From d9f83aa456f7649624956eb93957e3a82749e874 Mon Sep 17 00:00:00 2001 From: Hartorn Date: Mon, 10 Dec 2018 22:12:21 +0100 Subject: [PATCH] Adding export as CSV feature --- app/i18n/fr-fr.js | 1 + app/views/events/detail/index.js | 42 +++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/app/i18n/fr-fr.js b/app/i18n/fr-fr.js index c7d6ccd..6fb0577 100644 --- a/app/i18n/fr-fr.js +++ b/app/i18n/fr-fr.js @@ -56,6 +56,7 @@ export default { home: 'Fight for Sub' }, label: { + exportValidated: "Exporter au format CSV", validated: "Validés", waitingValidation: "En attente de validation", notEligible: "Vous n'êtes pas éligible à cet événement.", diff --git a/app/views/events/detail/index.js b/app/views/events/detail/index.js index f4e3335..3377fea 100644 --- a/app/views/events/detail/index.js +++ b/app/views/events/detail/index.js @@ -13,7 +13,7 @@ import AddPopin from '@/views/events/add-popin'; import UserLine from '@/components/user-line'; import List from '@/components/list'; import { navigate } from '@/utilities/router'; -import { isAdmin } from '@/utilities/check-rights'; +import { isAdmin, isModo } from '@/utilities/check-rights'; import EventStore from '@/stores/event'; import eventActions from '@/action/event'; @@ -21,6 +21,29 @@ import UserPopin from './detail-user'; import RecapEvent from './recap-event'; import RoundListView from './round-list-view'; +/* Credits to https://github.com/kennethjiang/react-file-download */ +const downloadData = (data, filename, typeMime) => { + const blob = new Blob([data], { + type: typeMime + }); + if (typeof window.navigator.msSaveBlob !== 'undefined') { + // IE workaround for "HTML7007: One or more blob URLs were + // revoked by closing the blob for which they were created. + // These URLs will no longer resolve as the data backing + // the URL has been freed." + window.navigator.msSaveBlob(blob, filename); + } else { + const csvURL = window.URL.createObjectURL(blob); + const tempLink = document.createElement('a'); + tempLink.href = csvURL; + tempLink.setAttribute('download', filename); + tempLink.setAttribute('target', '_blank'); + document.body.appendChild(tempLink); + tempLink.click(); + document.body.removeChild(tempLink); + } +}; + @connectToStore([{ store: EventStore, properties: ['eventUserList', 'eventDetail', 'eventUserRegistration'] @@ -56,6 +79,20 @@ class DetailEventView extends React.Component { this.doUnregister = this.doUnregister.bind(this); this.register = this.register.bind(this); this.buildDropdownValues = this.buildDropdownValues.bind(this); + this.exportValidated = this.exportValidated.bind(this); + } + + exportValidated() { + const header = ['Pseudo;NbVue;NbFollow;UrlTwitch']; + const data = (this.props.userList || []) + .filter(({ status }) => status === 'VALIDATED') + .sort((a, b) => this.compare(a, b, this.state.triValidated)) + .map(({ username, views, followers, url }) => + `${username};${views};${followers};${url}` + ); + const fileName = `${this.props.event.name}.csv`.replace(/ /g, '_'); + + downloadData(header.concat(data).join('\n'), fileName, 'text/csv'); } componentWillMount() { @@ -266,6 +303,9 @@ class DetailEventView extends React.Component { {!this.isRegistered() && this.isEligible() &&
} + {isModo() &&
+
}

{translate('label.users') + ' - '}{translate('label.validated') + ` (${toDisplayValidatedUser.length})`}