Tony CHEMIT pushed to branch develop-9 at ultreiaio / ird-observe Commits: 2fb68110 by Tony Chemit at 2021-04-20T09:04:35+02:00 Ajouter une action pour pouvoir récupérer le jeton d'authentification en mode server - Closes #1825 - - - - - 7 changed files: - client/datasource/editor/api/src/main/i18n/getters/java.getter - + client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/actions/CopyAuthenticationToken.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/actions/ShowStorageInfoAction.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/actions/ToggleInformation.java - client/i18n/src/main/i18n/translations/observe_en_GB.properties - client/i18n/src/main/i18n/translations/observe_es_ES.properties - client/i18n/src/main/i18n/translations/observe_fr_FR.properties Changes: ===================================== client/datasource/editor/api/src/main/i18n/getters/java.getter ===================================== @@ -180,12 +180,14 @@ observe.ui.choice.confirm.delete observe.ui.choice.confirm.move observe.ui.choice.confirm.replace observe.ui.choice.continue +observe.ui.choice.copy.token observe.ui.choice.doNotSave observe.ui.choice.quit observe.ui.choice.replace observe.ui.choice.save observe.ui.content.action.configure.tip observe.ui.content.action.insert.tip +observe.ui.copy.authentication.token.done observe.ui.datasource.actions.config.data.source.requires.read.data observe.ui.datasource.actions.config.data.source.requires.read.referential observe.ui.datasource.actions.config.data.source.requires.write.data ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/actions/CopyAuthenticationToken.java ===================================== @@ -0,0 +1,51 @@ +package fr.ird.observe.client.datasource.editor.api.actions; + +import fr.ird.observe.client.WithClientUIContext; +import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; +import fr.ird.observe.client.util.UIHelper; + +import javax.swing.AbstractAction; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import java.awt.event.ActionEvent; +import java.util.Objects; + +import static io.ultreia.java4all.i18n.I18n.t; + +/** + * Created on 20/04/2021. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.0 + */ +public class CopyAuthenticationToken extends AbstractAction implements WithClientUIContext { + private final ObserveSwingDataSource source; + private final JComponent popup; + + public CopyAuthenticationToken(ObserveSwingDataSource source, JComponent popup) { + this.source = Objects.requireNonNull(source); + this.popup = popup; + putValue(SMALL_ICON, UIManager.getIcon("action.report-copy")); + putValue(NAME, t("observe.ui.choice.copy.token")); + putValue(SHORT_DESCRIPTION, t("observe.ui.choice.copy.token")); + } + + @Override + public void actionPerformed(ActionEvent e) { + UIHelper.copyToClipBoard(source.getConnection().getAuthenticationToken()); + getClientUIContext().setUiStatus(t("observe.ui.copy.authentication.token.done")); + if (popup != null) { + if (popup instanceof JOptionPane) { + JOptionPane optionPane = (JOptionPane) popup; + JDialog dialog = (JDialog) SwingUtilities.getAncestorOfClass(JDialog.class, optionPane); + dialog.setVisible(false); + } else { + + popup.setVisible(false); + } + } + } +} ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/menu/actions/ShowStorageInfoAction.java ===================================== @@ -24,11 +24,22 @@ package fr.ird.observe.client.datasource.editor.api.menu.actions; import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; import fr.ird.observe.client.datasource.api.ObserveSwingDataSourceTemplate; +import fr.ird.observe.client.datasource.editor.api.actions.CopyAuthenticationToken; +import fr.ird.observe.client.datasource.editor.api.content.referential.usage.UsageUIHandlerSupport; import fr.ird.observe.client.datasource.editor.api.menu.DataSourceEditorMenu; +import fr.ird.observe.client.util.UIHelper; +import javax.swing.Action; +import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import java.awt.BorderLayout; import java.awt.event.ActionEvent; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.util.Objects; import static io.ultreia.java4all.i18n.I18n.t; @@ -48,14 +59,38 @@ public class ShowStorageInfoAction extends DataSourceEditorMenuActionSupport { protected void doActionPerformed(ActionEvent event, DataSourceEditorMenu ui) { ObserveSwingDataSource source = getObserveDataSourcesManager().getOptionalMainDataSource().orElse(null); - String text = ObserveSwingDataSourceTemplate.generate(source); - JOptionPane.showMessageDialog( - getClientUIContext().getMainUI(), - new JLabel(text), - t("observe.ui.title.storage.info"), - JOptionPane.INFORMATION_MESSAGE); + JPanel content = new JPanel(new BorderLayout()); + content.add(new JLabel(text), BorderLayout.CENTER); + boolean withTokenOption = source != null && source.isServer(); + Object[] options; + if (withTokenOption) { + CopyAuthenticationToken dummyAction = new CopyAuthenticationToken(source, null); + options = new Object[]{dummyAction.getValue(Action.NAME), t("observe.ui.choice.quit")}; + } else { + options = new Object[]{t("observe.ui.choice.quit")}; + } + + JOptionPane optionPane = new JOptionPane(new JLabel(text), JOptionPane.INFORMATION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[0]); + + if (withTokenOption) { + CopyAuthenticationToken action = new CopyAuthenticationToken(source, optionPane); + + JButton jButton = UsageUIHandlerSupport.findButton(optionPane, (String) options[0]); + Objects.requireNonNull(jButton).setAction(action); + optionPane.addComponentListener(new ComponentAdapter() { + @Override + public void componentShown(ComponentEvent e) { + SwingUtilities.invokeLater(jButton::grabFocus); + } + }); + } + int response = UIHelper.askUser(getClientUIContext().getMainUI(), optionPane, t("observe.ui.title.storage.info"), options); + if (withTokenOption && response == 0) { + UIHelper.copyToClipBoard(source.getConnection().getAuthenticationToken()); + getClientUIContext().setUiStatus(t("observe.ui.copy.authentication.token.done")); + } } } ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/navigation/actions/ToggleInformation.java ===================================== @@ -26,12 +26,15 @@ import fr.ird.observe.client.WithClientUIContext; import fr.ird.observe.client.datasource.api.ObserveSwingDataSource; import fr.ird.observe.client.datasource.api.ObserveSwingDataSourceTemplate; import fr.ird.observe.client.datasource.editor.api.ObserveKeyStrokesEditorApi; +import fr.ird.observe.client.datasource.editor.api.actions.CopyAuthenticationToken; import fr.ird.observe.client.datasource.editor.api.menu.DataSourceEditorMenuModel; import fr.ird.observe.client.datasource.editor.api.navigation.NavigationUI; +import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPopupMenu; +import javax.swing.SwingUtilities; import javax.swing.border.TitledBorder; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; @@ -81,9 +84,32 @@ public class ToggleInformation extends NavigationConfigUIActionSupport implement String text = ObserveSwingDataSourceTemplate.generate(source); JPanel content = new JPanel(new BorderLayout()); content.add(new JLabel(text), BorderLayout.CENTER); + boolean withTokenOption = source != null && source.isServer(); + JPopupMenu popup = ui.getInformationPopup(); + if (withTokenOption) { + CopyAuthenticationToken action = new CopyAuthenticationToken(source, popup); + JButton copyToken = new JButton(action); + JPanel actions = new JPanel(); + actions.add(copyToken, BorderLayout.CENTER); + content.add(actions, BorderLayout.SOUTH); + popup.addPopupMenuListener(new PopupMenuListener() { + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + SwingUtilities.invokeLater(copyToken::grabFocus); + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + + } + + @Override + public void popupMenuCanceled(PopupMenuEvent e) { + } + }); + } String title = t("observe.ui.title.storage.info"); content.setBorder(new TitledBorder(title + " ")); - JPopupMenu popup = ui.getInformationPopup(); popup.removeAll(); popup.add(content); adaptPopupSize(ui, popup, content); ===================================== client/i18n/src/main/i18n/translations/observe_en_GB.properties ===================================== @@ -1360,6 +1360,7 @@ observe.ui.choice.confirm.insert=Confirm to insert observe.ui.choice.confirm.move=Move observe.ui.choice.confirm.replace=Replace observe.ui.choice.continue=Continue +observe.ui.choice.copy.token=Copy authentication token observe.ui.choice.dcp.default=Other opérations or objects (FOB) observe.ui.choice.doNotSave=Do not save observe.ui.choice.generate.feedback=Generate @@ -1368,6 +1369,7 @@ observe.ui.choice.replace=Replace observe.ui.choice.save=Save observe.ui.content.action.configure.tip=Actions observe.ui.content.action.insert.tip=Create +observe.ui.copy.authentication.token.done=Authentication token was copied to clipboard observe.ui.datasource.actions.config.data.source.requires.read.data=Requires read permission on referential observe.ui.datasource.actions.config.data.source.requires.read.referential=Requires read permission on data observe.ui.datasource.actions.config.data.source.requires.write.data=Requires write permission on data ===================================== client/i18n/src/main/i18n/translations/observe_es_ES.properties ===================================== @@ -1360,6 +1360,7 @@ observe.ui.choice.confirm.insert=Confirmer l'insertion \#TODO observe.ui.choice.confirm.move=Cambiar observe.ui.choice.confirm.replace=Reemplazar observe.ui.choice.continue=Continuar +observe.ui.choice.copy.token=Copy authentication token \#TODO observe.ui.choice.dcp.default=Other opérations or objects (FOB) \#TODO observe.ui.choice.doNotSave=No grabar observe.ui.choice.generate.feedback=Generate \#TODO @@ -1368,6 +1369,7 @@ observe.ui.choice.replace=Reemplazar observe.ui.choice.save=Grabar observe.ui.content.action.configure.tip=Actions \#TODO observe.ui.content.action.insert.tip=Create \#TODO +observe.ui.copy.authentication.token.done=Authentication token was copied to clipboard \#TODO observe.ui.datasource.actions.config.data.source.requires.read.data=Requires read permission on referential \#TODO observe.ui.datasource.actions.config.data.source.requires.read.referential=Requires read permission on data \#TODO observe.ui.datasource.actions.config.data.source.requires.write.data=Requires write permission on data \#TODO ===================================== client/i18n/src/main/i18n/translations/observe_fr_FR.properties ===================================== @@ -1360,6 +1360,7 @@ observe.ui.choice.confirm.insert=Confirmer l'insertion observe.ui.choice.confirm.move=Déplacer observe.ui.choice.confirm.replace=Remplacer observe.ui.choice.continue=Continuer +observe.ui.choice.copy.token=Copier le jeton d'authentification observe.ui.choice.dcp.default=Autre opérations et types d'objets (FOB) observe.ui.choice.doNotSave=Ne pas enregistrer observe.ui.choice.generate.feedback=Générer @@ -1368,6 +1369,7 @@ observe.ui.choice.replace=Remplacer observe.ui.choice.save=Enregistrer observe.ui.content.action.configure.tip=Actions observe.ui.content.action.insert.tip=Créer +observe.ui.copy.authentication.token.done=Le jeton d'authentification a été copié dans le presse-papier observe.ui.datasource.actions.config.data.source.requires.read.data=La lecture sur les données n'est pas autorisée observe.ui.datasource.actions.config.data.source.requires.read.referential=La lecture sur les référentiels n'est pas autorisée observe.ui.datasource.actions.config.data.source.requires.write.data=L'écriture sur les données n'est pas autorisée View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/2fb68110dd8ce41bc1bd809fc0... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/2fb68110dd8ce41bc1bd809fc0... You're receiving this email because of your account on gitlab.com.