mailman.cloud.codelutin.com
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

Observe-commits

Thread Start a new thread
Download
Threads by month
  • ----- 2026 -----
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2015 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2014 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2013 -----
  • December
  • November
  • October
  • September
observe-commits@list.forge.codelutin.com

August 2022

  • 1 participants
  • 12 discussions
[Git][ultreiaio/ird-observe][develop] Client - Aucune barre de progression Closes #2409
by Tony CHEMIT (@tchemit) 03 Aug '22

03 Aug '22
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: cede2ae6 by Tony Chemit at 2022-08-03T11:23:52+02:00 Client - Aucune barre de progression Closes #2409 - - - - - 22 changed files: - client/core/src/main/java/fr/ird/observe/client/ClientUIContext.java - client/core/src/main/java/fr/ird/observe/client/ClientUIContextApi.java - client/core/src/main/java/fr/ird/observe/client/WithClientUIContextApi.java - client/core/src/main/java/fr/ird/observe/client/main/MainUIModel.java - client/core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jaxx - client/core/src/main/java/fr/ird/observe/client/main/ObserveMainUIHandler.java - client/core/src/main/java/fr/ird/observe/client/main/focus/MainUIFocusModel.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/DataSourceEditorBodyContent.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialogHandler.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialogModel.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/actions/DeleteEdit.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/DataSourceEditorMenu.jaxx - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/DataSourceEditorMenuModel.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/NavigationTree.java - toolkit/api/src/main/i18n/getters/java.getter - toolkit/api/src/main/i18n/translations/toolkit_en_GB.properties - toolkit/api/src/main/i18n/translations/toolkit_es_ES.properties - toolkit/api/src/main/i18n/translations/toolkit_fr_FR.properties - toolkit/api/src/main/java/fr/ird/observe/navigation/tree/navigation/NavigationTreeSelectionModel.java - toolkit/api/src/main/java/fr/ird/observe/navigation/tree/navigation/NavigationTreeSupport.java - client/core/src/main/java/fr/ird/observe/client/util/busy/BusyLayerUI.java → toolkit/api/src/main/java/fr/ird/observe/spi/ui/BusyLayerUI.java - client/core/src/main/java/fr/ird/observe/client/util/busy/BusyModel.java → toolkit/api/src/main/java/fr/ird/observe/spi/ui/BusyModel.java Changes: ===================================== client/core/src/main/java/fr/ird/observe/client/ClientUIContext.java ===================================== @@ -33,7 +33,7 @@ import fr.ird.observe.client.main.body.NoBodyContentComponent; import fr.ird.observe.client.main.callback.ObserveUICallbackManager; import fr.ird.observe.client.main.focus.MainUIFocusModel; import fr.ird.observe.client.util.action.ObserveExecutorService; -import fr.ird.observe.client.util.busy.BusyModel; +import fr.ird.observe.spi.ui.BusyModel; import fr.ird.observe.client.util.session.ObserveSwingSessionHelper; import fr.ird.observe.dto.data.ps.dcp.FloatingObjectPresetsManager; import fr.ird.observe.navigation.id.IdProjectManager; ===================================== client/core/src/main/java/fr/ird/observe/client/ClientUIContextApi.java ===================================== @@ -32,7 +32,7 @@ import fr.ird.observe.client.main.ObserveMainUI; import fr.ird.observe.client.main.callback.ObserveUICallbackManager; import fr.ird.observe.client.main.focus.MainUIFocusModel; import fr.ird.observe.client.util.UIHelper; -import fr.ird.observe.client.util.busy.BusyModel; +import fr.ird.observe.spi.ui.BusyModel; import fr.ird.observe.client.util.session.ObserveSwingSessionHelper; import fr.ird.observe.dto.ObserveUtil; import fr.ird.observe.dto.data.ps.dcp.FloatingObjectPresetsManager; ===================================== client/core/src/main/java/fr/ird/observe/client/WithClientUIContextApi.java ===================================== @@ -31,7 +31,7 @@ import fr.ird.observe.client.main.MainUIModel; import fr.ird.observe.client.main.ObserveMainUI; import fr.ird.observe.client.main.callback.ObserveUICallbackManager; import fr.ird.observe.client.main.focus.MainUIFocusModel; -import fr.ird.observe.client.util.busy.BusyModel; +import fr.ird.observe.spi.ui.BusyModel; import fr.ird.observe.client.util.session.ObserveSwingSessionHelper; import fr.ird.observe.dto.data.ps.dcp.FloatingObjectPresetsManager; import fr.ird.observe.navigation.id.IdProjectManager; ===================================== client/core/src/main/java/fr/ird/observe/client/main/MainUIModel.java ===================================== @@ -24,7 +24,7 @@ package fr.ird.observe.client.main; import fr.ird.observe.client.configuration.ClientConfig; import fr.ird.observe.client.main.focus.MainUIFocusModel; -import fr.ird.observe.client.util.busy.BusyModel; +import fr.ird.observe.spi.ui.BusyModel; import io.ultreia.java4all.bean.AbstractJavaBean; import io.ultreia.java4all.bean.spi.GenerateJavaBeanDefinition; ===================================== client/core/src/main/java/fr/ird/observe/client/main/ObserveMainUI.jaxx ===================================== @@ -22,7 +22,7 @@ <import> fr.ird.observe.client.util.JMenuWithAccelerator - fr.ird.observe.client.util.busy.BusyModel + fr.ird.observe.spi.ui.BusyModel fr.ird.observe.client.configuration.ClientConfig fr.ird.observe.client.main.MainUIModel fr.ird.observe.client.main.body.MainUIBodyContentManager ===================================== client/core/src/main/java/fr/ird/observe/client/main/ObserveMainUIHandler.java ===================================== @@ -27,8 +27,8 @@ import fr.ird.observe.client.configuration.ClientConfig; import fr.ird.observe.client.main.body.MainUIBodyContentManager; import fr.ird.observe.client.util.ObserveKeyStrokesSupport; import fr.ird.observe.client.util.UIHelper; -import fr.ird.observe.client.util.busy.BusyLayerUI; -import fr.ird.observe.client.util.busy.BusyModel; +import fr.ird.observe.spi.ui.BusyLayerUI; +import fr.ird.observe.spi.ui.BusyModel; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.nuiton.jaxx.runtime.spi.UIHandler; ===================================== client/core/src/main/java/fr/ird/observe/client/main/focus/MainUIFocusModel.java ===================================== @@ -22,7 +22,7 @@ package fr.ird.observe.client.main.focus; * #L% */ -import fr.ird.observe.client.util.busy.BusyModel; +import fr.ird.observe.spi.ui.BusyModel; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/DataSourceEditorBodyContent.java ===================================== @@ -44,7 +44,7 @@ import fr.ird.observe.client.main.ObserveMainUI; import fr.ird.observe.client.main.body.MainUIBodyContent; import fr.ird.observe.client.main.focus.MainUIFocusModel; import fr.ird.observe.client.util.UIHelper; -import fr.ird.observe.client.util.busy.BusyModel; +import fr.ird.observe.spi.ui.BusyModel; import fr.ird.observe.dto.ProgressionModel; import fr.ird.observe.dto.ProtectedIdsCommon; import fr.ird.observe.dto.db.BabModelVersionException; ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialogHandler.java ===================================== @@ -25,7 +25,7 @@ package fr.ird.observe.client.datasource.editor.api.avdth; import fr.ird.observe.client.WithClientUIContextApi; import fr.ird.observe.client.util.ObserveBlockingLayerUI; import fr.ird.observe.client.util.UIHelper; -import fr.ird.observe.client.util.busy.BusyLayerUI; +import fr.ird.observe.spi.ui.BusyLayerUI; import fr.ird.observe.client.util.init.UIInitHelper; import fr.ird.observe.dto.referential.common.OceanReference; import fr.ird.observe.dto.referential.ps.common.ProgramReference; ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/avdth/ImportDialogModel.java ===================================== @@ -27,7 +27,7 @@ import fr.ird.observe.client.configuration.ClientConfig; import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; import fr.ird.observe.client.datasource.validation.ContentMessageTableModel; import fr.ird.observe.client.main.focus.FocusDispatcher; -import fr.ird.observe.client.util.busy.BusyModel; +import fr.ird.observe.spi.ui.BusyModel; import fr.ird.observe.dto.ProgressionModel; import fr.ird.observe.services.service.data.ps.AvdthDataImportConfiguration; import fr.ird.observe.services.service.data.ps.AvdthDataImportResult; ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/edit/actions/DeleteEdit.java ===================================== @@ -29,7 +29,7 @@ import fr.ird.observe.client.datasource.editor.api.content.ContentUIHandler; import fr.ird.observe.client.datasource.editor.api.content.data.edit.ContentEditUI; import fr.ird.observe.client.datasource.editor.api.navigation.NavigationTree; import fr.ird.observe.client.datasource.editor.api.navigation.tree.NavigationNode; -import fr.ird.observe.client.util.busy.BusyModel; +import fr.ird.observe.spi.ui.BusyModel; import fr.ird.observe.dto.IdDto; import fr.ird.observe.dto.data.EditableDto; import fr.ird.observe.spi.decoration.DecoratorService; ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/DataSourceEditorMenu.jaxx ===================================== @@ -18,20 +18,7 @@ #L% --> <JMenu id='menuStorage'> - - <!-- <import>--> - <!-- fr.ird.observe.client.main.MainUIModel--> - <!-- fr.ird.observe.client.util.busy.BusyModel--> - <!-- fr.ird.observe.client.util.UIHelper--> - <!-- java.util.Locale--> - <!-- java.awt.Dimension--> - <!-- javax.swing.BoxLayout--> - <!-- javax.swing.JComponent--> - <!-- </import>--> - <DataSourceEditorMenuModel id="uiModel" initializer="getContextValue(DataSourceEditorMenuModel.class)"/> - <!-- <BusyModel id='busyModel' initializer='uiModel.getBusyModel()'/>--> - <!-- <MainUIModel id="mainUiModel" initializer="uiModel.getMainUIModel()"/>--> <JMenuItem id='changeStorage'/> <JMenuItem id='reloadStorage' styleClass="optional"/> <JMenuItem id='closeStorage' styleClass="optional"/> ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/DataSourceEditorMenuModel.java ===================================== @@ -30,7 +30,7 @@ import fr.ird.observe.client.main.MainUIModel; import fr.ird.observe.client.main.body.MainUIBodyContentManager; import fr.ird.observe.client.main.body.NoBodyContentComponent; import fr.ird.observe.client.util.UIHelper; -import fr.ird.observe.client.util.busy.BusyModel; +import fr.ird.observe.spi.ui.BusyModel; import io.ultreia.java4all.bean.AbstractJavaBean; import io.ultreia.java4all.bean.spi.GenerateJavaBeanDefinition; import org.apache.logging.log4j.LogManager; ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/NavigationTree.java ===================================== @@ -93,7 +93,7 @@ public class NavigationTree extends JXTree implements WithClientUIContextApi { @Override public void updateUI() { - setSelectionModel(new NavigationTreeSelectionModel()); + setSelectionModel(new NavigationTreeSelectionModel(getBusyModel())); super.updateUI(); } ===================================== toolkit/api/src/main/i18n/getters/java.getter ===================================== @@ -87,3 +87,4 @@ observe.ui.datasource.storage.error.rest.password.required observe.ui.datasource.storage.error.rest.user.required observe.ui.datasource.storage.error.rest.user.unknown observe.ui.message.warning.will.be.delete +observe.ui.tree.loading.node ===================================== toolkit/api/src/main/i18n/translations/toolkit_en_GB.properties ===================================== @@ -155,3 +155,4 @@ observe.ui.datasource.storage.error.rest.password.required=Password is mandatory observe.ui.datasource.storage.error.rest.user.required=User login is mandatory observe.ui.datasource.storage.error.rest.user.unknown=User "%s" is not defined on server observe.ui.message.warning.will.be.delete=%1$s\n\nBe ware, export will replace existing data. +observe.ui.tree.loading.node=Loading selected node ===================================== toolkit/api/src/main/i18n/translations/toolkit_es_ES.properties ===================================== @@ -155,3 +155,4 @@ observe.ui.datasource.storage.error.rest.password.required=Le contraseña es obl observe.ui.datasource.storage.error.rest.user.required=El usuario es obligatorio observe.ui.datasource.storage.error.rest.user.unknown=El usuario "%s" no es conocido del servidor observe.ui.message.warning.will.be.delete=%1$s\n\nAtención, la exportación reemplazará la marea existente. +observe.ui.tree.loading.node=Loading selected node ===================================== toolkit/api/src/main/i18n/translations/toolkit_fr_FR.properties ===================================== @@ -155,3 +155,4 @@ observe.ui.datasource.storage.error.rest.password.required=Le mot de passe est o observe.ui.datasource.storage.error.rest.user.required=L'utilisateur est obligatoire observe.ui.datasource.storage.error.rest.user.unknown=L'utilisateur "%s" est inconnu sur le serveur observe.ui.message.warning.will.be.delete=%1$s\n\nAttention, l'export remplacera la marée existante. +observe.ui.tree.loading.node=Chargement du nœud sélectionné ===================================== toolkit/api/src/main/java/fr/ird/observe/navigation/tree/navigation/NavigationTreeSelectionModel.java ===================================== @@ -25,9 +25,12 @@ package fr.ird.observe.navigation.tree.navigation; import fr.ird.observe.navigation.tree.navigation.event.NavigationTreeSelectionEvent; import fr.ird.observe.navigation.tree.navigation.event.NavigationTreeSelectionListener; import fr.ird.observe.navigation.tree.navigation.event.NavigationTreeSelectionVetoException; +import fr.ird.observe.spi.ui.BusyModel; +import io.ultreia.java4all.i18n.I18n; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import javax.swing.SwingUtilities; import javax.swing.event.TreeExpansionEvent; import javax.swing.tree.DefaultTreeSelectionModel; import javax.swing.tree.ExpandVetoException; @@ -47,8 +50,10 @@ public class NavigationTreeSelectionModel extends DefaultTreeSelectionModel { private static final Logger log = LogManager.getLogger(NavigationTreeSelectionModel.class); private boolean skipCheckPreviousContent; + private final BusyModel busyModel; - public NavigationTreeSelectionModel() { + public NavigationTreeSelectionModel(BusyModel busyModel) { + this.busyModel = busyModel; setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); } @@ -84,29 +89,35 @@ public class NavigationTreeSelectionModel extends DefaultTreeSelectionModel { return; } TreePath path = pPaths[0]; - boolean[] newness = new boolean[pPaths.length]; - Arrays.fill(newness, true); - NavigationTreeSelectionEvent event = new NavigationTreeSelectionEvent(this, pPaths, newness, getLeadSelectionPath(), path, skipCheckPreviousContent); boolean canChange = !Objects.equals(path, getSelectionPath()); if (canChange) { + boolean[] newness = new boolean[pPaths.length]; + Arrays.fill(newness, true); + NavigationTreeSelectionEvent event = new NavigationTreeSelectionEvent(this, pPaths, newness, getLeadSelectionPath(), path, skipCheckPreviousContent); try { fireVetoValueChanged(event); } catch (NavigationTreeSelectionVetoException e) { canChange = false; } } - -// boolean canChange = skipCheckPreviousContent || (!Objects.equals(path, getSelectionPath()) && contentUIManager.closeSelectedContentUI()); if (!canChange) { // cancel the change of node log.warn(String.format("Do not change selection path: %s against: %s", path, getSelectionPath())); return; } -// FIXME Move this in a listener -// if (skipCheckPreviousContent) { -// contentUIManager.closeSafeSelectedContentUI(); -// } - super.setSelectionPaths(pPaths); + // can now safely select new path + if (busyModel == null) { + super.setSelectionPaths(pPaths); + } else { + busyModel.addTask(I18n.t("observe.ui.tree.loading.node")); + SwingUtilities.invokeLater(() -> { + try { + setSelectionPaths(pPaths); + } finally { + busyModel.popTask(); + } + }); + } } @Override ===================================== toolkit/api/src/main/java/fr/ird/observe/navigation/tree/navigation/NavigationTreeSupport.java ===================================== @@ -54,7 +54,7 @@ public class NavigationTreeSupport<R extends NavigationTreeNode, M extends Navig @Override public void updateUI() { - setSelectionModel(new NavigationTreeSelectionModel()); + setSelectionModel(new NavigationTreeSelectionModel(null)); super.updateUI(); } ===================================== client/core/src/main/java/fr/ird/observe/client/util/busy/BusyLayerUI.java → toolkit/api/src/main/java/fr/ird/observe/spi/ui/BusyLayerUI.java ===================================== @@ -1,8 +1,8 @@ -package fr.ird.observe.client.util.busy; +package fr.ird.observe.spi.ui; /*- * #%L - * ObServe Client :: Core + * ObServe Toolkit :: API * %% * Copyright (C) 2008 - 2022 IRD, Ultreia.io * %% ===================================== client/core/src/main/java/fr/ird/observe/client/util/busy/BusyModel.java → toolkit/api/src/main/java/fr/ird/observe/spi/ui/BusyModel.java ===================================== @@ -1,8 +1,8 @@ -package fr.ird.observe.client.util.busy; +package fr.ird.observe.spi.ui; /*- * #%L - * ObServe Client :: Core + * ObServe Toolkit :: API * %% * Copyright (C) 2008 - 2022 IRD, Ultreia.io * %% View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/cede2ae6468add47a13e0b1ee… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/cede2ae6468add47a13e0b1ee… You're receiving this email because of your account on gitlab.com.
1 0
0 0
[Git][ultreiaio/ird-observe][develop] Dans l'assistant rapport, ajouter un export CSV - Closes #2259
by Tony CHEMIT (@tchemit) 03 Aug '22

03 Aug '22
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 512468e8 by Tony Chemit at 2022-08-03T09:49:49+02:00 Dans l&#39;assistant rapport, ajouter un export CSV - Closes #2259 - - - - - 28 changed files: - client/configuration/src/main/config/Client.ini - client/configuration/src/main/i18n/getters/config.getter - client/configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java - client/core/src/main/java/fr/ird/observe/client/main/body/ClientConfigUI.java - client/core/src/main/resources/observe-ui.properties - client/datasource/actions/src/main/i18n/getters/java.getter - client/datasource/actions/src/main/i18n/getters/jaxx.getter - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/ObserveKeyStrokesActions.java - + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUI.jaxx - + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUI.jcss - + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUIHandler.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportModel.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUI.jaxx - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUI.jcss - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUIHandler.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ResultTableModel.java - + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ChooseExportCsvDirectory.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/CopyResultToClipboard.java → client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ExportToClipboard.java - + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ExportToCsv.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ToggleConfigure.java - + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ToggleExport.java - + client/datasource/actions/src/main/resources/icons/action-export-csv.png - + client/datasource/actions/src/main/resources/icons/action-format-csv.png - client/runner/src/main/i18n/translations/client-runner_en_GB.properties - client/runner/src/main/i18n/translations/client-runner_es_ES.properties - client/runner/src/main/i18n/translations/client-runner_fr_FR.properties - toolkit/api/src/main/java/fr/ird/observe/dto/ObserveUtil.java - toolkit/api/src/main/java/fr/ird/observe/dto/report/DataMatrix.java Changes: ===================================== client/configuration/src/main/config/Client.ini ===================================== @@ -409,6 +409,14 @@ defaultValue = ${instance.data.directory}/tmp final = true transient = true +[option exportDirectory] +description = observe.config.exportDirectory.description +key = instance.export.directory +type = file +defaultValue = ${instance.data.directory}/export +final = true +transient = true + [option navigationEditModelFile] description = observe.config.ui.tree.edit.nodes key = instance.ui.file.tree.edit.nodes ===================================== client/configuration/src/main/i18n/getters/config.getter ===================================== @@ -38,6 +38,7 @@ observe.config.defaultReportDirectory.description observe.config.defaultReportFile.description observe.config.defaultResourcesDirectory.description observe.config.defaultValidationReportDirectory.description +observe.config.exportDirectory.description observe.config.feedBackDirectory.description observe.config.h2.can.editReferential.description observe.config.h2.can.migrate.description ===================================== client/configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java ===================================== @@ -430,6 +430,9 @@ public class ClientConfig extends GeneratedClientConfig implements TripMapConfig log.info(message); ClientResources.ObserveSwingPreferences.copyResource(preferencesFile); } + + // 11 - export directory + createDirectory(ClientConfigOption.EXPORT_DIRECTORY); } public void detectLocalDataBase() { ===================================== client/core/src/main/java/fr/ird/observe/client/main/body/ClientConfigUI.java ===================================== @@ -415,6 +415,7 @@ public class ClientConfigUI extends JXTitledPanel implements WithClientUIContext helper.addOption(ClientConfigOption.DATA_DIRECTORY); helper.addOption(ClientConfigOption.DB_DIRECTORY); helper.addOption(ClientConfigOption.BACKUP_DIRECTORY); + helper.addOption(ClientConfigOption.EXPORT_DIRECTORY); helper.addOption(ClientConfigOption.LOG_DIRECTORY); helper.addOption(ClientConfigOption.IMPORT_DIRECTORY); helper.addOption(ClientConfigOption.TEMPORARY_DIRECTORY); ===================================== client/core/src/main/resources/observe-ui.properties ===================================== @@ -229,6 +229,7 @@ icon.action.wizard-pause=action-wizard-pause-16.png icon.action.wizard-refresh=action-wizard-refresh-16.png icon.action.wizard-config=action-wizard-config-16.png icon.action.wizard-message=action-wizard-message-16.png +icon.action.export-csv=action-export-csv.png # couleurs au format (r,g,b) icon.Table.removeIcon=action-delete.png color.Table.lastRowColor=255,255,0 ===================================== client/datasource/actions/src/main/i18n/getters/java.getter ===================================== @@ -9,6 +9,7 @@ observe.ui.action.admin.close observe.ui.action.apply observe.ui.action.cancel observe.ui.action.choose.db.dump.directory +observe.ui.action.choose.export.csv.directory observe.ui.action.choose.reportFile observe.ui.action.choose.reportFile.description observe.ui.action.close @@ -19,6 +20,7 @@ observe.ui.action.configuration.tip observe.ui.action.continue observe.ui.action.copy.to.clipBoard observe.ui.action.do.backup.tip +observe.ui.action.export.tip observe.ui.action.goto.next.stage observe.ui.action.goto.next.stage.tip observe.ui.action.goto.previous.stage @@ -69,6 +71,9 @@ observe.ui.datasource.editor.actions.pairing.tip observe.ui.datasource.editor.actions.pairing.title observe.ui.datasource.editor.actions.report observe.ui.datasource.editor.actions.report.description +observe.ui.datasource.editor.actions.report.exportToCsv +observe.ui.datasource.editor.actions.report.exportToCsv.done +observe.ui.datasource.editor.actions.report.exportToCsv.tip observe.ui.datasource.editor.actions.report.no.report.found observe.ui.datasource.editor.actions.report.report.count.found observe.ui.datasource.editor.actions.report.title @@ -175,6 +180,7 @@ observe.ui.menu.actions observe.ui.message.no.report.selected observe.ui.message.select.report observe.ui.title.choose.db.dump.directory +observe.ui.title.choose.export.csv.directory observe.ui.title.choose.reportFile observe.ui.title.storage.info observe.ui.tree.action.collapseAll.tip ===================================== client/datasource/actions/src/main/i18n/getters/jaxx.getter ===================================== @@ -11,6 +11,7 @@ observe.info.selected.validators observe.info.validation.credentials observe.ui.action.show.properties observe.ui.action.show.properties.tip +observe.ui.choice.cancel.tip observe.ui.datasource.editor.actions.operation.configuration observe.ui.datasource.editor.actions.operations observe.ui.datasource.editor.actions.report.auto.copy.to.clipboard ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/ObserveKeyStrokesActions.java ===================================== @@ -39,6 +39,9 @@ public class ObserveKeyStrokesActions extends ObserveKeyStrokesEditorApi { public static final KeyStroke KEY_STROKE_DATA_SYNCHRO_COPY_RIGHT = KeyStroke.getKeyStroke("pressed F9"); public static final KeyStroke KEY_STROKE_DATA_SYNCHRO_DELETE_RIGHT = KeyStroke.getKeyStroke("pressed F10"); + public static final KeyStroke KEY_STROKE_EXPORT_POPUP = KeyStroke.getKeyStroke("pressed F10"); + public static final KeyStroke KEY_STROKE_EXPORT_CLIPBOARD = KeyStroke.getKeyStroke("pressed F2"); + public static final KeyStroke KEY_STROKE_EXPORT_CSV = KeyStroke.getKeyStroke("pressed F3"); public static final KeyStroke KEY_STROKE_EXIT = KeyStroke.getKeyStroke("alt pressed F"); } ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUI.jaxx ===================================== @@ -0,0 +1,60 @@ +<!-- + #%L + ObServe Client :: DataSource :: Actions + %% + Copyright (C) 2008 - 2022 IRD, Ultreia.io + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% + --> +<Table id="reportConfig"> + <import> + java.io.File + javax.swing.Box + javax.swing.BoxLayout + java.awt.Dimension + + static fr.ird.observe.client.util.UIHelper.getStringValue + </import> + <ReportModel id='stepModel' initializer='getContextValue(ReportModel.class)'/> + <row> + <cell anchor="west"> + <JLabel id="directoryLabel"/> + </cell> + <cell weightx='1' fill="horizontal"> + <JTextField id='directoryText' onKeyReleased='getHandler().changeDirectory(new File(((JTextField)event.getSource()).getText()))'/> + </cell> + <cell anchor="east"> + <JButton id="chooseExportCsvDirectory"/> + </cell> + </row> + <row> + <cell anchor="west"> + <JLabel id="fileLabel"/> + </cell> + <cell weightx='1' fill="horizontal" columns="2"> + <JTextField id='filenameText' onKeyReleased='getHandler().changeFilename(((JTextField)event.getSource()).getText())'/> + </cell> + </row> + <row> + <cell columns="3" anchor="west" fill="both"> + <JPanel id='actions' layout="{new BoxLayout(actions, BoxLayout.Y_AXIS)}"> + <JPanel id="cancelMessagePanel" layout="{new GridLayout(0, 1)}"> + <JSeparator constructorParams="JSeparator.HORIZONTAL"/> + <JLabel id="cancelMessage" styleClass="information italic"/> + <Component initializer="Box.createRigidArea(new Dimension(10, 5))"/> + </JPanel> + </JPanel> + </cell> + </row> +</Table> ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUI.jcss ===================================== @@ -0,0 +1,41 @@ +/*- + * #%L + * ObServe Client :: DataSource :: Actions + * %% + * Copyright (C) 2008 - 2022 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +#directoryLabel { + text:"observe.Common.directory"; +} + +#directoryText { + text:{stepModel.getExportCsvFile().getParent()}; +} + +#fileLabel { + text:"observe.Common.file"; +} + +#filenameText { + text:{stepModel.getExportCsvFileName()}; +} + +#cancelMessage { + text:"observe.ui.choice.cancel.tip"; +} ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/CsvExportUIHandler.java ===================================== @@ -0,0 +1,51 @@ +package fr.ird.observe.client.datasource.actions.report; + +/*- + * #%L + * ObServe Client :: DataSource :: Actions + * %% + * Copyright (C) 2008 - 2022 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.dto.ObserveUtil; +import org.nuiton.jaxx.runtime.spi.UIHandler; + +import java.io.File; + +/** + * Created on 02/08/2022. + * + * @author Tony Chemit - dev(a)tchemit.fr + * @since 9.0.7 + */ +public class CsvExportUIHandler implements UIHandler<CsvExportUI> { + private CsvExportUI ui; + + @Override + public void beforeInit(CsvExportUI ui) { + this.ui = ui; + } + + public void changeDirectory(File f) { + ui.getStepModel().setExportCsvFile(new File(f, ObserveUtil.addCsvExtension(ui.getStepModel().getExportCsvFileName()))); + } + + public void changeFilename(String filename) { + ui.getStepModel().setExportCsvFile(new File(ui.getDirectoryText().getText(), ObserveUtil.addCsvExtension(filename))); + } +} ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportModel.java ===================================== @@ -27,6 +27,7 @@ import fr.ird.observe.client.datasource.actions.AdminStep; import fr.ird.observe.client.datasource.actions.AdminUIModel; import fr.ird.observe.client.datasource.actions.config.SelectDataModel; import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel; +import fr.ird.observe.dto.ObserveUtil; import fr.ird.observe.dto.report.Report; import fr.ird.observe.dto.report.ReportBuilder; import fr.ird.observe.navigation.tree.selection.SelectionTreeConfig; @@ -41,6 +42,7 @@ import java.io.IOException; import java.net.URL; import java.nio.file.Files; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; @@ -57,6 +59,8 @@ import java.util.stream.Collectors; @GenerateJavaBeanDefinition public class ReportModel extends AdminActionModel { + public static final String EXPORT_CSV_FILE_PROPERTY_NAME = "exportCsvFile"; + public static final String EXPORT_CSV_FILE_NAME_PROPERTY_NAME = "exportCsvFileName"; public static final String SELECTED_REPORT_PROPERTY_NAME = "selectedReport"; public static final String REPORTS_PROPERTY_NAME = "reports"; @@ -115,6 +119,10 @@ public class ReportModel extends AdminActionModel { * Pour copier les entêtes de colonnes */ protected boolean copyColumnHeaders = true; + /** + * Where to do optional csv export. + */ + protected File exportCsvFile = new File(""); private List<Report> allReports; private SelectDataModel selectDataModel; @@ -125,6 +133,22 @@ public class ReportModel extends AdminActionModel { addPropertyChangeListener(REPORT_FILE_PROPERTY_NAME, evt -> updateReports()); } + public File getExportCsvFile() { + return exportCsvFile; + } + + public void setExportCsvFile(File exportCsvFile) { + File oldValue = getExportCsvFile(); + String oldBackupFileName = getExportCsvFileName(); + this.exportCsvFile = exportCsvFile; + firePropertyChange(EXPORT_CSV_FILE_PROPERTY_NAME, oldValue, exportCsvFile); + firePropertyChange(EXPORT_CSV_FILE_NAME_PROPERTY_NAME, oldBackupFileName, getExportCsvFileName()); + } + + public String getExportCsvFileName() { + return ObserveUtil.removeCsvExtension(exportCsvFile.getName()); + } + @Override public void start(AdminUIModel uiModel) { @@ -341,4 +365,7 @@ public class ReportModel extends AdminActionModel { log.info(String.format("Detects %d report(s).", reports.size())); } + public File newExportCsvFile() { + return new File(getClientConfig().getExportDirectory(), String.format("export-%1$s--%2$tF--%2$tk-%2$tM-%2$tS.csv", Objects.requireNonNull(getSelectedReport()).getId().replaceAll("\\.", "_"), new Date())); + } } ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUI.jaxx ===================================== @@ -50,31 +50,22 @@ public void destroy() { ]]> </script> <JPanel id='PENDING_content' layout='{new BorderLayout()}'> -<!-- <JPanel id='northPanel' constraints='BorderLayout.NORTH' layout='{new GridLayout(1, 2)}'>--> - <JXTitledPanel id="configurationPane" contentContainer="{configurationPanel}" constraints='BorderLayout.NORTH'> - <JPanel id="configurationPanel" layout='{new BorderLayout()}'> - <JPanel id='requestSelectorPane' constraints='BorderLayout.NORTH' layout='{new BorderLayout()}'> - <JToolBar id='toolbar' constraints='BorderLayout.WEST'> - <JButton id="resetSelectedReport" onActionPerformed="getHandler().updateSelectedReport(null)"/> - </JToolBar> - <JComboBox id='reportSelector' constraints='BorderLayout.CENTER' onItemStateChanged='getHandler().updateSelectedReportFromEvent(event)'/> - </JPanel> - <JScrollPane id='reportVariableSelectorPane' constraints='BorderLayout.CENTER'> - <JPanel id='reportVariableSelectorPanel' layout="{new GridLayout(0,1)}"/> - </JScrollPane> - <JScrollPane id='reportDescriptionPane' constraints='BorderLayout.SOUTH'> - <JTextArea id='reportDescription'/> - </JScrollPane> + <JXTitledPanel id="configurationPane" contentContainer="{configurationPanel}" constraints='BorderLayout.NORTH'> + <JPanel id="configurationPanel" layout='{new BorderLayout()}'> + <JPanel id='requestSelectorPane' constraints='BorderLayout.NORTH' layout='{new BorderLayout()}'> + <JToolBar id='toolbar' constraints='BorderLayout.WEST'> + <JButton id="resetSelectedReport" onActionPerformed="getHandler().updateSelectedReport(null)" styleClass="enabledIfReportSelected"/> + </JToolBar> + <JComboBox id='reportSelector' constraints='BorderLayout.CENTER' onItemStateChanged='getHandler().updateSelectedReportFromEvent(event)'/> </JPanel> - </JXTitledPanel> -<!-- <JPanel id="copyPane" layout='{new BorderLayout()}'>--> -<!-- <JPanel id='copyOptions' constraints='BorderLayout.NORTH' beanScope="stepModel" layout="{new GridLayout(0,1)}">--> -<!-- <BeanCheckBox id='autoCopyToClipboard'/>--> -<!-- <BeanCheckBox id='copyRowHeaders'/>--> -<!-- <BeanCheckBox id='copyColumnHeaders'/>--> -<!-- </JPanel>--> -<!-- </JPanel>--> -<!-- </JPanel>--> + <JScrollPane id='reportVariableSelectorPane' constraints='BorderLayout.CENTER'> + <JPanel id='reportVariableSelectorPanel' layout="{new GridLayout(0,1)}"/> + </JScrollPane> + <JScrollPane id='reportDescriptionPane' constraints='BorderLayout.SOUTH'> + <JTextArea id='reportDescription'/> + </JScrollPane> + </JPanel> + </JXTitledPanel> <JXTitledPanel id="resultPanel" constraints='BorderLayout.CENTER' contentContainer="{resultPane}" rightDecoration='{titleRightToolBar}'> <JScrollPane id='resultPane'> <JXTable id='resultTable'/> @@ -84,8 +75,12 @@ public void destroy() { <BeanCheckBox id='copyRowHeaders'/> <BeanCheckBox id='copyColumnHeaders'/> </JPopupMenu> + <JPopupMenu id='exportPopup'> + <JMenuItem id='exportToClipboard' styleClass="enabledIfReportSelected"/> + <JMenuItem id='exportToCsv' styleClass="enabledIfReportSelected"/> + </JPopupMenu> <JToolBar id='titleRightToolBar'> - <JButton id="copyResultToClipboard"/> + <JToggleButton id='toggleExport'/> <JToggleButton id='toggleConfigure'/> </JToolBar> </JXTitledPanel> ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUI.jcss ===================================== @@ -30,6 +30,10 @@ BeanCheckBox { bean:{stepModel}; } +.enabledIfReportSelected { + enabled:{stepModel.getSelectedReport() != null}; +} + #reportVariableSelectorPanel { border:{new TitledBorder(t("observe.ui.datasource.editor.actions.report.variables") + " ")}; } @@ -76,7 +80,6 @@ BeanCheckBox { #resetSelectedReport { actionIcon:"combobox-reset"; toolTipText:"observe.ui.datasource.editor.actions.synchro.report.reset.tip"; - enabled:{stepModel.getSelectedReport() != null}; mnemonic:R; } @@ -94,7 +97,3 @@ BeanCheckBox { text:"observe.ui.datasource.editor.actions.report.copy.column.headers"; toolTipText:"observe.ui.datasource.editor.actions.report.copy.column.headers.tip"; } - -#copyResultToClipboard { - enabled:{stepModel.isValid()}; -} ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportUIHandler.java ===================================== @@ -24,7 +24,7 @@ package fr.ird.observe.client.datasource.actions.report; import fr.ird.observe.client.datasource.actions.AdminTabUIHandler; import fr.ird.observe.client.datasource.actions.AdminUIModel; import fr.ird.observe.client.datasource.actions.config.ConfigUI; -import fr.ird.observe.client.datasource.actions.report.actions.CopyResultToClipboard; +import fr.ird.observe.client.datasource.actions.report.actions.ExportToClipboard; import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; import fr.ird.observe.client.util.ObserveSwingTechnicalException; import fr.ird.observe.client.util.UIHelper; @@ -319,7 +319,7 @@ public class ReportUIHandler extends AdminTabUIHandler<ReportUI> implements UIHa // mise a jour du clipboard automatique si requis if (stepModel.isAutoCopyToClipboard()) { - CopyResultToClipboard.copyReportToClipBoard(report, stepModel); + ExportToClipboard.copyReportToClipBoard(report, stepModel); } } catch (Exception e) { stepModel.getResultModel().clear(); ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ResultTableModel.java ===================================== @@ -220,6 +220,14 @@ public class ResultTableModel extends AbstractTableModel { } public String getClipboardContent(boolean copyRowHeaders, boolean copyColumnHeaders) { + return getDataContent(copyRowHeaders, copyColumnHeaders, true,'\t'); + } + + public String getCsvContent() { + return getDataContent(true, true, true, ';'); + } + + public String getDataContent(boolean copyRowHeaders, boolean copyColumnHeaders, boolean escapeCell, char separator) { if (data == null) { return ""; } @@ -234,9 +242,9 @@ public class ResultTableModel extends AbstractTableModel { String rowName = getColumnName(i); columns.setValue(i, 0, rowName); }); - result = columns.getClipboardContent(true, true, false, '\t'); + result = columns.getClipboardContent(true, true, escapeCell, separator); } - result += data.getClipboardContent(copyRowHeaders || !withRowHeader, true, false, '\t'); + result += data.getClipboardContent(copyRowHeaders || !withRowHeader, true, escapeCell, separator); return result; } ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ChooseExportCsvDirectory.java ===================================== @@ -0,0 +1,59 @@ +package fr.ird.observe.client.datasource.actions.report.actions; + +/*- + * #%L + * ObServe Client :: DataSource :: Actions + * %% + * Copyright (C) 2008 - 2022 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.client.datasource.actions.ObserveKeyStrokesActions; +import fr.ird.observe.client.datasource.actions.report.CsvExportUI; +import fr.ird.observe.client.util.UIFileHelper; +import org.nuiton.jaxx.runtime.swing.action.JComponentActionSupport; + +import java.awt.event.ActionEvent; +import java.io.File; + +import static io.ultreia.java4all.i18n.I18n.t; + +/** + * Created on 02/08/2022. + * + * @author Tony Chemit - dev(a)tchemit.fr + * @since 9.0.7 + */ +public class ChooseExportCsvDirectory extends JComponentActionSupport<CsvExportUI> { + + public ChooseExportCsvDirectory() { + super("", t("observe.ui.action.choose.export.csv.directory"), "fileChooser", ObserveKeyStrokesActions.KEY_STROKE_STORAGE_DO_CHOOSE_FILE); + } + + @Override + protected void doActionPerformed(ActionEvent e, CsvExportUI ui) { + File f = UIFileHelper.chooseDirectory( + ui, + t("observe.ui.title.choose.export.csv.directory"), + t("observe.ui.action.choose.export.csv.directory"), + new File(ui.getDirectoryText().getText()) + ); + if (f != null) { + ui.getHandler().changeDirectory(f); + } + } +} ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/CopyResultToClipboard.java → client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ExportToClipboard.java ===================================== @@ -22,6 +22,7 @@ package fr.ird.observe.client.datasource.actions.report.actions; * #L% */ +import fr.ird.observe.client.datasource.actions.ObserveKeyStrokesActions; import fr.ird.observe.client.datasource.actions.actions.AdminTabUIActionSupport; import fr.ird.observe.client.datasource.actions.report.ReportModel; import fr.ird.observe.client.datasource.actions.report.ReportUI; @@ -35,12 +36,16 @@ import java.awt.event.ActionEvent; import static io.ultreia.java4all.i18n.I18n.t; -public class CopyResultToClipboard extends AdminTabUIActionSupport<ReportUI> { +public class ExportToClipboard extends AdminTabUIActionSupport<ReportUI> { - private static final Logger log = LogManager.getLogger(CopyResultToClipboard.class); + private static final Logger log = LogManager.getLogger(ExportToClipboard.class); - public CopyResultToClipboard() { - super(""/*t("observe.ui.action.copy")*/, t("observe.ui.datasource.editor.actions.synchro.copy.tip"), "report-copy", 'C'); + public ExportToClipboard() { + super("observe.ui.datasource.editor.actions.report.exportToClipboard", + t("observe.ui.datasource.editor.actions.synchro.copy.tip"), + "report-copy", + ObserveKeyStrokesActions.KEY_STROKE_EXPORT_CLIPBOARD); + setCheckMenuItemIsArmed(false); } public static void copyReportToClipBoard(Report report, ReportModel stepModel) { ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ExportToCsv.java ===================================== @@ -0,0 +1,147 @@ +package fr.ird.observe.client.datasource.actions.report.actions; + +/*- + * #%L + * ObServe Client :: DataSource :: Actions + * %% + * Copyright (C) 2008 - 2022 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.client.datasource.actions.ObserveKeyStrokesActions; +import fr.ird.observe.client.datasource.actions.actions.AdminTabUIActionSupport; +import fr.ird.observe.client.datasource.actions.report.CsvExportUI; +import fr.ird.observe.client.datasource.actions.report.ReportModel; +import fr.ird.observe.client.datasource.actions.report.ReportUI; +import fr.ird.observe.client.datasource.actions.report.ResultTableModel; +import fr.ird.observe.client.datasource.editor.api.ObserveKeyStrokesEditorApi; +import fr.ird.observe.client.datasource.usage.UsageUIHandlerSupport; +import fr.ird.observe.client.util.UIHelper; +import fr.ird.observe.dto.ObserveUtil; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.nuiton.jaxx.runtime.context.JAXXInitialContext; + +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.ActionMap; +import javax.swing.InputMap; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JOptionPane; +import javax.swing.KeyStroke; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; + +import static io.ultreia.java4all.i18n.I18n.t; + +/** + * Created on 02/08/2022. + * + * @author Tony Chemit - dev(a)tchemit.fr + * @since 9.0.7 + */ +public class ExportToCsv extends AdminTabUIActionSupport<ReportUI> implements PropertyChangeListener { + + private static final Logger log = LogManager.getLogger(ExportToClipboard.class); + private JButton applyButton; + + public ExportToCsv() { + super(t("observe.ui.datasource.editor.actions.report.exportToCsv"), + t("observe.ui.datasource.editor.actions.report.exportToCsv.tip"), + "export-csv", + ObserveKeyStrokesActions.KEY_STROKE_EXPORT_CSV); + setCheckMenuItemIsArmed(false); + } + + @Override + protected void doActionPerformed(ActionEvent e, ReportUI ui) { + ReportModel stepModel = ui.getStepModel(); + JAXXInitialContext context = new JAXXInitialContext().add(stepModel); + CsvExportUI exportUi = new CsvExportUI(context); + KeyStroke keyStroke = ObserveKeyStrokesActions.KEY_STROKE_ALT_ENTER; + + String applyText = ObserveKeyStrokesEditorApi.suffixTextWithKeyStroke(t("observe.ui.action.apply"), keyStroke); + + + Object[] options = {applyText}; + + + JOptionPane optionPane = new JOptionPane(exportUi, JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[0]); + + applyButton = UsageUIHandlerSupport.findButton(optionPane, applyText); + Objects.requireNonNull(applyButton).setEnabled(false); + + stepModel.addPropertyChangeListener(ReportModel.EXPORT_CSV_FILE_PROPERTY_NAME, this); + + try { + AbstractAction applyAction = new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + applyButton.doClick(); + } + }; + + applyAction.putValue(Action.ACCELERATOR_KEY, keyStroke); + applyAction.putValue(Action.NAME, applyText); + applyAction.putValue(Action.SMALL_ICON, UIHelper.getContentActionIcon("save")); + + applyButton.setIcon(UIHelper.getContentActionIcon("save")); + + InputMap inputMap = optionPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); + inputMap.put((KeyStroke) applyAction.getValue(Action.ACCELERATOR_KEY), "apply"); + + ActionMap actionMap = optionPane.getActionMap(); + actionMap.put("apply", applyAction); + + File exportFile = stepModel.newExportCsvFile(); + ui.getStepModel().setExportCsvFile(exportFile); + + int response = UIHelper.askUser(getMainUI(), optionPane, new Dimension(600, 220), t("observe.ui.datasource.editor.actions.report.exportToCsv.tip"), options); + + boolean accept = response == 0; + if (accept) { + Path exportCsvFile = stepModel.getExportCsvFile().toPath(); + ResultTableModel model = stepModel.getResultModel(); + String content = model.getCsvContent(); + log.info("Export csv to: " + exportCsvFile); + try { + Files.write(exportCsvFile, content.getBytes(StandardCharsets.UTF_8)); + } catch (IOException ex) { + throw new RuntimeException("Can't export csv to file: " + exportCsvFile, ex); + } + setUiStatus(t("observe.ui.datasource.editor.actions.report.exportToCsv.done", exportCsvFile)); + } + } finally { + stepModel.removePropertyChangeListener(ReportModel.EXPORT_CSV_FILE_PROPERTY_NAME, this); + } + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + File exportFile = (File) evt.getNewValue(); + applyButton.setEnabled(exportFile != null && !exportFile.exists() && ObserveUtil.withCsvExtension(exportFile.getName())); + } +} ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ToggleConfigure.java ===================================== @@ -45,7 +45,6 @@ public class ToggleConfigure extends AdminTabUIActionSupport<ReportUI> { public ToggleConfigure() { super("", n("observe.ui.action.configuration.tip"), "generate", ObserveKeyStrokesEditorApi.KEY_STROKE_NAVIGATION_CONFIGURE); -// setIcon(getContentScaledImage("configure")); } @Override ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/actions/ToggleExport.java ===================================== @@ -0,0 +1,82 @@ +package fr.ird.observe.client.datasource.actions.report.actions; + +/*- + * #%L + * ObServe Client :: DataSource :: Actions + * %% + * Copyright (C) 2008 - 2022 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.client.datasource.actions.ObserveKeyStrokesActions; +import fr.ird.observe.client.datasource.actions.actions.AdminTabUIActionSupport; +import fr.ird.observe.client.datasource.actions.report.ReportUI; +import org.nuiton.jaxx.runtime.swing.action.MenuAction; + +import javax.swing.JComponent; +import javax.swing.JPopupMenu; +import javax.swing.SwingUtilities; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import java.awt.event.ActionEvent; + +import static io.ultreia.java4all.i18n.I18n.n; + +/** + * Created on 02/08/2022. + * + * @author Tony Chemit - dev(a)tchemit.fr + * @since 9.0.7 + */ +public class ToggleExport extends AdminTabUIActionSupport<ReportUI> { + + public ToggleExport() { + super("", n("observe.ui.action.export.tip"), "data-export", ObserveKeyStrokesActions.KEY_STROKE_EXPORT_POPUP); + } + + @Override + public void init() { + super.init(); + ui.getExportPopup().addPopupMenuListener(new PopupMenuListener() { + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + ui.getToggleExport().setSelected(false); + } + + @Override + public void popupMenuCanceled(PopupMenuEvent e) { + ui.getToggleExport().setSelected(false); + } + }); + } + + @Override + protected void doActionPerformed(ActionEvent e, ReportUI ui) { + ui.getToggleExport().setSelected(true); + SwingUtilities.invokeLater(() -> { + JComponent c = ui.getToggleExport(); + JPopupMenu p = ui.getExportPopup(); + MenuAction.preparePopup(p, c, false); + }); + } + +} + ===================================== client/datasource/actions/src/main/resources/icons/action-export-csv.png ===================================== Binary files /dev/null and b/client/datasource/actions/src/main/resources/icons/action-export-csv.png differ ===================================== client/datasource/actions/src/main/resources/icons/action-format-csv.png ===================================== Binary files /dev/null and b/client/datasource/actions/src/main/resources/icons/action-format-csv.png differ ===================================== client/runner/src/main/i18n/translations/client-runner_en_GB.properties ===================================== @@ -55,6 +55,7 @@ observe.config.defaultReportDirectory.description=Default directory where to sto observe.config.defaultReportFile.description=Default report file to use observe.config.defaultResourcesDirectory.description=Default user resources directory observe.config.defaultValidationReportDirectory.description=Default validation report directory +observe.config.exportDirectory.description=Default export directory for user export. observe.config.feedBackDirectory.description=FeedBack directory observe.config.h2.can.editReferential.description=Local database can edit referential observe.config.h2.can.migrate.description=Flag to know if you can migrate h2 data sources @@ -315,6 +316,7 @@ observe.ui.action.choose.avdth.file.description=AVDTH Database (*.mdb) observe.ui.action.choose.db.dump=Choose the backup observe.ui.action.choose.db.dump.description=Database backup (*.sql.gz) observe.ui.action.choose.db.dump.directory=Choose the backup directory +observe.ui.action.choose.export.csv.directory=Choose csv export directory observe.ui.action.choose.reportFile=Choose the reports file observe.ui.action.choose.reportFile.description=Report's file (*.properties) observe.ui.action.close=Close @@ -360,6 +362,7 @@ observe.ui.action.duplicate.remote.tip=Duplicate remote observe.ui.action.duplicate.server.tip=Duplicate server observe.ui.action.exit=Quit observe.ui.action.exit.tip=quit Observe +observe.ui.action.export.tip=Export observe.ui.action.goDown.tip=Go down in navigation tree observe.ui.action.goUp.tip=Go up in navigation tree observe.ui.action.goto.next.stage=Next step @@ -531,6 +534,10 @@ observe.ui.datasource.editor.actions.report.copy.column.headers.tip=Add in resul observe.ui.datasource.editor.actions.report.copy.row.headers=Copy row header observe.ui.datasource.editor.actions.report.copy.row.headers.tip=Add in result row headers observe.ui.datasource.editor.actions.report.description=Generate reports +observe.ui.datasource.editor.actions.report.exportToClipboard=Clipboard +observe.ui.datasource.editor.actions.report.exportToCsv=CSV +observe.ui.datasource.editor.actions.report.exportToCsv.done=Csv export done at %s +observe.ui.datasource.editor.actions.report.exportToCsv.tip=Export to csv observe.ui.datasource.editor.actions.report.no.report.found=No report found. observe.ui.datasource.editor.actions.report.report.count.found=Found %s reports. observe.ui.datasource.editor.actions.report.report.description=Description of selected report @@ -827,6 +834,7 @@ observe.ui.title.can.not.export.obstuna=Could not export data... observe.ui.title.choose.avdth.file=Select avdth file observe.ui.title.choose.db.dump=Choose a database backup observe.ui.title.choose.db.dump.directory=Choose directory of backup +observe.ui.title.choose.export.csv.directory=Choose directory of csv export observe.ui.title.choose.reportFile=Choose report definition file observe.ui.title.confirmReplace=Confirm to replace observe.ui.title.connect.existingDB=Connect to existing database ===================================== client/runner/src/main/i18n/translations/client-runner_es_ES.properties ===================================== @@ -55,6 +55,7 @@ observe.config.defaultReportDirectory.description=Directorio por defecto de los observe.config.defaultReportFile.description=Default report file to use observe.config.defaultResourcesDirectory.description=Directorio de almacenamiento de los recursos de usuario como las traducciones o la consultas de informes observe.config.defaultValidationReportDirectory.description=Directorio por defecto de almacenamiento de los informes de validación +observe.config.exportDirectory.description=Default export directory for user export. observe.config.feedBackDirectory.description=FeedBack directory \#TODO observe.config.h2.can.editReferential.description=Para poder editar el referencial de una base local observe.config.h2.can.migrate.description=Autorizar la actualización de las bases locales (h2) @@ -315,6 +316,7 @@ observe.ui.action.choose.avdth.file.description=AVDTH Database (*.mdb) \#TODO observe.ui.action.choose.db.dump=Elegir la copia de seguridad observe.ui.action.choose.db.dump.description=Copia de seguridad de la base (*.sql.gz) observe.ui.action.choose.db.dump.directory=Elegir el directorio de la copia de seguridad +observe.ui.action.choose.export.csv.directory=Choisir le répertoire de l'export csv observe.ui.action.choose.reportFile=Elegir el archivo de definición de informe observe.ui.action.choose.reportFile.description=Archivo de definición (*.properties) observe.ui.action.close=Cerrar @@ -360,6 +362,7 @@ observe.ui.action.duplicate.remote.tip=Duplicate remote \#TODO observe.ui.action.duplicate.server.tip=Duplicate server \#TODO observe.ui.action.exit=Salir observe.ui.action.exit.tip=Salir de ObServe +observe.ui.action.export.tip=Export observe.ui.action.goDown.tip=Descender hacia etapas porteriores observe.ui.action.goUp.tip=Ascender hacia etapas anteriores observe.ui.action.goto.next.stage=Siguiente @@ -531,6 +534,10 @@ observe.ui.datasource.editor.actions.report.copy.column.headers.tip=Añadir al r observe.ui.datasource.editor.actions.report.copy.row.headers=Copiar las cabeceras de linea observe.ui.datasource.editor.actions.report.copy.row.headers.tip=Añadir al resultado las cabeceras de linea (ej. la primera columna) observe.ui.datasource.editor.actions.report.description=Generar los cuadros de síntesis del informe de fin del embarque +observe.ui.datasource.editor.actions.report.exportToClipboard=Clipboard +observe.ui.datasource.editor.actions.report.exportToCsv=CSV +observe.ui.datasource.editor.actions.report.exportToCsv.done=Csv export done at %s +observe.ui.datasource.editor.actions.report.exportToCsv.tip=Export to csv observe.ui.datasource.editor.actions.report.no.report.found=No report found. \#TODO observe.ui.datasource.editor.actions.report.report.count.found=Found %s reports. \#TODO observe.ui.datasource.editor.actions.report.report.description=Descripción del informe seleccionado @@ -827,6 +834,7 @@ observe.ui.title.can.not.export.obstuna=Impossible exportar los datos... observe.ui.title.choose.avdth.file=Select avdth file \#TODO observe.ui.title.choose.db.dump=Seleccionar una copia de seguridad de base local observe.ui.title.choose.db.dump.directory=Seleccionar e directorio de destinación de la copia de seguridad +observe.ui.title.choose.export.csv.directory=Choose directory of csv export observe.ui.title.choose.reportFile=Seleccionar el archivo de definición de los informes observe.ui.title.confirmReplace=Confirmar para reemplazar observe.ui.title.connect.existingDB=Conexión a una fuente de datos que ya existe ===================================== client/runner/src/main/i18n/translations/client-runner_fr_FR.properties ===================================== @@ -55,6 +55,7 @@ observe.config.defaultReportDirectory.description=Répertoire par défaut des ra observe.config.defaultReportFile.description=Fichier par défaut des rapports de l'application observe.config.defaultResourcesDirectory.description=Répertoire où sont stockées les ressources. observe.config.defaultValidationReportDirectory.description=Répertoire où sont stockés les rapports de validation +observe.config.exportDirectory.description=Le répertoire par défaut pour les exports. observe.config.feedBackDirectory.description=Répertoire où sont consigner les feedback observe.config.h2.can.editReferential.description=Pour pouvoir éditer le référentiel d'une base locale observe.config.h2.can.migrate.description=Autoriser la mise à jour des bases locales (H2) @@ -315,6 +316,7 @@ observe.ui.action.choose.avdth.file.description=Base AVDTH (*.mdb) observe.ui.action.choose.db.dump=Choisir la sauvegarde observe.ui.action.choose.db.dump.description=Sauvegarde de base (*.sql.gz) observe.ui.action.choose.db.dump.directory=Choisir le répertoire de sauvegarde +observe.ui.action.choose.export.csv.directory=Choisir le répertoire de l'export csv observe.ui.action.choose.reportFile=Choisir le fichier de définition de report observe.ui.action.choose.reportFile.description=Fichier de définition (*.properties) observe.ui.action.close=Fermer @@ -360,6 +362,7 @@ observe.ui.action.duplicate.remote.tip=Duplicate la connexion distante observe.ui.action.duplicate.server.tip=Duplicate la connexion server observe.ui.action.exit=Quitter observe.ui.action.exit.tip=Quitter ObServe +observe.ui.action.export.tip=Exporter observe.ui.action.goDown.tip=Descendre dans la navigation observe.ui.action.goUp.tip=Remonter dans la navigation observe.ui.action.goto.next.stage=Suivant @@ -531,6 +534,10 @@ observe.ui.datasource.editor.actions.report.copy.column.headers.tip=Ajoute dans observe.ui.datasource.editor.actions.report.copy.row.headers=Copier les entêtes de ligne observe.ui.datasource.editor.actions.report.copy.row.headers.tip=Ajoute dans le résultat les entêtes de ligne (i.e la première colonne) observe.ui.datasource.editor.actions.report.description=Générer les tableaux de synthèse du rapport de fin d'embarquement +observe.ui.datasource.editor.actions.report.exportToClipboard=Presse papier +observe.ui.datasource.editor.actions.report.exportToCsv=Csv +observe.ui.datasource.editor.actions.report.exportToCsv.done=Export csv sauvegardé dans le fichier %s +observe.ui.datasource.editor.actions.report.exportToCsv.tip=Exporter au format Csv observe.ui.datasource.editor.actions.report.no.report.found=Aucun rapport trouvé. observe.ui.datasource.editor.actions.report.report.count.found=%s rapports détectés. observe.ui.datasource.editor.actions.report.report.description=Description du rapport sélectionné @@ -827,6 +834,7 @@ observe.ui.title.can.not.export.obstuna=Impossible d'exporter des données... observe.ui.title.choose.avdth.file=Choisir une base AVDTH observe.ui.title.choose.db.dump=Choisir une sauvegarder de base locale observe.ui.title.choose.db.dump.directory=Choisir le répertoire de destination de la sauvegarde +observe.ui.title.choose.export.csv.directory=Choisir le répertoire de destination de l'export csc observe.ui.title.choose.reportFile=Choisir le fichier de définition des reports observe.ui.title.confirmReplace=Confirmation de remplacement observe.ui.title.connect.existingDB=Connexion à une source de données existante ===================================== toolkit/api/src/main/java/fr/ird/observe/dto/ObserveUtil.java ===================================== @@ -62,7 +62,9 @@ import java.util.function.Supplier; public class ObserveUtil { public static final String SQL_GZ_EXTENSION_PATTERN = "^.+\\.sql\\.gz|.+\\.SQL\\.GZ$"; + public static final String CSV_EXTENSION_PATTERN = "^.+\\.csv|.+\\.CSV$"; public static final String SQL_GZ_EXTENSION = ".sql.gz"; + public static final String CSV_EXTENSION = ".csv"; public static final String PROPERTIES_EXTENSION_PATTERN = "^.+\\.properties|.+\\.PROPERTIES$"; public static final String PROPERTIES_EXTENSION = ".properties"; public static final String PNG_EXTENSION_PATTERN = "^.+\\.png|.+\\.PNG$"; @@ -150,6 +152,24 @@ public class ObserveUtil { return filePath.endsWith(SQL_GZ_EXTENSION); } + public static String addCsvExtension(String filePath) { + if (!filePath.endsWith(CSV_EXTENSION)) { + filePath += CSV_EXTENSION; + } + return filePath; + } + + public static String removeCsvExtension(String filePath) { + if (filePath.endsWith(CSV_EXTENSION)) { + filePath = Strings.removeEnd(filePath, CSV_EXTENSION); + } + return filePath; + } + + public static boolean withCsvExtension(String filePath) { + return filePath.endsWith(CSV_EXTENSION); + } + public static ScriptEngine getScriptEngine() { ScriptEngineManager factory = new ScriptEngineManager(); return factory.getEngineByName(JS_ENGINE_NAME); ===================================== toolkit/api/src/main/java/fr/ird/observe/dto/report/DataMatrix.java ===================================== @@ -223,44 +223,38 @@ public class DataMatrix implements JsonAware { public String getClipboardContent(boolean copyRowHeaders, boolean copyColumnHeaders, - boolean escapeCells, char sep) { - + boolean escapeCells, + char sep) { if (getWidth() <= 0 || getHeight() <= 0) { return ""; } - StringBuilder buffer = new StringBuilder(); - char eol = '\n'; - for (int y = copyColumnHeaders ? 0 : 1, rows = getHeight(); y < rows; y++) { - Serializable value; - - // nouvell ligne - + // new line int x = copyRowHeaders ? 0 : 1; - for (int columns = getWidth() - 1; x < columns; x++) { - - // sur chaque cellule (sauf la dernière) + // all cells except the last one value = getValue(x, y); if (escapeCells) { - value = "\"" + value + "\""; + value = escapeCell(value); } buffer.append(value).append(sep); } - - // dernière cellule + // last cell value = getValue(x, y); if (escapeCells) { - value = "\"" + value + "\""; + value = escapeCell(value); } buffer.append(value); - - // fin de ligne + // end of line buffer.append(eol); } return buffer.toString(); } + + private String escapeCell(Object value) { + return String.format("\"%s\"", value == null ? "" : value.toString().replaceAll("\"", "\"\"")); + } } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/512468e882d1ae9f08c90eab6… -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/512468e882d1ae9f08c90eab6… You're receiving this email because of your account on gitlab.com.
1 0
0 0
  • ← Newer
  • 1
  • 2
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.