From 66993300e0be2011652456b6fadd11c45f27db4b Mon Sep 17 00:00:00 2001 From: rbisson <remi.bisson@inrae.fr> Date: Thu, 11 Jul 2024 11:22:30 +0200 Subject: [PATCH 1/5] [BasicSearch] removed useless container for progress bar --- src/pages/search/BasicSearch/BasicSearch.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/pages/search/BasicSearch/BasicSearch.js b/src/pages/search/BasicSearch/BasicSearch.js index 397091a..ad91acb 100644 --- a/src/pages/search/BasicSearch/BasicSearch.js +++ b/src/pages/search/BasicSearch/BasicSearch.js @@ -69,13 +69,7 @@ const BasicSearch = ({ autoFocus={true} fullWidth /> - {isLoading && ( - <EuiFlexGroup> - <EuiFlexItem> - <EuiProgress postion="fixed" size="l" color="accent" /> - </EuiFlexItem> - </EuiFlexGroup> - )} + {isLoading && <EuiProgress postion="fixed" size="l" color="accent" />} </EuiFlexItem> <EuiFlexItem grow={false}> <EuiButton type="submit" fill isDisabled={isAdvancedSearch}> -- GitLab From d5a8143b9a2d72fdb312e859681c2db4d03161c2 Mon Sep 17 00:00:00 2001 From: rbisson <remi.bisson@inrae.fr> Date: Thu, 11 Jul 2024 11:23:23 +0200 Subject: [PATCH 2/5] [AdvancedSearch] removed useless container for progress bar --- src/pages/search/AdvancedSearch/AdvancedSearch.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/pages/search/AdvancedSearch/AdvancedSearch.js b/src/pages/search/AdvancedSearch/AdvancedSearch.js index d977c81..1b5104c 100644 --- a/src/pages/search/AdvancedSearch/AdvancedSearch.js +++ b/src/pages/search/AdvancedSearch/AdvancedSearch.js @@ -406,13 +406,7 @@ const SearchBar = ({ placeholder={t('search:advancedSearch.textQueryPlaceholder')} fullWidth /> - {isLoading && ( - <EuiFlexGroup> - <EuiFlexItem> - <EuiProgress postion="fixed" size="l" color="accent" /> - </EuiFlexItem> - </EuiFlexGroup> - )} + {isLoading && <EuiProgress postion="fixed" size="l" color="accent" />} </EuiFlexItem> <EuiFlexItem grow={false}> <EuiButton -- GitLab From 3a975ec1544bdb29342f0ca308bb41fb8d072419 Mon Sep 17 00:00:00 2001 From: rbisson <remi.bisson@inrae.fr> Date: Thu, 18 Jul 2024 06:36:42 +0200 Subject: [PATCH 3/5] src --- public/locales/fr/results.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales/fr/results.json b/public/locales/fr/results.json index 1237c23..01df349 100644 --- a/public/locales/fr/results.json +++ b/public/locales/fr/results.json @@ -1,7 +1,7 @@ { "clickOnRowTip": "Clickez sur une ligne du tableau pour afficher ses métadonnées.", "downloadResultsButton": { - "JSON": "Télécharger en JSON" + "JSON": "Télécharger" }, "table": { "title": "Résultats de la requête : <strong>{{searchQuery}}</strong>", -- GitLab From 9146726425f8f0abf1cdd22aedbb6e3599e8f65e Mon Sep 17 00:00:00 2001 From: rbisson <remi.bisson@inrae.fr> Date: Thu, 18 Jul 2024 06:37:33 +0200 Subject: [PATCH 4/5] (not working) start of different download button --- src/pages/results/Results.js | 7 +- src/pages/results/ResultsDownload.js | 109 +++++++++++++++++++++++++-- 2 files changed, 109 insertions(+), 7 deletions(-) diff --git a/src/pages/results/Results.js b/src/pages/results/Results.js index 3584081..9fb3123 100644 --- a/src/pages/results/Results.js +++ b/src/pages/results/Results.js @@ -22,7 +22,12 @@ const Results = ({ searchResults, searchQuery, selectedRowsIds, setSelectedRowsI <EuiFlexItem> <EuiCallOut size="s" title={t('results:clickOnRowTip')} iconType="search" /> </EuiFlexItem> - <ResultsDownload searchResults={searchResults} /> + <EuiFlexItem grow={false}> + <ResultsDownload + searchResults={searchResults} + selectedRowsIds={selectedRowsIds} + /> + </EuiFlexItem> </EuiFlexGroup> <EuiSpacer size={'m'} /> <ResultsTableMUI diff --git a/src/pages/results/ResultsDownload.js b/src/pages/results/ResultsDownload.js index 7ed3978..9f8af7d 100644 --- a/src/pages/results/ResultsDownload.js +++ b/src/pages/results/ResultsDownload.js @@ -1,15 +1,35 @@ -import React from 'react'; -import { EuiButton, EuiFlexItem } from '@elastic/eui'; +import React, { useState } from 'react'; +import { + EuiButton, + EuiFlexGroup, + EuiSelect, + EuiToolTip, + useEuiTheme, +} from '@elastic/eui'; import download from 'downloadjs'; import { useTranslation } from 'react-i18next'; -const ResultsDownload = ({ searchResults }) => { +const ResultsDownload = ({ searchResults, selectedRowsIds }) => { const { t } = useTranslation('results'); + const [resultsRowsSelection, setResultsRowsSelection] = useState('all'); + const [format, setFormat] = useState('json'); + const { euiTheme } = useEuiTheme(); + + const selectStyles = { + option: { + backgroundColor: euiTheme.colors.lightShade, + ':hover': { + backgroundColor: euiTheme.colors.primary, + }, + }, + }; const downloadResults = () => { if (!searchResults) { return; } + console.log(resultsRowsSelection); + console.log(format); download( `{"metadataRecords": ${JSON.stringify(searchResults, null, '\t')}}`, 'InSylvaSearchResults.json', @@ -17,12 +37,89 @@ const ResultsDownload = ({ searchResults }) => { ); }; + const ResultsRowSelectionSelectable = () => { + const resultsRowSelectionOptions = [ + { + value: 'all', + text: 'All results', + }, + { + value: 'selected', + text: 'Only selected', + disabled: selectedRowsIds.length <= 0, + }, + ]; + + const onResultsRowSelectionChange = (e) => { + setResultsRowsSelection(e.target.value); + }; + + return ( + <EuiToolTip position="bottom" content="Download selection or all"> + <EuiSelect + value={resultsRowsSelection} + options={resultsRowSelectionOptions} + onChange={onResultsRowSelectionChange} + style={{ + borderRadius: '0', + backgroundColor: euiTheme.colors.primary, + color: '#ffffff', + }} + aria-label="Row selection download options" + compressed + /> + </EuiToolTip> + ); + }; + + const FormatSelection = () => { + const resultsRowSelectionOptions = [ + { + value: 'json', + text: 'JSON', + }, + { + value: 'csv', + text: 'CSV', + }, + ]; + + const onFormatChange = (e) => { + setFormat(e.target.value); + }; + + return ( + <EuiToolTip position="bottom" content="Choose a download format"> + <EuiSelect + value={format} + options={resultsRowSelectionOptions} + onChange={onFormatChange} + aria-label="Download format options" + style={{ + borderTopLeftRadius: '0', + borderBottomLeftRadius: '0', + backgroundColor: euiTheme.colors.primary, + color: '#ffffff', + }} + compressed + /> + </EuiToolTip> + ); + }; + return ( - <EuiFlexItem grow={false}> - <EuiButton fill onClick={() => downloadResults()}> + <EuiFlexGroup gutterSize={'none'}> + <EuiButton + style={{ borderBottomRightRadius: '0', borderTopRightRadius: '0' }} + fill + size={'s'} + onClick={() => downloadResults()} + > {t('results:downloadResultsButton.JSON')} </EuiButton> - </EuiFlexItem> + <ResultsRowSelectionSelectable /> + <FormatSelection /> + </EuiFlexGroup> ); }; -- GitLab From eb2b632653de3b298ebce027267ecc41df52ef4f Mon Sep 17 00:00:00 2001 From: rbisson <remi.bisson@inrae.fr> Date: Tue, 23 Jul 2024 13:54:06 +0200 Subject: [PATCH 5/5] [ResultsDownload] Improved download button to include selection only, and multiple download formats. only CSV added for now --- public/locales/en/results.json | 14 ++++- public/locales/fr/results.json | 14 ++++- src/pages/results/ResultsDownload.js | 91 +++++++++++++++++----------- 3 files changed, 80 insertions(+), 39 deletions(-) diff --git a/public/locales/en/results.json b/public/locales/en/results.json index baaaa09..66d1b63 100644 --- a/public/locales/en/results.json +++ b/public/locales/en/results.json @@ -1,7 +1,17 @@ { "clickOnRowTip": "Click on a row to display metadata.", - "downloadResultsButton": { - "JSON": "Download as JSON" + "downloadResultsButtons": { + "download": "Download", + "selection": { + "all": "All results", + "selectionOnly": "Selected results only", + "label": "Row selection download options" + }, + "format": { + "label": "Download format options", + "JSON": "in JSON", + "CSV": "in CSV" + } }, "table": { "title": "Search results from query: <strong>{{searchQuery}}</strong>", diff --git a/public/locales/fr/results.json b/public/locales/fr/results.json index 01df349..c8e2dd9 100644 --- a/public/locales/fr/results.json +++ b/public/locales/fr/results.json @@ -1,7 +1,17 @@ { "clickOnRowTip": "Clickez sur une ligne du tableau pour afficher ses métadonnées.", - "downloadResultsButton": { - "JSON": "Télécharger" + "downloadResultsButtons": { + "download": "Télécharger", + "selection": { + "all": "Tous les résultats", + "selectionOnly": "Uniquement la sélection", + "label": "Options de téléchargement de la sélection" + }, + "format": { + "label": "Format du téléchargement", + "JSON": "en JSON", + "CSV": "en CSV" + } }, "table": { "title": "Résultats de la requête : <strong>{{searchQuery}}</strong>", diff --git a/src/pages/results/ResultsDownload.js b/src/pages/results/ResultsDownload.js index 9f8af7d..1a750b4 100644 --- a/src/pages/results/ResultsDownload.js +++ b/src/pages/results/ResultsDownload.js @@ -1,11 +1,5 @@ import React, { useState } from 'react'; -import { - EuiButton, - EuiFlexGroup, - EuiSelect, - EuiToolTip, - useEuiTheme, -} from '@elastic/eui'; +import { EuiButton, EuiFlexGroup, EuiSelect, EuiToolTip } from '@elastic/eui'; import download from 'downloadjs'; import { useTranslation } from 'react-i18next'; @@ -13,39 +7,64 @@ const ResultsDownload = ({ searchResults, selectedRowsIds }) => { const { t } = useTranslation('results'); const [resultsRowsSelection, setResultsRowsSelection] = useState('all'); const [format, setFormat] = useState('json'); - const { euiTheme } = useEuiTheme(); - const selectStyles = { - option: { - backgroundColor: euiTheme.colors.lightShade, - ':hover': { - backgroundColor: euiTheme.colors.primary, - }, - }, + const downloadJSON = (content) => { + download( + `{"metadataRecords": ${JSON.stringify(content, null, '\t')}}`, + `InSylvaSearchResults.json`, + 'application/json' + ); + }; + + function JSONtoCSV(jsonData) { + let csv = ''; + let headers = Object.keys(jsonData[0]); + csv += headers.join(',') + '\n'; + jsonData.forEach((row) => { + let data = headers.map((header) => JSON.stringify(row[header])).join(','); + csv += data + '\n'; + }); + return csv; + } + + const downloadCSV = (content) => { + download(JSONtoCSV(content), `InSylvaSearchResults.csv`, 'text/csv'); }; const downloadResults = () => { if (!searchResults) { return; } - console.log(resultsRowsSelection); - console.log(format); - download( - `{"metadataRecords": ${JSON.stringify(searchResults, null, '\t')}}`, - 'InSylvaSearchResults.json', - 'application/json' - ); + let downloadResults = searchResults; + // Change content to download if user selected 'selected results only' + if (resultsRowsSelection !== 'all') { + downloadResults = searchResults.filter((result) => { + return selectedRowsIds.find((id) => result.id === id); + }); + } + // Switch will ease the need to add new formats in the future. + switch (format) { + case 'json': + downloadJSON(downloadResults); + break; + case 'csv': + downloadCSV(downloadResults); + break; + default: + downloadJSON(downloadResults); + break; + } }; const ResultsRowSelectionSelectable = () => { const resultsRowSelectionOptions = [ { value: 'all', - text: 'All results', + text: t('results:downloadResultsButtons.selection.all'), }, { value: 'selected', - text: 'Only selected', + text: t('results:downloadResultsButtons.selection.selectionOnly'), disabled: selectedRowsIds.length <= 0, }, ]; @@ -55,17 +74,18 @@ const ResultsDownload = ({ searchResults, selectedRowsIds }) => { }; return ( - <EuiToolTip position="bottom" content="Download selection or all"> + <EuiToolTip + position="top" + content={t('results:downloadResultsButtons.selection.label')} + > <EuiSelect value={resultsRowsSelection} options={resultsRowSelectionOptions} onChange={onResultsRowSelectionChange} style={{ borderRadius: '0', - backgroundColor: euiTheme.colors.primary, - color: '#ffffff', }} - aria-label="Row selection download options" + aria-label={t('results:downloadResultsButtons.selection.label')} compressed /> </EuiToolTip> @@ -76,11 +96,11 @@ const ResultsDownload = ({ searchResults, selectedRowsIds }) => { const resultsRowSelectionOptions = [ { value: 'json', - text: 'JSON', + text: t('results:downloadResultsButtons.format.JSON'), }, { value: 'csv', - text: 'CSV', + text: t('results:downloadResultsButtons.format.CSV'), }, ]; @@ -89,17 +109,18 @@ const ResultsDownload = ({ searchResults, selectedRowsIds }) => { }; return ( - <EuiToolTip position="bottom" content="Choose a download format"> + <EuiToolTip + position="top" + content={t('results:downloadResultsButtons.format.label')} + > <EuiSelect value={format} options={resultsRowSelectionOptions} onChange={onFormatChange} - aria-label="Download format options" + aria-label={t('results:downloadResultsButtons.format.label')} style={{ borderTopLeftRadius: '0', borderBottomLeftRadius: '0', - backgroundColor: euiTheme.colors.primary, - color: '#ffffff', }} compressed /> @@ -115,7 +136,7 @@ const ResultsDownload = ({ searchResults, selectedRowsIds }) => { size={'s'} onClick={() => downloadResults()} > - {t('results:downloadResultsButton.JSON')} + {t('results:downloadResultsButtons.download')} </EuiButton> <ResultsRowSelectionSelectable /> <FormatSelection /> -- GitLab