Observe-commits
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
June 2024
- 1 participants
- 23 discussions
[Git][ultreiaio/ird-observe][feature/issue_2888] 3 commits: Extraction du code pour gérer le mode de synchronisation et utilisation sur la...
by Tony CHEMIT (@tchemit) 25 Jun '24
by Tony CHEMIT (@tchemit) 25 Jun '24
25 Jun '24
Tony CHEMIT pushed to branch feature/issue_2888 at ultreiaio / ird-observe
Commits:
c75875bc by Tony Chemit at 2024-06-25T12:57:30+02:00
Extraction du code pour gérer le mode de synchronisation et utilisation sur la synchronisation de référentiel
- - - - -
d98dfa59 by Tony Chemit at 2024-06-25T12:57:35+02:00
Mise en place du mode de synchronisation sur la synchronisation de données
- - - - -
25c1331f by Tony Chemit at 2024-06-25T16:22:39+02:00
Revue de la disposition des actions propre à chaque arbre de navigation pour les positionner au centre de l'écran (comme en synchronisation avancée de référentiels)
- - - - -
25 changed files:
- client/datasource/actions/src/main/i18n/getters/java-enumeration.getter
- 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/synchronize/SelectSynchronizeMode.java
- + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeConfigUI.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/SelectReferentialSynchronizeMode.java → client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeConfigUI.jcss
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchronizeMode.java → client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeMode.java
- + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeModel.java
- + client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/DataSynchroConfigUI.jaxx
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/DataSynchroModel.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/DataSynchroUIHandler.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/actions/Start.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/tree/DataSelectionTreePane.jaxx
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/tree/DataSelectionTreePaneHandler.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroConfigUI.jaxx
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroConfigUI.jcss
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroModel.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroUIHandler.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/Start.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/tree/ReferentialSelectionTreePaneHandler.java
- client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/tree/ReferentialSynchronizeTreeModelsBuilder.java
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/wizard/connexion/DataSourceSelectorModel.java
- 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
Changes:
=====================================
client/datasource/actions/src/main/i18n/getters/java-enumeration.getter
=====================================
@@ -20,9 +20,9 @@ observe.constant.AdminStep.SYNCHRONIZE
observe.constant.AdminStep.SYNCHRONIZE.description
observe.constant.AdminStep.VALIDATE
observe.constant.AdminStep.VALIDATE.description
-observe.constant.ReferentialSynchronizeMode.BOTH
-observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT
-observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT
+observe.constant.SynchronizeMode.BOTH
+observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT
+observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT
observe.constant.ValidationModelMode.DATA
observe.constant.ValidationModelMode.DATA.description
observe.constant.ValidationModelMode.REFERENTIEL
=====================================
client/datasource/actions/src/main/i18n/getters/java.getter
=====================================
@@ -105,6 +105,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation
observe.ui.datasource.editor.actions.synchro.data.message.data.loaded
observe.ui.datasource.editor.actions.synchro.data.title
observe.ui.datasource.editor.actions.synchro.data.title.tip
+observe.ui.datasource.editor.actions.synchro.data.withMode
observe.ui.datasource.editor.actions.synchro.launch.operation
observe.ui.datasource.editor.actions.synchro.prepare.operation
observe.ui.datasource.editor.actions.synchro.referential
=====================================
client/datasource/actions/src/main/i18n/getters/jaxx.getter
=====================================
@@ -27,8 +27,8 @@ observe.ui.datasource.editor.actions.report.copy.row.headers.tip
observe.ui.datasource.editor.actions.report.select.file
observe.ui.datasource.editor.actions.report.select.file.tip
observe.ui.datasource.editor.actions.report.variables
+observe.ui.datasource.editor.actions.synchro.config.mode
observe.ui.datasource.editor.actions.synchro.data.actionsToPerform
-observe.ui.datasource.editor.actions.synchro.referential.config.mode
observe.ui.datasource.editor.actions.synchro.referential.obsolete.entities.list
observe.ui.datasource.editor.actions.synchro.referential.obsolete.entity.fix
observe.ui.datasource.editor.actions.synchro.referential.safe.entity.to.choose.label
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SelectSynchronizeMode.java
=====================================
@@ -0,0 +1,68 @@
+package fr.ird.observe.client.datasource.actions.synchronize;
+
+/*-
+ * #%L
+ * ObServe Client :: DataSource :: Actions
+ * %%
+ * Copyright (C) 2008 - 2024 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 org.nuiton.jaxx.runtime.swing.action.JAXXObjectActionSupport;
+
+import javax.swing.ActionMap;
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import java.awt.event.ActionEvent;
+
+/**
+ * To select synchronize mode on admin config ui.
+ * <p>
+ * Created at 25/06/2024.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.3.6
+ */
+public class SelectSynchronizeMode extends JAXXObjectActionSupport<SynchronizeConfigUI> {
+
+ private final SynchronizeMode mode;
+
+ public SelectSynchronizeMode(SynchronizeMode mode) {
+ super(SelectSynchronizeMode.class.getName() + "#" + mode, mode.getLabel(), mode.getLabel(), mode.getIconName(), mode.getKeyStroke());
+ this.mode = mode;
+ }
+
+ @Override
+ protected InputMap getInputMap(SynchronizeConfigUI ui, int inputMapCondition) {
+ return ui.getInputMap(inputMapCondition);
+ }
+
+ @Override
+ protected int getInputMapCondition() {
+ return JComponent.WHEN_IN_FOCUSED_WINDOW;
+ }
+
+ @Override
+ protected ActionMap getActionMap(SynchronizeConfigUI ui) {
+ return ui.getActionMap();
+ }
+
+ @Override
+ protected void doActionPerformed(ActionEvent e, SynchronizeConfigUI ui) {
+ ui.getStepModel().setSynchronizeMode(mode);
+ }
+}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeConfigUI.java
=====================================
@@ -0,0 +1,108 @@
+package fr.ird.observe.client.datasource.actions.synchronize;
+
+/*-
+ * #%L
+ * ObServe Client :: DataSource :: Actions
+ * %%
+ * Copyright (C) 2008 - 2024 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.AdminUIModel;
+import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.nuiton.jaxx.runtime.JAXXObject;
+import org.nuiton.jaxx.runtime.swing.JAXXButtonGroup;
+
+import javax.swing.ActionMap;
+import javax.swing.InputMap;
+import javax.swing.JToggleButton;
+import java.util.EnumSet;
+
+/**
+ * Contract of admin config ui when using synchronize mode.
+ * <p>
+ * Created at 25/06/2024.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.3.6
+ */
+public interface SynchronizeConfigUI extends JAXXObject {
+ Logger log = LogManager.getLogger(SynchronizeConfigUI.class);
+
+ JToggleButton getBOTH();
+
+ JToggleButton getFROM_LEFT_TO_RIGHT();
+
+ JToggleButton getFROM_RIGHT_TO_LEFT();
+
+ AdminUIModel getModel();
+
+ SynchronizeModel getStepModel();
+
+ JAXXButtonGroup getSynchronizeMode();
+
+ ActionMap getActionMap();
+
+ InputMap getInputMap(int condition);
+
+ default void updateSynchroModes() {
+ AdminUIModel model = getModel();
+ SynchronizeModel stepModel = getStepModel();
+ SynchronizeMode synchronizeMode = stepModel.getSynchronizeMode();
+ log.info(String.format("Will update synchro modes (previous value: %s)", synchronizeMode));
+ DataSourceSelectorModel leftSourceModel = model.getConfigModel().getLeftSourceModel();
+ if (!leftSourceModel.isInit()) {
+ return;
+ }
+ DataSourceSelectorModel rightSourceModel = model.getConfigModel().getRightSourceModel();
+ if (!rightSourceModel.isInit()) {
+ return;
+ }
+ boolean dataSourcesValid = leftSourceModel.validateExt() && rightSourceModel.validateExt();
+ boolean leftToRightEnabled = dataSourcesValid && stepModel.isCanWrite(rightSourceModel);
+ log.debug(String.format("Update synchro modes: leftToRight: %s", leftToRightEnabled));
+ boolean rightToLeftEnabled = dataSourcesValid && stepModel.isCanWrite(leftSourceModel);
+ log.debug(String.format("Update synchro modes: rightToLeft: %s", rightToLeftEnabled));
+ boolean bothEnabled = leftToRightEnabled && rightToLeftEnabled;
+ log.debug(String.format("Update synchro modes: both: %s", bothEnabled));
+ getFROM_LEFT_TO_RIGHT().setEnabled(leftToRightEnabled);
+ getFROM_RIGHT_TO_LEFT().setEnabled(rightToLeftEnabled);
+ getBOTH().setEnabled(bothEnabled);
+ EnumSet<SynchronizeMode> candidates = EnumSet.allOf(SynchronizeMode.class);
+ if (!leftToRightEnabled) {
+ candidates.remove(SynchronizeMode.FROM_LEFT_TO_RIGHT);
+ }
+ if (!rightToLeftEnabled) {
+ candidates.remove(SynchronizeMode.FROM_RIGHT_TO_LEFT);
+ }
+ if (!bothEnabled) {
+ candidates.remove(SynchronizeMode.BOTH);
+ }
+ if (!candidates.contains(synchronizeMode)) {
+ if (candidates.isEmpty()) {
+ synchronizeMode = null;
+ } else {
+ synchronizeMode = candidates.iterator().next();
+ }
+ }
+ log.info(String.format("Will update synchro modes (new value: %s)", synchronizeMode));
+ stepModel.setSynchronizeMode(null);
+ stepModel.setSynchronizeMode(synchronizeMode);
+ }
+}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/SelectReferentialSynchronizeMode.java → client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeConfigUI.jcss
=====================================
@@ -1,6 +1,4 @@
-package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.actions;
-
-/*-
+/*
* #%L
* ObServe Client :: DataSource :: Actions
* %%
@@ -22,23 +20,19 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.acti
* #L%
*/
-import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroConfigUI;
-import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
-import org.nuiton.jaxx.runtime.swing.action.JComponentActionSupport;
-
-import java.awt.event.ActionEvent;
-
-public class SelectReferentialSynchronizeMode extends JComponentActionSupport<ReferentialSynchroConfigUI> {
-
- private final ReferentialSynchronizeMode mode;
+#synchronizeConfigPanel {
+ border:{new TitledBorder(t("observe.ui.datasource.editor.actions.synchro.config.mode") + "")};
+}
- public SelectReferentialSynchronizeMode(ReferentialSynchronizeMode mode) {
- super(SelectReferentialSynchronizeMode.class.getName() + "#" + mode, mode.getLabel(), mode.getLabel(), mode.getIconName(), mode.getKeyStroke());
- this.mode = mode;
- }
+#synchronizeMode {
+ selectedValue:{stepModel.getSynchronizeMode()};
+}
- @Override
- protected void doActionPerformed(ActionEvent e, ReferentialSynchroConfigUI ui) {
- ui.getStepModel().setSynchronizeMode(mode);
- }
+.synchronizeMode {
+ buttonGroup:"synchronizeMode";
+ enabled:false;
+ selected:{java.util.Objects.equals(fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode.%%, stepModel.getSynchronizeMode())};
+ value:{fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode.%%};
+ action:{new fr.ird.observe.client.datasource.actions.synchronize.SelectSynchronizeMode(fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode.%%)};
}
+
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchronizeMode.java → client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeMode.java
=====================================
@@ -1,4 +1,4 @@
-package fr.ird.observe.client.datasource.actions.synchronize.referential.ng;
+package fr.ird.observe.client.datasource.actions.synchronize;
/*-
* #%L
@@ -30,7 +30,7 @@ import io.ultreia.java4all.i18n.spi.enumeration.TranslateEnumeration;
import javax.swing.KeyStroke;
/**
- * Type de synchronisation de référentiel. Définit quelles bases sont en écriture.
+ * Synchronize mode, defines on which side we can write.
* <p>
* Created on 10/08/16.
*
@@ -38,8 +38,7 @@ import javax.swing.KeyStroke;
* @since 5.0
*/
@TranslateEnumeration(name = I18nDecoratorHelper.I18N_CONSTANT_LABEL, pattern = I18nDecoratorHelper.I18N_CONSTANT_LABEL_PATTERN)
-public enum ReferentialSynchronizeMode {
-
+public enum SynchronizeMode {
/**
* La base de gauche est en lecture, la base de droite est en écriture.
*/
@@ -52,7 +51,6 @@ public enum ReferentialSynchronizeMode {
* La base de gauche est en écriture, la base de droite est en écriture.
*/
BOTH(true, true, "copyToBoth");
-
/**
* Est ce que la source de gauche est en écriture ?
*/
@@ -66,7 +64,7 @@ public enum ReferentialSynchronizeMode {
private final String iconName;
- ReferentialSynchronizeMode(boolean leftWrite, boolean rightWrite, String iconName) {
+ SynchronizeMode(boolean leftWrite, boolean rightWrite, String iconName) {
this.leftWrite = leftWrite;
this.rightWrite = rightWrite;
this.keyStroke = ObserveKeyStrokesSupport.getFunctionKeyStroke(ordinal() + 1);
@@ -90,6 +88,6 @@ public enum ReferentialSynchronizeMode {
}
public String getLabel() {
- return ReferentialSynchronizeModeI18n.getLabel(this);
+ return SynchronizeModeI18n.getLabel(this);
}
}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/SynchronizeModel.java
=====================================
@@ -0,0 +1,73 @@
+package fr.ird.observe.client.datasource.actions.synchronize;
+
+/*-
+ * #%L
+ * ObServe Client :: DataSource :: Actions
+ * %%
+ * Copyright (C) 2008 - 2024 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.AdminActionModel;
+import fr.ird.observe.client.datasource.actions.AdminUI;
+import fr.ird.observe.client.datasource.actions.AdminUIModel;
+import fr.ird.observe.client.datasource.actions.synchronize.data.DataSynchroModel;
+import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
+import io.ultreia.java4all.bean.JavaBean;
+
+/**
+ * Contract of {@link AdminActionModel} model when using synchronize mode.
+ * <p>
+ * Created at 25/06/2024.
+ *
+ * @author Tony Chemit - dev(a)tchemit.fr
+ * @since 9.3.6
+ */
+public interface SynchronizeModel extends JavaBean {
+
+ String SYNCHRONIZE_MODE_PROPERTY_NAME = "synchronizeMode";
+
+ SynchronizeMode getSynchronizeMode();
+
+ void setSynchronizeMode(SynchronizeMode synchronizeMode);
+
+ default void start(AdminUIModel uiModel) {
+
+ addPropertyChangeListener(SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
+ if (uiModel.isWasStarted()) {
+ // on ne propage plus rien (il n'y a plus de configuration possible...)
+ return;
+ }
+ uiModel.validate();
+ });
+
+ setSynchronizeMode(SynchronizeMode.FROM_LEFT_TO_RIGHT);
+ }
+
+ default void afterInit(AdminUI parentUI) {
+ addPropertyChangeListener(DataSynchroModel.SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
+ SynchronizeMode newValue = (SynchronizeMode) evt.getNewValue();
+ if (parentUI.getTabs().getComponentCount() > 1 && newValue != null) {
+ parentUI.getTabs().setTitleAt(1, getTitleWithMode(newValue));
+ }
+ });
+ }
+
+ boolean isCanWrite(DataSourceSelectorModel dataSourceSelectorModel);
+
+ String getTitleWithMode(SynchronizeMode mode);
+}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/DataSynchroConfigUI.jaxx
=====================================
@@ -0,0 +1,50 @@
+<!--
+ #%L
+ ObServe Client :: DataSource :: Actions
+ %%
+ Copyright (C) 2008 - 2023 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%
+ -->
+<JPanel id="dataSynchronizeConfig" layout="{new BorderLayout()}" implements="fr.ird.observe.client.datasource.actions.synchronize.SynchronizeConfigUI">
+
+ <style source="../SynchronizeConfigUI.jcss"/>
+ <import>
+ fr.ird.observe.client.datasource.actions.AdminUIModel
+
+ io.ultreia.java4all.i18n.I18n
+
+ static io.ultreia.java4all.i18n.I18n.t
+ static fr.ird.observe.client.util.UIHelper.getStringValue
+ </import>
+
+ <DataSynchroUIHandler id='handler' initializer='getContextValue(DataSynchroUIHandler.class)'/>
+ <AdminUIModel id='model' initializer='getContextValue(AdminUIModel.class)'/>
+ <DataSynchroModel id='stepModel' initializer='model.getDataSynchroModel()'/>
+ <ButtonGroup id='synchronizeMode'/>
+
+ <script><![CDATA[
+public void destroy() {
+ model = null;
+ stepModel = null;
+}
+]]>
+ </script>
+
+ <JPanel id="synchronizeConfigPanel" constraints='BorderLayout.CENTER' layout='{new GridLayout(0, 1)}'>
+ <JToggleButton id="FROM_LEFT_TO_RIGHT" styleClass="synchronizeMode"/>
+ <JToggleButton id="FROM_RIGHT_TO_LEFT" styleClass="synchronizeMode"/>
+ <JToggleButton id="BOTH" styleClass="synchronizeMode"/>
+ </JPanel>
+</JPanel>
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/DataSynchroModel.java
=====================================
@@ -25,11 +25,14 @@ package fr.ird.observe.client.datasource.actions.synchronize.data;
import fr.ird.observe.client.datasource.actions.AdminActionModel;
import fr.ird.observe.client.datasource.actions.AdminStep;
import fr.ird.observe.client.datasource.actions.AdminUIModel;
+import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
+import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeModel;
import fr.ird.observe.client.datasource.actions.synchronize.data.tree.DataSelectionTreePaneModel;
import fr.ird.observe.client.datasource.api.data.DataTaskSupport;
import fr.ird.observe.client.datasource.api.data.TaskSide;
import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
import fr.ird.observe.datasource.configuration.ObserveDataSourceInformation;
+import io.ultreia.java4all.i18n.I18n;
import io.ultreia.java4all.util.TwoSideContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -43,8 +46,7 @@ import javax.swing.DefaultListModel;
* @author Tony Chemit - dev(a)tchemit.fr
* @since 5.0
*/
-public class DataSynchroModel extends AdminActionModel implements TwoSideContext<TaskSide, DataSelectionTreePaneModel> {
-
+public class DataSynchroModel extends AdminActionModel implements SynchronizeModel, TwoSideContext<TaskSide, DataSelectionTreePaneModel> {
public static final String LEFT_MODEL = "leftModel";
public static final String RIGHT_MODEL = "rightModel";
private static final String TASKS_EMPTY_PROPERTY_NAME = "tasksEmpty";
@@ -57,11 +59,14 @@ public class DataSynchroModel extends AdminActionModel implements TwoSideContext
* Right model.
*/
private final DataSelectionTreePaneModel rightModel = new DataSelectionTreePaneModel();
-
/**
* Registered tasks to apply.
*/
private final DefaultListModel<DataTaskSupport> tasks = new DefaultListModel<>();
+ /**
+ * Synchronize mode.
+ */
+ private SynchronizeMode synchronizeMode;
public DataSynchroModel() {
super(AdminStep.DATA_SYNCHRONIZE);
@@ -86,6 +91,29 @@ public class DataSynchroModel extends AdminActionModel implements TwoSideContext
rightSourceModel.setRequiredReadOnReferential(true);
rightSourceModel.setRequiredReadOnData(true);
fireTasksEmptyChanged();
+ SynchronizeModel.super.start(uiModel);
+ }
+
+ @Override
+ public boolean isCanWrite(DataSourceSelectorModel dataSourceSelectorModel) {
+ return dataSourceSelectorModel.isCanWriteData();
+ }
+
+ @Override
+ public String getTitleWithMode(SynchronizeMode mode) {
+ return I18n.t("observe.ui.datasource.editor.actions.synchro.data.withMode", mode.getLabel());
+ }
+
+ @Override
+ public SynchronizeMode getSynchronizeMode() {
+ return synchronizeMode;
+ }
+
+ @Override
+ public void setSynchronizeMode(SynchronizeMode synchronizeMode) {
+ Object oldValue = getSynchronizeMode();
+ this.synchronizeMode = synchronizeMode;
+ firePropertyChange(SYNCHRONIZE_MODE_PROPERTY_NAME, oldValue, synchronizeMode);
}
@Override
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/DataSynchroUIHandler.java
=====================================
@@ -29,6 +29,7 @@ import fr.ird.observe.client.datasource.actions.synchronize.data.tree.DataSelect
import fr.ird.observe.client.datasource.api.data.TaskSide;
import fr.ird.observe.client.datasource.editor.api.selection.actions.SelectUnselectWithOpposite;
import fr.ird.observe.client.datasource.editor.api.wizard.StorageUIModel;
+import fr.ird.observe.client.util.UIHelper;
import fr.ird.observe.client.util.init.UIInitHelper;
import org.nuiton.jaxx.runtime.spi.UIHandler;
@@ -64,8 +65,8 @@ class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> implements U
SelectUnselectWithOpposite.init(ui.getLeftTreePane().getTree(), null, new SelectUnselectWithOpposite(ui.getRightTreePane().getTree()));
JScrollPane descriptionPane = ui.getDescriptionPane();
descriptionPane.getParent().remove(descriptionPane);
-
hideFixedPanelLabel(ui);
+ ui.getStepModel().afterInit(parentUI);
}
@Override
@@ -75,7 +76,10 @@ class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> implements U
configUI.getLeftSourceConfig().getSourceInfoLabel().setText(t("observe.ui.action.config.export.required.read.data"));
configUI.getRightSourceConfig().getSourceInfoLabel().setText(t("observe.ui.action.config.export.required.read.data"));
configUI.getRightSourceModel().setSourceLabel(t("observe.ui.datasource.storage.config.right.storage"));
+ DataSynchroConfigUI extraConfig = new DataSynchroConfigUI(UIHelper.initialContext(configUI, this));
+ configUI.getExtraConfig().add(extraConfig);
ConfigModel configModel = configUI.getStepModel();
+ configModel.addPropertyChangeListener(StorageUIModel.VALID_STEP_PROPERTY_NAME, evt -> extraConfig.updateSynchroModes());
configModel.addPropertyChangeListener(StorageUIModel.VALID_PROPERTY_NAME, evt -> getModel().validate());
}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/actions/Start.java
=====================================
@@ -72,12 +72,18 @@ public class Start extends DataSynchroUIActionSupport {
rightModel.setSource(rightSource);
DataSelectionTreePane leftTreePane = tabUI.getLeftTreePane();
- DataSelectionTreePaneHandler.initDatasource(configModel.getLeftSourceModel(), rightSource.getDataSourceInformation().canWriteData() && (rightSource.isLocal() || rightSource.getDataSourceInformation().canWriteReferential()), leftTreePane, leftModel.getIdStates());
+ boolean rightCanWrite = rightSource.getDataSourceInformation().canWriteData()
+ && configModel.getRightSourceModel().isCanWriteReferential()
+ && stepModel.getSynchronizeMode().isRightWrite();
+ DataSelectionTreePaneHandler.initDatasource(configModel.getLeftSourceModel(), rightCanWrite, stepModel.getSynchronizeMode().isLeftWrite(),leftTreePane, leftModel.getIdStates());
progressModel.increments();
sendMessage(t("observe.ui.datasource.editor.actions.synchro.data.message.data.loaded", leftSourceLabel));
DataSelectionTreePane rightTreePane = tabUI.getRightTreePane();
- DataSelectionTreePaneHandler.initDatasource(configModel.getRightSourceModel(), leftSource.getDataSourceInformation().canWriteData() && (leftSource.isLocal() || leftSource.getDataSourceInformation().canWriteReferential()), rightTreePane, rightModel.getIdStates());
+ boolean leftCanWrite = leftSource.getDataSourceInformation().canWriteData()
+ && configModel.getLeftSourceModel().isCanWriteReferential()
+ && stepModel.getSynchronizeMode().isLeftWrite();
+ DataSelectionTreePaneHandler.initDatasource(configModel.getRightSourceModel(), leftCanWrite, stepModel.getSynchronizeMode().isRightWrite(),rightTreePane, rightModel.getIdStates());
progressModel.increments();
sendMessage(t("observe.ui.datasource.editor.actions.synchro.data.message.data.loaded", rightSourceLabel));
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/tree/DataSelectionTreePane.jaxx
=====================================
@@ -30,9 +30,10 @@
<JToggleButton id="toggleNewer"/>
<JToggleButton id="toggleOlder"/>
<JToggleButton id="toggleEquals"/>
- <JSeparator orientation='{JSeparator.VERTICAL}'/>
- <JButton id="copy" enabled="false"/>
- <JButton id="delete" enabled="false"/>
</JToolBar>
<SelectionTreePane id='tree' constructorParams="!side.onLeft()" constraints='BorderLayout.CENTER'/>
+ <JToolBar id="middleActions" layout="{new GridLayout(0, 1)}" constraints='BorderLayout.EAST'>
+ <JButton id="copy" enabled="false" visible="{model.isCanCopy()}"/>
+ <JButton id="delete" enabled="false" visible="{model.isCanDelete()}"/>
+ </JToolBar>
</JPanel>
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/data/tree/DataSelectionTreePaneHandler.java
=====================================
@@ -49,6 +49,7 @@ import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.tree.TreePath;
+import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseAdapter;
@@ -63,9 +64,8 @@ import java.util.function.Consumer;
*/
public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTreePane> {
- private static final Logger log = LogManager.getLogger(DataSelectionTreePaneHandler.class);
-
public static final TwoSideContext<TaskSide, String> MODEL_NAMES = TwoSideContext.of(DataSynchroModel.LEFT_MODEL, DataSynchroModel.RIGHT_MODEL);
+ private static final Logger log = LogManager.getLogger(DataSelectionTreePaneHandler.class);
static DataSelectionTreePaneModel getModel(DataSelectionTreePane ui) {
return ui.getContextValue(DataSelectionTreePaneModel.class, MODEL_NAMES.onSameSide(ui.getSide()));
@@ -92,6 +92,11 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree
for (Component component : ui.getToolbar().getComponents()) {
treePane.getToolbar().add(component);
}
+ boolean isLeft = taskSide.onLeft();
+ if (!isLeft) {
+ ui.remove(ui.getMiddleActions());
+ ui.add(ui.getMiddleActions(), BorderLayout.WEST);
+ }
Consumer<TreeConfigUI> consumer = TreeConfigUIHandler::hideOptions;
Consumer<TreeConfigUI> apply = u -> rebuildTree(parent.getModel().getDataSynchroModel(), ui, true);
@@ -104,8 +109,7 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree
DataSelectionTreePaneModel model = ui.getModel();
model.setSelectionDataModel(treeModel);
// When model idStates has changed, rebuild the tree (but not the flat model)
- model.addPropertyChangeListener(DataSelectionTreePaneModel.ID_STATES_PROPERTY_NAME,
- evt -> DataSelectionTreePaneHandler.rebuildTree(parent.getStepModel(), ui, false));
+ model.addPropertyChangeListener(DataSelectionTreePaneModel.ID_STATES_PROPERTY_NAME, evt -> rebuildTree(parent.getStepModel(), ui, false));
// When tree model has changed, rebuild accessibility to copy and delete action
treeModel.addPropertyChangeListener(evt -> {
@@ -131,11 +135,11 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree
});
}
- public static void initDatasource(DataSourceSelectorModel sourceModel, boolean oppositeCanWrite, DataSelectionTreePane ui, EnumSet<IdState> idStates) {
+ public static void initDatasource(DataSourceSelectorModel sourceModel, boolean oppositeCanWrite, boolean canWrite, DataSelectionTreePane ui, EnumSet<IdState> idStates) {
ui.setContextValue(sourceModel);
- boolean canWriteData = sourceModel.getDataSourceInformation().canWriteData();
+ boolean canWriteData = canWrite && sourceModel.isCanWriteData();
Color color = canWriteData ? Color.BLACK : Color.RED;
ui.getModel().setCanCopy(oppositeCanWrite);
ui.getModel().setCanDelete(canWriteData);
@@ -179,5 +183,4 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree
public void beforeInit(DataSelectionTreePane ui) {
ui.setComponentPopupMenu(new JPopupMenu());
}
-
}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroConfigUI.jaxx
=====================================
@@ -17,21 +17,14 @@
<http://www.gnu.org/licenses/gpl-3.0.html>.
#L%
-->
-<JPanel id="referentialSynchronizeConfig" layout="{new BorderLayout()}">
+<JPanel id="referentialSynchronizeConfig" layout="{new BorderLayout()}" implements="fr.ird.observe.client.datasource.actions.synchronize.SynchronizeConfigUI">
+ <style source="../../SynchronizeConfigUI.jcss"/>
<import>
- fr.ird.observe.client.configuration.ClientConfig
- fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode
- fr.ird.observe.client.datasource.actions.synchronize.referential.ng.actions.SelectReferentialSynchronizeMode
fr.ird.observe.client.datasource.actions.AdminUIModel
- org.nuiton.validator.NuitonValidatorScope
io.ultreia.java4all.i18n.I18n
- java.io.File
- java.util.Objects
- javax.swing.JComboBox
-
static io.ultreia.java4all.i18n.I18n.t
static fr.ird.observe.client.util.UIHelper.getStringValue
</import>
@@ -49,7 +42,7 @@ public void destroy() {
]]>
</script>
- <JPanel id="referentialSynchronizeConfigPanel" constraints='BorderLayout.CENTER' layout='{new GridLayout(0, 1)}'>
+ <JPanel id="synchronizeConfigPanel" constraints='BorderLayout.CENTER' layout='{new GridLayout(0, 1)}'>
<JToggleButton id="FROM_LEFT_TO_RIGHT" styleClass="synchronizeMode"/>
<JToggleButton id="FROM_RIGHT_TO_LEFT" styleClass="synchronizeMode"/>
<JToggleButton id="BOTH" styleClass="synchronizeMode"/>
@@ -57,8 +50,7 @@ public void destroy() {
<Table constraints='BorderLayout.SOUTH' weightx='1'>
<row>
<cell>
- <JCheckBox id='showProperties'
- onStateChanged='getStepModel().setShowProperties(((JCheckBox)event.getSource()).isSelected())'/>
+ <JCheckBox id='showProperties' onStateChanged='getStepModel().setShowProperties(((JCheckBox)event.getSource()).isSelected())'/>
</cell>
</row>
<row>
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroConfigUI.jcss
=====================================
@@ -20,22 +20,6 @@
* #L%
*/
-#referentialSynchronizeConfigPanel {
- border:{new TitledBorder(t("observe.ui.datasource.editor.actions.synchro.referential.config.mode") + "")};
-}
-
-#synchronizeMode {
- selectedValue:{stepModel.getSynchronizeMode()};
-}
-
-.synchronizeMode {
- buttonGroup:"synchronizeMode";
- enabled:false;
- selected:{Objects.equals(ReferentialSynchronizeMode.%%, stepModel.getSynchronizeMode())};
- value:{ReferentialSynchronizeMode.%%};
- action:{new SelectReferentialSynchronizeMode(ReferentialSynchronizeMode.%%)};
-}
-
#showProperties {
text:"observe.ui.action.show.properties";
toolTipText:"observe.ui.action.show.properties.tip";
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroModel.java
=====================================
@@ -27,6 +27,8 @@ import fr.ird.observe.client.datasource.actions.AdminActionModel;
import fr.ird.observe.client.datasource.actions.AdminStep;
import fr.ird.observe.client.datasource.actions.AdminUIModel;
import fr.ird.observe.client.datasource.actions.config.ConfigModel;
+import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
+import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeModel;
import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.task.ReferentialSynchronizeTaskListModel;
import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.task.SwingReferentialSynchronizeTask;
import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSynchronizeTreeModel;
@@ -43,6 +45,7 @@ import fr.ird.observe.services.service.referential.SynchronizeEngine;
import fr.ird.observe.services.service.referential.differential.DifferentialModelBuilder;
import fr.ird.observe.services.service.referential.differential.DifferentialType;
import fr.ird.observe.services.service.referential.synchro.SynchronizeTaskType;
+import io.ultreia.java4all.i18n.I18n;
import io.ultreia.java4all.util.LeftOrRight;
import io.ultreia.java4all.util.LeftOrRightContext;
import org.apache.logging.log4j.LogManager;
@@ -64,9 +67,8 @@ import java.util.Set;
* @since 5.0
*/
@SuppressWarnings("unused")
-public class ReferentialSynchroModel extends AdminActionModel {
+public class ReferentialSynchroModel extends AdminActionModel implements SynchronizeModel {
- public static final String SYNCHRONIZE_MODE_PROPERTY_NAME = "synchronizeMode";
public static final String SHOW_PROPERTIES_PROPERTY_NAME = "showProperties";
public static final String LEFT_SOURCE_PROPERTY_NAME = "leftSource";
public static final String RIGHT_SOURCE_PROPERTY_NAME = "rightSource";
@@ -91,7 +93,7 @@ public class ReferentialSynchroModel extends AdminActionModel {
private final LeftOrRightContext<ReferentialSynchronizeTreeModel> treeModels;
private ObserveSwingDataSource leftSource;
private ObserveSwingDataSource rightSource;
- private ReferentialSynchronizeMode synchronizeMode;
+ private SynchronizeMode synchronizeMode;
private boolean showProperties;
private ReferentialSynchronizeTreeModel leftTreeModel;
private ReferentialSynchronizeTreeModel rightTreeModel;
@@ -147,6 +149,17 @@ public class ReferentialSynchroModel extends AdminActionModel {
};
}
+ @Override
+ public boolean isCanWrite(DataSourceSelectorModel dataSourceSelectorModel) {
+ return dataSourceSelectorModel.isCanWriteReferential();
+ }
+
+ @Override
+ public String getTitleWithMode(SynchronizeMode mode) {
+ return I18n.t("observe.ui.datasource.editor.actions.synchro.referential.withMode", mode.getLabel());
+ }
+
+
@Override
public void start(AdminUIModel uiModel) {
@@ -154,21 +167,13 @@ public class ReferentialSynchroModel extends AdminActionModel {
configModel.getLeftSourceModel().setRequiredReadOnReferential(true);
configModel.getRightSourceModel().setRequiredReadOnReferential(true);
- addPropertyChangeListener(SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
- if (uiModel.isWasStarted()) {
- // on ne propage plus rien (il n'y a plus de configuration possible...)
- log.debug("Stop propagation, was started... " + evt.getPropertyName());
- return;
- }
- uiModel.validate();
- });
- setSynchronizeMode(ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT);
+ SynchronizeModel.super.start(uiModel);
setShowProperties(true);
}
@Override
public boolean validateConfig(AdminUIModel uiModel) {
- ReferentialSynchronizeMode synchronizeMode = uiModel.getReferentialSynchroModel().getSynchronizeMode();
+ SynchronizeMode synchronizeMode = uiModel.getReferentialSynchroModel().getSynchronizeMode();
if (synchronizeMode == null) {
log.info("No synchronize mode selected");
return false;
@@ -212,11 +217,13 @@ public class ReferentialSynchroModel extends AdminActionModel {
rightTreeModel = null;
}
- public ReferentialSynchronizeMode getSynchronizeMode() {
+ @Override
+ public SynchronizeMode getSynchronizeMode() {
return synchronizeMode;
}
- public void setSynchronizeMode(ReferentialSynchronizeMode synchronizeMode) {
+ @Override
+ public void setSynchronizeMode(SynchronizeMode synchronizeMode) {
Object oldValue = getSynchronizeMode();
this.synchronizeMode = synchronizeMode;
firePropertyChange(SYNCHRONIZE_MODE_PROPERTY_NAME, oldValue, synchronizeMode);
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/ReferentialSynchroUIHandler.java
=====================================
@@ -23,17 +23,12 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng;
*/
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.editor.api.wizard.StorageUIModel;
-import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
import fr.ird.observe.client.util.UIHelper;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
import org.nuiton.jaxx.runtime.spi.UIHandler;
import javax.swing.ToolTipManager;
-import java.util.EnumSet;
import static io.ultreia.java4all.i18n.I18n.t;
@@ -45,21 +40,13 @@ import static io.ultreia.java4all.i18n.I18n.t;
*/
public class ReferentialSynchroUIHandler extends AdminTabUIHandler<ReferentialSynchroUI> implements UIHandler<ReferentialSynchroUI> {
- private static final Logger log = LogManager.getLogger(ReferentialSynchroUIHandler.class);
-
@Override
public void afterInit(ReferentialSynchroUI ui) {
super.afterInit(ui);
setAutoStart(ui.getStart());
ui.getLeftTreePane().init();
ui.getRightTreePane().init();
- ui.getStepModel().addPropertyChangeListener(ReferentialSynchroModel.SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
-
- ReferentialSynchronizeMode newValue = (ReferentialSynchronizeMode) evt.getNewValue();
- if (parentUI.getTabs().getComponentCount() > 1 && newValue != null) {
- parentUI.getTabs().setTitleAt(1, t("observe.ui.datasource.editor.actions.synchro.referential.withMode", newValue.getLabel()));
- }
- });
+ ui.getStepModel().afterInit(parentUI);
hideFixedPanelLabel(ui);
ToolTipManager.sharedInstance().registerComponent(ui.getLeftTreePane().getTree());
ToolTipManager.sharedInstance().registerComponent(ui.getRightTreePane().getTree());
@@ -72,50 +59,6 @@ public class ReferentialSynchroUIHandler extends AdminTabUIHandler<ReferentialSy
configUI.getExtraConfig().add(extraConfig);
configUI.getLeftSourceModel().setSourceLabel(t("observe.ui.datasource.storage.config.left.storage"));
configUI.getRightSourceModel().setSourceLabel(t("observe.ui.datasource.storage.config.right.storage"));
- configUI.getStepModel().addPropertyChangeListener(StorageUIModel.VALID_STEP_PROPERTY_NAME, evt -> updateSynchroModes(extraConfig));
- }
-
- private void updateSynchroModes(ReferentialSynchroConfigUI extraConfig) {
- AdminUIModel model = getUi().getModel();
- ReferentialSynchronizeMode synchronizeMode = model.getReferentialSynchroModel().getSynchronizeMode();
- log.info(String.format("Will update synchro modes (previous value: %s)", synchronizeMode));
- DataSourceSelectorModel leftSourceModel = model.getConfigModel().getLeftSourceModel();
- if (!leftSourceModel.isInit()) {
- return;
- }
- DataSourceSelectorModel rightSourceModel = model.getConfigModel().getRightSourceModel();
- if (!rightSourceModel.isInit()) {
- return;
- }
- boolean dataSourcesValid = leftSourceModel.validateExt() && rightSourceModel.validateExt();
- boolean leftToRightEnabled = dataSourcesValid && rightSourceModel.isCanWriteReferential();
- log.debug(String.format("Update synchro modes: leftToRight: %s", leftToRightEnabled));
- boolean rightToLeftEnabled = dataSourcesValid && leftSourceModel.isCanWriteReferential();
- log.debug(String.format("Update synchro modes: rightToLeft: %s", rightToLeftEnabled));
- boolean bothEnabled = leftToRightEnabled && rightToLeftEnabled;
- log.debug(String.format("Update synchro modes: both: %s", bothEnabled));
- extraConfig.getFROM_LEFT_TO_RIGHT().setEnabled(leftToRightEnabled);
- extraConfig.getFROM_RIGHT_TO_LEFT().setEnabled(rightToLeftEnabled);
- extraConfig.getBOTH().setEnabled(bothEnabled);
- EnumSet<ReferentialSynchronizeMode> candidates = EnumSet.allOf(ReferentialSynchronizeMode.class);
- if (!leftToRightEnabled) {
- candidates.remove(ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT);
- }
- if (!rightToLeftEnabled) {
- candidates.remove(ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT);
- }
- if (!bothEnabled) {
- candidates.remove(ReferentialSynchronizeMode.BOTH);
- }
- if (!candidates.contains(synchronizeMode)) {
- if (candidates.isEmpty()) {
- synchronizeMode = null;
- } else {
- synchronizeMode = candidates.iterator().next();
- }
- }
- log.info(String.format("Will update synchro modes (new value: %s)", synchronizeMode));
- model.getReferentialSynchroModel().setSynchronizeMode(null);
- model.getReferentialSynchroModel().setSynchronizeMode(synchronizeMode);
+ configUI.getStepModel().addPropertyChangeListener(StorageUIModel.VALID_STEP_PROPERTY_NAME, evt -> extraConfig.updateSynchroModes());
}
}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/actions/Start.java
=====================================
@@ -23,9 +23,9 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.acti
*/
import fr.ird.observe.client.datasource.actions.AdminUIModel;
+import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroModel;
import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroUI;
-import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSelectionTree;
import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSelectionTreePane;
import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSynchronizeTreeModel;
@@ -66,7 +66,7 @@ public class Start extends ReferentialSynchroUIActionSupport {
try (ObserveSwingDataSource rightSource = ui.getModel().getConfigModel().getRightSourceModel().getSafeSource(true)) {
stepModel.setRightSource(rightSource);
DifferentialModelBuilder engine = stepModel.newDifferentialModelBuilder();
- ReferentialSynchronizeMode synchronizeMode = stepModel.getSynchronizeMode();
+ SynchronizeMode synchronizeMode = stepModel.getSynchronizeMode();
ProgressionModel progressionModel = stepModel.getProgressModel();
ReferentialSynchronizeTreeModelsBuilder treeModelsBuilder = new ReferentialSynchronizeTreeModelsBuilder(synchronizeMode, stepModel.isShowProperties(), engine, progressionModel);
LeftOrRightContext<ReferentialSynchronizeTreeModel> treePair = treeModelsBuilder.build();
@@ -97,11 +97,11 @@ public class Start extends ReferentialSynchroUIActionSupport {
private void initTree(ReferentialSelectionTreePane pane, ReferentialSynchronizeTreeModel treeModel, DataSourceSelectorModel dataSourceSelectorModel, String message, PropertyChangeListener listener) {
ReferentialSelectionTree tree = pane.getTree();
- ReferentialSynchronizeMode newValue = ui.getStepModel().getSynchronizeMode();
+ SynchronizeMode synchronizeMode = ui.getStepModel().getSynchronizeMode();
pane.setContextValue(dataSourceSelectorModel);
Color color =
- (treeModel.isLeft() && newValue.isLeftWrite() || !treeModel.isLeft() && newValue.isRightWrite()) ?
+ (treeModel.isLeft() && synchronizeMode.isLeftWrite() || !treeModel.isLeft() && synchronizeMode.isRightWrite()) ?
Color.BLACK : Color.RED;
pane.setBorder(new TitledBorder(""));
String label = dataSourceSelectorModel.getLabel();
@@ -110,9 +110,17 @@ public class Start extends ReferentialSynchroUIActionSupport {
pane.getDataSourceLabel().setText(dataSourceSelectorModel.getSource().getLabel() + " " + labelWithUrl);
pane.getDataSourceLabel().setForeground(color);
+ boolean isRight = pane.isRight();
+ boolean canCopy = isRight ? synchronizeMode.isLeftWrite() : synchronizeMode.isRightWrite();
+ boolean canRevert = isRight ? synchronizeMode.isRightWrite() : synchronizeMode.isLeftWrite();
+ pane.getCopy().setVisible(canCopy);
+ pane.getRevert().setVisible(canRevert);
+ pane.getDeactivate().setVisible(canRevert);
+ pane.getDeactivateWithReplace().setVisible(canRevert);
+ pane.getDelete().setVisible(canRevert);
+
tree.setModel(treeModel);
treeModel.addPropertyChangeListener(ReferentialSynchronizeTreeModel.SELECTED_COUNT, listener);
-
listener.propertyChange(null);
sendMessage(message);
}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/tree/ReferentialSelectionTreePaneHandler.java
=====================================
@@ -22,16 +22,17 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree
* #L%
*/
-import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroModel;
-import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroUI;
-import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroUIHandler;
-import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
-import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.*;
+import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterCopy;
+import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterDeactivate;
+import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterDeactivateWithReplacement;
+import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterDelete;
+import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterRevert;
+import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.SelectUnselect;
import fr.ird.observe.client.util.init.DefaultUIInitializer;
import io.ultreia.java4all.util.LeftOrRight;
import org.nuiton.jaxx.runtime.spi.UIHandler;
-import java.awt.*;
+import java.awt.BorderLayout;
/**
* @author Tony Chemit - dev(a)tchemit.fr
@@ -45,16 +46,13 @@ public class ReferentialSelectionTreePaneHandler implements UIHandler<Referentia
}
void init(ReferentialSelectionTreePane ui) {
- ReferentialSynchroUI parent = ui.getContextValue(ReferentialSynchroUI.class, ReferentialSynchroUIHandler.ADMIN_TAB_UI);
- ReferentialSynchroModel stepModel = parent.getStepModel();
- stepModel.addPropertyChangeListener(ReferentialSynchroModel.SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> onUpdateMode(ui, (ReferentialSynchronizeMode) evt.getNewValue()));
boolean isLeft = ui.isLeft();
- LeftOrRight side = isLeft?LeftOrRight.LEFT : LeftOrRight.RIGHT;
- RegisterCopy.init(ui, ui.copy, new RegisterCopy(ui, side));
- RegisterRevert.init(ui, ui.revert, new RegisterRevert(ui, side));
- RegisterDeactivate.init(ui, ui.deactivate, new RegisterDeactivate(ui, side));
- RegisterDeactivateWithReplacement.init(ui, ui.deactivateWithReplace, new RegisterDeactivateWithReplacement(ui, side));
- RegisterDelete.init(ui, ui.delete, new RegisterDelete(ui, side));
+ LeftOrRight side = isLeft ? LeftOrRight.LEFT : LeftOrRight.RIGHT;
+ RegisterCopy.init(ui, ui.getCopy(), new RegisterCopy(ui, side));
+ RegisterRevert.init(ui, ui.getRevert(), new RegisterRevert(ui, side));
+ RegisterDeactivate.init(ui, ui.getDeactivate(), new RegisterDeactivate(ui, side));
+ RegisterDeactivateWithReplacement.init(ui, ui.getDeactivateWithReplace(), new RegisterDeactivateWithReplacement(ui, side));
+ RegisterDelete.init(ui, ui.getDelete(), new RegisterDelete(ui, side));
SelectUnselect.init(ui, null, new SelectUnselect(ui));
if (!isLeft) {
ui.remove(ui.getMiddleActions());
@@ -65,20 +63,5 @@ public class ReferentialSelectionTreePaneHandler implements UIHandler<Referentia
// an update is asked using the deleted data...)
ui.getMiddleActions().remove(ui.delete);
}
-
- private void onUpdateMode(ReferentialSelectionTreePane ui, ReferentialSynchronizeMode synchronizeMode) {
- if (synchronizeMode == null) {
- return;
- }
- boolean isRight = ui.isRight();
- boolean canCopy = isRight ? synchronizeMode.isLeftWrite() : synchronizeMode.isRightWrite();
- boolean canRevert = isRight ? synchronizeMode.isRightWrite() : synchronizeMode.isLeftWrite();
- ui.copy.setVisible(canCopy);
- ui.revert.setVisible(canRevert);
- ui.deactivate.setVisible(canRevert);
- ui.deactivateWithReplace.setVisible(canRevert);
- ui.delete.setVisible(canRevert);
- }
-
}
=====================================
client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/tree/ReferentialSynchronizeTreeModelsBuilder.java
=====================================
@@ -23,7 +23,7 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree
*/
import fr.ird.observe.client.WithClientUIContextApi;
-import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
+import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.node.ReferentialAddedSynchroNode;
import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.node.ReferentialPropertyUpdatedNode;
import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.node.ReferentialSynchroNodeSupport;
@@ -130,7 +130,7 @@ public class ReferentialSynchronizeTreeModelsBuilder implements WithClientUICont
}
- public ReferentialSynchronizeTreeModelsBuilder(ReferentialSynchronizeMode synchronizeMode, boolean showProperties, DifferentialModelBuilder engine, ProgressionModel progressionModel) {
+ public ReferentialSynchronizeTreeModelsBuilder(SynchronizeMode synchronizeMode, boolean showProperties, DifferentialModelBuilder engine, ProgressionModel progressionModel) {
this.engine = Objects.requireNonNull(engine);
this.leftRootNode = new RootSynchroNode(true, Objects.requireNonNull(synchronizeMode).isLeftWrite(), showProperties);
this.rightRootNode = new RootSynchroNode(false, synchronizeMode.isRightWrite(), showProperties);
=====================================
client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/wizard/connexion/DataSourceSelectorModel.java
=====================================
@@ -134,6 +134,10 @@ public class DataSourceSelectorModel extends StorageUIModel {
return isLocal() || Optional.ofNullable(getDataSourceInformation()).map(ObserveDataSourceInformation::canWriteReferential).orElse(false);
}
+ public boolean isCanWriteData() {
+ return isLocal() || Optional.ofNullable(getDataSourceInformation()).map(ObserveDataSourceInformation::canWriteData).orElse(false);
+ }
+
public boolean validateExt() {
setValidationMessage(null);
if (!isValid()) {
=====================================
client/runner/src/main/i18n/translations/client-runner_en_GB.properties
=====================================
@@ -208,9 +208,6 @@ observe.constant.ObstunaAdminAction.SECURITY=Update security
observe.constant.ObstunaAdminAction.SECURITY.description=Update security
observe.constant.ObstunaAdminAction.UPDATE=Update
observe.constant.ObstunaAdminAction.UPDATE.description=Update a database
-observe.constant.ReferentialSynchronizeMode.BOTH=Bi directional
-observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT=From left to right
-observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT=From right to left
observe.constant.StorageStep.BACKUP=Save
observe.constant.StorageStep.BACKUP.description=Save local database before changing data source
observe.constant.StorageStep.CHOOSE_DB_MODE=Mode
@@ -227,6 +224,9 @@ observe.constant.StorageStep.ROLES=Security
observe.constant.StorageStep.ROLES.description=Apply security on database roles
observe.constant.StorageStep.SELECT_DATA=Data selection
observe.constant.StorageStep.SELECT_DATA.description=Select data to export in backup
+observe.constant.SynchronizeMode.BOTH=Bi directional
+observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT=From left to right
+observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT=From right to left
observe.constant.ValidationModelMode.DATA=Only data
observe.constant.ValidationModelMode.DATA.description=Only data
observe.constant.ValidationModelMode.REFERENTIEL=Only referential
@@ -592,6 +592,7 @@ observe.ui.datasource.editor.actions.report.variables=Variables configuration
observe.ui.datasource.editor.actions.saveLocal=Save local database
observe.ui.datasource.editor.actions.saveLocal.description=Save modifications on local database
observe.ui.datasource.editor.actions.synchro.cancel.tip=Cancel
+observe.ui.datasource.editor.actions.synchro.config.mode=Synchronisation mode
observe.ui.datasource.editor.actions.synchro.copy.tip=Copy result of report in clipboard
observe.ui.datasource.editor.actions.synchro.data=Advanced data management
observe.ui.datasource.editor.actions.synchro.data.actionsToPerform=Operations to perform
@@ -601,6 +602,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation=Get data fro
observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Database «%s» - Data loaded
observe.ui.datasource.editor.actions.synchro.data.title=Advanced data management
observe.ui.datasource.editor.actions.synchro.data.title.tip=Advanced data management
+observe.ui.datasource.editor.actions.synchro.data.withMode=Advanced data management (%s)
observe.ui.datasource.editor.actions.synchro.launch.operation=Launch operation < %1$S >
observe.ui.datasource.editor.actions.synchro.prepare.operation=Prepare operation < %1$s >
observe.ui.datasource.editor.actions.synchro.referential=Advanced referential management
@@ -614,7 +616,6 @@ observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromLeft.t
observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromRight.tip=Delete selected referential(s) from right database
observe.ui.datasource.editor.actions.synchro.referential.action.revertFromLeft.tip=Revert selected referential(s) into left database
observe.ui.datasource.editor.actions.synchro.referential.action.revertFromRight.tip=Revert selected referential(s) into right database
-observe.ui.datasource.editor.actions.synchro.referential.config.mode=Synchronisation mode
observe.ui.datasource.editor.actions.synchro.referential.description=Advanced referential management
observe.ui.datasource.editor.actions.synchro.referential.launch.operation=Compute differentials of referential
observe.ui.datasource.editor.actions.synchro.referential.legacy=Update referential
=====================================
client/runner/src/main/i18n/translations/client-runner_es_ES.properties
=====================================
@@ -208,9 +208,6 @@ observe.constant.ObstunaAdminAction.SECURITY=Actualización de seguridad de base
observe.constant.ObstunaAdminAction.SECURITY.description=Actualización de securidad de una base remota
observe.constant.ObstunaAdminAction.UPDATE=Actualización de une base remota
observe.constant.ObstunaAdminAction.UPDATE.description=Actualización de una base remota
-observe.constant.ReferentialSynchronizeMode.BOTH=Bidireccional
-observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT=De izquierda a derecha
-observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT=De derecha a izquierda
observe.constant.StorageStep.BACKUP=Copia de seguridad
observe.constant.StorageStep.BACKUP.description=Guardadar la base local antes de cambiar la fuente de datos
observe.constant.StorageStep.CHOOSE_DB_MODE=Modo
@@ -227,6 +224,9 @@ observe.constant.StorageStep.ROLES=Seguridad
observe.constant.StorageStep.ROLES.description=Configuración de la seguridad
observe.constant.StorageStep.SELECT_DATA=Selección de datos
observe.constant.StorageStep.SELECT_DATA.description=Seleccionar los datos a exportar en la copia de seguridad
+observe.constant.SynchronizeMode.BOTH=Bidireccional
+observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT=De izquierda a derecha
+observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT=De derecha a izquierda
observe.constant.ValidationModelMode.DATA=Datos
observe.constant.ValidationModelMode.DATA.description=Datos
observe.constant.ValidationModelMode.REFERENTIEL=Referencial
@@ -592,6 +592,7 @@ observe.ui.datasource.editor.actions.report.variables=Configuración de variable
observe.ui.datasource.editor.actions.saveLocal=Copia de seguridad de la base local
observe.ui.datasource.editor.actions.saveLocal.description=Guardar las modificationes realizadas en la base locale
observe.ui.datasource.editor.actions.synchro.cancel.tip=Cancelar
+observe.ui.datasource.editor.actions.synchro.config.mode=Modo de synchronización
observe.ui.datasource.editor.actions.synchro.copy.tip=Copiar el informe en el portapapeles
observe.ui.datasource.editor.actions.synchro.data=Gestión avanzada de los datos
observe.ui.datasource.editor.actions.synchro.data.actionsToPerform=Operaciones a realisar
@@ -601,6 +602,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation=Recuperar los
observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Base «%s» - Datos recuperadas.
observe.ui.datasource.editor.actions.synchro.data.title=Gestión avanzada de los datos
observe.ui.datasource.editor.actions.synchro.data.title.tip=Sincronización bi-directionnal de los datos de los usaurios
+observe.ui.datasource.editor.actions.synchro.data.withMode=Gestión avanzada de los datos (%s)
observe.ui.datasource.editor.actions.synchro.launch.operation=Comenzar la operación < %1$s >
observe.ui.datasource.editor.actions.synchro.prepare.operation=Preparar la operación <%1$s>
observe.ui.datasource.editor.actions.synchro.referential=Gestión avanzada del referencial
@@ -614,7 +616,6 @@ observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromLeft.t
observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromRight.tip=Eliminar el referencial seleccionado en la base de la derecha
observe.ui.datasource.editor.actions.synchro.referential.action.revertFromLeft.tip=Volver atrás el referencial seleccionado en la izquierda
observe.ui.datasource.editor.actions.synchro.referential.action.revertFromRight.tip=Volver atrás el referencial seleccionado en la derecha
-observe.ui.datasource.editor.actions.synchro.referential.config.mode=Modo de synchronización
observe.ui.datasource.editor.actions.synchro.referential.description=Gestión avanzada del referencial
observe.ui.datasource.editor.actions.synchro.referential.launch.operation=Calcular el diferencial de los referenciales de los fuentes de datos
observe.ui.datasource.editor.actions.synchro.referential.legacy=Actualización del referencial
=====================================
client/runner/src/main/i18n/translations/client-runner_fr_FR.properties
=====================================
@@ -208,9 +208,6 @@ observe.constant.ObstunaAdminAction.SECURITY=Mise à jour de la sécurité d'une
observe.constant.ObstunaAdminAction.SECURITY.description=Mise à jour de la sécurité d'une base distante
observe.constant.ObstunaAdminAction.UPDATE=Mise à jour d'une base distante
observe.constant.ObstunaAdminAction.UPDATE.description=Mise à jour d'une base distante
-observe.constant.ReferentialSynchronizeMode.BOTH=Bidirectionnel
-observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT=De la gauche vers la droite
-observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT=De la droite vers la gauche
observe.constant.StorageStep.BACKUP=Sauvegarde
observe.constant.StorageStep.BACKUP.description=Sauvegarder la base locale avant de changer de source de données
observe.constant.StorageStep.CHOOSE_DB_MODE=Mode
@@ -227,6 +224,9 @@ observe.constant.StorageStep.ROLES=Sécurité
observe.constant.StorageStep.ROLES.description=Mise en place de la sécurité
observe.constant.StorageStep.SELECT_DATA=Sélection données
observe.constant.StorageStep.SELECT_DATA.description=Sélectionner les données à exporter dans la sauvegarde
+observe.constant.SynchronizeMode.BOTH=Bidirectionnel
+observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT=De la gauche vers la droite
+observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT=De la droite vers la gauche
observe.constant.ValidationModelMode.DATA=Données
observe.constant.ValidationModelMode.DATA.description=Données
observe.constant.ValidationModelMode.REFERENTIEL=Référentiel
@@ -592,6 +592,7 @@ observe.ui.datasource.editor.actions.report.variables=Configuration des variable
observe.ui.datasource.editor.actions.saveLocal=Sauvegarde de la base locale
observe.ui.datasource.editor.actions.saveLocal.description=Sauvegarder les modifications effectuées vers la base locale
observe.ui.datasource.editor.actions.synchro.cancel.tip=Annuler
+observe.ui.datasource.editor.actions.synchro.config.mode=Mode de synchronisation
observe.ui.datasource.editor.actions.synchro.copy.tip=Copier le rapport dans le presse-papier
observe.ui.datasource.editor.actions.synchro.data=Gestion avancée de données
observe.ui.datasource.editor.actions.synchro.data.actionsToPerform=Opérations à réaliser
@@ -601,6 +602,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation=Récupérer l
observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Source «%s» - Données récupérées.
observe.ui.datasource.editor.actions.synchro.data.title=Gestion avancée de données
observe.ui.datasource.editor.actions.synchro.data.title.tip=Synchronisation bidirectionnelle des données utilisateurs
+observe.ui.datasource.editor.actions.synchro.data.withMode=Gestion avancée de données (%s)
observe.ui.datasource.editor.actions.synchro.launch.operation=Démarrer l'opération < %1$s >
observe.ui.datasource.editor.actions.synchro.prepare.operation=Préparer l'opération <%1$s>
observe.ui.datasource.editor.actions.synchro.referential=Gestion avancée du référentiel
@@ -614,7 +616,6 @@ observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromLeft.t
observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromRight.tip=Supprimer le référentiel sélectionnée de la base de droite
observe.ui.datasource.editor.actions.synchro.referential.action.revertFromLeft.tip=Revenir en arrière du référentiel sélectionné à gauche
observe.ui.datasource.editor.actions.synchro.referential.action.revertFromRight.tip=Revenir en arrière du référentiel sélectionné à droite
-observe.ui.datasource.editor.actions.synchro.referential.config.mode=Mode de synchronisation
observe.ui.datasource.editor.actions.synchro.referential.description=Gestion avancée du référentiel
observe.ui.datasource.editor.actions.synchro.referential.launch.operation=Calculer le différentiel des référentiels des sources de données
observe.ui.datasource.editor.actions.synchro.referential.legacy=Mise à jour du référentiel
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/0e65a2fd7e245efce1b45ee2…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/0e65a2fd7e245efce1b45ee2…
You're receiving this email because of your account on gitlab.com.
1
0
[Git][ultreiaio/ird-observe][develop] 8 commits: add ird-2024 specs
by Tony CHEMIT (@tchemit) 25 Jun '24
by Tony CHEMIT (@tchemit) 25 Jun '24
25 Jun '24
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
80fd609c by Tony Chemit at 2024-05-24T17:13:47+02:00
add ird-2024 specs
- - - - -
c0a42543 by Tony Chemit at 2024-05-24T17:14:28+02:00
[ui - map] improve i18n
- - - - -
dc1347a8 by Tony Chemit at 2024-06-03T10:49:56+02:00
add ird-2024 specs v2
- - - - -
dc6f49a7 by Tony Chemit at 2024-06-24T08:26:11+02:00
Mini erreur dans la doc du migrateur AVDTH - Closes #2894
- - - - -
863a699b by Tony Chemit at 2024-06-24T12:26:12+02:00
update pom
- - - - -
f139d232 by Tony Chemit at 2024-06-24T13:05:11+02:00
L'utilisation du bouton de création d'un FOB brut (sans présélection) ne fonctionne plus en mode serveur - Closes #2891
- - - - -
b9088155 by Tony Chemit at 2024-06-24T14:21:23+02:00
Les transcodages ASSOC ne sont plus totalement respectés par l'importeur AVDTH - Closes #2889
- - - - -
564508d6 by Tony Chemit at 2024-06-24T14:30:58+02:00
Une règle de migration AVDTH ASSOC non respectée - Closes #2896
- - - - -
8 changed files:
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/map/ObserveMapPaneLegendItem.java
- client/runner/src/main/i18n/translations/client-runner_en_GB.properties
- client/runner/src/main/i18n/translations/client-runner_es_ES.properties
- core/persistence/avdth/src/main/java/fr/ird/observe/persistence/avdth/data/logbook/ActivityReader.java
- core/persistence/avdth/src/main/java/fr/ird/observe/persistence/avdth/data/logbook/FloatingObjectReader.java
- + doc/specs/ird-2024/observe-ird-2024.md
- pom.xml
- src/site/markdown/avdth/logbook.md
Changes:
=====================================
client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/map/ObserveMapPaneLegendItem.java
=====================================
@@ -84,14 +84,14 @@ public class ObserveMapPaneLegendItem {
String label = this.label;
if (addPointCount && validCount > 0) {
if (validCount == 1) {
- label += " " + I18n.t("observe.ui.datasource.editor.content.map.legend.valid.count", validCount);
+ label += " " + I18n.t("observe.ui.datasource.editor.content.map.legend.valid.count");
} else {
label += " " + I18n.t("observe.ui.datasource.editor.content.map.legend.valid.counts", validCount);
}
}
if (notValidCount > 0) {
if (notValidCount == 1) {
- label += " " + I18n.t("observe.ui.datasource.editor.content.map.legend.not.valid.count", notValidCount);
+ label += " " + I18n.t("observe.ui.datasource.editor.content.map.legend.not.valid.count");
} else {
label += " " + I18n.t("observe.ui.datasource.editor.content.map.legend.not.valid.counts", notValidCount);
=====================================
client/runner/src/main/i18n/translations/client-runner_en_GB.properties
=====================================
@@ -715,16 +715,16 @@ observe.ui.datasource.editor.content.map.legend.logbook.hauling=Logbook - Haulin
observe.ui.datasource.editor.content.map.legend.logbook.setting=Logbook - Setting
observe.ui.datasource.editor.content.map.legend.logbook.trip=Logbook - Route
observe.ui.datasource.editor.content.map.legend.logbook.tripSegment=Logbook - Segment
-observe.ui.datasource.editor.content.map.legend.not.valid.count=( %d point are not displayed )
+observe.ui.datasource.editor.content.map.legend.not.valid.count=( one point is not displayed )
observe.ui.datasource.editor.content.map.legend.not.valid.counts=( %d points are not displayed )
observe.ui.datasource.editor.content.map.legend.obs.hauling=Observation - Hauling
observe.ui.datasource.editor.content.map.legend.obs.setting=Observation - Setting
observe.ui.datasource.editor.content.map.legend.obs.trip=Observation - Route
-observe.ui.datasource.editor.content.map.legend.obs.tripBetweenTwoDays=Night trip
+observe.ui.datasource.editor.content.map.legend.obs.tripBetweenTwoDays=Observation - Night trip
observe.ui.datasource.editor.content.map.legend.obs.tripDay=Observation - Day trip
observe.ui.datasource.editor.content.map.legend.tip=To display or hide legend
-observe.ui.datasource.editor.content.map.legend.valid.count=- %d point is displayed
-observe.ui.datasource.editor.content.map.legend.valid.counts=- %d point(s) are displayed
+observe.ui.datasource.editor.content.map.legend.valid.count=- one point is displayed
+observe.ui.datasource.editor.content.map.legend.valid.counts=- %d points are displayed
observe.ui.datasource.editor.content.map.legendBottom=Display legend at bottom
observe.ui.datasource.editor.content.map.legendBottom.tip=Display legend at bottom
observe.ui.datasource.editor.content.map.legendTop=Display legend at top
=====================================
client/runner/src/main/i18n/translations/client-runner_es_ES.properties
=====================================
@@ -715,7 +715,7 @@ observe.ui.datasource.editor.content.map.legend.logbook.hauling=Logbook - Arrast
observe.ui.datasource.editor.content.map.legend.logbook.setting=Logbook - Calada
observe.ui.datasource.editor.content.map.legend.logbook.trip=Logbook - Trayecto
observe.ui.datasource.editor.content.map.legend.logbook.tripSegment=Logbook - Trayecto
-observe.ui.datasource.editor.content.map.legend.not.valid.count=( %d point is not displayed )
+observe.ui.datasource.editor.content.map.legend.not.valid.count=( one point is not displayed )
observe.ui.datasource.editor.content.map.legend.not.valid.counts=( %d points are not displayed )
observe.ui.datasource.editor.content.map.legend.obs.hauling=Observation - Arrastre
observe.ui.datasource.editor.content.map.legend.obs.setting=Observation - Calada
@@ -723,7 +723,7 @@ observe.ui.datasource.editor.content.map.legend.obs.trip=Observation - Route
observe.ui.datasource.editor.content.map.legend.obs.tripBetweenTwoDays=Observation - Trayecto del noche
observe.ui.datasource.editor.content.map.legend.obs.tripDay=Observation - Trayecto
observe.ui.datasource.editor.content.map.legend.tip=To display or hide legend \#TODO
-observe.ui.datasource.editor.content.map.legend.valid.count=- %d point is displayed \#TODO
+observe.ui.datasource.editor.content.map.legend.valid.count=- one point is displayed \#TODO
observe.ui.datasource.editor.content.map.legend.valid.counts=- %d points are displayed \#TODO
observe.ui.datasource.editor.content.map.legendBottom=Display legend at bottom
observe.ui.datasource.editor.content.map.legendBottom.tip=Display legend at bottom
=====================================
core/persistence/avdth/src/main/java/fr/ird/observe/persistence/avdth/data/logbook/ActivityReader.java
=====================================
@@ -352,12 +352,13 @@ public class ActivityReader extends DataReader<Activity> {
activityObservedSystemTableReader.setPrimaryKey(activityPrimaryKey);
while (activityObservedSystemTableReader.hasNext()) {
ResultSet activityObservedSystemRow = activityObservedSystemTableReader.next();
- String observedSystemCode = activityObservedSystemRow.getString(6);
- observedSystemCodes.add(observedSystemCode);
- if (!ObservedSystemInterceptor.CODE_MAPPING.containsKey(observedSystemCode)) {
- throw new IllegalStateException(String.format("Can't find observedSystem with code: %s from ad-hoc AVDTH to ObServe mapping", observedSystemCode));
+ String avdthSystemCode = activityObservedSystemRow.getString(6);
+ observedSystemCodes.add(avdthSystemCode);
+ if (!ObservedSystemInterceptor.CODE_MAPPING.containsKey(avdthSystemCode)) {
+ throw new IllegalStateException(String.format("Can't find observedSystem with code: %s from ad-hoc AVDTH to ObServe mapping", avdthSystemCode));
}
- ObservedSystem observedSystem = dataContext.getObservedSystem(observedSystemCode);
+ String observeSystemCode = ObservedSystemInterceptor.CODE_MAPPING.get(avdthSystemCode);
+ ObservedSystem observedSystem = dataContext.getObservedSystem(observeSystemCode);
observedSystems.add(observedSystem);
}
return observedSystemCodes;
=====================================
core/persistence/avdth/src/main/java/fr/ird/observe/persistence/avdth/data/logbook/FloatingObjectReader.java
=====================================
@@ -383,30 +383,36 @@ public class FloatingObjectReader extends DataReader<FloatingObject> {
// add ObjectMaterial FOB
addObjectMaterial(vesselActivityCode, objectMaterialUsed, dataContext.getObjectMaterialFOB(), whenArriving, whenLeaving, entity);
addDefaultObjectMaterialOnUnknownObjectType = false;
- } else if (observedSystemCodes.contains("21")) {
+ }
+ if (observedSystemCodes.contains("21")) {
// add ObjectMaterial 2-1-1 VNLOG
addObjectMaterial(vesselActivityCode, objectMaterialUsed, dataContext.getObjectMaterialVNLOG(), whenArriving, whenLeaving, entity);
addDefaultObjectMaterialOnUnknownObjectType = false;
- } else if (observedSystemCodes.contains("22")) {
+ }
+ if (observedSystemCodes.contains("22")) {
// add ObjectMaterial 2-1-1 VNLOG + 1-1 DFAD
addObjectMaterial(vesselActivityCode, objectMaterialUsed, dataContext.getObjectMaterialVNLOG(), whenArriving, whenLeaving, entity);
addObjectMaterial(vesselActivityCode, objectMaterialUsed, dataContext.getObjectMaterialDFAD(), whenArriving, whenLeaving, entity);
addDefaultObjectMaterialOnUnknownObjectType = false;
addBuoyFromObservedSystem = true;
- } else if (observedSystemCodes.contains("23")) {
+ }
+ if (observedSystemCodes.contains("23")) {
// add ObjectMaterial 2-2 ALOG
addObjectMaterial(vesselActivityCode, objectMaterialUsed, dataContext.getObjectMaterialALOG(), whenArriving, whenLeaving, entity);
addDefaultObjectMaterialOnUnknownObjectType = false;
- } else if (observedSystemCodes.contains("24")) {
+ }
+ if (observedSystemCodes.contains("24")) {
// add ObjectMaterial 1-1 DFAD
addObjectMaterial(vesselActivityCode, objectMaterialUsed, dataContext.getObjectMaterialDFAD(), whenArriving, whenLeaving, entity);
addDefaultObjectMaterialOnUnknownObjectType = false;
addBuoyFromObservedSystem = true;
- } else if (observedSystemCodes.contains("25")) {
+ }
+ if (observedSystemCodes.contains("25")) {
// add ObjectMaterial 1-2 AFAD
addObjectMaterial(vesselActivityCode, objectMaterialUsed, dataContext.getObjectMaterialAFAD(), whenArriving, whenLeaving, entity);
addDefaultObjectMaterialOnUnknownObjectType = false;
- } else if (observedSystemCodes.contains("81")) {
+ }
+ if (observedSystemCodes.contains("81")) {
// add ObjectMaterial 2-1-2-1 Carrion
addObjectMaterial(vesselActivityCode, objectMaterialUsed, dataContext.getObjectMaterialCarrion(), whenArriving, whenLeaving, entity);
addDefaultObjectMaterialOnUnknownObjectType = false;
=====================================
doc/specs/ird-2024/observe-ird-2024.md
=====================================
@@ -0,0 +1,437 @@
+---
+title: Chiffrage IRD-2024 (v9.4)
+author: Tony Chemit, société Ultreia.io
+geometry: margin=1.2cm
+---
+
+# Introduction
+
+* Ce document décrit un chiffrage suite à la demande de développements complémentaires et de documentation sur le logiciel *ObServe* (v9.4) par l'IRD.
+* Rédigé le 22/05/2024 à Saint Cybardeaux (16170)
+
+\newpage
+
+# Détail des développements demandés
+
+## [#2826](https://gitlab.com/ultreiaio/ird-observe/-/issues/2826) Permettre de renommer et de supprimer une présélection FOB
+
+Nous proposons de pouvoir renommer, supprimer et réordonner, mais pas d'éditer le contenu (car cela requière trop de développement pour la partie matériaux et bouées et des formulaires existent déjà pour cela).
+
+Cette fonctionnalité sera disponible depuis le menu Configuration > Gérer les présélections FOB.
+
+Les présélections peuvent se retrouver à trois niveaux (commun, observation ou logbook), voir si il est pertinent de ré-impacter cela dans la nouvelle interface graphique.
+
+**2J**
+
+On peut ajouter une option de développement pour afficher le détail de chaque présélection (uniquement si une base est connectée car on doit aller chercher en base les label des différents référentiels utilisés).
+
+**1J**
+
+## [#2834](https://gitlab.com/ultreiaio/ird-observe/-/issues/2834) Permettre à l’utilisateur de sauvegarder ses choix quant au mode de classement des listes déroulantes
+
+### Rappel
+
+En préambule, rappelons qu'il existe déjà un mécanisme qui permet de modifier la configuration des listes déroulantes des formulaires dans l'application.
+
+Il s'agit d'un fichier de propriétés nommé **observe-swing-preferences.properties** embarqué dans l'application, qui est recopié dans le répertoire des ressources de l'utilisateur.
+
+Seul un utilisateur expert peut actuellement le modifier (connaissance requise du code des interfaces graphiques JAXX/Java).
+
+### Amélioration du fichier de configuration
+
+Nous proposons dans un premier temps de consolider ce fichier pour que toutes les valeurs possibles y soient (comme
+nous l'avons déjà fait pour les fichiers de configuration) et d'effectuer une sauvegarde qui conserve les valeurs non modifiées.
+
+Le format du fichier va peut-être évoluer pour répondre à d'autres besoins préssentis sur les configurations de ces listes déroulantes.
+
+**2J**
+
+### Adaptation de l'interface graphique
+
+Dans un formulaire pour une liste déroulante dont la configuration est modifiée par l'utilisateur, il faudra lui indiquer
+
+ - avec un nouvel icône (à droite de celui de modification de la configuration)
+ - ou bien en changeant la couleur du contour de l'icône de modification de configuration (peut-être plus léger)
+
+La popup de configuration d'une liste déroulante ainsi que son menu d'accès seront revus pour pouvoir prendre en compte les nouvelles actions :
+
+ - **Mettre en préférence**
+ - **Retirer des préférences**
+
+**3J**
+
+## [#2347](https://gitlab.com/ultreiaio/ird-observe/-/issues/2347) Permettre à l’utilisateur de pré régler ses propres valeurs par défaut de listes déroulantes
+
+### Enrichissement du fichier de configuration
+
+En reprenant le principe de la fonctionnalité précédente, on peut enrichir le fichier de configuration des listes déroulantes et associer un identifiant technique (*topiaId*) à chaque liste possible.
+
+**1J**
+
+### Adaptation de l'interface graphique
+
+Les actions suivantes seront rajoutées au menu de configuration:
+
+ - **Appliquer cette valeur par défaut**
+ - **Supprimer la valeur par défaut**
+
+À noter que ce nouveau mécanisme ne sera utilisable que pour des données en mode création.
+
+**2J**
+
+### Utilisation de ces valeurs par défaut
+
+Se pose la question de l'utilisation de ces valeurs par défaut. Il peut sembler pertinent d'envoyer ces valeurs par
+défaut au service pour que celui-ci nous retourne l'objet bien initialisé, plutôt que de le récupéré «vide» et que le formulaire remplisse ensuite les valeurs par défaut.
+
+Il faudra aussi se poser la question de déporter toutes les valeurs par défaut qui sont fournis (en dure dans le code) par les services, elles pourrait ainsi devenir des valeurs par défaut.
+
+Afin de palier au fait que certains référentiels utilisés dans cette nouvelle configuration puissent ne pas exister
+dans une base, à chaque ouverture d'une source de données, on reprendra la configuration pour en supprimer les valeurs
+manquantes, sans pour autant modifier la configuration.
+
+**3J**
+
+## [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) Sur tous les widgets position, présélectionner le quadrant de la saisie précédente
+
+### Mise en place de la nouvelle donnée à récupérer
+Deux choix techniques sont possibles :
+
+ - Cette règle de gestion devrait-elle être réalisée au niveau service car faire cela au niveau de l'application cela ne semble pas pertinent (quid de l'API publique), sauf qu'à ce niveau là nous ne possédons par l'information quadrant (il est calculé depuis les coordonnées).
+ - Faire cela au niveau de l'application, mais cela sous-entend aussi d'avoir cette information depuis la couche service...
+
+Il semble alors indispensable de calculer cette information et de la rajouter dans les DTO du service (champ **defaultQuadrant** ou **xxxDefaultQuadrant**) qui ne sera utilisé dans le formulaire que si la coordonnée associée n'est pas renseignée.
+
+**3J**
+
+### Utilisation de cette nouvelle donnée dans le formulaire
+
+À noter que ce nouveau mécanisme ne sera utilisable que pour des données en mode création.
+
+**2J**
+
+## [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) LL observations/logbook : mise à jour auto de la date de fin de marée en fonction des dates activités (comme en PS)
+
+Le mécanisme proposé se fera sur toutes les dates possibles lorsqu'elles existent (activité et calée).
+
+On renforcera donc aussi pour le module Seine.
+
+Cela doit être réalisé au niveau service.
+
+**1J**
+
+On propose aussi en option d'en faire règle de consolidation.
+
+**2J**
+
+## [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) LL observations/logbook : filage: mettre par défaut date de dernière activité (ou dernier virage ?) + 1
+
+Uniquement en mode création et remplit depuis le service.
+
+**0.5J**
+
+## [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) LL observations/logbook : virage : mettre date de virage à J+1 par rapport à celle du filage
+
+Uniquement en mode création et remplit depuis le service.
+
+**0.5J**
+
+## [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) LL observations/composition détaillée : on nous signale une forte latence dans la V9 lors de la sélection de sections/paniers, inexistante en V7 (sûrement due à la normalisation du modèle). Possibilité de retrouver une meilleure réactivité ? (si techniquement possible)
+
+Il est vrai que la validation à ce niveau n'est pas très performante... Elle valide tous les objects alors que l'on ne devrait valider que ceux affichés dans les tableaux...
+
+Nous proposons dans ce cadre de rajouter le ticket suivant qui remplace la validation utilisant la technologie **XWorks** qui est la source de ces lenteurs.
+
+**2J**
+
+## [#2594](https://gitlab.com/ultreiaio/ird-observe/-/issues/2594) Suppression de la technologie XWorks (utilisé pour la validation)
+
+La technologie de remplacement est déjà disponible et la migration est effective.
+
+La solution de remplaçement a été développée par nos soins et répond parfaitement à nos besoin et est performante.
+
+**3J**
+
+## [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) LL observations : amélioration du focus sur form captures (à voir plus précisément ensemble), et ajout de champs (actuellement existants mais masqués) dans le tableau récapitulatif
+
+**1J**
+
+## [#2669](https://gitlab.com/ultreiaio/ird-observe/-/issues/2669) PS logbook : Automatiser la calcul des sample.minus10Weight et sample.plus10Weight par sommation des lots du plan de cuves
+
+Il faut ici reprendre le principe déjà en place pour les données calculées, à savoir :
+
+ - ajouter un champs booléan **minus10WeightComputed** et **plus10WeightComputed** pour consigner le fait que la données a été observée ou calculée
+ - utiliser le widget (icône œil ou roue) pour pouvoir supprimer le drapeau **computed** dans le formulaire
+
+On propose aussi de rajouter une règle de validation pour n'autoriser au niveau des échantillons que les identifiants de cuves disponibles sur le plan de cuve (et ceci uniquement si le plan de cuve est saisi).
+
+**3J**
+
+## [#2799](https://gitlab.com/ultreiaio/ird-observe/-/issues/2799) PS logbook : Automatiser les associations Échantillon Activités
+
+Cette évolution est incluse dans une autre que nous vous proposons de réaliser à la place, à savoir [#2734](https://gitlab.com/ultreiaio/ird-observe/-/issues/2734) La liste des activités associées à un échantillon pourrait être déduite du plan de cuves, et inversément.
+
+ - Ajout du bouton sur le formulaire échantillons et récupération des activités depuis le plan de cuve (l'action ne sera accessible que si le plan de cuve existe et que la cuve décrite dans l'échantillonnage est bien présente) 1J
+ - Ajout du bouton sur le formulaire plan de cuve et récupération des activités depuis l'échantillonnage correspondant (l'action ne sera accessible que si un échantillonnage existe sur la cuve en question) 1J
+ - Mise en place via la consolidation 2J
+
+Il faudra bien veiller à ne rien modifier si le plan de cuve n'existe pas ou bien que les échantillons n'existent pas afin de ne pas altérer les données existantes.
+
+On devra aussi en cascade calculer au niveau des échantillons les pondérations des cuves-calées (**1J**).
+
+## [#2726](https://gitlab.com/ultreiaio/ird-observe/-/issues/2726) Amélioration de la gestion des types date
+
+Actuellement tous les types de dates dans le code *Java* utilise un simple **java.util.Date**, ce qui ne permet pas de connaître sa granularité temporelle (date, heure ou horodatage).
+
+On se propose alors de les remplacer par des types java plus précis et qui ont été introduits en *Java 8* (sans time zone).
+
+Pour ce qui est des horodatages techniques (topiaCreateDate et lastUpdateDate), on passera sur un type horodatage avec tome zone.
+
+**5J**
+
+## [#2875](https://gitlab.com/ultreiaio/ird-observe/-/issues/2875) Dates activités toujours affichées sur carte LL
+
+Ajout des dates sur toutes les activités, ajout de nouvelles options de configuration (mapLlStyleLogbookTextColor et mapLlStyleLogbookTextSize) comme fait pour le module Ps.
+
+Ici on ne travaille que sur la partie Logbook.
+
+**2J**
+
+## [#2603](https://gitlab.com/ultreiaio/ird-observe/-/issues/2603) Améliorer la reconnexion à un serveur distant utilisé comme connexion d’un assistant
+
+Actuellement, seule la source de données principale propose une reconnexion, il faut étendre cela à toutes les sources de données ouvertes via les assistants.
+
+**3J**
+
+## [#2818](https://gitlab.com/ultreiaio/ird-observe/-/issues/2818) Ajouter quelques champs de référence dans common.Vessel
+
+ - Ajout du référentiel EngineMake **0.5J**
+ - Ajout du référentiel HullMaterial **0.5J**
+ - Ajout des deux champs engineMake et hullMaterial dans le référentiel Vessel **0.5J**
+ - Import via la migration des deux nouveaux référentiels (via le fichier Turbobat) **1J**
+ - Ajout d'un champs **GT** dans le référentiel Vessel **0.5J**
+ -
+## [#2816](https://gitlab.com/ultreiaio/ird-observe/-/issues/2816) Fonction de changement de programme en masse
+
+Cela est tout à fait réalisable; Nous vous proposons de procéder de la sorte :
+
+ - l'utilisateur sélectionne la liste de ces marées via le formulaire de liste de marées
+ - une nouvelle action **Modification en masse** devient accessible, elle ouvre une une boite de dialogue composée de deux composants :
+ - le premier pour choisir quelle propriété modifier via une liste déroulante (par défaut elle prendre la modalité sélectionnée dans la configuration de l'arbre de navigation)
+ - le second pour éditer la valeur à utiliser, selon le type de la modalité sélectionnée (on reprend ici le principe utilisé dans l'écran de recherche de marées)
+
+ **Note :** Il faudra penser à rester cohérent avec les status de collecte, par exemple il ne sera pas possible de modifier le capitaine si au moins une marée n'a pas de collecte des observations.
+
+ - réalisation de la boite de dialogue **2J**
+ - enregistrement via un nouveau service dédié **1J**
+ - mise à jour de l'arbre de navigation **2J**
+
+Dans cette première version, on se limitera aux modalités qualitatives.
+
+## [#2846](https://gitlab.com/ultreiaio/ird-observe/-/issues/2846) Corriger un effet de bord indésirable lors de la désactivation ou la suppression d’une référence et la réattribution de ses données liées à une autre référence
+
+### Rappel des trois actions possibles
+Pour rappel, le comportement d'une suppression est le suivant :
+
+1. on calcule les utilisations du référentiel
+2. si pas de résultat, on peut supprimer directement
+3. sinon on affiche les utilisations et on demande un remplacement
+4. si l'utilisateur renseigne le remplaçant et valide on procède
+ 1. remplacement du référentiel partout
+ 2. suppression du référentiel
+
+Le comportement d'une désactivation au moment de la sauvegarde :
+
+1. on calcule les utilisations du référentiel
+2. si pas de résultat, on peut désactiver directement
+3. sinon on affiche les utilisations et on demande un remplacement
+4. si l'utilisateur renseigne le remplaçant et valide on procède
+ 1. remplacement du référentiel partout
+ 2. désactivation du référentiel
+
+Enfin le comportement d'un remplacement :
+
+1. on calcule les utilisations du référentiel
+2. si pas de résultat, il n'y a rien à faire
+3. sinon on affiche les utilisations et on demande un remplacement
+4. si l'utilisateur renseigne le remplaçant et valide on procède au remplacement du référentiel partout
+
+### Nouveau besoin
+
+Dans certains cas, on voit bien que le remplacement n'est pas pertinent et qu'il faudrait en fait effectuer
+les remplacements des référentiels impactés.
+
+Ce besoin est induit par la logique métier et non par la structuration des données; il nous faut donc trouver un moyen
+élégant de le décrire.
+
+Nous vous proposons de le décrire via une nouvelle tag-value sur les classes du modèle de type booléen :
+
+ - la valeur **false** (celle par défaut) conservera le comportement actuel de remplacement
+ - la valeur **true** permettra de mettre en place un remplacement en profondeur, i.e de demander le remplacement des
+ référentiels visés dans les autres données du modèle
+
+Dans l'exemple des espèces, on cherchera alors les occurrences des RTP et RTT (il n'y en a aucune puisque ces données
+ne sont pas utilisées dans aucune autre donnée); pour les catégories de poids, on proposera alors un remplacement par
+une autre catégorie de poids dans le sous-ensemble de celles utilisant la nouvelle espèce de remplacement.
+
+**0.5J**
+
+Il faudra bien distinguer une désactivation, d'un remplacement et d'une suppression :
+
+ * dans le cas d'une désactivation, on devra alors désactiver les référentiels ciblés
+ * dans le cas d'une suppression, les supprimer
+ * dans le cas d'une remplacement, probablement ne rien faire
+
+### Réorganisation de l'interface graphique
+
+Pour que cela soit compréhensible pour l'utilisateur, il faut que nous distinguons plusieurs zones selon ce qu'il y a a faire :
+
+1. celle déjà existant ou un remplacement est possible
+2. une nouvelle zone qui indique les objets qui ne doivent pas être remplacés et qui seront supprimés
+3. une troisième zone qui liste les utilisations qui doivent être elles-même remplacées
+
+Une organisation en onglet est peut-être envisageable ?
+
+**4.5J**
+
+### Adaptation du code de réalisation des actions
+
+On doit alors effectuer toutes les suppressions et remplacements de second niveau, puis ensuite le code actuel peut-être appliqué tel quel.
+
+**1J**
+
+### Cas des doublons lors de remplacement sur une liste d'association
+
+Effectivement comme décrit dans le ticket, on pourrait avoir des erreurs lors de l'exécution de l'action puisque les
+couples sont des clefs primaires.
+
+Pour y remédier, nous pouvons améliorer le code sql généré dans ce but pour tenir compte de ce cas.
+
+**0.5J**
+
+## [#1203](https://gitlab.com/ultreiaio/ird-observe/-/issues/1203) Tableaux de saisie (captures, échantillons, équipements...) - Classement en cliquant sur les en-têtes de colonnes
+
+On rajoute de plus une colonne **index** au début pour bien voir l'ordre.
+
+Lors de l'ajout ou suppression, il faudra maintenir cohérent cet ordre induit.
+
+Se pose la question des actions de changement de position ?
+
+Avant d'enregistrer, on réordonnera la liste via cet index.
+
+**3J**
+
+# Détail de la documentation demandée
+
+
+## [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) Écriture de tutoriels pratiques
+
+Avant de pouvoir proposer des tutoriels de modification du projet, il faut en écrire quelques uns pour avoir une bonne compréhension de l'architecture de celui-ci :
+
+ - un tutoriel pour mettre en place l'environnement de développement
+ - un tutoriel pour expliquer l'organisation du projet et de ses modules Maven
+ - un tutoriel pour expliquer le modèle et tous ce que l'on peut faire dessus (description détaillée de chaque tag-value)
+ - un tutoriel pour expliquer comment fonctionne les migrations
+ - un tutoriel pour expliquer comment fonctionne les décorations
+ - un tutoriel pour expliquer comment fonctionne la validation
+ - un tutoriel pour expliquer comment fonctionne les services
+ - un tutoriel pour expliquer comment fonctionne l'API publique
+ - un tutoriel pour expliquer comment fonctionne le serveur
+ - un tutoriel pour expliquer comment fonctionne les rapports
+ - un tutoriel pour expliquer comment fonctionne l'application lourde
+ - un tutoriel pour expliquer comment fonctionne les interfaces graphiques
+ - un tutoriel pour expliquer comment fonctionne l'éditeur de source de données
+ - un tutoriel pour expliquer comment fonctionne les actions longues
+
+Une fois cela réalisé, on pourra penser à écrire des tutoriels de modification du projet.
+
+Nous vous proposons de travailler **5J** sur le sujet pour commencer ce travail.
+
+## [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) Mise à jour de la documentation des librairies
+
+Dans un premier temps, il nous faut lister toutes les technologies utilisées dans le projet et que nous supportons, à savoir :
+
+ - java4all.java-util
+ - java4all.java-lang
+ - java4all.java-bean
+ - java4all.jaxx
+ - java4all.eugene
+ - java4all.http
+ - java4all.validation
+
+Un certain nombres d'entre-elles ont directement été intégrée dans le projet (dans le module **toolkit**) car elles
+n'étaient plus maintenues, à savoir
+ - topia (gestion de la persistence)
+ - webMotion (serveur web)
+
+Nous vous proposons de travailler **5J** sur le sujet pour commencer ce travail.
+
+## [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) Ajout d'une documentation dans la base de données
+
+Pour réaliser cela nous allons utiliser une nouvelle tag-value sur le modèle de persistence, on pourra la renseigner à
+différents niveaux :
+
+ - sur un schéma
+ - sur une table
+ - sur la colonne d'une table
+
+Lors de la génération d'une nouvelle base ou d'une migration, cette documentation sera insérée dans la base juste après la création de la base.
+
+Cela s'applique sur les bases H2 et Postgres.
+
+**4J**
+
+### Intégration de cette documentation dans l'API publique
+
+Cette nouvelle documentation pourra être intégrée au niveau de la documentation de chaque entité.
+
+**2J**
+
+### Production d'un rapport de cette documentation dans le site de l'application
+
+On peut aussi proposer un rapport généré dans le site de l'application et qui reprend cette fois via une vue physique de
+la documentation déjà réalisé et indique le pourcentage de réalisation sur le sujet.
+
+**3J**
+
+### Production d'une documentation du schéma de base
+
+Mettre en place la génération de la documentation du schéma de la base via probablement la librairie **SchemaSpy**.
+
+La documentation produite sera alors placée dans la documentation du projet.
+
+**4J**
+
+\newpage
+
+# Chiffrage global
+
+**Tous les prix sont affichés HT.** et le prix journalier est de **540€**.
+
+| Tâche | Jours |
+|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------:|
+| [#2826](https://gitlab.com/ultreiaio/ird-observe/-/issues/2826) Permettre de renommer et de supprimer une présélection FOB | 3 |
+| [#2834](https://gitlab.com/ultreiaio/ird-observe/-/issues/2834) Permettre à l’utilisateur de sauvegarder ses choix quant au mode de classement des listes déroulantes | 5 |
+| [#2347](https://gitlab.com/ultreiaio/ird-observe/-/issues/2347) Permettre à l’utilisateur de pré régler ses propres valeurs par défaut de listes déroulantes | 6 |
+| [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) Sur tous les widgets position, présélectionner le quadrant de la saisie précédente | 5 |
+| [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) LL observations/logbook : mise à jour auto de la date de fin de marée en fonction des dates activités (comme en PS) | 3 |
+| [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) LL observations/logbook : filage: mettre par défaut date de dernière activité (ou dernier virage ?) + 1 | 0.5 |
+| [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) LL observations/logbook : virage : mettre date de virage à J+1 par rapport à celle du filage | 0.5 |
+| [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) LL observations/composition détaillée : on nous signale une forte latence dans la V9 lors de la sélection de sections/paniers, inexistante en V7 (sûrement due à la normalisation du modèle). Possibilité de retrouver une meilleure réactivité ? | 2 |
+| [#2594](https://gitlab.com/ultreiaio/ird-observe/-/issues/2594) Suppression de la technologie XWorks (utilisé pour la validation) | 3 |
+| [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) LL observations : amélioration du focus sur form captures (à voir plus précisément ensemble), et ajout de champs (actuellement existants mais masqués) dans le tableau récapitulatif | 1 |
+| [#2669](https://gitlab.com/ultreiaio/ird-observe/-/issues/2669) PS logbook : Automatiser la calcul des sample.minus10Weight et sample.plus10Weight par sommation des lots du plan de cuves | 3 |
+| [#2799](https://gitlab.com/ultreiaio/ird-observe/-/issues/2799) PS logbook : Automatiser les associations Échantillon Activités | 5 |
+| [#2726](https://gitlab.com/ultreiaio/ird-observe/-/issues/2726) Amélioration de la gestion des types date | 5 |
+| [#2875](https://gitlab.com/ultreiaio/ird-observe/-/issues/2875) Dates activités toujours affichées sur carte LL | 2 |
+| [#2603](https://gitlab.com/ultreiaio/ird-observe/-/issues/2603) Améliorer la reconnexion à un serveur distant utilisé comme connexion d’un assistant | 3 |
+| [#2818](https://gitlab.com/ultreiaio/ird-observe/-/issues/2818) Ajouter quelques champs de référence dans common.Vessel | 1.5 |
+| [#2816](https://gitlab.com/ultreiaio/ird-observe/-/issues/2816) Fonction de changement de programme en masse | 6 |
+| [#2846](https://gitlab.com/ultreiaio/ird-observe/-/issues/2846) Corriger un effet de bord indésirable lors de la désactivation ou la suppression d’une référence et la réattribution de ses données liées à une autre référence | 6 |
+| [#1203](https://gitlab.com/ultreiaio/ird-observe/-/issues/1203) Tableaux de saisie (captures, échantillons, équipements...) - Classement en cliquant sur les en-têtes de colonnes | 3 |
+| [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) Écriture de tutoriels pratiques | 5 |
+| [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) Mise à jour de la documentation des librairies | 5 |
+| [#TODO](https://gitlab.com/ultreiaio/ird-observe/-/issues/) Ajout d'une documentation dans la base de données | 13 |
+| Total | 86.5 |
+
+* Prix total : **46 170** (**43250€** à **500€/J**)
=====================================
pom.xml
=====================================
@@ -23,7 +23,7 @@
<parent>
<groupId>io.ultreia.maven</groupId>
<artifactId>pom</artifactId>
- <version>2024.25</version>
+ <version>2024.26</version>
</parent>
<groupId>fr.ird.observe</groupId>
<artifactId>ird-observe</artifactId>
@@ -254,12 +254,6 @@
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>${lib.version.commons-beanutils}</version>
- <exclusions>
- <exclusion>
- <groupId>commons-collections</groupId>
- <artifactId>commons-collections</artifactId>
- </exclusion>
- </exclusions>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
=====================================
src/site/markdown/avdth/logbook.md
=====================================
@@ -75,7 +75,7 @@ Voir mapping [REF_VESSEL_ACTIVITY_TYPE](./referential.html#REF_VESSEL_ACTIVITY_T
Voir mapping [REF_SCHOOL_TYPE](./referential.html#REF_SCHOOL_TYPE).
-**À noter que cette donée est renseignée uniquement si l'activité est une activité de pêche ```ACTIVITE_C_OPERA in (0, 1, 2, 14)```**
+**À noter que cette donnée est renseignée uniquement si l'activité est une activité de pêche ```ACTIVITE_C_OPERA in (0, 1, 2, 14)```**
* Note 6 <a name="n_0_6"></a>
@@ -137,7 +137,7 @@ Dans ce cas on rajoute aussi le système observé **110**.
Dans **AVDTH**, il existe trois notions à considéder :
1. ```ACTIVITE.C_TYP_OBJET``` donne le type de DCP (la valeur ```NULL``` ou ```999``` indique pas de DCP déclaré dans **AVDTH**)
-2. ```ACTIVITE.C_TYP_BALISE``` donne le type de balise (la valeur ```NULL``` ou ```999``` indique pas de bouée délcarée dans **AVDTH**)
+2. ```ACTIVITE.C_TYP_BALISE``` donne le type de balise (la valeur ```NULL``` ou ```999``` indique pas de bouée déclarée dans **AVDTH**)
3. Les valeurs ```20,21,22,23,24,25,81``` de la table ```ACT_ASSOC.C_ASSOC``` permettent de définir aussi un DCP (et de renseigner les matériaux associés)
On va alors interdire l'ajout d'un DCP, si aucune des trois notions précédentes n'est satisfaite, en clair on ne peut pas ajouté un DPC si :
@@ -236,12 +236,12 @@ Dans tous les autres cas, on peut ajouter un système observé en utilisant la t
La valeur des champs ```FloatingObject.floatingObjectPart.whenArriving``` et ```FloatingObject.floatingObjectPart.whenLeaving```
est déduite du référentiel ```ps_common.ObjectOperation``` et n'est plus récupéré d'**AVDTH**.
-##### Matériel Bioadégradable
+##### Matériel Biodégradable
Si le DCP est déclaré dans **AVDTH** et que la valeur de la colonne ```ACTIVITE.F_DCP_ECO``` vaut **2**, on ajoute alors
-le matériel **4-2 (Biodegradable materials)**.
+le matériel **4-1 (Biodegradable materials)**.
-##### Matériaux provenants des systèmes observés d'AVDTH
+##### Matériaux provenant des systèmes observés d'AVDTH
Les systèmes observés d'**AVDTH** permettent de caractériser les matériaux à ajouter au DCP comme indiqué dans le
tableau suivant :
@@ -263,7 +263,7 @@ cas où la balise n'est pas déclarée dans AVDTH**.
##### Matériaux ajouté si le DCP est déclaré dans AVDTH
-Dans ce cas, on peut ajouter un éventel matériel en utilisant la table de correspondance suivante :
+Dans ce cas, on peut ajouter un éventuel matériel en utilisant la table de correspondance suivante :
| ACTIVITE.C_TYP_OBJET | ObjectMaterial |
|:---------------------|:---------------|
@@ -386,7 +386,7 @@ On ajoute ici une balise avec les caractéristiques suivantes :
* **TransmittingBuoyType** 98 (Balise inconnue ou indéterminée)
* **TransmittingBuoyOperation** 1 (Visite)
-**FIXME** Ne devrait pas plutot mettre une opération à **99** (qui a été introduite en 9.1) ?
+**FIXME** Ne devrait pas plutôt mettre une opération à **99** (qui a été introduite en 9.1) ?
### Table ACT_ASSOC
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/94763272c47cc0ab4bb6b222…
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/94763272c47cc0ab4bb6b222…
You're receiving this email because of your account on gitlab.com.
1
0
[Git][ultreiaio/ird-observe] Pushed new branch feature/issue_2888
by Tony CHEMIT (@tchemit) 24 Jun '24
by Tony CHEMIT (@tchemit) 24 Jun '24
24 Jun '24
Tony CHEMIT pushed new branch feature/issue_2888 at ultreiaio / ird-observe
--
View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/tree/feature/issue_2888
You're receiving this email because of your account on gitlab.com.
1
0