[Git][ultreiaio/ird-observe][develop] 10 commits: Le nom du fichier de sauvegarde par défaut pourrait être modernisé - Closes #1212
Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 96793291 by tchemit at 2020-04-18T10:30:21+02:00 Le nom du fichier de sauvegarde par défaut pourrait être modernisé - Closes #1212 - - - - - 0d8ba6ee by tchemit at 2020-04-18T10:30:23+02:00 update pom - - - - - 5294b6cf by tchemit at 2020-04-18T10:30:23+02:00 Suppression de l'onglet résumé sur les assistants - Closes #1468 - - - - - 0a43816b by tchemit at 2020-04-18T10:30:23+02:00 FOB sans objectOperation fait planter la consolidation des données - See #1469 - - - - - 533b9ed5 by tchemit at 2020-04-18T10:30:23+02:00 Les températures ne sont pas bien restituées... - Closes #1470 - - - - - 4b64cbe7 by tchemit at 2020-04-18T10:30:23+02:00 Remove bad and unusefull code - - - - - 02f0c544 by tchemit at 2020-04-18T10:30:23+02:00 FOB sans objectOperation fait planter la consolidation des données (Afficher les FOB sans objectOperation) - See #1469 - - - - - a0cb96f4 by tchemit at 2020-04-18T10:30:23+02:00 Do not clean temporary files if root directory does not exist - - - - - 49139d70 by tchemit at 2020-04-18T10:30:23+02:00 Utilisation de filtres intelligents pour l'appairement des activités - Closes #1471 - - - - - 1574fb81 by tchemit at 2020-04-18T10:30:23+02:00 Correction de la décoration - - - - - 28 changed files: - client-configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java - client-core/src/main/java/fr/ird/observe/client/datasource/h2/backup/BackupsManager.java - 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/AdminStep.java - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUIHandler.java - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUIModel.java - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/actions/AdminTabUIActionSupport.java - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/longline/pairing/tree/ActivityLonglinePairingTreeTable.java - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/longline/pairing/tree/ActivityLonglinePairingTreeTableModel.java - − client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/resume/ShowResumeModel.java - − client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/resume/ShowResumeUI.jaxx - − client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/resume/ShowResumeUI.jcss - − client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/resume/ShowResumeUIHandler.java - − client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/resume/actions/CopyResumeToClipBoard.java - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/tree/actions/RegisterTaskActionSupport.java - client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/validate/actions/SaveReport.java - client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ContentUIInitializer.java - observe-i18n/src/main/i18n/translations/observe_en_GB.properties - observe-i18n/src/main/i18n/translations/observe_es_ES.properties - observe-i18n/src/main/i18n/translations/observe_fr_FR.properties - − persistence/src/main/java/fr/ird/observe/entities/data/ps/observation/FloatingObjectTopiaDao.java - pom.xml - services-local/src/main/java/fr/ird/observe/services/local/service/actions/consolidate/ConsolidateDataServiceLocal.java - services-local/src/main/java/fr/ird/observe/services/local/service/data/ps/observation/FloatingObjectServiceLocal.java - services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTask.java - services/src/main/java/fr/ird/observe/services/service/data/ll/pairing/ActivityLonglinePairingResultItem.java Changes: ===================================== client-configuration/src/main/java/fr/ird/observe/client/configuration/ClientConfig.java ===================================== @@ -115,7 +115,7 @@ public class ClientConfig extends GeneratedClientConfig implements TemplateGener ClientConfigOption.MAP_LAYER10); private static final Logger log = LogManager.getLogger(ClientConfig.class); /** le pattern du fichier de sauvegarde d'une base locale */ - private static final String BACKUP_DB_PATTERN = "obstuna-local-%1$tF--%1$tk-%1$tM-%1$tS.sql.gz"; + private static final String BACKUP_DB_PATTERN = "observe-v%1$s-%2$tF--%2$tk-%2$tM-%2$tS.sql.gz"; private static final String APPLICATION_VERSION = "application.version"; private static final String VERSION = "version"; @@ -537,7 +537,7 @@ public class ClientConfig extends GeneratedClientConfig implements TemplateGener } public File newBackupDataFile() { - return new File(getBackupDirectory(), String.format(BACKUP_DB_PATTERN, new Date())); + return new File(getBackupDirectory(), String.format(BACKUP_DB_PATTERN, getBuildVersion().toString().replaceAll("\\.","_"), new Date())); } public void saveForUser() { ===================================== client-core/src/main/java/fr/ird/observe/client/datasource/h2/backup/BackupsManager.java ===================================== @@ -74,7 +74,7 @@ public class BackupsManager implements Closeable { private static final Logger log = LogManager.getLogger(BackupsManager.class); - private static final Pattern AUTOMATIC_BACKUP_FILENAME_PATTERN = Pattern.compile("obstuna-local-([0-9-]+)\\.sql\\.gz"); + private static final Pattern AUTOMATIC_BACKUP_FILENAME_PATTERN = Pattern.compile("obs.+-([0-9-]+)\\.sql\\.gz"); private final Path backupsPath; private final ObserveDataSourcesManager dataSourcesManager; ===================================== client-datasource-actions/src/main/i18n/getters/java-enumeration.getter ===================================== @@ -16,8 +16,6 @@ observe.constant.AdminStep.SAVE_LOCAL observe.constant.AdminStep.SAVE_LOCAL.description observe.constant.AdminStep.SELECT_DATA observe.constant.AdminStep.SELECT_DATA.description -observe.constant.AdminStep.SHOW_RESUME -observe.constant.AdminStep.SHOW_RESUME.description observe.constant.AdminStep.SYNCHRONIZE observe.constant.AdminStep.SYNCHRONIZE.description observe.constant.AdminStep.VALIDATE ===================================== client-datasource-actions/src/main/i18n/getters/java.getter ===================================== @@ -170,13 +170,6 @@ observe.admin.report.no.report.found observe.admin.report.report.count.found observe.admin.report.title observe.admin.report.title.tip -observe.admin.resume.no.operation.done -observe.admin.resume.operation.canceled -observe.admin.resume.operation.done -observe.admin.resume.operation.failed -observe.admin.resume.operation.need.fix -observe.admin.resume.operation.not.started -observe.admin.resume.operation.running observe.choice.cancel observe.choice.confirm.insert observe.choice.replace ===================================== client-datasource-actions/src/main/i18n/getters/jaxx.getter ===================================== @@ -34,7 +34,6 @@ observe.admin.report.variables observe.common.directory observe.common.file observe.common.global.progression.description -observe.common.operation.resume observe.common.step.description observe.info.selected.validators observe.info.validation.credentials ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminStep.java ===================================== @@ -32,7 +32,6 @@ import fr.ird.observe.client.datasource.actions.longline.pairing.ActivityLonglin import fr.ird.observe.client.datasource.actions.longline.pairing.ActivityLonglinePairingUI; import fr.ird.observe.client.datasource.actions.report.ReportModel; import fr.ird.observe.client.datasource.actions.report.ReportUI; -import fr.ird.observe.client.datasource.actions.resume.ShowResumeUI; import fr.ird.observe.client.datasource.actions.save.SaveLocalModel; import fr.ird.observe.client.datasource.actions.save.SaveLocalUI; import fr.ird.observe.client.datasource.actions.synchronize.data.DataSynchroModel; @@ -247,13 +246,6 @@ public enum AdminStep implements WizardExtStep { DbMode.USE_LOCAL, DbMode.USE_REMOTE, DbMode.USE_SERVER - ), - - /** pour afficher après les opération un ecran de résumé */ - SHOW_RESUME( - null, - ShowResumeUI.class, - false ); private final String iconName; ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUIHandler.java ===================================== @@ -27,7 +27,6 @@ import fr.ird.observe.client.datasource.actions.config.SelectDataUI; import fr.ird.observe.client.datasource.actions.consolidate.ConsolidateUI; import fr.ird.observe.client.datasource.actions.export.ExportUI; import fr.ird.observe.client.datasource.actions.longline.pairing.ActivityLonglinePairingUI; -import fr.ird.observe.client.datasource.actions.resume.ShowResumeUI; import fr.ird.observe.client.datasource.actions.save.SaveLocalUI; import fr.ird.observe.client.datasource.actions.synchronize.data.DataSynchroUI; import fr.ird.observe.client.datasource.actions.synchronize.referential.legacy.SynchronizeUI; @@ -297,12 +296,6 @@ public class AdminUIHandler implements UIHandler<AdminUI>, WithClientUIContext { SaveLocalUI tabUI = (SaveLocalUI) ui.getStepUI(AdminStep.SAVE_LOCAL); tabUI.getHandler().updateText(); } - if (c != null && c.getStep() == AdminStep.SHOW_RESUME) { - - // on met a jour le resumé des opérations - ShowResumeUI showResumeUI = (ShowResumeUI) ui.getStepUI(AdminStep.SHOW_RESUME); - showResumeUI.getHandler().updateText(); - } // selection du nouvel onglet int index = ui.tabs.indexOfComponent(c); @@ -371,12 +364,6 @@ public class AdminUIHandler implements UIHandler<AdminUI>, WithClientUIContext { itr = UIHelper.newTabbedPaneIterator(ui.getTabs()); } - if (selected != null && selected.getStep() == AdminStep.SHOW_RESUME) { - - // rien a faire sur le dernier onglet - log.debug("We are on last step (resume), nothing to do."); - return; - } boolean[] accessibleSteps = ui.getModel().getAccessibleSteps(); log.debug("Accessibles step : " + Arrays.toString(accessibleSteps)); for (; itr.hasNext(); itr.next()) { ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/AdminUIModel.java ===================================== @@ -28,7 +28,6 @@ import fr.ird.observe.client.datasource.actions.consolidate.ConsolidateModel; import fr.ird.observe.client.datasource.actions.export.ExportModel; import fr.ird.observe.client.datasource.actions.longline.pairing.ActivityLonglinePairingModel; import fr.ird.observe.client.datasource.actions.report.ReportModel; -import fr.ird.observe.client.datasource.actions.resume.ShowResumeModel; import fr.ird.observe.client.datasource.actions.save.SaveLocalModel; import fr.ird.observe.client.datasource.actions.synchronize.data.DataSynchroModel; import fr.ird.observe.client.datasource.actions.synchronize.referential.legacy.SynchronizeModel; @@ -64,8 +63,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { private final SelectDataModel selectDataModel = new SelectDataModel(); - private final ShowResumeModel showResumeModel = new ShowResumeModel(); - private final AdminStep adminStep; private final EnumSet<DbMode> availableIncomingModes; @@ -152,10 +149,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { return configModel; } - public ShowResumeModel getShowResumeModel() { - return showResumeModel; - } - public SelectDataModel getSelectDataModel() { return selectDataModel; } @@ -397,8 +390,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { return getSynchronizeReferentielModel().validate(this, step); case SAVE_LOCAL: return getSaveLocalModel().validate(this, step); - case SHOW_RESUME: - return getShowResumeModel().validate(this); } return true; } @@ -411,8 +402,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { // toujours l'onglet de configuration des opérations universe.add(AdminStep.CONFIG); - // pour savoir si on doit ajouter l'onglet de résumé (cas par défaut) - boolean needResume = true; if (!operations.isEmpty()) { if (needSelect()) { @@ -458,9 +447,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { if (containsOperation(AdminStep.REPORT)) { universe.add(AdminStep.REPORT); - - // pas de page de resume - needResume = false; } updateSaveLocalOperation(); @@ -476,12 +462,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { // ajout de l'onglet de sauvegarde de la base distante universe.add(AdminStep.EXPORT_DATA); } - - if (needResume) { - - // ajout d'un onglet de resume - universe.add(AdminStep.SHOW_RESUME); - } } return universe.toArray(new AdminStep[0]); } ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/actions/AdminTabUIActionSupport.java ===================================== @@ -28,7 +28,6 @@ import fr.ird.observe.client.datasource.actions.AdminActionWorker; import fr.ird.observe.client.datasource.actions.AdminStep; import fr.ird.observe.client.datasource.actions.AdminTabUI; import fr.ird.observe.client.datasource.actions.AdminUI; -import fr.ird.observe.client.datasource.actions.resume.ShowResumeUI; import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; import fr.ird.observe.client.datasource.editor.content.ref.usage.UsageForDisplayUI; import fr.ird.observe.client.datasource.editor.content.ref.usage.UsageForDisplayUIHandler; @@ -98,14 +97,8 @@ public abstract class AdminTabUIActionSupport<U extends AdminTabUI> extends JCom public String sendMessage(String message) { - AdminStep step = ui.getStep(); addMessage(step, message); - AdminUI parentUI = getParentUI(); - ShowResumeUI resumeUI = (ShowResumeUI) parentUI.getStepUI(AdminStep.SHOW_RESUME); - if (resumeUI != null) { - addMessage(resumeUI, step, message); - } return message; } ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/longline/pairing/tree/ActivityLonglinePairingTreeTable.java ===================================== @@ -22,6 +22,7 @@ package fr.ird.observe.client.datasource.actions.longline.pairing.tree; * #L% */ +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.configuration.ClientConfig; import fr.ird.observe.client.configuration.WithClientConfig; @@ -46,6 +47,8 @@ import fr.ird.observe.dto.referential.common.ProgramDto; import fr.ird.observe.dto.referential.common.ProgramReference; import fr.ird.observe.services.service.data.ll.pairing.ActivityLonglinePairingResultItem; import fr.ird.observe.services.service.data.ll.pairing.ActivityLonglinePairingResultItemDecorator; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.JXTreeTable; import org.jdesktop.swingx.table.ColumnFactory; @@ -76,6 +79,8 @@ import java.util.function.Supplier; */ public class ActivityLonglinePairingTreeTable extends JXTreeTable implements WithDecoratorService, WithClientConfig { + private static final Logger log = LogManager.getLogger(ActivityLonglinePairingTreeTable.class); + public ActivityLonglinePairingTreeTable(ActivityLonglinePairingTreeTableModel treeModel) { super(treeModel); setTreeCellRenderer(new ActivityLonglinePairingTreeTableTreeCellRenderer()); @@ -162,7 +167,7 @@ public class ActivityLonglinePairingTreeTable extends JXTreeTable implements Wit } - static class ActivityLonglinePairingTreeTableCellEditor implements TableCellEditor { + class ActivityLonglinePairingTreeTableCellEditor implements TableCellEditor { private final TableCellEditor booleanEditor; private final BeanFilterableComboBoxCellEditor pairingEditor; @@ -187,9 +192,14 @@ public class ActivityLonglinePairingTreeTable extends JXTreeTable implements Wit Objects.requireNonNull(node); if (column == 1) { if (node instanceof ActivityLonglinePairingActivityNode) { - BeanFilterableComboBox component = pairingEditor.getComponent(); + BeanFilterableComboBox<?> component = pairingEditor.getComponent(); ActivityLonglinePairingActivityNode activityLonglinePairingActivityNode = (ActivityLonglinePairingActivityNode) node; - UIHelper.fillComboBox(component.getCombobox(), activityLonglinePairingActivityNode.getUserObject().getItems(), activityLonglinePairingActivityNode.getSelectedValue()); + ImmutableList<ActivityLonglinePairingResultItem> availableActivities = getTreeTableModel().getAvailableActivities(activityLonglinePairingActivityNode); + ActivityLonglinePairingResultItem selectedValue = activityLonglinePairingActivityNode.getSelectedValue(); + if (!availableActivities.contains(selectedValue)) { + selectedValue = null; + } + UIHelper.fillComboBox(component.getCombobox(), availableActivities, selectedValue); editor = pairingEditor; } } else if (column == 2) { ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/longline/pairing/tree/ActivityLonglinePairingTreeTableModel.java ===================================== @@ -22,14 +22,21 @@ package fr.ird.observe.client.datasource.actions.longline.pairing.tree; * #L% */ +import com.google.common.collect.ImmutableList; import fr.ird.observe.client.datasource.actions.longline.pairing.ActivityLonglinePairingModel; import fr.ird.observe.client.datasource.actions.longline.pairing.tree.node.ActivityLonglinePairingActivityNode; import fr.ird.observe.client.datasource.actions.longline.pairing.tree.node.ActivityLonglinePairingRootNode; +import fr.ird.observe.services.service.data.ll.pairing.ActivityLonglinePairingResultItem; import io.ultreia.java4all.i18n.I18n; import org.jdesktop.swingx.treetable.DefaultTreeTableModel; +import sun.awt.image.ImageWatched; import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; /** * Created by tchemit on 20/11/2018. @@ -79,4 +86,13 @@ public class ActivityLonglinePairingTreeTableModel extends DefaultTreeTableModel public ActivityLonglinePairingModel getUiModel() { return uiModel; } + + public ImmutableList<ActivityLonglinePairingResultItem> getAvailableActivities(ActivityLonglinePairingActivityNode selectedNode) { + List<ActivityLonglinePairingActivityNode> selectedNodes = new LinkedList<>(uiModel.getSelectedNodes()); + selectedNodes.remove(selectedNode); + Set<ActivityLonglinePairingResultItem> usedActivities = selectedNodes.stream().map(ActivityLonglinePairingActivityNode::getSelectedValue).collect(Collectors.toSet()); + List<ActivityLonglinePairingResultItem> availableActivities = new LinkedList<>(selectedNode.getUserObject().getItems()); + availableActivities.removeAll(usedActivities); + return ImmutableList.copyOf(availableActivities); + } } ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/resume/ShowResumeModel.java deleted ===================================== @@ -1,43 +0,0 @@ -package fr.ird.observe.client.datasource.actions.resume; - -/*- - * #%L - * ObServe :: Client DataSource actions - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, 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.AdminStep; -import fr.ird.observe.client.datasource.actions.AdminUIModel; - -/** - * Created on 28/11/16. - * - * @author Tony Chemit - dev@tchemit.fr - * @since 6.0 - */ -public class ShowResumeModel extends AdminActionModel { - public ShowResumeModel() { - super(AdminStep.SHOW_RESUME); - } - - public boolean validate(AdminUIModel uiModel) { - return true; - } -} ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/resume/ShowResumeUI.jaxx deleted ===================================== @@ -1,59 +0,0 @@ -<!-- - #%L - ObServe :: Client DataSource actions - %% - Copyright (C) 2008 - 2020 IRD, Code Lutin, 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% - --> - -<fr.ird.observe.client.datasource.actions.AdminTabUI> - - <import> - fr.ird.observe.client.util.UIHelper - fr.ird.observe.client.datasource.actions.AdminUI - fr.ird.observe.client.datasource.actions.AdminTabUI - - java.awt.Dimension - </import> - - <ShowResumeModel id='stepModel' initializer='getModel().getShowResumeModel()'/> - - <JPanel id='PENDING_content'> - <Table constraints='BorderLayout.CENTER' fill='both' weightx='1' - weighty='1'> - <row> - <cell> - <JScrollPane id='resumePane'> - <JTextArea id='resume'/> - </JScrollPane> - </cell> - </row> - <row> - <cell> - <JScrollPane id='globalProgressionPane' columnHeaderView='{globalProgressionTop}'> - <JTextArea id='globalProgression'/> - <JToolBar id='globalProgressionTop'> - <JLabel id='globalProgressionTopLabel'/> - <javax.swing.Box.Filler - constructorParams='UIHelper.newMinDimension(), UIHelper.newMinDimension(), UIHelper.newMaxXDimension()'/> - <JButton id="copyToClipBoard"/> - </JToolBar> - </JScrollPane> - </cell> - </row> - </Table> - </JPanel> - -</fr.ird.observe.client.datasource.actions.AdminTabUI> ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/resume/ShowResumeUI.jcss deleted ===================================== @@ -1,59 +0,0 @@ -/* - * #%L - * ObServe :: Client DataSource actions - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, 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% - */ - -#PENDING_content { - layout:{new BorderLayout()}; -} - -#resumePane { - minimumSize:{new Dimension(0,0)}; - horizontalScrollBarPolicy:{JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED}; - columnHeaderView:{UIHelper.newLabel(t("observe.common.operation.resume") ,"wizard-message", 10)}; -} - -#resume { - editable:false; - focusable:true; -} - -#globalProgressionPane { - minimumSize:{new Dimension(0,0)}; - horizontalScrollBarPolicy:{JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED}; -} - -#globalProgression { - font-size:10; - focusable:true; - lineWrap:false; - editable:false; -} - -#globalProgressionTop { - floatable:false; -} - -#globalProgressionTopLabel { - text:"observe.common.global.progression.description"; - actionIcon:"wizard-message"; -} - - ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/resume/ShowResumeUIHandler.java deleted ===================================== @@ -1,91 +0,0 @@ -/* - * #%L - * ObServe :: Client DataSource actions - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, 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% - */ -package fr.ird.observe.client.datasource.actions.resume; - -import fr.ird.observe.client.datasource.actions.AdminStep; -import fr.ird.observe.client.datasource.actions.AdminTabUIHandler; -import fr.ird.observe.client.datasource.actions.AdminUIModel; -import fr.ird.observe.client.util.UIHelper; -import fr.ird.observe.dto.I18nEnumHelper; -import org.nuiton.jaxx.runtime.spi.UIHandler; -import org.nuiton.jaxx.runtime.swing.wizard.ext.WizardState; - -import static io.ultreia.java4all.i18n.I18n.t; - -/** - * Le controleur des onglets. - * - * @author Tony Chemit - dev@tchemit.fr - * @since 1.4 - */ -public class ShowResumeUIHandler extends AdminTabUIHandler<ShowResumeUI> implements UIHandler<ShowResumeUI> { - - @Override - public void afterInit(ShowResumeUI ui) { - super.afterInit(ui); - UIHelper.setLayerUI(ui.getContent(), null); - } - - public void updateText() { - AdminUIModel model = ui.getModel(); - StringBuilder buffer = new StringBuilder(); - if (!model.isWasStarted()) { - buffer.append(t("observe.admin.resume.no.operation.done")); - } else { - for (AdminStep s : model.getOperations()) { - WizardState state = model.getStepState(s); - String stateStr = ""; - switch (state) { - case CANCELED: - stateStr = t("observe.admin.resume.operation.canceled"); - break; - case FAILED: - stateStr = t("observe.admin.resume.operation.failed"); - break; - case NEED_FIX: - stateStr = t("observe.admin.resume.operation.need.fix"); - break; - case PENDING: - stateStr = t("observe.admin.resume.operation.not.started"); - break; - case RUNNING: - stateStr = t("observe.admin.resume.operation.running"); - break; - case SUCCESSED: - stateStr = t("observe.admin.resume.operation.done"); - break; - } - buffer.append("\n\n"); - buffer.append(I18nEnumHelper.getLabel(s)); - buffer.append(" : "); - buffer.append(stateStr); - buffer.append("."); - } - buffer.append("\n\n"); - } - getUi().getResume().setText(buffer.toString()); - } - - public void addMessage(AdminStep step, String text) { - getUi().getGlobalProgression().append(I18nEnumHelper.getLabel(step) + " - " + text + "\n"); - } -} ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/resume/actions/CopyResumeToClipBoard.java deleted ===================================== @@ -1,45 +0,0 @@ -package fr.ird.observe.client.datasource.actions.resume.actions; - -/*- - * #%L - * ObServe :: Client DataSource actions - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, 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.actions.AdminTabUIActionSupport; -import fr.ird.observe.client.datasource.actions.resume.ShowResumeUI; -import fr.ird.observe.client.util.ObserveKeyStrokesSupport; -import fr.ird.observe.client.util.UIHelper; - -import java.awt.event.ActionEvent; - -import static io.ultreia.java4all.i18n.I18n.t; - -public class CopyResumeToClipBoard extends AdminTabUIActionSupport<ShowResumeUI> { - - public CopyResumeToClipBoard() { - super(t("observe.action.copy.to.clipBoard"), t("observe.action.copy.to.clipBoard"), "report-copy", ObserveKeyStrokesSupport.KEY_STROKE_COPY_TO_CLIPBOARD); - } - - @Override - protected void doActionPerformed(ActionEvent e, ShowResumeUI ui) { - UIHelper.copyToClipBoard(ui.getGlobalProgression().getText()); - } - -} ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/synchronize/referential/ng/tree/actions/RegisterTaskActionSupport.java ===================================== @@ -27,7 +27,6 @@ import com.google.common.collect.ImmutableSet; import fr.ird.observe.client.datasource.actions.AdminStep; import fr.ird.observe.client.datasource.actions.AdminTabUI; import fr.ird.observe.client.datasource.actions.AdminUI; -import fr.ird.observe.client.datasource.actions.resume.ShowResumeUI; import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialReplaceUI; import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialReplaceUIHandler; import fr.ird.observe.client.datasource.actions.synchronize.referential.ng.ReferentialSynchroModel; @@ -304,14 +303,8 @@ public abstract class RegisterTaskActionSupport extends ReferentialSelectionTree } public String sendMessage(String message) { - AdminStep step = parentUI.getStep(); addMessage(step, message); - AdminUI parentUI = getParentUI(); - ShowResumeUI resumeUI = (ShowResumeUI) parentUI.getStepUI(AdminStep.SHOW_RESUME); - if (resumeUI != null) { - addMessage(resumeUI, step, message); - } return message; } ===================================== client-datasource-actions/src/main/java/fr/ird/observe/client/datasource/actions/validate/actions/SaveReport.java ===================================== @@ -83,7 +83,6 @@ public class SaveReport extends ValidateUIActionSupport { String content = ValidateModelTemplate.generate(validationModel); log.debug(content); - addMessage(AdminStep.SHOW_RESUME, content); FileUtils.write(reportFile, content, StandardCharsets.UTF_8.name()); } ===================================== client-datasource-editor-api/src/main/java/fr/ird/observe/client/datasource/editor/content/ContentUIInitializer.java ===================================== @@ -327,7 +327,7 @@ public class ContentUIInitializer<UI extends ContentUI> implements WithClientCon if (editor.getBean() != null) { if (UIHelper.isBindingFromBean(editor)) { - editor.getModel().addPropertyChangeListener(propertyName, e -> { + ((JavaBean)editor.getBean()).addPropertyChangeListener(propertyName, e -> { Float oldValue = editor.getModel().getTemperature(); Float newValue = (Float) e.getNewValue(); if (!Objects.equals(oldValue, newValue)) { @@ -342,17 +342,6 @@ public class ContentUIInitializer<UI extends ContentUI> implements WithClientCon if (StringUtils.isEmpty(editor.getProperty())) { editor.setProperty(editor.getName()); } - if (editor.getBean() != null) { - if (UIHelper.isBindingFromBean(editor)) { - editor.getModel().addPropertyChangeListener(editor.getProperty(), e -> { - String oldValue = editor.getText(); - String newValue = (String) e.getNewValue(); - if (!Objects.equals(oldValue, newValue)) { - editor.setText(newValue); - } - }); - } - } editor.setMinimumSize(new Dimension(50, 5 * 24)); editor.getTextEditor().setRows(4); } @@ -361,36 +350,12 @@ public class ContentUIInitializer<UI extends ContentUI> implements WithClientCon if (StringUtils.isEmpty(editor.getProperty())) { editor.setProperty(editor.getName()); } - - if (editor.getBean() != null) { - if (UIHelper.isBindingFromBean(editor)) { - editor.getModel().addPropertyChangeListener(editor.getProperty(), e -> { - String oldValue = editor.getText(); - String newValue = (String) e.getNewValue(); - if (!Objects.equals(oldValue, newValue)) { - editor.setText(newValue); - } - }); - } - } } protected void init(UrlEditor editor) { if (StringUtils.isEmpty(editor.getProperty())) { editor.setProperty(editor.getName()); } - - if (editor.getBean() != null) { - if (UIHelper.isBindingFromBean(editor)) { - editor.getModel().addPropertyChangeListener(editor.getProperty(), e -> { - String oldValue = editor.getText(); - String newValue = (String) e.getNewValue(); - if (!Objects.equals(oldValue, newValue)) { - editor.setText(newValue); - } - }); - } - } } private void init(JLabel editor) { ===================================== observe-i18n/src/main/i18n/translations/observe_en_GB.properties ===================================== @@ -374,13 +374,6 @@ observe.admin.report.select.file.tip=Choose file of reports definitions observe.admin.report.title=Help to generat reports observe.admin.report.title.tip=Help to generate reports observe.admin.report.variables=Variables configuration -observe.admin.resume.no.operation.done=No operation done. -observe.admin.resume.operation.canceled=operation canceled -observe.admin.resume.operation.done=operation done -observe.admin.resume.operation.failed=operation failed -observe.admin.resume.operation.need.fix=operation need fix -observe.admin.resume.operation.not.started=operation not started -observe.admin.resume.operation.running=operation is running... observe.backup.done=[%s] Auto backup done (in %s) observe.backup.start=[%s] Start auto backup observe.choice.cancel=Cancel @@ -433,7 +426,6 @@ observe.common.gps.gpsPoint=Gps point observe.common.label=Label observe.common.lengthWeightFormula=Length weight formula observe.common.no.unit=No unit -observe.common.operation.resume=Summary of operations observe.common.resume=Summary observe.common.saveFile.overwrite=file alreayd exists, would you like to overwrite it? observe.common.saveFile.overwrite.cancel=Cancel @@ -593,8 +585,6 @@ observe.constant.AdminStep.SAVE_LOCAL=Save local database observe.constant.AdminStep.SAVE_LOCAL.description=Save modifcations on local database observe.constant.AdminStep.SELECT_DATA=Select data observe.constant.AdminStep.SELECT_DATA.description=Select data for operations -observe.constant.AdminStep.SHOW_RESUME=Summary -observe.constant.AdminStep.SHOW_RESUME.description=Summary of operations observe.constant.AdminStep.SYNCHRONIZE=Update referential observe.constant.AdminStep.SYNCHRONIZE.description=Update referential observe.constant.AdminStep.VALIDATE=Validation ===================================== observe-i18n/src/main/i18n/translations/observe_es_ES.properties ===================================== @@ -374,13 +374,6 @@ observe.admin.report.select.file.tip=Elegir el archivo de definición de informe observe.admin.report.title=Ayuda a la generación de informes observe.admin.report.title.tip=Ayuda a la generación del informe de fin del embarque observe.admin.report.variables=Configuración de variables -observe.admin.resume.no.operation.done=Ninguna operación realizada -observe.admin.resume.operation.canceled=operación cancelada -observe.admin.resume.operation.done=operacion realizada -observe.admin.resume.operation.failed=operación no realizada -observe.admin.resume.operation.need.fix=la operación necesita correcciones -observe.admin.resume.operation.not.started=operación no empezada -observe.admin.resume.operation.running=operación en curso... observe.backup.done=[%s] Copia de seguridad automática realizada (en %s) observe.backup.start=[%s] Inicio de copia de seguridad automática observe.choice.cancel=Cancelar @@ -433,7 +426,6 @@ observe.common.gps.gpsPoint=Punto GPS observe.common.label=Texto observe.common.lengthWeightFormula=Relación de peso observe.common.no.unit=No unit \#TODO -observe.common.operation.resume=Resumen de operaciones observe.common.resume=Resumen de la configuración observe.common.saveFile.overwrite=El archivo ya existe. Quiere reemplazar lo ? observe.common.saveFile.overwrite.cancel=Cancelar @@ -593,8 +585,6 @@ observe.constant.AdminStep.SAVE_LOCAL=Copia local de seguridad observe.constant.AdminStep.SAVE_LOCAL.description=Guardar las modificaciones realizadas en la base original observe.constant.AdminStep.SELECT_DATA=Selección de datos observe.constant.AdminStep.SELECT_DATA.description=Selección de los datos para la realización de los operaciones -observe.constant.AdminStep.SHOW_RESUME=Resumen -observe.constant.AdminStep.SHOW_RESUME.description=Ver un resumen de los operaciones realizadas observe.constant.AdminStep.SYNCHRONIZE=Actualización del referencial observe.constant.AdminStep.SYNCHRONIZE.description=Actualizar el referencial con una base central observe.constant.AdminStep.VALIDATE=Validación ===================================== observe-i18n/src/main/i18n/translations/observe_fr_FR.properties ===================================== @@ -374,13 +374,6 @@ observe.admin.report.select.file.tip=Choisir le fichier de définition des repor observe.admin.report.title=Aide à la génération de rapport observe.admin.report.title.tip=Aide à la génération du rapport de fin d'embarquement observe.admin.report.variables=Configuration des variables -observe.admin.resume.no.operation.done=Aucune opération réalisée. -observe.admin.resume.operation.canceled=opération annulée -observe.admin.resume.operation.done=opération réussie -observe.admin.resume.operation.failed=opération échouée -observe.admin.resume.operation.need.fix=opération nécessitant des corrections -observe.admin.resume.operation.not.started=opération non démarrée -observe.admin.resume.operation.running=opération en cours... observe.backup.done=[%s] Fin de la sauvegarde automatique (en %s) observe.backup.start=[%s] Début de la sauvegarde automatique observe.choice.cancel=Annuler @@ -433,7 +426,6 @@ observe.common.gps.gpsPoint=Point GPS observe.common.label=Libellé observe.common.lengthWeightFormula=Relation Poids observe.common.no.unit=Pas d'unité -observe.common.operation.resume=Résumé des opérations observe.common.resume=Résumé de la configuration observe.common.saveFile.overwrite=Le fichier existe déjà. Voulez-vous le remplacer ? observe.common.saveFile.overwrite.cancel=Annuler @@ -593,8 +585,6 @@ observe.constant.AdminStep.SAVE_LOCAL=Sauvegarde locale observe.constant.AdminStep.SAVE_LOCAL.description=Sauver les modifications sur votre base source observe.constant.AdminStep.SELECT_DATA=Sélection des données observe.constant.AdminStep.SELECT_DATA.description=Sélection des données pour effectuer les opérations -observe.constant.AdminStep.SHOW_RESUME=Résumé -observe.constant.AdminStep.SHOW_RESUME.description=Voir un résumé des opérations effectuées observe.constant.AdminStep.SYNCHRONIZE=Mise à jour du référentiel observe.constant.AdminStep.SYNCHRONIZE.description=Mettre à jour le référentiel depuis une base centrale observe.constant.AdminStep.VALIDATE=Validation ===================================== persistence/src/main/java/fr/ird/observe/entities/data/ps/observation/FloatingObjectTopiaDao.java deleted ===================================== @@ -1,99 +0,0 @@ -package fr.ird.observe.entities.data.ps.observation; - -/* - * #%L - * ObServe :: Persistence - * %% - * Copyright (C) 2008 - 2020 IRD, Code Lutin, Ultreia.io - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import fr.ird.observe.dto.referential.I18nReferentialHelper; -import fr.ird.observe.entities.referential.ps.common.ObjectOperation; -import fr.ird.observe.entities.referential.ps.common.ObjectOperationImpl; -import org.nuiton.topia.persistence.support.TopiaSqlQuery; -import org.nuiton.topia.persistence.support.TopiaSqlSupport; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - -public class FloatingObjectTopiaDao extends AbstractFloatingObjectTopiaDao<FloatingObject> { - - public List<FloatingObject> findAllStubByActivityId(String activityId, int referenceLocale) { - - return StubSqlQuery.findAll(topiaSqlSupport, activityId, referenceLocale); - - } - - private static class StubSqlQuery extends TopiaSqlQuery<FloatingObject> { - - private final String sql; - - private final String id; - - private final int referenceLocale; - - static List<FloatingObject> findAll(TopiaSqlSupport context, String activityId, int referenceLocale) { - - String sql = "SELECT" + - " fo.topiaId," + - " ot." + I18nReferentialHelper.getPropertyName(referenceLocale) + - " FROM ps_observation.floatingobject fo, ps_common.objectOperation ot" + - " WHERE " + - " fo.activity = ?" + - " AND fo.objectOperation = ot.topiaid" + - " ORDER BY ot." + I18nReferentialHelper.getPropertyName(referenceLocale); - - StubSqlQuery request = new StubSqlQuery(sql, activityId, referenceLocale); - return context.findMultipleResult(request); - - } - - StubSqlQuery(String sql, String id, int referenceLocale) { - this.sql = sql; - this.id = id; - this.referenceLocale = referenceLocale; - } - - @Override - public PreparedStatement prepareQuery(Connection connection) throws SQLException { - PreparedStatement preparedStatement = connection.prepareStatement(sql); - preparedStatement.setString(1, id); - return preparedStatement; - } - - @Override - public FloatingObject prepareResult(ResultSet set) throws SQLException { - - FloatingObject floatingObject = new FloatingObjectImpl(); - floatingObject.setTopiaId(set.getString(1)); - - String objectTypeLabel = set.getString(2); - ObjectOperation objectType = new ObjectOperationImpl(); - I18nReferentialHelper.setLabel(referenceLocale, objectType, objectTypeLabel); - floatingObject.setObjectOperation(objectType); - - return floatingObject; - - } - - } - -} ===================================== pom.xml ===================================== @@ -24,7 +24,7 @@ <parent> <groupId>io.ultreia.maven</groupId> <artifactId>pom</artifactId> - <version>2020.18</version> + <version>2020.19</version> </parent> <groupId>fr.ird.observe</groupId> @@ -170,7 +170,7 @@ <!-- <lib.version.java4all.topia>1.17</lib.version.java4all.topia>--> <!--<lib.version.java4all.eugene>3.0<-alpha-22</lib.version.java4all.eugene>--> -<!-- <lib.version.java4all.jaxx>3.0-alpha-66-SNAPSHOT</lib.version.java4all.jaxx>--> +<!-- <lib.version.java4all.jaxx>3.0-alpha-67-SNAPSHOT</lib.version.java4all.jaxx>--> <!--<lib.version.java4all.application-context>1.0.3-SNAPSHOT</lib.version.java4all.application-context>--> <!--<lib.version.java4all.application-template>1.0.2-SNAPSHOT</lib.version.java4all.application-template>--> <!--<lib.version.java4all.i18n>4.0-beta-3-SNAPSHOT</lib.version.java4all.i18n>--> ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/consolidate/ConsolidateDataServiceLocal.java ===================================== @@ -375,6 +375,12 @@ public class ConsolidateDataServiceLocal extends ObserveServiceLocal implements private void updateDcp(FloatingObject dcp, ConsolidationActivitySeineDataContext activityContext) { + if (dcp.getObjectOperation() == null) { + log.warn("**********************"); + log.warn(String.format("Floating object %s has no object operation....", dcp.getTopiaId())); + log.warn("**********************"); + return; + } FloatingObjectConsolidateEngine floatingObjectConsolidateEngine = activityContext.floatingObjectConsolidateEngine; ReferentialLocale referentialLocale = getReferentialLocale(); ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/data/ps/observation/FloatingObjectServiceLocal.java ===================================== @@ -48,7 +48,6 @@ import fr.ird.observe.entities.referential.ps.common.TransmittingBuoyOperation; import fr.ird.observe.entities.referential.ps.common.TransmittingBuoyOwnership; import fr.ird.observe.entities.referential.ps.common.TransmittingBuoyType; import fr.ird.observe.entities.referential.ps.observation.ObjectMaterial; -import fr.ird.observe.entities.referential.ps.observation.ObjectMaterialTopiaDao; import fr.ird.observe.entities.referential.ps.observation.ObservedSystem; import fr.ird.observe.services.local.service.ObserveServiceLocal; import fr.ird.observe.services.service.data.ps.observation.FloatingObjectService; @@ -76,16 +75,14 @@ public class FloatingObjectServiceLocal extends ObserveServiceLocal implements F @Override public ObjectMaterialHierarchyDto getObjectMaterialHierarchy() { - ObjectMaterialTopiaDao dao = getTopiaPersistenceContext().getPsObservationObjectMaterialDao(); - List<ObjectMaterial> objectMaterials = dao.findAll(); + List<ObjectMaterial> objectMaterials = ObjectMaterial.getDao(getTopiaPersistenceContext()).findAll(); objectMaterials.sort(Comparator.comparing(ObjectMaterial::getCode)); return getObjectMaterialHierarchyDtos(objectMaterials).get(0); } @Override public DataDtoReferenceSet<FloatingObjectReference> getFloatingObjectByActivitySeine(String activitySeineId) { - ReferentialLocale referenceLocale = getReferentialLocale(); - List<FloatingObject> entities = FloatingObject.getDao(getTopiaPersistenceContext()).findAllStubByActivityId(activitySeineId, referenceLocale.ordinal()); + Set<FloatingObject> entities = Activity.loadEntity(getTopiaPersistenceContext(), activitySeineId).getFloatingObject(); return FloatingObject.toReferenceSet(entities, getReferentialLocale()); } ===================================== services/src/main/java/fr/ird/observe/services/service/CleanTemporaryFilesTask.java ===================================== @@ -64,6 +64,9 @@ public class CleanTemporaryFilesTask extends TimerTask { public void run() { Path temporaryDirectory = configuration.getTemporaryDirectory().toPath(); + if (Files.notExists(temporaryDirectory)) { + return; + } Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.add(Calendar.HOUR_OF_DAY, -configuration.getTemporaryFilesTimeout()); ===================================== services/src/main/java/fr/ird/observe/services/service/data/ll/pairing/ActivityLonglinePairingResultItem.java ===================================== @@ -75,7 +75,7 @@ public class ActivityLonglinePairingResultItem implements SimpleDto { long days = TimeUnit.MINUTES.toDays(computedTime); long hours = TimeUnit.MINUTES.toHours(computedTime) % 24; long minutes = TimeUnit.MINUTES.toMinutes(computedTime) % 60; - computedTimeStr += String.format("%s:%s:%s", days, hours, minutes); + computedTimeStr += String.format("%s:%s:%s", Math.abs(days), Math.abs(hours), Math.abs(minutes)); } return computedTimeStr; } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/77b6cb12c26f67f9db87cec8d... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/77b6cb12c26f67f9db87cec8d... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT