Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe
Commits:
-
eccb1224
by Tony Chemit at 2024-06-24T17:08:45+02:00
-
8c2c4e3b
by Tony Chemit at 2024-06-24T17:11:34+02:00
-
b391616f
by Tony Chemit at 2024-06-24T17:11:57+02:00
-
21541a6a
by Tony Chemit at 2024-06-24T17:12:45+02:00
-
c75875bc
by Tony Chemit at 2024-06-25T12:57:30+02:00
-
d98dfa59
by Tony Chemit at 2024-06-25T12:57:35+02:00
-
25c1331f
by Tony Chemit at 2024-06-25T16:22:39+02:00
-
ffa96efa
by Tony Chemit at 2024-06-25T16:23:09+02:00
29 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/data/tree/DataSelectionTreePaneModel.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/i18n/getters/java.getter
- client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/actions/SaveStorageToFile.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
- toolkit/api-i18n/src/main/i18n/translations/toolkit-api-i18n_fr_FR.properties
Changes:
| ... | ... | @@ -20,9 +20,9 @@ observe.constant.AdminStep.SYNCHRONIZE |
| 20 | 20 | observe.constant.AdminStep.SYNCHRONIZE.description
|
| 21 | 21 | observe.constant.AdminStep.VALIDATE
|
| 22 | 22 | observe.constant.AdminStep.VALIDATE.description
|
| 23 | -observe.constant.ReferentialSynchronizeMode.BOTH
|
|
| 24 | -observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT
|
|
| 25 | -observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT
|
|
| 23 | +observe.constant.SynchronizeMode.BOTH
|
|
| 24 | +observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT
|
|
| 25 | +observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT
|
|
| 26 | 26 | observe.constant.ValidationModelMode.DATA
|
| 27 | 27 | observe.constant.ValidationModelMode.DATA.description
|
| 28 | 28 | observe.constant.ValidationModelMode.REFERENTIEL
|
| ... | ... | @@ -13,6 +13,7 @@ observe.ui.action.choose.export.csv.directory |
| 13 | 13 | observe.ui.action.choose.reportFile
|
| 14 | 14 | observe.ui.action.close
|
| 15 | 15 | observe.ui.action.close.synchro.tip
|
| 16 | +observe.ui.action.config.export.required.read.data
|
|
| 16 | 17 | observe.ui.action.config.export.required.write.data
|
| 17 | 18 | observe.ui.action.config.left.datasource.required.write.data
|
| 18 | 19 | observe.ui.action.configuration.tip
|
| ... | ... | @@ -104,6 +105,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation |
| 104 | 105 | observe.ui.datasource.editor.actions.synchro.data.message.data.loaded
|
| 105 | 106 | observe.ui.datasource.editor.actions.synchro.data.title
|
| 106 | 107 | observe.ui.datasource.editor.actions.synchro.data.title.tip
|
| 108 | +observe.ui.datasource.editor.actions.synchro.data.withMode
|
|
| 107 | 109 | observe.ui.datasource.editor.actions.synchro.launch.operation
|
| 108 | 110 | observe.ui.datasource.editor.actions.synchro.prepare.operation
|
| 109 | 111 | observe.ui.datasource.editor.actions.synchro.referential
|
| ... | ... | @@ -27,8 +27,8 @@ observe.ui.datasource.editor.actions.report.copy.row.headers.tip |
| 27 | 27 | observe.ui.datasource.editor.actions.report.select.file
|
| 28 | 28 | observe.ui.datasource.editor.actions.report.select.file.tip
|
| 29 | 29 | observe.ui.datasource.editor.actions.report.variables
|
| 30 | +observe.ui.datasource.editor.actions.synchro.config.mode
|
|
| 30 | 31 | observe.ui.datasource.editor.actions.synchro.data.actionsToPerform
|
| 31 | -observe.ui.datasource.editor.actions.synchro.referential.config.mode
|
|
| 32 | 32 | observe.ui.datasource.editor.actions.synchro.referential.obsolete.entities.list
|
| 33 | 33 | observe.ui.datasource.editor.actions.synchro.referential.obsolete.entity.fix
|
| 34 | 34 | observe.ui.datasource.editor.actions.synchro.referential.safe.entity.to.choose.label
|
| 1 | +package fr.ird.observe.client.datasource.actions.synchronize;
|
|
| 2 | + |
|
| 3 | +/*-
|
|
| 4 | + * #%L
|
|
| 5 | + * ObServe Client :: DataSource :: Actions
|
|
| 6 | + * %%
|
|
| 7 | + * Copyright (C) 2008 - 2024 IRD, Ultreia.io
|
|
| 8 | + * %%
|
|
| 9 | + * This program is free software: you can redistribute it and/or modify
|
|
| 10 | + * it under the terms of the GNU General Public License as
|
|
| 11 | + * published by the Free Software Foundation, either version 3 of the
|
|
| 12 | + * License, or (at your option) any later version.
|
|
| 13 | + *
|
|
| 14 | + * This program is distributed in the hope that it will be useful,
|
|
| 15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| 16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| 17 | + * GNU General Public License for more details.
|
|
| 18 | + *
|
|
| 19 | + * You should have received a copy of the GNU General Public
|
|
| 20 | + * License along with this program. If not, see
|
|
| 21 | + * <http://www.gnu.org/licenses/gpl-3.0.html>.
|
|
| 22 | + * #L%
|
|
| 23 | + */
|
|
| 24 | + |
|
| 25 | +import org.nuiton.jaxx.runtime.swing.action.JAXXObjectActionSupport;
|
|
| 26 | + |
|
| 27 | +import javax.swing.ActionMap;
|
|
| 28 | +import javax.swing.InputMap;
|
|
| 29 | +import javax.swing.JComponent;
|
|
| 30 | +import java.awt.event.ActionEvent;
|
|
| 31 | + |
|
| 32 | +/**
|
|
| 33 | + * To select synchronize mode on admin config ui.
|
|
| 34 | + * <p>
|
|
| 35 | + * Created at 25/06/2024.
|
|
| 36 | + *
|
|
| 37 | + * @author Tony Chemit - dev@tchemit.fr
|
|
| 38 | + * @since 9.3.6
|
|
| 39 | + */
|
|
| 40 | +public class SelectSynchronizeMode extends JAXXObjectActionSupport<SynchronizeConfigUI> {
|
|
| 41 | + |
|
| 42 | + private final SynchronizeMode mode;
|
|
| 43 | + |
|
| 44 | + public SelectSynchronizeMode(SynchronizeMode mode) {
|
|
| 45 | + super(SelectSynchronizeMode.class.getName() + "#" + mode, mode.getLabel(), mode.getLabel(), mode.getIconName(), mode.getKeyStroke());
|
|
| 46 | + this.mode = mode;
|
|
| 47 | + }
|
|
| 48 | + |
|
| 49 | + @Override
|
|
| 50 | + protected InputMap getInputMap(SynchronizeConfigUI ui, int inputMapCondition) {
|
|
| 51 | + return ui.getInputMap(inputMapCondition);
|
|
| 52 | + }
|
|
| 53 | + |
|
| 54 | + @Override
|
|
| 55 | + protected int getInputMapCondition() {
|
|
| 56 | + return JComponent.WHEN_IN_FOCUSED_WINDOW;
|
|
| 57 | + }
|
|
| 58 | + |
|
| 59 | + @Override
|
|
| 60 | + protected ActionMap getActionMap(SynchronizeConfigUI ui) {
|
|
| 61 | + return ui.getActionMap();
|
|
| 62 | + }
|
|
| 63 | + |
|
| 64 | + @Override
|
|
| 65 | + protected void doActionPerformed(ActionEvent e, SynchronizeConfigUI ui) {
|
|
| 66 | + ui.getStepModel().setSynchronizeMode(mode);
|
|
| 67 | + }
|
|
| 68 | +} |
| 1 | +package fr.ird.observe.client.datasource.actions.synchronize;
|
|
| 2 | + |
|
| 3 | +/*-
|
|
| 4 | + * #%L
|
|
| 5 | + * ObServe Client :: DataSource :: Actions
|
|
| 6 | + * %%
|
|
| 7 | + * Copyright (C) 2008 - 2024 IRD, Ultreia.io
|
|
| 8 | + * %%
|
|
| 9 | + * This program is free software: you can redistribute it and/or modify
|
|
| 10 | + * it under the terms of the GNU General Public License as
|
|
| 11 | + * published by the Free Software Foundation, either version 3 of the
|
|
| 12 | + * License, or (at your option) any later version.
|
|
| 13 | + *
|
|
| 14 | + * This program is distributed in the hope that it will be useful,
|
|
| 15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| 16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| 17 | + * GNU General Public License for more details.
|
|
| 18 | + *
|
|
| 19 | + * You should have received a copy of the GNU General Public
|
|
| 20 | + * License along with this program. If not, see
|
|
| 21 | + * <http://www.gnu.org/licenses/gpl-3.0.html>.
|
|
| 22 | + * #L%
|
|
| 23 | + */
|
|
| 24 | + |
|
| 25 | +import fr.ird.observe.client.datasource.actions.AdminUIModel;
|
|
| 26 | +import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
|
|
| 27 | +import org.apache.logging.log4j.LogManager;
|
|
| 28 | +import org.apache.logging.log4j.Logger;
|
|
| 29 | +import org.nuiton.jaxx.runtime.JAXXObject;
|
|
| 30 | +import org.nuiton.jaxx.runtime.swing.JAXXButtonGroup;
|
|
| 31 | + |
|
| 32 | +import javax.swing.ActionMap;
|
|
| 33 | +import javax.swing.InputMap;
|
|
| 34 | +import javax.swing.JToggleButton;
|
|
| 35 | +import java.util.EnumSet;
|
|
| 36 | + |
|
| 37 | +/**
|
|
| 38 | + * Contract of admin config ui when using synchronize mode.
|
|
| 39 | + * <p>
|
|
| 40 | + * Created at 25/06/2024.
|
|
| 41 | + *
|
|
| 42 | + * @author Tony Chemit - dev@tchemit.fr
|
|
| 43 | + * @since 9.3.6
|
|
| 44 | + */
|
|
| 45 | +public interface SynchronizeConfigUI extends JAXXObject {
|
|
| 46 | + Logger log = LogManager.getLogger(SynchronizeConfigUI.class);
|
|
| 47 | + |
|
| 48 | + JToggleButton getBOTH();
|
|
| 49 | + |
|
| 50 | + JToggleButton getFROM_LEFT_TO_RIGHT();
|
|
| 51 | + |
|
| 52 | + JToggleButton getFROM_RIGHT_TO_LEFT();
|
|
| 53 | + |
|
| 54 | + AdminUIModel getModel();
|
|
| 55 | + |
|
| 56 | + SynchronizeModel getStepModel();
|
|
| 57 | + |
|
| 58 | + JAXXButtonGroup getSynchronizeMode();
|
|
| 59 | + |
|
| 60 | + ActionMap getActionMap();
|
|
| 61 | + |
|
| 62 | + InputMap getInputMap(int condition);
|
|
| 63 | + |
|
| 64 | + default void updateSynchroModes() {
|
|
| 65 | + AdminUIModel model = getModel();
|
|
| 66 | + SynchronizeModel stepModel = getStepModel();
|
|
| 67 | + SynchronizeMode synchronizeMode = stepModel.getSynchronizeMode();
|
|
| 68 | + log.info(String.format("Will update synchro modes (previous value: %s)", synchronizeMode));
|
|
| 69 | + DataSourceSelectorModel leftSourceModel = model.getConfigModel().getLeftSourceModel();
|
|
| 70 | + if (!leftSourceModel.isInit()) {
|
|
| 71 | + return;
|
|
| 72 | + }
|
|
| 73 | + DataSourceSelectorModel rightSourceModel = model.getConfigModel().getRightSourceModel();
|
|
| 74 | + if (!rightSourceModel.isInit()) {
|
|
| 75 | + return;
|
|
| 76 | + }
|
|
| 77 | + boolean dataSourcesValid = leftSourceModel.validateExt() && rightSourceModel.validateExt();
|
|
| 78 | + boolean leftToRightEnabled = dataSourcesValid && stepModel.isCanWrite(rightSourceModel);
|
|
| 79 | + log.debug(String.format("Update synchro modes: leftToRight: %s", leftToRightEnabled));
|
|
| 80 | + boolean rightToLeftEnabled = dataSourcesValid && stepModel.isCanWrite(leftSourceModel);
|
|
| 81 | + log.debug(String.format("Update synchro modes: rightToLeft: %s", rightToLeftEnabled));
|
|
| 82 | + boolean bothEnabled = leftToRightEnabled && rightToLeftEnabled;
|
|
| 83 | + log.debug(String.format("Update synchro modes: both: %s", bothEnabled));
|
|
| 84 | + getFROM_LEFT_TO_RIGHT().setEnabled(leftToRightEnabled);
|
|
| 85 | + getFROM_RIGHT_TO_LEFT().setEnabled(rightToLeftEnabled);
|
|
| 86 | + getBOTH().setEnabled(bothEnabled);
|
|
| 87 | + EnumSet<SynchronizeMode> candidates = EnumSet.allOf(SynchronizeMode.class);
|
|
| 88 | + if (!leftToRightEnabled) {
|
|
| 89 | + candidates.remove(SynchronizeMode.FROM_LEFT_TO_RIGHT);
|
|
| 90 | + }
|
|
| 91 | + if (!rightToLeftEnabled) {
|
|
| 92 | + candidates.remove(SynchronizeMode.FROM_RIGHT_TO_LEFT);
|
|
| 93 | + }
|
|
| 94 | + if (!bothEnabled) {
|
|
| 95 | + candidates.remove(SynchronizeMode.BOTH);
|
|
| 96 | + }
|
|
| 97 | + if (!candidates.contains(synchronizeMode)) {
|
|
| 98 | + if (candidates.isEmpty()) {
|
|
| 99 | + synchronizeMode = null;
|
|
| 100 | + } else {
|
|
| 101 | + synchronizeMode = candidates.iterator().next();
|
|
| 102 | + }
|
|
| 103 | + }
|
|
| 104 | + log.info(String.format("Will update synchro modes (new value: %s)", synchronizeMode));
|
|
| 105 | + stepModel.setSynchronizeMode(null);
|
|
| 106 | + stepModel.setSynchronizeMode(synchronizeMode);
|
|
| 107 | + }
|
|
| 108 | +} |
| 1 | -package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.actions;
|
|
| 2 | - |
|
| 3 | -/*-
|
|
| 1 | +/*
|
|
| 4 | 2 | * #%L
|
| 5 | 3 | * ObServe Client :: DataSource :: Actions
|
| 6 | 4 | * %%
|
| ... | ... | @@ -22,23 +20,19 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.acti |
| 22 | 20 | * #L%
|
| 23 | 21 | */
|
| 24 | 22 | |
| 25 | -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroConfigUI;
|
|
| 26 | -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
|
|
| 27 | -import org.nuiton.jaxx.runtime.swing.action.JComponentActionSupport;
|
|
| 28 | - |
|
| 29 | -import java.awt.event.ActionEvent;
|
|
| 30 | - |
|
| 31 | -public class SelectReferentialSynchronizeMode extends JComponentActionSupport<ReferentialSynchroConfigUI> {
|
|
| 32 | - |
|
| 33 | - private final ReferentialSynchronizeMode mode;
|
|
| 23 | +#synchronizeConfigPanel {
|
|
| 24 | + border:{new TitledBorder(t("observe.ui.datasource.editor.actions.synchro.config.mode") + "")};
|
|
| 25 | +}
|
|
| 34 | 26 | |
| 35 | - public SelectReferentialSynchronizeMode(ReferentialSynchronizeMode mode) {
|
|
| 36 | - super(SelectReferentialSynchronizeMode.class.getName() + "#" + mode, mode.getLabel(), mode.getLabel(), mode.getIconName(), mode.getKeyStroke());
|
|
| 37 | - this.mode = mode;
|
|
| 38 | - }
|
|
| 27 | +#synchronizeMode {
|
|
| 28 | + selectedValue:{stepModel.getSynchronizeMode()};
|
|
| 29 | +}
|
|
| 39 | 30 | |
| 40 | - @Override
|
|
| 41 | - protected void doActionPerformed(ActionEvent e, ReferentialSynchroConfigUI ui) {
|
|
| 42 | - ui.getStepModel().setSynchronizeMode(mode);
|
|
| 43 | - }
|
|
| 31 | +.synchronizeMode {
|
|
| 32 | + buttonGroup:"synchronizeMode";
|
|
| 33 | + enabled:false;
|
|
| 34 | + selected:{java.util.Objects.equals(fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode.%%, stepModel.getSynchronizeMode())};
|
|
| 35 | + value:{fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode.%%};
|
|
| 36 | + action:{new fr.ird.observe.client.datasource.actions.synchronize.SelectSynchronizeMode(fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode.%%)};
|
|
| 44 | 37 | }
|
| 38 | + |
| 1 | -package fr.ird.observe.client.datasource.actions.synchronize.referential.ng;
|
|
| 1 | +package fr.ird.observe.client.datasource.actions.synchronize;
|
|
| 2 | 2 | |
| 3 | 3 | /*-
|
| 4 | 4 | * #%L
|
| ... | ... | @@ -30,7 +30,7 @@ import io.ultreia.java4all.i18n.spi.enumeration.TranslateEnumeration; |
| 30 | 30 | import javax.swing.KeyStroke;
|
| 31 | 31 | |
| 32 | 32 | /**
|
| 33 | - * Type de synchronisation de référentiel. Définit quelles bases sont en écriture.
|
|
| 33 | + * Synchronize mode, defines on which side we can write.
|
|
| 34 | 34 | * <p>
|
| 35 | 35 | * Created on 10/08/16.
|
| 36 | 36 | *
|
| ... | ... | @@ -38,8 +38,7 @@ import javax.swing.KeyStroke; |
| 38 | 38 | * @since 5.0
|
| 39 | 39 | */
|
| 40 | 40 | @TranslateEnumeration(name = I18nDecoratorHelper.I18N_CONSTANT_LABEL, pattern = I18nDecoratorHelper.I18N_CONSTANT_LABEL_PATTERN)
|
| 41 | -public enum ReferentialSynchronizeMode {
|
|
| 42 | - |
|
| 41 | +public enum SynchronizeMode {
|
|
| 43 | 42 | /**
|
| 44 | 43 | * La base de gauche est en lecture, la base de droite est en écriture.
|
| 45 | 44 | */
|
| ... | ... | @@ -52,7 +51,6 @@ public enum ReferentialSynchronizeMode { |
| 52 | 51 | * La base de gauche est en écriture, la base de droite est en écriture.
|
| 53 | 52 | */
|
| 54 | 53 | BOTH(true, true, "copyToBoth");
|
| 55 | - |
|
| 56 | 54 | /**
|
| 57 | 55 | * Est ce que la source de gauche est en écriture ?
|
| 58 | 56 | */
|
| ... | ... | @@ -66,7 +64,7 @@ public enum ReferentialSynchronizeMode { |
| 66 | 64 | |
| 67 | 65 | private final String iconName;
|
| 68 | 66 | |
| 69 | - ReferentialSynchronizeMode(boolean leftWrite, boolean rightWrite, String iconName) {
|
|
| 67 | + SynchronizeMode(boolean leftWrite, boolean rightWrite, String iconName) {
|
|
| 70 | 68 | this.leftWrite = leftWrite;
|
| 71 | 69 | this.rightWrite = rightWrite;
|
| 72 | 70 | this.keyStroke = ObserveKeyStrokesSupport.getFunctionKeyStroke(ordinal() + 1);
|
| ... | ... | @@ -90,6 +88,6 @@ public enum ReferentialSynchronizeMode { |
| 90 | 88 | }
|
| 91 | 89 | |
| 92 | 90 | public String getLabel() {
|
| 93 | - return ReferentialSynchronizeModeI18n.getLabel(this);
|
|
| 91 | + return SynchronizeModeI18n.getLabel(this);
|
|
| 94 | 92 | }
|
| 95 | 93 | } |
| 1 | +package fr.ird.observe.client.datasource.actions.synchronize;
|
|
| 2 | + |
|
| 3 | +/*-
|
|
| 4 | + * #%L
|
|
| 5 | + * ObServe Client :: DataSource :: Actions
|
|
| 6 | + * %%
|
|
| 7 | + * Copyright (C) 2008 - 2024 IRD, Ultreia.io
|
|
| 8 | + * %%
|
|
| 9 | + * This program is free software: you can redistribute it and/or modify
|
|
| 10 | + * it under the terms of the GNU General Public License as
|
|
| 11 | + * published by the Free Software Foundation, either version 3 of the
|
|
| 12 | + * License, or (at your option) any later version.
|
|
| 13 | + *
|
|
| 14 | + * This program is distributed in the hope that it will be useful,
|
|
| 15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| 16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| 17 | + * GNU General Public License for more details.
|
|
| 18 | + *
|
|
| 19 | + * You should have received a copy of the GNU General Public
|
|
| 20 | + * License along with this program. If not, see
|
|
| 21 | + * <http://www.gnu.org/licenses/gpl-3.0.html>.
|
|
| 22 | + * #L%
|
|
| 23 | + */
|
|
| 24 | + |
|
| 25 | +import fr.ird.observe.client.datasource.actions.AdminActionModel;
|
|
| 26 | +import fr.ird.observe.client.datasource.actions.AdminUI;
|
|
| 27 | +import fr.ird.observe.client.datasource.actions.AdminUIModel;
|
|
| 28 | +import fr.ird.observe.client.datasource.actions.synchronize.data.DataSynchroModel;
|
|
| 29 | +import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
|
|
| 30 | +import io.ultreia.java4all.bean.JavaBean;
|
|
| 31 | + |
|
| 32 | +/**
|
|
| 33 | + * Contract of {@link AdminActionModel} model when using synchronize mode.
|
|
| 34 | + * <p>
|
|
| 35 | + * Created at 25/06/2024.
|
|
| 36 | + *
|
|
| 37 | + * @author Tony Chemit - dev@tchemit.fr
|
|
| 38 | + * @since 9.3.6
|
|
| 39 | + */
|
|
| 40 | +public interface SynchronizeModel extends JavaBean {
|
|
| 41 | + |
|
| 42 | + String SYNCHRONIZE_MODE_PROPERTY_NAME = "synchronizeMode";
|
|
| 43 | + |
|
| 44 | + SynchronizeMode getSynchronizeMode();
|
|
| 45 | + |
|
| 46 | + void setSynchronizeMode(SynchronizeMode synchronizeMode);
|
|
| 47 | + |
|
| 48 | + default void start(AdminUIModel uiModel) {
|
|
| 49 | + |
|
| 50 | + addPropertyChangeListener(SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
|
|
| 51 | + if (uiModel.isWasStarted()) {
|
|
| 52 | + // on ne propage plus rien (il n'y a plus de configuration possible...)
|
|
| 53 | + return;
|
|
| 54 | + }
|
|
| 55 | + uiModel.validate();
|
|
| 56 | + });
|
|
| 57 | + |
|
| 58 | + setSynchronizeMode(SynchronizeMode.FROM_LEFT_TO_RIGHT);
|
|
| 59 | + }
|
|
| 60 | + |
|
| 61 | + default void afterInit(AdminUI parentUI) {
|
|
| 62 | + addPropertyChangeListener(DataSynchroModel.SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
|
|
| 63 | + SynchronizeMode newValue = (SynchronizeMode) evt.getNewValue();
|
|
| 64 | + if (parentUI.getTabs().getComponentCount() > 1 && newValue != null) {
|
|
| 65 | + parentUI.getTabs().setTitleAt(1, getTitleWithMode(newValue));
|
|
| 66 | + }
|
|
| 67 | + });
|
|
| 68 | + }
|
|
| 69 | + |
|
| 70 | + boolean isCanWrite(DataSourceSelectorModel dataSourceSelectorModel);
|
|
| 71 | + |
|
| 72 | + String getTitleWithMode(SynchronizeMode mode);
|
|
| 73 | +} |
| 1 | +<!--
|
|
| 2 | + #%L
|
|
| 3 | + ObServe Client :: DataSource :: Actions
|
|
| 4 | + %%
|
|
| 5 | + Copyright (C) 2008 - 2023 IRD, Ultreia.io
|
|
| 6 | + %%
|
|
| 7 | + This program is free software: you can redistribute it and/or modify
|
|
| 8 | + it under the terms of the GNU General Public License as
|
|
| 9 | + published by the Free Software Foundation, either version 3 of the
|
|
| 10 | + License, or (at your option) any later version.
|
|
| 11 | + This program is distributed in the hope that it will be useful,
|
|
| 12 | + but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| 13 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| 14 | + GNU General Public License for more details.
|
|
| 15 | + You should have received a copy of the GNU General Public
|
|
| 16 | + License along with this program. If not, see
|
|
| 17 | + <http://www.gnu.org/licenses/gpl-3.0.html>.
|
|
| 18 | + #L%
|
|
| 19 | + -->
|
|
| 20 | +<JPanel id="dataSynchronizeConfig" layout="{new BorderLayout()}" implements="fr.ird.observe.client.datasource.actions.synchronize.SynchronizeConfigUI">
|
|
| 21 | + |
|
| 22 | + <style source="../SynchronizeConfigUI.jcss"/>
|
|
| 23 | + <import>
|
|
| 24 | + fr.ird.observe.client.datasource.actions.AdminUIModel
|
|
| 25 | + |
|
| 26 | + io.ultreia.java4all.i18n.I18n
|
|
| 27 | + |
|
| 28 | + static io.ultreia.java4all.i18n.I18n.t
|
|
| 29 | + static fr.ird.observe.client.util.UIHelper.getStringValue
|
|
| 30 | + </import>
|
|
| 31 | + |
|
| 32 | + <DataSynchroUIHandler id='handler' initializer='getContextValue(DataSynchroUIHandler.class)'/>
|
|
| 33 | + <AdminUIModel id='model' initializer='getContextValue(AdminUIModel.class)'/>
|
|
| 34 | + <DataSynchroModel id='stepModel' initializer='model.getDataSynchroModel()'/>
|
|
| 35 | + <ButtonGroup id='synchronizeMode'/>
|
|
| 36 | + |
|
| 37 | + <script><![CDATA[
|
|
| 38 | +public void destroy() {
|
|
| 39 | + model = null;
|
|
| 40 | + stepModel = null;
|
|
| 41 | +}
|
|
| 42 | +]]>
|
|
| 43 | + </script>
|
|
| 44 | + |
|
| 45 | + <JPanel id="synchronizeConfigPanel" constraints='BorderLayout.CENTER' layout='{new GridLayout(0, 1)}'>
|
|
| 46 | + <JToggleButton id="FROM_LEFT_TO_RIGHT" styleClass="synchronizeMode"/>
|
|
| 47 | + <JToggleButton id="FROM_RIGHT_TO_LEFT" styleClass="synchronizeMode"/>
|
|
| 48 | + <JToggleButton id="BOTH" styleClass="synchronizeMode"/>
|
|
| 49 | + </JPanel>
|
|
| 50 | +</JPanel> |
| ... | ... | @@ -25,11 +25,14 @@ package fr.ird.observe.client.datasource.actions.synchronize.data; |
| 25 | 25 | import fr.ird.observe.client.datasource.actions.AdminActionModel;
|
| 26 | 26 | import fr.ird.observe.client.datasource.actions.AdminStep;
|
| 27 | 27 | import fr.ird.observe.client.datasource.actions.AdminUIModel;
|
| 28 | +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
|
|
| 29 | +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeModel;
|
|
| 28 | 30 | import fr.ird.observe.client.datasource.actions.synchronize.data.tree.DataSelectionTreePaneModel;
|
| 29 | 31 | import fr.ird.observe.client.datasource.api.data.DataTaskSupport;
|
| 30 | 32 | import fr.ird.observe.client.datasource.api.data.TaskSide;
|
| 31 | 33 | import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
|
| 32 | 34 | import fr.ird.observe.datasource.configuration.ObserveDataSourceInformation;
|
| 35 | +import io.ultreia.java4all.i18n.I18n;
|
|
| 33 | 36 | import io.ultreia.java4all.util.TwoSideContext;
|
| 34 | 37 | import org.apache.logging.log4j.LogManager;
|
| 35 | 38 | import org.apache.logging.log4j.Logger;
|
| ... | ... | @@ -43,8 +46,7 @@ import javax.swing.DefaultListModel; |
| 43 | 46 | * @author Tony Chemit - dev@tchemit.fr
|
| 44 | 47 | * @since 5.0
|
| 45 | 48 | */
|
| 46 | -public class DataSynchroModel extends AdminActionModel implements TwoSideContext<TaskSide, DataSelectionTreePaneModel> {
|
|
| 47 | - |
|
| 49 | +public class DataSynchroModel extends AdminActionModel implements SynchronizeModel, TwoSideContext<TaskSide, DataSelectionTreePaneModel> {
|
|
| 48 | 50 | public static final String LEFT_MODEL = "leftModel";
|
| 49 | 51 | public static final String RIGHT_MODEL = "rightModel";
|
| 50 | 52 | private static final String TASKS_EMPTY_PROPERTY_NAME = "tasksEmpty";
|
| ... | ... | @@ -57,11 +59,14 @@ public class DataSynchroModel extends AdminActionModel implements TwoSideContext |
| 57 | 59 | * Right model.
|
| 58 | 60 | */
|
| 59 | 61 | private final DataSelectionTreePaneModel rightModel = new DataSelectionTreePaneModel();
|
| 60 | - |
|
| 61 | 62 | /**
|
| 62 | 63 | * Registered tasks to apply.
|
| 63 | 64 | */
|
| 64 | 65 | private final DefaultListModel<DataTaskSupport> tasks = new DefaultListModel<>();
|
| 66 | + /**
|
|
| 67 | + * Synchronize mode.
|
|
| 68 | + */
|
|
| 69 | + private SynchronizeMode synchronizeMode;
|
|
| 65 | 70 | |
| 66 | 71 | public DataSynchroModel() {
|
| 67 | 72 | super(AdminStep.DATA_SYNCHRONIZE);
|
| ... | ... | @@ -86,6 +91,29 @@ public class DataSynchroModel extends AdminActionModel implements TwoSideContext |
| 86 | 91 | rightSourceModel.setRequiredReadOnReferential(true);
|
| 87 | 92 | rightSourceModel.setRequiredReadOnData(true);
|
| 88 | 93 | fireTasksEmptyChanged();
|
| 94 | + SynchronizeModel.super.start(uiModel);
|
|
| 95 | + }
|
|
| 96 | + |
|
| 97 | + @Override
|
|
| 98 | + public boolean isCanWrite(DataSourceSelectorModel dataSourceSelectorModel) {
|
|
| 99 | + return dataSourceSelectorModel.isCanWriteData();
|
|
| 100 | + }
|
|
| 101 | + |
|
| 102 | + @Override
|
|
| 103 | + public String getTitleWithMode(SynchronizeMode mode) {
|
|
| 104 | + return I18n.t("observe.ui.datasource.editor.actions.synchro.data.withMode", mode.getLabel());
|
|
| 105 | + }
|
|
| 106 | + |
|
| 107 | + @Override
|
|
| 108 | + public SynchronizeMode getSynchronizeMode() {
|
|
| 109 | + return synchronizeMode;
|
|
| 110 | + }
|
|
| 111 | + |
|
| 112 | + @Override
|
|
| 113 | + public void setSynchronizeMode(SynchronizeMode synchronizeMode) {
|
|
| 114 | + Object oldValue = getSynchronizeMode();
|
|
| 115 | + this.synchronizeMode = synchronizeMode;
|
|
| 116 | + firePropertyChange(SYNCHRONIZE_MODE_PROPERTY_NAME, oldValue, synchronizeMode);
|
|
| 89 | 117 | }
|
| 90 | 118 | |
| 91 | 119 | @Override
|
| ... | ... | @@ -29,6 +29,7 @@ import fr.ird.observe.client.datasource.actions.synchronize.data.tree.DataSelect |
| 29 | 29 | import fr.ird.observe.client.datasource.api.data.TaskSide;
|
| 30 | 30 | import fr.ird.observe.client.datasource.editor.api.selection.actions.SelectUnselectWithOpposite;
|
| 31 | 31 | import fr.ird.observe.client.datasource.editor.api.wizard.StorageUIModel;
|
| 32 | +import fr.ird.observe.client.util.UIHelper;
|
|
| 32 | 33 | import fr.ird.observe.client.util.init.UIInitHelper;
|
| 33 | 34 | import org.nuiton.jaxx.runtime.spi.UIHandler;
|
| 34 | 35 | |
| ... | ... | @@ -64,15 +65,21 @@ class DataSynchroUIHandler extends AdminTabUIHandler<DataSynchroUI> implements U |
| 64 | 65 | SelectUnselectWithOpposite.init(ui.getLeftTreePane().getTree(), null, new SelectUnselectWithOpposite(ui.getRightTreePane().getTree()));
|
| 65 | 66 | JScrollPane descriptionPane = ui.getDescriptionPane();
|
| 66 | 67 | descriptionPane.getParent().remove(descriptionPane);
|
| 67 | - |
|
| 68 | 68 | hideFixedPanelLabel(ui);
|
| 69 | + ui.getStepModel().afterInit(parentUI);
|
|
| 69 | 70 | }
|
| 70 | 71 | |
| 71 | 72 | @Override
|
| 72 | 73 | protected void initConfig(ConfigUI configUI) {
|
| 74 | + configUI.getLeftSourceConfig().getSourceInfoLabel().setVisible(true);
|
|
| 73 | 75 | configUI.getLeftSourceModel().setSourceLabel(t("observe.ui.datasource.storage.config.left.storage"));
|
| 76 | + configUI.getLeftSourceConfig().getSourceInfoLabel().setText(t("observe.ui.action.config.export.required.read.data"));
|
|
| 77 | + configUI.getRightSourceConfig().getSourceInfoLabel().setText(t("observe.ui.action.config.export.required.read.data"));
|
|
| 74 | 78 | configUI.getRightSourceModel().setSourceLabel(t("observe.ui.datasource.storage.config.right.storage"));
|
| 79 | + DataSynchroConfigUI extraConfig = new DataSynchroConfigUI(UIHelper.initialContext(configUI, this));
|
|
| 80 | + configUI.getExtraConfig().add(extraConfig);
|
|
| 75 | 81 | ConfigModel configModel = configUI.getStepModel();
|
| 82 | + configModel.addPropertyChangeListener(StorageUIModel.VALID_STEP_PROPERTY_NAME, evt -> extraConfig.updateSynchroModes());
|
|
| 76 | 83 | configModel.addPropertyChangeListener(StorageUIModel.VALID_PROPERTY_NAME, evt -> getModel().validate());
|
| 77 | 84 | }
|
| 78 | 85 |
| ... | ... | @@ -72,12 +72,18 @@ public class Start extends DataSynchroUIActionSupport { |
| 72 | 72 | rightModel.setSource(rightSource);
|
| 73 | 73 | |
| 74 | 74 | DataSelectionTreePane leftTreePane = tabUI.getLeftTreePane();
|
| 75 | - DataSelectionTreePaneHandler.initDatasource(configModel.getLeftSourceModel(), rightSource.getDataSourceInformation().canWriteData(), leftTreePane, leftModel.getIdStates());
|
|
| 75 | + boolean rightCanWrite = rightSource.getDataSourceInformation().canWriteData()
|
|
| 76 | + && configModel.getRightSourceModel().isCanWriteReferential()
|
|
| 77 | + && stepModel.getSynchronizeMode().isRightWrite();
|
|
| 78 | + DataSelectionTreePaneHandler.initDatasource(configModel.getLeftSourceModel(), rightCanWrite, stepModel.getSynchronizeMode().isLeftWrite(),leftTreePane, leftModel.getIdStates());
|
|
| 76 | 79 | progressModel.increments();
|
| 77 | 80 | sendMessage(t("observe.ui.datasource.editor.actions.synchro.data.message.data.loaded", leftSourceLabel));
|
| 78 | 81 | |
| 79 | 82 | DataSelectionTreePane rightTreePane = tabUI.getRightTreePane();
|
| 80 | - DataSelectionTreePaneHandler.initDatasource(configModel.getRightSourceModel(), leftSource.getDataSourceInformation().canWriteData(), rightTreePane, rightModel.getIdStates());
|
|
| 83 | + boolean leftCanWrite = leftSource.getDataSourceInformation().canWriteData()
|
|
| 84 | + && configModel.getLeftSourceModel().isCanWriteReferential()
|
|
| 85 | + && stepModel.getSynchronizeMode().isLeftWrite();
|
|
| 86 | + DataSelectionTreePaneHandler.initDatasource(configModel.getRightSourceModel(), leftCanWrite, stepModel.getSynchronizeMode().isRightWrite(),rightTreePane, rightModel.getIdStates());
|
|
| 81 | 87 | progressModel.increments();
|
| 82 | 88 | sendMessage(t("observe.ui.datasource.editor.actions.synchro.data.message.data.loaded", rightSourceLabel));
|
| 83 | 89 |
| ... | ... | @@ -30,9 +30,10 @@ |
| 30 | 30 | <JToggleButton id="toggleNewer"/>
|
| 31 | 31 | <JToggleButton id="toggleOlder"/>
|
| 32 | 32 | <JToggleButton id="toggleEquals"/>
|
| 33 | - <JSeparator orientation='{JSeparator.VERTICAL}'/>
|
|
| 34 | - <JButton id="copy" enabled="false"/>
|
|
| 35 | - <JButton id="delete" enabled="false"/>
|
|
| 36 | 33 | </JToolBar>
|
| 37 | 34 | <SelectionTreePane id='tree' constructorParams="!side.onLeft()" constraints='BorderLayout.CENTER'/>
|
| 35 | + <JToolBar id="middleActions" layout="{new GridLayout(0, 1)}" constraints='BorderLayout.EAST'>
|
|
| 36 | + <JButton id="copy" enabled="false" visible="{model.isCanCopy()}"/>
|
|
| 37 | + <JButton id="delete" enabled="false" visible="{model.isCanDelete()}"/>
|
|
| 38 | + </JToolBar>
|
|
| 38 | 39 | </JPanel> |
| ... | ... | @@ -49,6 +49,7 @@ import javax.swing.JPopupMenu; |
| 49 | 49 | import javax.swing.SwingUtilities;
|
| 50 | 50 | import javax.swing.ToolTipManager;
|
| 51 | 51 | import javax.swing.tree.TreePath;
|
| 52 | +import java.awt.BorderLayout;
|
|
| 52 | 53 | import java.awt.Color;
|
| 53 | 54 | import java.awt.Component;
|
| 54 | 55 | import java.awt.event.MouseAdapter;
|
| ... | ... | @@ -63,9 +64,8 @@ import java.util.function.Consumer; |
| 63 | 64 | */
|
| 64 | 65 | public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTreePane> {
|
| 65 | 66 | |
| 66 | - private static final Logger log = LogManager.getLogger(DataSelectionTreePaneHandler.class);
|
|
| 67 | - |
|
| 68 | 67 | public static final TwoSideContext<TaskSide, String> MODEL_NAMES = TwoSideContext.of(DataSynchroModel.LEFT_MODEL, DataSynchroModel.RIGHT_MODEL);
|
| 68 | + private static final Logger log = LogManager.getLogger(DataSelectionTreePaneHandler.class);
|
|
| 69 | 69 | |
| 70 | 70 | static DataSelectionTreePaneModel getModel(DataSelectionTreePane ui) {
|
| 71 | 71 | return ui.getContextValue(DataSelectionTreePaneModel.class, MODEL_NAMES.onSameSide(ui.getSide()));
|
| ... | ... | @@ -92,6 +92,11 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree |
| 92 | 92 | for (Component component : ui.getToolbar().getComponents()) {
|
| 93 | 93 | treePane.getToolbar().add(component);
|
| 94 | 94 | }
|
| 95 | + boolean isLeft = taskSide.onLeft();
|
|
| 96 | + if (!isLeft) {
|
|
| 97 | + ui.remove(ui.getMiddleActions());
|
|
| 98 | + ui.add(ui.getMiddleActions(), BorderLayout.WEST);
|
|
| 99 | + }
|
|
| 95 | 100 | |
| 96 | 101 | Consumer<TreeConfigUI> consumer = TreeConfigUIHandler::hideOptions;
|
| 97 | 102 | Consumer<TreeConfigUI> apply = u -> rebuildTree(parent.getModel().getDataSynchroModel(), ui, true);
|
| ... | ... | @@ -104,14 +109,13 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree |
| 104 | 109 | DataSelectionTreePaneModel model = ui.getModel();
|
| 105 | 110 | model.setSelectionDataModel(treeModel);
|
| 106 | 111 | // When model idStates has changed, rebuild the tree (but not the flat model)
|
| 107 | - model.addPropertyChangeListener(DataSelectionTreePaneModel.ID_STATES_PROPERTY_NAME,
|
|
| 108 | - evt -> DataSelectionTreePaneHandler.rebuildTree(parent.getStepModel(), ui, false));
|
|
| 112 | + model.addPropertyChangeListener(DataSelectionTreePaneModel.ID_STATES_PROPERTY_NAME, evt -> rebuildTree(parent.getStepModel(), ui, false));
|
|
| 109 | 113 | |
| 110 | 114 | // When tree model has changed, rebuild accessibility to copy and delete action
|
| 111 | 115 | treeModel.addPropertyChangeListener(evt -> {
|
| 112 | 116 | boolean withDataSelected = !treeModel.isSelectionEmpty();
|
| 113 | - ui.getCopy().setEnabled(withDataSelected);
|
|
| 114 | - ui.getDelete().setEnabled(withDataSelected);
|
|
| 117 | + ui.getCopy().setEnabled(ui.getModel().isCanCopy() && withDataSelected);
|
|
| 118 | + ui.getDelete().setEnabled(ui.getModel().isCanDelete() && withDataSelected);
|
|
| 115 | 119 | });
|
| 116 | 120 | // When use double clicks in tree, update selection state of the selected node
|
| 117 | 121 | tree.addMouseListener(new MouseAdapter() {
|
| ... | ... | @@ -131,15 +135,14 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree |
| 131 | 135 | });
|
| 132 | 136 | }
|
| 133 | 137 | |
| 134 | - public static void initDatasource(DataSourceSelectorModel sourceModel, boolean oppositeCanWriteData, DataSelectionTreePane ui, EnumSet<IdState> idStates) {
|
|
| 138 | + public static void initDatasource(DataSourceSelectorModel sourceModel, boolean oppositeCanWrite, boolean canWrite, DataSelectionTreePane ui, EnumSet<IdState> idStates) {
|
|
| 135 | 139 | |
| 136 | 140 | ui.setContextValue(sourceModel);
|
| 137 | 141 | |
| 138 | - boolean canWriteData = sourceModel.getDataSourceInformation().canWriteData();
|
|
| 142 | + boolean canWriteData = canWrite && sourceModel.isCanWriteData();
|
|
| 139 | 143 | Color color = canWriteData ? Color.BLACK : Color.RED;
|
| 140 | - |
|
| 141 | - ui.getDelete().setEnabled(canWriteData);
|
|
| 142 | - ui.getCopy().setEnabled(oppositeCanWriteData);
|
|
| 144 | + ui.getModel().setCanCopy(oppositeCanWrite);
|
|
| 145 | + ui.getModel().setCanDelete(canWriteData);
|
|
| 143 | 146 | ui.getToggleEquals().setSelected(idStates.contains(IdState.EQUALS));
|
| 144 | 147 | ui.getToggleOlder().setSelected(idStates.contains(IdState.OBSOLETE));
|
| 145 | 148 | ui.getToggleNewer().setSelected(idStates.contains(IdState.UPDATED));
|
| ... | ... | @@ -180,5 +183,4 @@ public class DataSelectionTreePaneHandler implements UIHandler<DataSelectionTree |
| 180 | 183 | public void beforeInit(DataSelectionTreePane ui) {
|
| 181 | 184 | ui.setComponentPopupMenu(new JPopupMenu());
|
| 182 | 185 | }
|
| 183 | - |
|
| 184 | 186 | } |
| ... | ... | @@ -60,6 +60,8 @@ public class DataSelectionTreePaneModel extends AbstractJavaBean { |
| 60 | 60 | public static final String ID_STATES_PROPERTY_NAME = "idStates";
|
| 61 | 61 | private static final Logger log = LogManager.getLogger(DataSelectionTreePaneModel.class);
|
| 62 | 62 | private static final String SOURCE_PROPERTY_NAME = "source";
|
| 63 | + private static final String CAN_COPY_PROPERTY_NAME = "canCopy";
|
|
| 64 | + private static final String CAN_DELETE_PROPERTY_NAME = "canDelete";
|
|
| 63 | 65 | /**
|
| 64 | 66 | * Which id states we use in tree model.
|
| 65 | 67 | */
|
| ... | ... | @@ -88,6 +90,14 @@ public class DataSelectionTreePaneModel extends AbstractJavaBean { |
| 88 | 90 | */
|
| 89 | 91 | private List<IdAndLastUpdateDate> dataIds = List.of();
|
| 90 | 92 | |
| 93 | + /**
|
|
| 94 | + * Can we copy from this side?
|
|
| 95 | + */
|
|
| 96 | + private boolean canCopy;
|
|
| 97 | + /**
|
|
| 98 | + * Can we delete from this side?
|
|
| 99 | + */
|
|
| 100 | + private boolean canDelete;
|
|
| 91 | 101 | public void dispose() {
|
| 92 | 102 | source = null;
|
| 93 | 103 | treeFlatModel = null;
|
| ... | ... | @@ -104,6 +114,26 @@ public class DataSelectionTreePaneModel extends AbstractJavaBean { |
| 104 | 114 | firePropertyChange(SOURCE_PROPERTY_NAME, source);
|
| 105 | 115 | }
|
| 106 | 116 | |
| 117 | + public boolean isCanCopy() {
|
|
| 118 | + return canCopy;
|
|
| 119 | + }
|
|
| 120 | + |
|
| 121 | + public void setCanCopy(boolean canCopy) {
|
|
| 122 | + boolean oldValue = this.canCopy;
|
|
| 123 | + this.canCopy = canCopy;
|
|
| 124 | + firePropertyChange(CAN_COPY_PROPERTY_NAME, oldValue, canCopy);
|
|
| 125 | + }
|
|
| 126 | + |
|
| 127 | + public boolean isCanDelete() {
|
|
| 128 | + return canDelete;
|
|
| 129 | + }
|
|
| 130 | + |
|
| 131 | + public void setCanDelete(boolean canDelete) {
|
|
| 132 | + boolean oldValue = this.canDelete;
|
|
| 133 | + this.canDelete = canDelete;
|
|
| 134 | + firePropertyChange(CAN_DELETE_PROPERTY_NAME, oldValue, canDelete);
|
|
| 135 | + }
|
|
| 136 | + |
|
| 107 | 137 | public SelectionTreeModel getSelectionDataModel() {
|
| 108 | 138 | return selectionDataModel;
|
| 109 | 139 | }
|
| ... | ... | @@ -17,21 +17,14 @@ |
| 17 | 17 | <http://www.gnu.org/licenses/gpl-3.0.html>.
|
| 18 | 18 | #L%
|
| 19 | 19 | -->
|
| 20 | -<JPanel id="referentialSynchronizeConfig" layout="{new BorderLayout()}">
|
|
| 20 | +<JPanel id="referentialSynchronizeConfig" layout="{new BorderLayout()}" implements="fr.ird.observe.client.datasource.actions.synchronize.SynchronizeConfigUI">
|
|
| 21 | 21 | |
| 22 | + <style source="../../SynchronizeConfigUI.jcss"/>
|
|
| 22 | 23 | <import>
|
| 23 | - fr.ird.observe.client.configuration.ClientConfig
|
|
| 24 | - fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode
|
|
| 25 | - fr.ird.observe.client.datasource.actions.synchronize.referential.ng.actions.SelectReferentialSynchronizeMode
|
|
| 26 | 24 | fr.ird.observe.client.datasource.actions.AdminUIModel
|
| 27 | 25 | |
| 28 | - org.nuiton.validator.NuitonValidatorScope
|
|
| 29 | 26 | io.ultreia.java4all.i18n.I18n
|
| 30 | 27 | |
| 31 | - java.io.File
|
|
| 32 | - java.util.Objects
|
|
| 33 | - javax.swing.JComboBox
|
|
| 34 | - |
|
| 35 | 28 | static io.ultreia.java4all.i18n.I18n.t
|
| 36 | 29 | static fr.ird.observe.client.util.UIHelper.getStringValue
|
| 37 | 30 | </import>
|
| ... | ... | @@ -49,7 +42,7 @@ public void destroy() { |
| 49 | 42 | ]]>
|
| 50 | 43 | </script>
|
| 51 | 44 | |
| 52 | - <JPanel id="referentialSynchronizeConfigPanel" constraints='BorderLayout.CENTER' layout='{new GridLayout(0, 1)}'>
|
|
| 45 | + <JPanel id="synchronizeConfigPanel" constraints='BorderLayout.CENTER' layout='{new GridLayout(0, 1)}'>
|
|
| 53 | 46 | <JToggleButton id="FROM_LEFT_TO_RIGHT" styleClass="synchronizeMode"/>
|
| 54 | 47 | <JToggleButton id="FROM_RIGHT_TO_LEFT" styleClass="synchronizeMode"/>
|
| 55 | 48 | <JToggleButton id="BOTH" styleClass="synchronizeMode"/>
|
| ... | ... | @@ -57,8 +50,7 @@ public void destroy() { |
| 57 | 50 | <Table constraints='BorderLayout.SOUTH' weightx='1'>
|
| 58 | 51 | <row>
|
| 59 | 52 | <cell>
|
| 60 | - <JCheckBox id='showProperties'
|
|
| 61 | - onStateChanged='getStepModel().setShowProperties(((JCheckBox)event.getSource()).isSelected())'/>
|
|
| 53 | + <JCheckBox id='showProperties' onStateChanged='getStepModel().setShowProperties(((JCheckBox)event.getSource()).isSelected())'/>
|
|
| 62 | 54 | </cell>
|
| 63 | 55 | </row>
|
| 64 | 56 | <row>
|
| ... | ... | @@ -20,22 +20,6 @@ |
| 20 | 20 | * #L%
|
| 21 | 21 | */
|
| 22 | 22 | |
| 23 | -#referentialSynchronizeConfigPanel {
|
|
| 24 | - border:{new TitledBorder(t("observe.ui.datasource.editor.actions.synchro.referential.config.mode") + "")};
|
|
| 25 | -}
|
|
| 26 | - |
|
| 27 | -#synchronizeMode {
|
|
| 28 | - selectedValue:{stepModel.getSynchronizeMode()};
|
|
| 29 | -}
|
|
| 30 | - |
|
| 31 | -.synchronizeMode {
|
|
| 32 | - buttonGroup:"synchronizeMode";
|
|
| 33 | - enabled:false;
|
|
| 34 | - selected:{Objects.equals(ReferentialSynchronizeMode.%%, stepModel.getSynchronizeMode())};
|
|
| 35 | - value:{ReferentialSynchronizeMode.%%};
|
|
| 36 | - action:{new SelectReferentialSynchronizeMode(ReferentialSynchronizeMode.%%)};
|
|
| 37 | -}
|
|
| 38 | - |
|
| 39 | 23 | #showProperties {
|
| 40 | 24 | text:"observe.ui.action.show.properties";
|
| 41 | 25 | toolTipText:"observe.ui.action.show.properties.tip";
|
| ... | ... | @@ -27,6 +27,8 @@ import fr.ird.observe.client.datasource.actions.AdminActionModel; |
| 27 | 27 | import fr.ird.observe.client.datasource.actions.AdminStep;
|
| 28 | 28 | import fr.ird.observe.client.datasource.actions.AdminUIModel;
|
| 29 | 29 | import fr.ird.observe.client.datasource.actions.config.ConfigModel;
|
| 30 | +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
|
|
| 31 | +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeModel;
|
|
| 30 | 32 | import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.task.ReferentialSynchronizeTaskListModel;
|
| 31 | 33 | import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.task.SwingReferentialSynchronizeTask;
|
| 32 | 34 | import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSynchronizeTreeModel;
|
| ... | ... | @@ -43,6 +45,7 @@ import fr.ird.observe.services.service.referential.SynchronizeEngine; |
| 43 | 45 | import fr.ird.observe.services.service.referential.differential.DifferentialModelBuilder;
|
| 44 | 46 | import fr.ird.observe.services.service.referential.differential.DifferentialType;
|
| 45 | 47 | import fr.ird.observe.services.service.referential.synchro.SynchronizeTaskType;
|
| 48 | +import io.ultreia.java4all.i18n.I18n;
|
|
| 46 | 49 | import io.ultreia.java4all.util.LeftOrRight;
|
| 47 | 50 | import io.ultreia.java4all.util.LeftOrRightContext;
|
| 48 | 51 | import org.apache.logging.log4j.LogManager;
|
| ... | ... | @@ -64,9 +67,8 @@ import java.util.Set; |
| 64 | 67 | * @since 5.0
|
| 65 | 68 | */
|
| 66 | 69 | @SuppressWarnings("unused")
|
| 67 | -public class ReferentialSynchroModel extends AdminActionModel {
|
|
| 70 | +public class ReferentialSynchroModel extends AdminActionModel implements SynchronizeModel {
|
|
| 68 | 71 | |
| 69 | - public static final String SYNCHRONIZE_MODE_PROPERTY_NAME = "synchronizeMode";
|
|
| 70 | 72 | public static final String SHOW_PROPERTIES_PROPERTY_NAME = "showProperties";
|
| 71 | 73 | public static final String LEFT_SOURCE_PROPERTY_NAME = "leftSource";
|
| 72 | 74 | public static final String RIGHT_SOURCE_PROPERTY_NAME = "rightSource";
|
| ... | ... | @@ -91,7 +93,7 @@ public class ReferentialSynchroModel extends AdminActionModel { |
| 91 | 93 | private final LeftOrRightContext<ReferentialSynchronizeTreeModel> treeModels;
|
| 92 | 94 | private ObserveSwingDataSource leftSource;
|
| 93 | 95 | private ObserveSwingDataSource rightSource;
|
| 94 | - private ReferentialSynchronizeMode synchronizeMode;
|
|
| 96 | + private SynchronizeMode synchronizeMode;
|
|
| 95 | 97 | private boolean showProperties;
|
| 96 | 98 | private ReferentialSynchronizeTreeModel leftTreeModel;
|
| 97 | 99 | private ReferentialSynchronizeTreeModel rightTreeModel;
|
| ... | ... | @@ -147,6 +149,17 @@ public class ReferentialSynchroModel extends AdminActionModel { |
| 147 | 149 | };
|
| 148 | 150 | }
|
| 149 | 151 | |
| 152 | + @Override
|
|
| 153 | + public boolean isCanWrite(DataSourceSelectorModel dataSourceSelectorModel) {
|
|
| 154 | + return dataSourceSelectorModel.isCanWriteReferential();
|
|
| 155 | + }
|
|
| 156 | + |
|
| 157 | + @Override
|
|
| 158 | + public String getTitleWithMode(SynchronizeMode mode) {
|
|
| 159 | + return I18n.t("observe.ui.datasource.editor.actions.synchro.referential.withMode", mode.getLabel());
|
|
| 160 | + }
|
|
| 161 | + |
|
| 162 | + |
|
| 150 | 163 | @Override
|
| 151 | 164 | public void start(AdminUIModel uiModel) {
|
| 152 | 165 | |
| ... | ... | @@ -154,21 +167,13 @@ public class ReferentialSynchroModel extends AdminActionModel { |
| 154 | 167 | configModel.getLeftSourceModel().setRequiredReadOnReferential(true);
|
| 155 | 168 | configModel.getRightSourceModel().setRequiredReadOnReferential(true);
|
| 156 | 169 | |
| 157 | - addPropertyChangeListener(SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
|
|
| 158 | - if (uiModel.isWasStarted()) {
|
|
| 159 | - // on ne propage plus rien (il n'y a plus de configuration possible...)
|
|
| 160 | - log.debug("Stop propagation, was started... " + evt.getPropertyName());
|
|
| 161 | - return;
|
|
| 162 | - }
|
|
| 163 | - uiModel.validate();
|
|
| 164 | - });
|
|
| 165 | - setSynchronizeMode(ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT);
|
|
| 170 | + SynchronizeModel.super.start(uiModel);
|
|
| 166 | 171 | setShowProperties(true);
|
| 167 | 172 | }
|
| 168 | 173 | |
| 169 | 174 | @Override
|
| 170 | 175 | public boolean validateConfig(AdminUIModel uiModel) {
|
| 171 | - ReferentialSynchronizeMode synchronizeMode = uiModel.getReferentialSynchroModel().getSynchronizeMode();
|
|
| 176 | + SynchronizeMode synchronizeMode = uiModel.getReferentialSynchroModel().getSynchronizeMode();
|
|
| 172 | 177 | if (synchronizeMode == null) {
|
| 173 | 178 | log.info("No synchronize mode selected");
|
| 174 | 179 | return false;
|
| ... | ... | @@ -212,11 +217,13 @@ public class ReferentialSynchroModel extends AdminActionModel { |
| 212 | 217 | rightTreeModel = null;
|
| 213 | 218 | }
|
| 214 | 219 | |
| 215 | - public ReferentialSynchronizeMode getSynchronizeMode() {
|
|
| 220 | + @Override
|
|
| 221 | + public SynchronizeMode getSynchronizeMode() {
|
|
| 216 | 222 | return synchronizeMode;
|
| 217 | 223 | }
|
| 218 | 224 | |
| 219 | - public void setSynchronizeMode(ReferentialSynchronizeMode synchronizeMode) {
|
|
| 225 | + @Override
|
|
| 226 | + public void setSynchronizeMode(SynchronizeMode synchronizeMode) {
|
|
| 220 | 227 | Object oldValue = getSynchronizeMode();
|
| 221 | 228 | this.synchronizeMode = synchronizeMode;
|
| 222 | 229 | firePropertyChange(SYNCHRONIZE_MODE_PROPERTY_NAME, oldValue, synchronizeMode);
|
| ... | ... | @@ -23,17 +23,12 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng; |
| 23 | 23 | */
|
| 24 | 24 | |
| 25 | 25 | import fr.ird.observe.client.datasource.actions.AdminTabUIHandler;
|
| 26 | -import fr.ird.observe.client.datasource.actions.AdminUIModel;
|
|
| 27 | 26 | import fr.ird.observe.client.datasource.actions.config.ConfigUI;
|
| 28 | 27 | import fr.ird.observe.client.datasource.editor.api.wizard.StorageUIModel;
|
| 29 | -import fr.ird.observe.client.datasource.editor.api.wizard.connexion.DataSourceSelectorModel;
|
|
| 30 | 28 | import fr.ird.observe.client.util.UIHelper;
|
| 31 | -import org.apache.logging.log4j.LogManager;
|
|
| 32 | -import org.apache.logging.log4j.Logger;
|
|
| 33 | 29 | import org.nuiton.jaxx.runtime.spi.UIHandler;
|
| 34 | 30 | |
| 35 | 31 | import javax.swing.ToolTipManager;
|
| 36 | -import java.util.EnumSet;
|
|
| 37 | 32 | |
| 38 | 33 | import static io.ultreia.java4all.i18n.I18n.t;
|
| 39 | 34 | |
| ... | ... | @@ -45,21 +40,13 @@ import static io.ultreia.java4all.i18n.I18n.t; |
| 45 | 40 | */
|
| 46 | 41 | public class ReferentialSynchroUIHandler extends AdminTabUIHandler<ReferentialSynchroUI> implements UIHandler<ReferentialSynchroUI> {
|
| 47 | 42 | |
| 48 | - private static final Logger log = LogManager.getLogger(ReferentialSynchroUIHandler.class);
|
|
| 49 | - |
|
| 50 | 43 | @Override
|
| 51 | 44 | public void afterInit(ReferentialSynchroUI ui) {
|
| 52 | 45 | super.afterInit(ui);
|
| 53 | 46 | setAutoStart(ui.getStart());
|
| 54 | 47 | ui.getLeftTreePane().init();
|
| 55 | 48 | ui.getRightTreePane().init();
|
| 56 | - ui.getStepModel().addPropertyChangeListener(ReferentialSynchroModel.SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> {
|
|
| 57 | - |
|
| 58 | - ReferentialSynchronizeMode newValue = (ReferentialSynchronizeMode) evt.getNewValue();
|
|
| 59 | - if (parentUI.getTabs().getComponentCount() > 1 && newValue != null) {
|
|
| 60 | - parentUI.getTabs().setTitleAt(1, t("observe.ui.datasource.editor.actions.synchro.referential.withMode", newValue.getLabel()));
|
|
| 61 | - }
|
|
| 62 | - });
|
|
| 49 | + ui.getStepModel().afterInit(parentUI);
|
|
| 63 | 50 | hideFixedPanelLabel(ui);
|
| 64 | 51 | ToolTipManager.sharedInstance().registerComponent(ui.getLeftTreePane().getTree());
|
| 65 | 52 | ToolTipManager.sharedInstance().registerComponent(ui.getRightTreePane().getTree());
|
| ... | ... | @@ -72,50 +59,6 @@ public class ReferentialSynchroUIHandler extends AdminTabUIHandler<ReferentialSy |
| 72 | 59 | configUI.getExtraConfig().add(extraConfig);
|
| 73 | 60 | configUI.getLeftSourceModel().setSourceLabel(t("observe.ui.datasource.storage.config.left.storage"));
|
| 74 | 61 | configUI.getRightSourceModel().setSourceLabel(t("observe.ui.datasource.storage.config.right.storage"));
|
| 75 | - configUI.getStepModel().addPropertyChangeListener(StorageUIModel.VALID_STEP_PROPERTY_NAME, evt -> updateSynchroModes(extraConfig));
|
|
| 76 | - }
|
|
| 77 | - |
|
| 78 | - private void updateSynchroModes(ReferentialSynchroConfigUI extraConfig) {
|
|
| 79 | - AdminUIModel model = getUi().getModel();
|
|
| 80 | - ReferentialSynchronizeMode synchronizeMode = model.getReferentialSynchroModel().getSynchronizeMode();
|
|
| 81 | - log.info(String.format("Will update synchro modes (previous value: %s)", synchronizeMode));
|
|
| 82 | - DataSourceSelectorModel leftSourceModel = model.getConfigModel().getLeftSourceModel();
|
|
| 83 | - if (!leftSourceModel.isInit()) {
|
|
| 84 | - return;
|
|
| 85 | - }
|
|
| 86 | - DataSourceSelectorModel rightSourceModel = model.getConfigModel().getRightSourceModel();
|
|
| 87 | - if (!rightSourceModel.isInit()) {
|
|
| 88 | - return;
|
|
| 89 | - }
|
|
| 90 | - boolean dataSourcesValid = leftSourceModel.validateExt() && rightSourceModel.validateExt();
|
|
| 91 | - boolean leftToRightEnabled = dataSourcesValid && rightSourceModel.isCanWriteReferential();
|
|
| 92 | - log.debug(String.format("Update synchro modes: leftToRight: %s", leftToRightEnabled));
|
|
| 93 | - boolean rightToLeftEnabled = dataSourcesValid && leftSourceModel.isCanWriteReferential();
|
|
| 94 | - log.debug(String.format("Update synchro modes: rightToLeft: %s", rightToLeftEnabled));
|
|
| 95 | - boolean bothEnabled = leftToRightEnabled && rightToLeftEnabled;
|
|
| 96 | - log.debug(String.format("Update synchro modes: both: %s", bothEnabled));
|
|
| 97 | - extraConfig.getFROM_LEFT_TO_RIGHT().setEnabled(leftToRightEnabled);
|
|
| 98 | - extraConfig.getFROM_RIGHT_TO_LEFT().setEnabled(rightToLeftEnabled);
|
|
| 99 | - extraConfig.getBOTH().setEnabled(bothEnabled);
|
|
| 100 | - EnumSet<ReferentialSynchronizeMode> candidates = EnumSet.allOf(ReferentialSynchronizeMode.class);
|
|
| 101 | - if (!leftToRightEnabled) {
|
|
| 102 | - candidates.remove(ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT);
|
|
| 103 | - }
|
|
| 104 | - if (!rightToLeftEnabled) {
|
|
| 105 | - candidates.remove(ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT);
|
|
| 106 | - }
|
|
| 107 | - if (!bothEnabled) {
|
|
| 108 | - candidates.remove(ReferentialSynchronizeMode.BOTH);
|
|
| 109 | - }
|
|
| 110 | - if (!candidates.contains(synchronizeMode)) {
|
|
| 111 | - if (candidates.isEmpty()) {
|
|
| 112 | - synchronizeMode = null;
|
|
| 113 | - } else {
|
|
| 114 | - synchronizeMode = candidates.iterator().next();
|
|
| 115 | - }
|
|
| 116 | - }
|
|
| 117 | - log.info(String.format("Will update synchro modes (new value: %s)", synchronizeMode));
|
|
| 118 | - model.getReferentialSynchroModel().setSynchronizeMode(null);
|
|
| 119 | - model.getReferentialSynchroModel().setSynchronizeMode(synchronizeMode);
|
|
| 62 | + configUI.getStepModel().addPropertyChangeListener(StorageUIModel.VALID_STEP_PROPERTY_NAME, evt -> extraConfig.updateSynchroModes());
|
|
| 120 | 63 | }
|
| 121 | 64 | } |
| ... | ... | @@ -23,9 +23,9 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.acti |
| 23 | 23 | */
|
| 24 | 24 | |
| 25 | 25 | import fr.ird.observe.client.datasource.actions.AdminUIModel;
|
| 26 | +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
|
|
| 26 | 27 | import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroModel;
|
| 27 | 28 | import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroUI;
|
| 28 | -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
|
|
| 29 | 29 | import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSelectionTree;
|
| 30 | 30 | import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSelectionTreePane;
|
| 31 | 31 | import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.ReferentialSynchronizeTreeModel;
|
| ... | ... | @@ -66,7 +66,7 @@ public class Start extends ReferentialSynchroUIActionSupport { |
| 66 | 66 | try (ObserveSwingDataSource rightSource = ui.getModel().getConfigModel().getRightSourceModel().getSafeSource(true)) {
|
| 67 | 67 | stepModel.setRightSource(rightSource);
|
| 68 | 68 | DifferentialModelBuilder engine = stepModel.newDifferentialModelBuilder();
|
| 69 | - ReferentialSynchronizeMode synchronizeMode = stepModel.getSynchronizeMode();
|
|
| 69 | + SynchronizeMode synchronizeMode = stepModel.getSynchronizeMode();
|
|
| 70 | 70 | ProgressionModel progressionModel = stepModel.getProgressModel();
|
| 71 | 71 | ReferentialSynchronizeTreeModelsBuilder treeModelsBuilder = new ReferentialSynchronizeTreeModelsBuilder(synchronizeMode, stepModel.isShowProperties(), engine, progressionModel);
|
| 72 | 72 | LeftOrRightContext<ReferentialSynchronizeTreeModel> treePair = treeModelsBuilder.build();
|
| ... | ... | @@ -97,11 +97,11 @@ public class Start extends ReferentialSynchroUIActionSupport { |
| 97 | 97 | |
| 98 | 98 | private void initTree(ReferentialSelectionTreePane pane, ReferentialSynchronizeTreeModel treeModel, DataSourceSelectorModel dataSourceSelectorModel, String message, PropertyChangeListener listener) {
|
| 99 | 99 | ReferentialSelectionTree tree = pane.getTree();
|
| 100 | - ReferentialSynchronizeMode newValue = ui.getStepModel().getSynchronizeMode();
|
|
| 100 | + SynchronizeMode synchronizeMode = ui.getStepModel().getSynchronizeMode();
|
|
| 101 | 101 | |
| 102 | 102 | pane.setContextValue(dataSourceSelectorModel);
|
| 103 | 103 | Color color =
|
| 104 | - (treeModel.isLeft() && newValue.isLeftWrite() || !treeModel.isLeft() && newValue.isRightWrite()) ?
|
|
| 104 | + (treeModel.isLeft() && synchronizeMode.isLeftWrite() || !treeModel.isLeft() && synchronizeMode.isRightWrite()) ?
|
|
| 105 | 105 | Color.BLACK : Color.RED;
|
| 106 | 106 | pane.setBorder(new TitledBorder(""));
|
| 107 | 107 | String label = dataSourceSelectorModel.getLabel();
|
| ... | ... | @@ -110,9 +110,17 @@ public class Start extends ReferentialSynchroUIActionSupport { |
| 110 | 110 | pane.getDataSourceLabel().setText(dataSourceSelectorModel.getSource().getLabel() + " " + labelWithUrl);
|
| 111 | 111 | pane.getDataSourceLabel().setForeground(color);
|
| 112 | 112 | |
| 113 | + boolean isRight = pane.isRight();
|
|
| 114 | + boolean canCopy = isRight ? synchronizeMode.isLeftWrite() : synchronizeMode.isRightWrite();
|
|
| 115 | + boolean canRevert = isRight ? synchronizeMode.isRightWrite() : synchronizeMode.isLeftWrite();
|
|
| 116 | + pane.getCopy().setVisible(canCopy);
|
|
| 117 | + pane.getRevert().setVisible(canRevert);
|
|
| 118 | + pane.getDeactivate().setVisible(canRevert);
|
|
| 119 | + pane.getDeactivateWithReplace().setVisible(canRevert);
|
|
| 120 | + pane.getDelete().setVisible(canRevert);
|
|
| 121 | + |
|
| 113 | 122 | tree.setModel(treeModel);
|
| 114 | 123 | treeModel.addPropertyChangeListener(ReferentialSynchronizeTreeModel.SELECTED_COUNT, listener);
|
| 115 | - |
|
| 116 | 124 | listener.propertyChange(null);
|
| 117 | 125 | sendMessage(message);
|
| 118 | 126 | }
|
| ... | ... | @@ -22,16 +22,17 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree |
| 22 | 22 | * #L%
|
| 23 | 23 | */
|
| 24 | 24 | |
| 25 | -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroModel;
|
|
| 26 | -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroUI;
|
|
| 27 | -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroUIHandler;
|
|
| 28 | -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
|
|
| 29 | -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.*;
|
|
| 25 | +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterCopy;
|
|
| 26 | +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterDeactivate;
|
|
| 27 | +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterDeactivateWithReplacement;
|
|
| 28 | +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterDelete;
|
|
| 29 | +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.RegisterRevert;
|
|
| 30 | +import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.actions.SelectUnselect;
|
|
| 30 | 31 | import fr.ird.observe.client.util.init.DefaultUIInitializer;
|
| 31 | 32 | import io.ultreia.java4all.util.LeftOrRight;
|
| 32 | 33 | import org.nuiton.jaxx.runtime.spi.UIHandler;
|
| 33 | 34 | |
| 34 | -import java.awt.*;
|
|
| 35 | +import java.awt.BorderLayout;
|
|
| 35 | 36 | |
| 36 | 37 | /**
|
| 37 | 38 | * @author Tony Chemit - dev@tchemit.fr
|
| ... | ... | @@ -45,16 +46,13 @@ public class ReferentialSelectionTreePaneHandler implements UIHandler<Referentia |
| 45 | 46 | }
|
| 46 | 47 | |
| 47 | 48 | void init(ReferentialSelectionTreePane ui) {
|
| 48 | - ReferentialSynchroUI parent = ui.getContextValue(ReferentialSynchroUI.class, ReferentialSynchroUIHandler.ADMIN_TAB_UI);
|
|
| 49 | - ReferentialSynchroModel stepModel = parent.getStepModel();
|
|
| 50 | - stepModel.addPropertyChangeListener(ReferentialSynchroModel.SYNCHRONIZE_MODE_PROPERTY_NAME, evt -> onUpdateMode(ui, (ReferentialSynchronizeMode) evt.getNewValue()));
|
|
| 51 | 49 | boolean isLeft = ui.isLeft();
|
| 52 | - LeftOrRight side = isLeft?LeftOrRight.LEFT : LeftOrRight.RIGHT;
|
|
| 53 | - RegisterCopy.init(ui, ui.copy, new RegisterCopy(ui, side));
|
|
| 54 | - RegisterRevert.init(ui, ui.revert, new RegisterRevert(ui, side));
|
|
| 55 | - RegisterDeactivate.init(ui, ui.deactivate, new RegisterDeactivate(ui, side));
|
|
| 56 | - RegisterDeactivateWithReplacement.init(ui, ui.deactivateWithReplace, new RegisterDeactivateWithReplacement(ui, side));
|
|
| 57 | - RegisterDelete.init(ui, ui.delete, new RegisterDelete(ui, side));
|
|
| 50 | + LeftOrRight side = isLeft ? LeftOrRight.LEFT : LeftOrRight.RIGHT;
|
|
| 51 | + RegisterCopy.init(ui, ui.getCopy(), new RegisterCopy(ui, side));
|
|
| 52 | + RegisterRevert.init(ui, ui.getRevert(), new RegisterRevert(ui, side));
|
|
| 53 | + RegisterDeactivate.init(ui, ui.getDeactivate(), new RegisterDeactivate(ui, side));
|
|
| 54 | + RegisterDeactivateWithReplacement.init(ui, ui.getDeactivateWithReplace(), new RegisterDeactivateWithReplacement(ui, side));
|
|
| 55 | + RegisterDelete.init(ui, ui.getDelete(), new RegisterDelete(ui, side));
|
|
| 58 | 56 | SelectUnselect.init(ui, null, new SelectUnselect(ui));
|
| 59 | 57 | if (!isLeft) {
|
| 60 | 58 | ui.remove(ui.getMiddleActions());
|
| ... | ... | @@ -65,20 +63,5 @@ public class ReferentialSelectionTreePaneHandler implements UIHandler<Referentia |
| 65 | 63 | // an update is asked using the deleted data...)
|
| 66 | 64 | ui.getMiddleActions().remove(ui.delete);
|
| 67 | 65 | }
|
| 68 | - |
|
| 69 | - private void onUpdateMode(ReferentialSelectionTreePane ui, ReferentialSynchronizeMode synchronizeMode) {
|
|
| 70 | - if (synchronizeMode == null) {
|
|
| 71 | - return;
|
|
| 72 | - }
|
|
| 73 | - boolean isRight = ui.isRight();
|
|
| 74 | - boolean canCopy = isRight ? synchronizeMode.isLeftWrite() : synchronizeMode.isRightWrite();
|
|
| 75 | - boolean canRevert = isRight ? synchronizeMode.isRightWrite() : synchronizeMode.isLeftWrite();
|
|
| 76 | - ui.copy.setVisible(canCopy);
|
|
| 77 | - ui.revert.setVisible(canRevert);
|
|
| 78 | - ui.deactivate.setVisible(canRevert);
|
|
| 79 | - ui.deactivateWithReplace.setVisible(canRevert);
|
|
| 80 | - ui.delete.setVisible(canRevert);
|
|
| 81 | - }
|
|
| 82 | - |
|
| 83 | 66 | }
|
| 84 | 67 |
| ... | ... | @@ -23,7 +23,7 @@ package fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree |
| 23 | 23 | */
|
| 24 | 24 | |
| 25 | 25 | import fr.ird.observe.client.WithClientUIContextApi;
|
| 26 | -import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchronizeMode;
|
|
| 26 | +import fr.ird.observe.client.datasource.actions.synchronize.SynchronizeMode;
|
|
| 27 | 27 | import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.node.ReferentialAddedSynchroNode;
|
| 28 | 28 | import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.node.ReferentialPropertyUpdatedNode;
|
| 29 | 29 | import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.tree.node.ReferentialSynchroNodeSupport;
|
| ... | ... | @@ -130,7 +130,7 @@ public class ReferentialSynchronizeTreeModelsBuilder implements WithClientUICont |
| 130 | 130 | }
|
| 131 | 131 | |
| 132 | 132 | |
| 133 | - public ReferentialSynchronizeTreeModelsBuilder(ReferentialSynchronizeMode synchronizeMode, boolean showProperties, DifferentialModelBuilder engine, ProgressionModel progressionModel) {
|
|
| 133 | + public ReferentialSynchronizeTreeModelsBuilder(SynchronizeMode synchronizeMode, boolean showProperties, DifferentialModelBuilder engine, ProgressionModel progressionModel) {
|
|
| 134 | 134 | this.engine = Objects.requireNonNull(engine);
|
| 135 | 135 | this.leftRootNode = new RootSynchroNode(true, Objects.requireNonNull(synchronizeMode).isLeftWrite(), showProperties);
|
| 136 | 136 | this.rightRootNode = new RootSynchroNode(false, synchronizeMode.isRightWrite(), showProperties);
|
| ... | ... | @@ -268,7 +268,7 @@ observe.ui.datasource.storage.no.data.import |
| 268 | 268 | observe.ui.datasource.storage.no.referentiel.import
|
| 269 | 269 | observe.ui.datasource.storage.report.can.migrate
|
| 270 | 270 | observe.ui.datasource.storage.report.can.not.migrate
|
| 271 | -observe.ui.datasource.storage.required.rw.on.data
|
|
| 271 | +observe.ui.datasource.storage.required.read.on.data
|
|
| 272 | 272 | observe.ui.datasource.storage.server.dataBase.name
|
| 273 | 273 | observe.ui.datasource.storage.server.default.dataBase
|
| 274 | 274 | observe.ui.datasource.storage.server.sessionExpire
|
| ... | ... | @@ -60,7 +60,7 @@ public class SaveStorageToFile extends MenuActionSupport implements Runnable { |
| 60 | 60 | if (!service.isLocal() && !(service.canReadData() && service.canWriteData())) {
|
| 61 | 61 | askToUser(
|
| 62 | 62 | t("observe.ui.title.can.not.export.obstuna"),
|
| 63 | - t("observe.ui.datasource.storage.required.rw.on.data", service),
|
|
| 63 | + t("observe.ui.datasource.storage.required.read.on.data", service),
|
|
| 64 | 64 | JOptionPane.ERROR_MESSAGE,
|
| 65 | 65 | new Object[]{t("observe.ui.choice.cancel")},
|
| 66 | 66 | 0
|
| ... | ... | @@ -134,6 +134,10 @@ public class DataSourceSelectorModel extends StorageUIModel { |
| 134 | 134 | return isLocal() || Optional.ofNullable(getDataSourceInformation()).map(ObserveDataSourceInformation::canWriteReferential).orElse(false);
|
| 135 | 135 | }
|
| 136 | 136 | |
| 137 | + public boolean isCanWriteData() {
|
|
| 138 | + return isLocal() || Optional.ofNullable(getDataSourceInformation()).map(ObserveDataSourceInformation::canWriteData).orElse(false);
|
|
| 139 | + }
|
|
| 140 | + |
|
| 137 | 141 | public boolean validateExt() {
|
| 138 | 142 | setValidationMessage(null);
|
| 139 | 143 | if (!isValid()) {
|
| ... | ... | @@ -208,9 +208,6 @@ observe.constant.ObstunaAdminAction.SECURITY=Update security |
| 208 | 208 | observe.constant.ObstunaAdminAction.SECURITY.description=Update security
|
| 209 | 209 | observe.constant.ObstunaAdminAction.UPDATE=Update
|
| 210 | 210 | observe.constant.ObstunaAdminAction.UPDATE.description=Update a database
|
| 211 | -observe.constant.ReferentialSynchronizeMode.BOTH=Bi directional
|
|
| 212 | -observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT=From left to right
|
|
| 213 | -observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT=From right to left
|
|
| 214 | 211 | observe.constant.StorageStep.BACKUP=Save
|
| 215 | 212 | observe.constant.StorageStep.BACKUP.description=Save local database before changing data source
|
| 216 | 213 | observe.constant.StorageStep.CHOOSE_DB_MODE=Mode
|
| ... | ... | @@ -227,6 +224,9 @@ observe.constant.StorageStep.ROLES=Security |
| 227 | 224 | observe.constant.StorageStep.ROLES.description=Apply security on database roles
|
| 228 | 225 | observe.constant.StorageStep.SELECT_DATA=Data selection
|
| 229 | 226 | observe.constant.StorageStep.SELECT_DATA.description=Select data to export in backup
|
| 227 | +observe.constant.SynchronizeMode.BOTH=Bi directional
|
|
| 228 | +observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT=From left to right
|
|
| 229 | +observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT=From right to left
|
|
| 230 | 230 | observe.constant.ValidationModelMode.DATA=Only data
|
| 231 | 231 | observe.constant.ValidationModelMode.DATA.description=Only data
|
| 232 | 232 | observe.constant.ValidationModelMode.REFERENTIEL=Only referential
|
| ... | ... | @@ -360,6 +360,7 @@ observe.ui.action.commandline.launch.h2.server.mode=Launch ObServe in server mod |
| 360 | 360 | observe.ui.action.commandline.launch.remote.admin.ui=Launch an administration task on remote
|
| 361 | 361 | observe.ui.action.commandline.launch.server.admin.ui=Launch an administration task on server
|
| 362 | 362 | observe.ui.action.commandline.use.jmx=Add JMX support
|
| 363 | +observe.ui.action.config.export.required.read.data=Read permission is required on data for this operation
|
|
| 363 | 364 | observe.ui.action.config.export.required.read.referentiel=Read permission is required on referential for this operation
|
| 364 | 365 | observe.ui.action.config.export.required.write.data=Write permission is required on data for this operation
|
| 365 | 366 | observe.ui.action.config.left.datasource.required.write.data=Write permission is required on data for this operation
|
| ... | ... | @@ -591,6 +592,7 @@ observe.ui.datasource.editor.actions.report.variables=Variables configuration |
| 591 | 592 | observe.ui.datasource.editor.actions.saveLocal=Save local database
|
| 592 | 593 | observe.ui.datasource.editor.actions.saveLocal.description=Save modifications on local database
|
| 593 | 594 | observe.ui.datasource.editor.actions.synchro.cancel.tip=Cancel
|
| 595 | +observe.ui.datasource.editor.actions.synchro.config.mode=Synchronisation mode
|
|
| 594 | 596 | observe.ui.datasource.editor.actions.synchro.copy.tip=Copy result of report in clipboard
|
| 595 | 597 | observe.ui.datasource.editor.actions.synchro.data=Advanced data management
|
| 596 | 598 | observe.ui.datasource.editor.actions.synchro.data.actionsToPerform=Operations to perform
|
| ... | ... | @@ -600,6 +602,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation=Get data fro |
| 600 | 602 | observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Database «%s» - Data loaded
|
| 601 | 603 | observe.ui.datasource.editor.actions.synchro.data.title=Advanced data management
|
| 602 | 604 | observe.ui.datasource.editor.actions.synchro.data.title.tip=Advanced data management
|
| 605 | +observe.ui.datasource.editor.actions.synchro.data.withMode=Advanced data management (%s)
|
|
| 603 | 606 | observe.ui.datasource.editor.actions.synchro.launch.operation=Launch operation < %1$S >
|
| 604 | 607 | observe.ui.datasource.editor.actions.synchro.prepare.operation=Prepare operation < %1$s >
|
| 605 | 608 | observe.ui.datasource.editor.actions.synchro.referential=Advanced referential management
|
| ... | ... | @@ -613,7 +616,6 @@ observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromLeft.t |
| 613 | 616 | observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromRight.tip=Delete selected referential(s) from right database
|
| 614 | 617 | observe.ui.datasource.editor.actions.synchro.referential.action.revertFromLeft.tip=Revert selected referential(s) into left database
|
| 615 | 618 | observe.ui.datasource.editor.actions.synchro.referential.action.revertFromRight.tip=Revert selected referential(s) into right database
|
| 616 | -observe.ui.datasource.editor.actions.synchro.referential.config.mode=Synchronisation mode
|
|
| 617 | 619 | observe.ui.datasource.editor.actions.synchro.referential.description=Advanced referential management
|
| 618 | 620 | observe.ui.datasource.editor.actions.synchro.referential.launch.operation=Compute differentials of referential
|
| 619 | 621 | observe.ui.datasource.editor.actions.synchro.referential.legacy=Update referential
|
| ... | ... | @@ -832,7 +834,7 @@ observe.ui.datasource.storage.remoteConfiguration.presets.save=Save current conf |
| 832 | 834 | observe.ui.datasource.storage.report.action.migrate=Update policy
|
| 833 | 835 | observe.ui.datasource.storage.report.can.migrate=Update if necessary (current version\: %1$s)
|
| 834 | 836 | observe.ui.datasource.storage.report.can.not.migrate=No update possible
|
| 835 | -observe.ui.datasource.storage.required.rw.on.data=You don't have sufficient credentials to perform this operation.\n\nTo perform this operation, you need Read/Write permissions on data.
|
|
| 837 | +observe.ui.datasource.storage.required.read.on.data=You don't have sufficient credentials to perform this operation.\n\nTo perform this operation, you need Read permission on data.
|
|
| 836 | 838 | observe.ui.datasource.storage.server.dataBase=Databases
|
| 837 | 839 | observe.ui.datasource.storage.server.dataBase.name=Database
|
| 838 | 840 | observe.ui.datasource.storage.server.default.dataBase=default
|
| ... | ... | @@ -208,9 +208,6 @@ observe.constant.ObstunaAdminAction.SECURITY=Actualización de seguridad de base |
| 208 | 208 | observe.constant.ObstunaAdminAction.SECURITY.description=Actualización de securidad de una base remota
|
| 209 | 209 | observe.constant.ObstunaAdminAction.UPDATE=Actualización de une base remota
|
| 210 | 210 | observe.constant.ObstunaAdminAction.UPDATE.description=Actualización de una base remota
|
| 211 | -observe.constant.ReferentialSynchronizeMode.BOTH=Bidireccional
|
|
| 212 | -observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT=De izquierda a derecha
|
|
| 213 | -observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT=De derecha a izquierda
|
|
| 214 | 211 | observe.constant.StorageStep.BACKUP=Copia de seguridad
|
| 215 | 212 | observe.constant.StorageStep.BACKUP.description=Guardadar la base local antes de cambiar la fuente de datos
|
| 216 | 213 | observe.constant.StorageStep.CHOOSE_DB_MODE=Modo
|
| ... | ... | @@ -227,6 +224,9 @@ observe.constant.StorageStep.ROLES=Seguridad |
| 227 | 224 | observe.constant.StorageStep.ROLES.description=Configuración de la seguridad
|
| 228 | 225 | observe.constant.StorageStep.SELECT_DATA=Selección de datos
|
| 229 | 226 | observe.constant.StorageStep.SELECT_DATA.description=Seleccionar los datos a exportar en la copia de seguridad
|
| 227 | +observe.constant.SynchronizeMode.BOTH=Bidireccional
|
|
| 228 | +observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT=De izquierda a derecha
|
|
| 229 | +observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT=De derecha a izquierda
|
|
| 230 | 230 | observe.constant.ValidationModelMode.DATA=Datos
|
| 231 | 231 | observe.constant.ValidationModelMode.DATA.description=Datos
|
| 232 | 232 | observe.constant.ValidationModelMode.REFERENTIEL=Referencial
|
| ... | ... | @@ -360,6 +360,7 @@ observe.ui.action.commandline.launch.h2.server.mode=Ejecutar ObServe en modo ser |
| 360 | 360 | observe.ui.action.commandline.launch.remote.admin.ui=Ejecutar una operación de administración sobre remota
|
| 361 | 361 | observe.ui.action.commandline.launch.server.admin.ui=Lancer une opération d'administration sur un serveur \#TODO
|
| 362 | 362 | observe.ui.action.commandline.use.jmx=Mostrar el soporte JMX
|
| 363 | +observe.ui.action.config.export.required.read.data=Debe tener derechos de lectura sobre los datos para esta operación
|
|
| 363 | 364 | observe.ui.action.config.export.required.read.referentiel=Debe tener derechos de lectura sobre el referencial de datos para esta operación
|
| 364 | 365 | observe.ui.action.config.export.required.write.data=Debe tener derechos de escritura sobre los datos para esta operación
|
| 365 | 366 | observe.ui.action.config.left.datasource.required.write.data=Write permission is required on data for this operation \#TODO
|
| ... | ... | @@ -591,6 +592,7 @@ observe.ui.datasource.editor.actions.report.variables=Configuración de variable |
| 591 | 592 | observe.ui.datasource.editor.actions.saveLocal=Copia de seguridad de la base local
|
| 592 | 593 | observe.ui.datasource.editor.actions.saveLocal.description=Guardar las modificationes realizadas en la base locale
|
| 593 | 594 | observe.ui.datasource.editor.actions.synchro.cancel.tip=Cancelar
|
| 595 | +observe.ui.datasource.editor.actions.synchro.config.mode=Modo de synchronización
|
|
| 594 | 596 | observe.ui.datasource.editor.actions.synchro.copy.tip=Copiar el informe en el portapapeles
|
| 595 | 597 | observe.ui.datasource.editor.actions.synchro.data=Gestión avanzada de los datos
|
| 596 | 598 | observe.ui.datasource.editor.actions.synchro.data.actionsToPerform=Operaciones a realisar
|
| ... | ... | @@ -600,6 +602,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation=Recuperar los |
| 600 | 602 | observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Base «%s» - Datos recuperadas.
|
| 601 | 603 | observe.ui.datasource.editor.actions.synchro.data.title=Gestión avanzada de los datos
|
| 602 | 604 | observe.ui.datasource.editor.actions.synchro.data.title.tip=Sincronización bi-directionnal de los datos de los usaurios
|
| 605 | +observe.ui.datasource.editor.actions.synchro.data.withMode=Gestión avanzada de los datos (%s)
|
|
| 603 | 606 | observe.ui.datasource.editor.actions.synchro.launch.operation=Comenzar la operación < %1$s >
|
| 604 | 607 | observe.ui.datasource.editor.actions.synchro.prepare.operation=Preparar la operación <%1$s>
|
| 605 | 608 | observe.ui.datasource.editor.actions.synchro.referential=Gestión avanzada del referencial
|
| ... | ... | @@ -613,7 +616,6 @@ observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromLeft.t |
| 613 | 616 | observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromRight.tip=Eliminar el referencial seleccionado en la base de la derecha
|
| 614 | 617 | observe.ui.datasource.editor.actions.synchro.referential.action.revertFromLeft.tip=Volver atrás el referencial seleccionado en la izquierda
|
| 615 | 618 | observe.ui.datasource.editor.actions.synchro.referential.action.revertFromRight.tip=Volver atrás el referencial seleccionado en la derecha
|
| 616 | -observe.ui.datasource.editor.actions.synchro.referential.config.mode=Modo de synchronización
|
|
| 617 | 619 | observe.ui.datasource.editor.actions.synchro.referential.description=Gestión avanzada del referencial
|
| 618 | 620 | observe.ui.datasource.editor.actions.synchro.referential.launch.operation=Calcular el diferencial de los referenciales de los fuentes de datos
|
| 619 | 621 | observe.ui.datasource.editor.actions.synchro.referential.legacy=Actualización del referencial
|
| ... | ... | @@ -832,7 +834,7 @@ observe.ui.datasource.storage.remoteConfiguration.presets.save=Enregister cette |
| 832 | 834 | observe.ui.datasource.storage.report.action.migrate=Politica de actualización
|
| 833 | 835 | observe.ui.datasource.storage.report.can.migrate=Actualizar si es necesario (version actual \: %1$s)
|
| 834 | 836 | observe.ui.datasource.storage.report.can.not.migrate=No es posible actualizar
|
| 835 | -observe.ui.datasource.storage.required.rw.on.data=No tiene los permisos necesarios para realizar esta operación.\n\nDebe tener permios de lectura y escritura de los datos del obaservador.
|
|
| 837 | +observe.ui.datasource.storage.required.read.on.data=No tiene los permisos necesarios para realizar esta operación.\n\nDebe tener permios de lectura de los datos del obaservador.
|
|
| 836 | 838 | observe.ui.datasource.storage.server.dataBase=Base de datos
|
| 837 | 839 | observe.ui.datasource.storage.server.dataBase.name=Database \#TODO
|
| 838 | 840 | observe.ui.datasource.storage.server.default.dataBase=default \#TODO
|
| ... | ... | @@ -208,9 +208,6 @@ observe.constant.ObstunaAdminAction.SECURITY=Mise à jour de la sécurité d'une |
| 208 | 208 | observe.constant.ObstunaAdminAction.SECURITY.description=Mise à jour de la sécurité d'une base distante
|
| 209 | 209 | observe.constant.ObstunaAdminAction.UPDATE=Mise à jour d'une base distante
|
| 210 | 210 | observe.constant.ObstunaAdminAction.UPDATE.description=Mise à jour d'une base distante
|
| 211 | -observe.constant.ReferentialSynchronizeMode.BOTH=Bidirectionnel
|
|
| 212 | -observe.constant.ReferentialSynchronizeMode.FROM_LEFT_TO_RIGHT=De la gauche vers la droite
|
|
| 213 | -observe.constant.ReferentialSynchronizeMode.FROM_RIGHT_TO_LEFT=De la droite vers la gauche
|
|
| 214 | 211 | observe.constant.StorageStep.BACKUP=Sauvegarde
|
| 215 | 212 | observe.constant.StorageStep.BACKUP.description=Sauvegarder la base locale avant de changer de source de données
|
| 216 | 213 | observe.constant.StorageStep.CHOOSE_DB_MODE=Mode
|
| ... | ... | @@ -227,6 +224,9 @@ observe.constant.StorageStep.ROLES=Sécurité |
| 227 | 224 | observe.constant.StorageStep.ROLES.description=Mise en place de la sécurité
|
| 228 | 225 | observe.constant.StorageStep.SELECT_DATA=Sélection données
|
| 229 | 226 | observe.constant.StorageStep.SELECT_DATA.description=Sélectionner les données à exporter dans la sauvegarde
|
| 227 | +observe.constant.SynchronizeMode.BOTH=Bidirectionnel
|
|
| 228 | +observe.constant.SynchronizeMode.FROM_LEFT_TO_RIGHT=De la gauche vers la droite
|
|
| 229 | +observe.constant.SynchronizeMode.FROM_RIGHT_TO_LEFT=De la droite vers la gauche
|
|
| 230 | 230 | observe.constant.ValidationModelMode.DATA=Données
|
| 231 | 231 | observe.constant.ValidationModelMode.DATA.description=Données
|
| 232 | 232 | observe.constant.ValidationModelMode.REFERENTIEL=Référentiel
|
| ... | ... | @@ -360,6 +360,7 @@ observe.ui.action.commandline.launch.h2.server.mode=Lancer ObServe en mode serve |
| 360 | 360 | observe.ui.action.commandline.launch.remote.admin.ui=Lancer une opération d'administration sur une base distante
|
| 361 | 361 | observe.ui.action.commandline.launch.server.admin.ui=Lancer une opération d'administration sur un serveur
|
| 362 | 362 | observe.ui.action.commandline.use.jmx=Ajouter le support JMX
|
| 363 | +observe.ui.action.config.export.required.read.data=Lecture sur les données requis pour cette opération
|
|
| 363 | 364 | observe.ui.action.config.export.required.read.referentiel=Lecture sur le référentiel requis pour cette opération
|
| 364 | 365 | observe.ui.action.config.export.required.write.data=Écriture sur les données requis pour cette opération
|
| 365 | 366 | observe.ui.action.config.left.datasource.required.write.data=Écriture sur les données requis pour cette opération
|
| ... | ... | @@ -591,6 +592,7 @@ observe.ui.datasource.editor.actions.report.variables=Configuration des variable |
| 591 | 592 | observe.ui.datasource.editor.actions.saveLocal=Sauvegarde de la base locale
|
| 592 | 593 | observe.ui.datasource.editor.actions.saveLocal.description=Sauvegarder les modifications effectuées vers la base locale
|
| 593 | 594 | observe.ui.datasource.editor.actions.synchro.cancel.tip=Annuler
|
| 595 | +observe.ui.datasource.editor.actions.synchro.config.mode=Mode de synchronisation
|
|
| 594 | 596 | observe.ui.datasource.editor.actions.synchro.copy.tip=Copier le rapport dans le presse-papier
|
| 595 | 597 | observe.ui.datasource.editor.actions.synchro.data=Gestion avancée de données
|
| 596 | 598 | observe.ui.datasource.editor.actions.synchro.data.actionsToPerform=Opérations à réaliser
|
| ... | ... | @@ -600,6 +602,7 @@ observe.ui.datasource.editor.actions.synchro.data.launch.operation=Récupérer l |
| 600 | 602 | observe.ui.datasource.editor.actions.synchro.data.message.data.loaded=Source «%s» - Données récupérées.
|
| 601 | 603 | observe.ui.datasource.editor.actions.synchro.data.title=Gestion avancée de données
|
| 602 | 604 | observe.ui.datasource.editor.actions.synchro.data.title.tip=Synchronisation bidirectionnelle des données utilisateurs
|
| 605 | +observe.ui.datasource.editor.actions.synchro.data.withMode=Gestion avancée de données (%s)
|
|
| 603 | 606 | observe.ui.datasource.editor.actions.synchro.launch.operation=Démarrer l'opération < %1$s >
|
| 604 | 607 | observe.ui.datasource.editor.actions.synchro.prepare.operation=Préparer l'opération <%1$s>
|
| 605 | 608 | observe.ui.datasource.editor.actions.synchro.referential=Gestion avancée du référentiel
|
| ... | ... | @@ -613,7 +616,6 @@ observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromLeft.t |
| 613 | 616 | observe.ui.datasource.editor.actions.synchro.referential.action.deleteFromRight.tip=Supprimer le référentiel sélectionnée de la base de droite
|
| 614 | 617 | observe.ui.datasource.editor.actions.synchro.referential.action.revertFromLeft.tip=Revenir en arrière du référentiel sélectionné à gauche
|
| 615 | 618 | observe.ui.datasource.editor.actions.synchro.referential.action.revertFromRight.tip=Revenir en arrière du référentiel sélectionné à droite
|
| 616 | -observe.ui.datasource.editor.actions.synchro.referential.config.mode=Mode de synchronisation
|
|
| 617 | 619 | observe.ui.datasource.editor.actions.synchro.referential.description=Gestion avancée du référentiel
|
| 618 | 620 | observe.ui.datasource.editor.actions.synchro.referential.launch.operation=Calculer le différentiel des référentiels des sources de données
|
| 619 | 621 | observe.ui.datasource.editor.actions.synchro.referential.legacy=Mise à jour du référentiel
|
| ... | ... | @@ -832,7 +834,7 @@ observe.ui.datasource.storage.remoteConfiguration.presets.save=Enregister cette |
| 832 | 834 | observe.ui.datasource.storage.report.action.migrate=Politique de mise à jour
|
| 833 | 835 | observe.ui.datasource.storage.report.can.migrate=Mise à jour si nécessaire (version actuelle \: %1$s)
|
| 834 | 836 | observe.ui.datasource.storage.report.can.not.migrate=Pas de mise à jour possible
|
| 835 | -observe.ui.datasource.storage.required.rw.on.data=Vous n'avez pas les droits suffisants pour effectuer cette opération.\n\nPour effectuer cette opération vous devez avoir les droits de lecture et d'écriture sur les données observateur.
|
|
| 837 | +observe.ui.datasource.storage.required.read.on.data=Vous n'avez pas les droits suffisants pour effectuer cette opération.\n\nPour effectuer cette opération vous devez avoir les droits de lecture sur les données observateur.
|
|
| 836 | 838 | observe.ui.datasource.storage.server.dataBase=Base de données
|
| 837 | 839 | observe.ui.datasource.storage.server.dataBase.name=Base
|
| 838 | 840 | observe.ui.datasource.storage.server.default.dataBase=par défaut
|
| ... | ... | @@ -137,7 +137,7 @@ observe.referential.common.Wind.speedRange=Vitesse (nd) |
| 137 | 137 | observe.referential.common.Wind.swellHeight=Houle (m)
|
| 138 | 138 | observe.referential.diff.loading.type=Chargement du référentiel %-2d/%d «%s»
|
| 139 | 139 | observe.referential.package.title=%sRéférentiel %s
|
| 140 | -observe.service.error.method.unauthorized=Vous n'avez pas les autorisations nécessaire pour appeler le service '%s → %s'
|
|
| 140 | +observe.service.error.method.unauthorized=Vous n'avez pas les droits suffisants pour appeler le service '%s → %s'
|
|
| 141 | 141 | observe.services.topia.error.concurrentModification=La donnée %s est plus récente en base (%s) que votre version (%s)
|
| 142 | 142 | observe.services.topia.error.data.not.found=Donnée [%s] (de type\: %s) non trouvée.
|
| 143 | 143 | observe.services.topia.error.data.source.with.no.referential=Impossible de créer la base (aucun import référentiel)
|