From f4c7fd23ebd2b80ccf62191ac8613b02e76901f1 Mon Sep 17 00:00:00 2001 From: Suren Date: Tue, 4 Jul 2023 15:52:25 +0530 Subject: [PATCH] #9248 - Import/export an application context --- docs/user-guide/application-context.md | 6 + .../context_import_export.jpg | Bin 0 -> 218184 bytes .../actions/__tests__/contextcreator-test.js | 20 +- web/client/actions/contextcreator.js | 19 ++ .../contextcreator/ContextCreator.jsx | 36 ++-- .../__tests__/ContextCreator-test.jsx | 33 ++++ web/client/components/misc/Stepper.jsx | 13 +- web/client/configs/localConfig.json | 2 + .../epics/__tests__/contextcreator-test.js | 108 ++++++++++- web/client/epics/contextcreator.js | 182 +++++++++++++----- web/client/plugins/ContextExport.jsx | 97 ++++++++++ web/client/plugins/ContextImport.jsx | 94 +++++++++ .../plugins/__tests__/ContextExport-test.js | 41 ++++ .../plugins/__tests__/ContextImport-test.js | 41 ++++ web/client/product/plugins.js | 2 + .../reducers/__tests__/contextcreator-test.js | 7 +- web/client/reducers/contextcreator.js | 4 +- .../__tests__/contextcreator-test.js | 11 +- web/client/selectors/contextcreator.js | 1 + web/client/translations/data.de-DE.json | 21 +- web/client/translations/data.en-US.json | 69 ++++--- web/client/translations/data.es-ES.json | 21 +- web/client/translations/data.fr-FR.json | 21 +- web/client/translations/data.it-IT.json | 21 +- 24 files changed, 766 insertions(+), 104 deletions(-) create mode 100644 docs/user-guide/img/application-context/context_import_export.jpg create mode 100644 web/client/plugins/ContextExport.jsx create mode 100644 web/client/plugins/ContextImport.jsx create mode 100644 web/client/plugins/__tests__/ContextExport-test.js create mode 100644 web/client/plugins/__tests__/ContextImport-test.js diff --git a/docs/user-guide/application-context.md b/docs/user-guide/application-context.md index 20190853e3..4b4aad1de2 100644 --- a/docs/user-guide/application-context.md +++ b/docs/user-guide/application-context.md @@ -30,6 +30,12 @@ This first step allows to configure the **Name** and the **Window title** of the !!! note The **Window title** is the name of the browser window. +### Import/Export context + +In general settings, the user can import/export the context in view with all the configurations of the context. The plugins are configured under `context-creator` in the localConfig and are enabled by default. + + + ## Configure Map To create the context viewer, the map configuration (like the one described [here](exploring-maps.md#exploring-maps) opens so that the admin can set the initial state of the context map. diff --git a/docs/user-guide/img/application-context/context_import_export.jpg b/docs/user-guide/img/application-context/context_import_export.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16a6dfe23fc1b28653951e400220256dc4e40651 GIT binary patch literal 218184 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 AGXMYp literal 0 HcmV?d00001 diff --git a/web/client/actions/__tests__/contextcreator-test.js b/web/client/actions/__tests__/contextcreator-test.js index 6049afceae..24db35471f 100644 --- a/web/client/actions/__tests__/contextcreator-test.js +++ b/web/client/actions/__tests__/contextcreator-test.js @@ -48,7 +48,11 @@ import { SET_SELECTED_THEME, setSelectedTheme, onToggleCustomVariables, - ON_TOGGLE_CUSTOM_VARIABLES + ON_TOGGLE_CUSTOM_VARIABLES, + onContextExport, + CONTEXT_EXPORT, + onContextImport, + CONTEXT_IMPORT } from '../contextcreator'; describe('contextcreator actions', () => { @@ -177,4 +181,18 @@ describe('contextcreator actions', () => { expect(retval).toBeTruthy(); expect(retval.type).toBe(ON_TOGGLE_CUSTOM_VARIABLES); }); + it('onContextExport', () => { + const fileName = "test.json"; + const retVal = onContextExport(fileName); + expect(retVal).toBeTruthy(); + expect(retVal.type).toBe(CONTEXT_EXPORT); + expect(retVal.fileName).toBe(fileName); + }); + it('onContextImport', () => { + const file = {name: "test"}; + const retVal = onContextImport(file); + expect(retVal).toBeTruthy(); + expect(retVal.type).toBe(CONTEXT_IMPORT); + expect(retVal.file).toEqual(file); + }); }); diff --git a/web/client/actions/contextcreator.js b/web/client/actions/contextcreator.js index 7761b0ada2..cfa52413cb 100644 --- a/web/client/actions/contextcreator.js +++ b/web/client/actions/contextcreator.js @@ -74,6 +74,9 @@ export const CONTEXT_TUTORIALS = { "configure-map": "contextcreator_configuremap_tutorial", "configure-plugins": "contextcreator_configureplugins_tutorial" }; +export const CONTEXT_EXPORT = 'CONTEXT:EXPORT'; +export const CONTEXT_IMPORT = 'CONTEXT:IMPORT'; + /** * Merges initState into context creator state. Meant to be called on ContextCreator component mount * @param {object} initState state to merge @@ -562,3 +565,19 @@ export const showBackToPageConfirmation = (show) => ({ export const onToggleCustomVariables = () => ({ type: ON_TOGGLE_CUSTOM_VARIABLES }); + +/** + * Triggers context export + */ +export const onContextExport = (fileName) => ({ + type: CONTEXT_EXPORT, + fileName +}); + +/** + * Triggers context import + */ +export const onContextImport = (file) => ({ + type: CONTEXT_IMPORT, + file +}); diff --git a/web/client/components/contextcreator/ContextCreator.jsx b/web/client/components/contextcreator/ContextCreator.jsx index da1a8882ab..934a76e539 100644 --- a/web/client/components/contextcreator/ContextCreator.jsx +++ b/web/client/components/contextcreator/ContextCreator.jsx @@ -160,7 +160,8 @@ export default class ContextCreator extends React.Component { basicVariables: PropTypes.object, customVariablesEnabled: PropTypes.bool, onToggleCustomVariables: PropTypes.func, - enableClickOnStep: PropTypes.bool + enableClickOnStep: PropTypes.bool, + items: PropTypes.array }; static contextTypes = { @@ -244,7 +245,9 @@ export default class ContextCreator extends React.Component { editingAllowedRoles: [] } } - } + }, + "ContextImport", + "ContextExport" ], ignoreViewerPlugins: false, allAvailablePlugins: [], @@ -282,11 +285,24 @@ export default class ContextCreator extends React.Component { } render() { - const extraToolbarButtons = (stepId) => this.props.tutorials[stepId] ? [{ - id: 'show-tutorial', - onClick: () => this.props.onShowTutorial(stepId), - label: 'contextCreator.showTutorial' - }] : []; + const extraToolbarButtons = (stepId) => { + let toolbarButton = this.props.tutorials[stepId] ? [{ + id: 'show-tutorial', + onClick: () => this.props.onShowTutorial(stepId), + label: 'contextCreator.showTutorial' + }] : []; + if (stepId === 'general-settings') { + const importExportButtons = this.props.items?.map(({toolbarBtn} = {}) => toolbarBtn) ?? []; + toolbarButton = toolbarButton.concat(importExportButtons); + } else if (stepId === 'configure-map') { + toolbarButton = toolbarButton.concat({ + id: "map-reload", + onClick: () => this.props.onReloadConfirm(true), + label: 'contextCreator.configureMap.reload' + }); + } + return toolbarButton; + }; return ( this.props.onReloadConfirm(true), - label: 'contextCreator.configureMap.reload' - }], + extraToolbarButtons: extraToolbarButtons('configure-map'), component: { }); }); + it("test plugin container items in general-settings", () => { + const eng = { + "locale": "en-US", + "messages": { + "aboutLbl": "About" + } + }; + const actions = { + onSave: () => { } + }; + const allAvailablePlugins = [ + {enabled: true, title: 'title', pluginConfig: {cfg: {}}}, + {enabled: false, title: 'title', pluginConfig: {cfg: {}}} + ]; + ReactDOM.render( + + + + } + }]} + /> + + , document.getElementById("container")); + const itemBtn = document.querySelectorAll('.footer-button-toolbar-extra button')[1]; + expect(itemBtn.innerText).toBe('ITEM1'); + }); }); diff --git a/web/client/components/misc/Stepper.jsx b/web/client/components/misc/Stepper.jsx index edf1d8366f..92c1243afe 100644 --- a/web/client/components/misc/Stepper.jsx +++ b/web/client/components/misc/Stepper.jsx @@ -33,11 +33,14 @@ export default ({

- {(steps[curStepIndex].extraToolbarButtons || []).map(({onClick = () => {}, label, id}, idx) => - - )} + {(steps[curStepIndex].extraToolbarButtons || []).map((toolbarButton, idx) => { + const {component: Component, onClick = () => {}, label, id} = toolbarButton; + return Component ? : ( + + ); + })} +)); + +/** + * Context Export Plugin + * Allows exporting of the context resources, all configured plugins, themes + * pertaining to the context from context creator wizard + * The plugins is enabled by adding `ContextExport` to context-creator in localConfig (default enabled) + * @class ExportComponent + * @memberof plugins + * @static + */ +const ContextExportPlugin = createPlugin("ContextExport", { + component: ExportComponent, + containers: { + ContextCreator: { + name: "context-export", + toolbarBtn: { + id: "export", + component: ExportButton + } + } + } +}); + +export default ContextExportPlugin; diff --git a/web/client/plugins/ContextImport.jsx b/web/client/plugins/ContextImport.jsx new file mode 100644 index 0000000000..03a84e6043 --- /dev/null +++ b/web/client/plugins/ContextImport.jsx @@ -0,0 +1,94 @@ +/* + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React, { useRef } from "react"; +import { Glyphicon } from "react-bootstrap"; +import { connect } from "react-redux"; +import { createSelector } from "reselect"; + +import DragZone from "../components/import/dragZone/DragZone"; +import { createPlugin } from "../utils/PluginsUtils"; +import { createControlEnabledSelector } from "../selectors/controls"; +import { onContextImport } from "../actions/contextcreator"; + +import { toggleControl } from "../actions/controls"; +import Message from "../components/I18N/Message"; +import HTML from "../components/I18N/HTML"; +import Button from "../components/misc/Button"; + +const isEnabled = createControlEnabledSelector("import"); + +const mapStateToProps = createSelector(isEnabled, (show) => ({ show })); + +const actions = { + onClose: () => toggleControl("import"), + handleDrop: (file) => onContextImport(file) +}; + +const Component = ({ show, onClose, handleDrop }) => { + const dropZoneRef = useRef(); + return ( + handleDrop(file)} + > +
+ +
+ +
+
+ +
+ +
+
+ ); +}; + +const ImportComponent = connect(mapStateToProps, actions)(Component); + +const ImportButton = connect(null, { + onImport: () => toggleControl("import") +})(({ onImport }) => ( + +)); + +/** + * Context Import Plugin + * Allows importing context json into the context creator wizard + * The plugins is enabled by adding `ContextImport` to context-creator in localConfig (default enabled) + * @class ImportComponent + * @memberof plugins + * @static + */ +const ContextImportPlugin = createPlugin("ContextImport", { + component: ImportComponent, + containers: { + ContextCreator: { + name: "context-import", + toolbarBtn: { + id: "import", + component: ImportButton + } + } + } +}); + +export default ContextImportPlugin; diff --git a/web/client/plugins/__tests__/ContextExport-test.js b/web/client/plugins/__tests__/ContextExport-test.js new file mode 100644 index 0000000000..d15cec1389 --- /dev/null +++ b/web/client/plugins/__tests__/ContextExport-test.js @@ -0,0 +1,41 @@ +/** + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import expect from 'expect'; + +import { getPluginForTest } from './pluginsTestUtils'; + +import ContextExport from '../ContextExport'; + +describe('ContextExport plugin', () => { + beforeEach((done) => { + document.body.innerHTML = '
'; + setTimeout(done); + }); + + afterEach((done) => { + ReactDOM.unmountComponentAtNode(document.getElementById("container")); + document.body.innerHTML = ''; + setTimeout(done); + }); + + it('displays the export panel when enabled', () => { + const { Plugin } = getPluginForTest(ContextExport, { + controls: { + "export": { + enabled: true + } + } + }); + ReactDOM.render(, document.getElementById('container')); + const rootDiv = document.querySelector('.export-panel'); + expect(rootDiv).toBeTruthy(); + }); +}); diff --git a/web/client/plugins/__tests__/ContextImport-test.js b/web/client/plugins/__tests__/ContextImport-test.js new file mode 100644 index 0000000000..3b5404d020 --- /dev/null +++ b/web/client/plugins/__tests__/ContextImport-test.js @@ -0,0 +1,41 @@ +/** + * Copyright 2023, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import expect from 'expect'; + +import { getPluginForTest } from './pluginsTestUtils'; + +import ContextImport from '../ContextImport'; + +describe('ContextImport plugin', () => { + beforeEach((done) => { + document.body.innerHTML = '
'; + setTimeout(done); + }); + + afterEach((done) => { + ReactDOM.unmountComponentAtNode(document.getElementById("container")); + document.body.innerHTML = ''; + setTimeout(done); + }); + + it('displays the import drag zone when enabled', () => { + const { Plugin } = getPluginForTest(ContextImport, { + controls: { + "import": { + enabled: true + } + } + }); + ReactDOM.render(, document.getElementById('container')); + const rootDiv = document.getElementById('DRAGDROP_IMPORT_ZONE'); + expect(rootDiv).toBeTruthy(); + }); +}); diff --git a/web/client/product/plugins.js b/web/client/product/plugins.js index 8870dc3cb4..dd69932246 100644 --- a/web/client/product/plugins.js +++ b/web/client/product/plugins.js @@ -67,6 +67,8 @@ export const plugins = { ContentTabs: toModulePlugin('ContentTabs', () => import(/* webpackChunkName: 'plugins/contentTabs' */ '../plugins/ContentTabs')), ContextManagerPlugin: toModulePlugin('ContextManager', () => import(/* webpackChunkName: 'plugins/contextManager' */ '../plugins/contextmanager/ContextManager')), ContextsPlugin: toModulePlugin('Contexts', () => import(/* webpackChunkName: 'plugins/contexts' */ '../plugins/Contexts')), + ContextImportPlugin: toModulePlugin('ContextImport', () => import(/* webpackChunkName: 'plugins/contextImport' */ '../plugins/ContextImport')), + ContextExportPlugin: toModulePlugin('ContextExport', () => import(/* webpackChunkName: 'plugins/contextExport' */ '../plugins/ContextExport')), CookiePlugin: toModulePlugin('Cookie', () => import(/* webpackChunkName: 'plugins/cookie' */ '../plugins/Cookie')), CreateNewMapPlugin: toModulePlugin('CreateNewMap', () => import(/* webpackChunkName: 'plugins/createNewMap' */ '../plugins/CreateNewMap')), DashboardEditor: toModulePlugin('DashboardEditor', () => import(/* webpackChunkName: 'plugins/dashboardEditor' */ '../plugins/DashboardEditor')), diff --git a/web/client/reducers/__tests__/contextcreator-test.js b/web/client/reducers/__tests__/contextcreator-test.js index 2a56f62cac..e90e7cd25b 100644 --- a/web/client/reducers/__tests__/contextcreator-test.js +++ b/web/client/reducers/__tests__/contextcreator-test.js @@ -23,7 +23,8 @@ import { editedCfgSelector, editedTemplateSelector, selectedThemeSelector, - customVariablesEnabledSelector + customVariablesEnabledSelector, + exportDataSelector } from '../../selectors/contextcreator'; import { setFilterText, @@ -185,6 +186,7 @@ describe('contextcreator reducer', () => { const plugins = pluginsSelector(state); const templates = templatesSelector(state); const selectedTheme = selectedThemeSelector(state); + const exportData = exportDataSelector(state); expect(selectedTheme).toEqual(data.theme); expect(newContext).toExist(); expect(newContext.windowTitle).toBe(data.windowTitle); @@ -251,6 +253,9 @@ describe('contextcreator reducer', () => { expect(plugins[4].active).toBe(false); expect(plugins[4].docUrl).toExist(); expect(plugins[4].docUrl).toEqual("https://domain.com/documentation"); + expect(exportData).toEqual({ + resource: testContextResource, pluginsConfig, allTemplates + }); }); it('setResource with context with templates inside MapTemplates config', () => { const contextResource = { diff --git a/web/client/reducers/contextcreator.js b/web/client/reducers/contextcreator.js index 7e0b8ccde2..32ff2cf89f 100644 --- a/web/client/reducers/contextcreator.js +++ b/web/client/reducers/contextcreator.js @@ -238,6 +238,7 @@ export default (state = {}, action) => { const contextCreatorPlugins = convertPlugins(allPlugins); const pluginTemplates = findPlugin(contextCreatorPlugins, 'MapTemplates')?.pluginConfig?.cfg?.allowedTemplates; + const {type, ...exportData} = action; return set('initialEnabledPlugins', pluginsToEnable, set('templates', (action.allTemplates || []).map(template => ({ @@ -254,7 +255,8 @@ export default (state = {}, action) => { set('plugins', contextCreatorPlugins, set('resource', resource, set('selectedTheme', theme, - set('customVariablesEnabled', customVariablesEnabled, state))))))); + set('customVariablesEnabled', customVariablesEnabled, + set('exportData', exportData, state)))))))); } case UPDATE_TEMPLATE: { const newResource = action.resource || {}; diff --git a/web/client/selectors/__tests__/contextcreator-test.js b/web/client/selectors/__tests__/contextcreator-test.js index f68d0d178e..35aac859d0 100644 --- a/web/client/selectors/__tests__/contextcreator-test.js +++ b/web/client/selectors/__tests__/contextcreator-test.js @@ -12,7 +12,8 @@ import { creationStepSelector, selectedThemeSelector, customVariablesEnabledSelector, - isNewContext + isNewContext, + exportDataSelector } from '../contextcreator'; const testState = { @@ -57,4 +58,12 @@ describe('contextcreator selectors', () => { it('isNewContext', () => { expect(isNewContext(testState)).toBe(true); }); + it('exportDataSelector', () => { + const exportData = {resource: {name: "test"}}; + expect(exportDataSelector({ + contextcreator: { + exportData + } + })).toEqual(exportData); + }); }); diff --git a/web/client/selectors/contextcreator.js b/web/client/selectors/contextcreator.js index 2c9e8f145e..26282a59e4 100644 --- a/web/client/selectors/contextcreator.js +++ b/web/client/selectors/contextcreator.js @@ -43,3 +43,4 @@ export const tutorialStepSelector = state => state.contextcreator?.tutorialStep; export const selectedThemeSelector = state => get(state, 'contextcreator.selectedTheme'); export const customVariablesEnabledSelector = state => get(state, 'contextcreator.customVariablesEnabled', false); export const isNewContext = state => state.contextcreator?.contextId === 'new'; +export const exportDataSelector = state => get(state, 'contextcreator.exportData', {}); diff --git a/web/client/translations/data.de-DE.json b/web/client/translations/data.de-DE.json index bfde46d009..736b9eeaa0 100644 --- a/web/client/translations/data.de-DE.json +++ b/web/client/translations/data.de-DE.json @@ -3191,7 +3191,9 @@ "name": "Name", "namePlaceholder": "Geben Sie den Namen des App-Kontexts ein...", "windowTitle": "Fenstertitel", - "windowTitlePlaceholder": "Fenstertitel eingeben..." + "windowTitlePlaceholder": "Fenstertitel eingeben...", + "import": "Importieren", + "export": "Export" }, "configureThemes": { "title": "Thema konfigurieren", @@ -3312,7 +3314,22 @@ "unknownError": "Ein unerwarteter Fehler ist aufgetreten" }, "undo": "Möchten Sie die Kontextbearbeitungssitzung wirklich abbrechen?", - "showTutorial": "Tutorial anzeigen" + "showTutorial": "Tutorial anzeigen", + "errors":{ + "loading": { + "title": "Fehler beim Laden des Kontexts", + "import": "Der Kontext konnte nicht importiert werden", + "export": "Der Kontext konnte nicht exportiert werden" + } + }, + "importDialog": { + "selectFiles": "Wählen Sie eine Datei aus", + "heading": "Löschen Sie eine zuvor exportierte context.json-Datei", + "note": "Die Daten in der importierten Datei ersetzen die Daten im aktuellen Kontext" + }, + "exportDialog": { + "heading": "Kontext als .json-Datei exportieren" + } }, "contextManager": { "title": "Kontexte verwalten", diff --git a/web/client/translations/data.en-US.json b/web/client/translations/data.en-US.json index 6e89edae27..b28a382288 100644 --- a/web/client/translations/data.en-US.json +++ b/web/client/translations/data.en-US.json @@ -2171,7 +2171,7 @@ "pleaseLogin": "Some resource may not be public. Please try to login", "unknownError": "There was an error loading the map or the context. Please contact the administrator", "notFound": "Resource not found", - "notAccessible": "Resource not accessible" + "notAccessible": "Resource not accessible" }, "context": { "pleaseLogin": "This context is not public. Please try to login", @@ -3165,31 +3165,33 @@ "name": "Name", "namePlaceholder": "Enter app context name...", "windowTitle": "Window title", - "windowTitlePlaceholder": "Enter window title..." + "windowTitlePlaceholder": "Enter window title...", + "import": "Import", + "export": "Export" }, "configureThemes": { - "title": "Configure Theme", - "label": "Theme", - "themes": "Choose a theme", - "noThemes": "No themes found", - "customVariables": "Custom Variables", - "main": "Main Text Color", - "background": "Main Background Color", - "primaryContrast": "Primary Text Color", - "primary": "Primary Color", - "successContrast": "Secondary Text Color", - "success": "Secondary Color", - "guidelines": "Make sure to not use a secondary color too similar with the primary one and obviously the primary text color with its counterpart (the same applies for the other couples of colors: main, secondary)", - "alternativeTextPrimarySecondary": "

Warning: the secondary color could be not readable compared to the primary one

An alternative color is {color}  

", - "tooltips": { - "main": "Text color used in panels or dialogs", - "background": "Background color used in panels or dialogs", - "primaryContrast": "Text color opposed to the primary and success bacgrkound color: icons inside toolbars, headers, buttons", - "primary": "Background primary color: toolbars, headers, buttons", - "successContrast": "Text color applied when the secondary color is used as background", - "success": "Background color used to show when a button is 'active' or 'selected'", - "customColorsDescription": "You may change one of these colors in addition (or not) to a preconfigured theme chosen above" - } + "title": "Configure Theme", + "label": "Theme", + "themes": "Choose a theme", + "noThemes": "No themes found", + "customVariables": "Custom Variables", + "main": "Main Text Color", + "background": "Main Background Color", + "primaryContrast": "Primary Text Color", + "primary": "Primary Color", + "successContrast": "Secondary Text Color", + "success": "Secondary Color", + "guidelines": "Make sure to not use a secondary color too similar with the primary one and obviously the primary text color with its counterpart (the same applies for the other couples of colors: main, secondary)", + "alternativeTextPrimarySecondary": "

Warning: the secondary color could be not readable compared to the primary one

An alternative color is {color}  

", + "tooltips": { + "main": "Text color used in panels or dialogs", + "background": "Background color used in panels or dialogs", + "primaryContrast": "Text color opposed to the primary and success bacgrkound color: icons inside toolbars, headers, buttons", + "primary": "Background primary color: toolbars, headers, buttons", + "successContrast": "Text color applied when the secondary color is used as background", + "success": "Background color used to show when a button is 'active' or 'selected'", + "customColorsDescription": "You may change one of these colors in addition (or not) to a preconfigured theme chosen above" + } }, "configurePlugins": { "label": "Configure Plugins", @@ -3234,7 +3236,7 @@ "enabledTitle": "Enabled Plugin", "enabledDescription": "This plugin is enabled" }, - "saveCfgErrorNotification": { + "saveCfgErrorNotification": { "title": "Syntax error in plugin configuration", "message": "Plugin \"{pluginName}\" contains an error in configuration. Please fix before proceeding" } @@ -3286,7 +3288,22 @@ "unknownError": "Unexpected error occurred" }, "undo": "Are you sure you want to abandon the context editing session?", - "showTutorial": "Show Tutorial" + "showTutorial": "Show Tutorial", + "errors":{ + "loading": { + "title": "Error loading context", + "import": "Failed to import context", + "export": "Failed to export context" + } + }, + "importDialog": { + "selectFiles": "Select a file", + "heading": "Drop a previously exported context.json file", + "note": "The data in the imported file will replace the data in the current context" + }, + "exportDialog": { + "heading": "Export context as a .json file" + } }, "contextManager": { "title": "Manage Contexts", diff --git a/web/client/translations/data.es-ES.json b/web/client/translations/data.es-ES.json index dc99342cf7..390a39ac3d 100644 --- a/web/client/translations/data.es-ES.json +++ b/web/client/translations/data.es-ES.json @@ -3153,7 +3153,9 @@ "name": "Nombre", "namePlaceholder": "Ingrese el nombre del contexto de la aplicación...", "windowTitle": "Título de la ventana", - "windowTitlePlaceholder": "Ingrese el título de la ventana..." + "windowTitlePlaceholder": "Ingrese el título de la ventana...", + "import": "Importar", + "export": "Exportar" }, "configureThemes": { "title": "Configurar tema", @@ -3274,7 +3276,22 @@ "unknownError": "Ocurrió un error inesperado" }, "undo": "¿Seguro que quieres abandonar la sesión de edición de contexto?", - "showTutorial": "Tutorial de presentación" + "showTutorial": "Tutorial de presentación", + "errors":{ + "loading": { + "title": "Error al cargar el contexto", + "import": "No se pudo importar el contexto", + "export": "No se pudo exportar el contexto" + } + }, + "importDialog": { + "selectFiles": "Seleccione un archivo", + "heading": "Suelte un archivo context.json previamente exportado", + "note": "Los datos en el archivo importado reemplazarán los datos en el contexto actual" + }, + "exportDialog": { + "heading": "Exportar contexto como un archivo .json" + } }, "contextManager": { "title": "Administrar contextos", diff --git a/web/client/translations/data.fr-FR.json b/web/client/translations/data.fr-FR.json index 179de42f0f..0b85fbfc0d 100644 --- a/web/client/translations/data.fr-FR.json +++ b/web/client/translations/data.fr-FR.json @@ -3155,7 +3155,9 @@ "name": "Nom", "namePlaceholder": "Entrez le nom du contexte applicatif...", "windowTitle": "Titre de la fenêtre", - "windowTitlePlaceholder": "Entrez le titre de la fenêtre..." + "windowTitlePlaceholder": "Entrez le titre de la fenêtre...", + "import": "Importer", + "export": "Exporter" }, "configureThemes": { "title": "Configurer le thème", @@ -3276,7 +3278,22 @@ "unknownError": "Une erreur inattendue s'est produite" }, "undo": "Êtes-vous sûr de vouloir abandonner la session de modification de contexte ?", - "showTutorial": "Afficher le didacticiel" + "showTutorial": "Afficher le didacticiel", + "errors":{ + "loading": { + "title": "Erreur lors du chargement du contexte", + "import": "Échec de l'importation du contexte", + "export": "Échec de l'exportation du contexte" + } + }, + "importDialog": { + "selectFiles": "Sélectionner un fichier", + "heading": "Déposez un fichier context.json précédemment exporté", + "note": "Les données du fichier importé remplaceront les données du contexte actuel" + }, + "exportDialog": { + "heading": "Exporter le contexte sous forme de fichier .json" + } }, "contextManager": { "title": "Gérer les contextes", diff --git a/web/client/translations/data.it-IT.json b/web/client/translations/data.it-IT.json index 13e31c0cdd..4134e4e5bb 100644 --- a/web/client/translations/data.it-IT.json +++ b/web/client/translations/data.it-IT.json @@ -3155,7 +3155,9 @@ "name": "Nome", "namePlaceholder": "Inserisci il nome del contesto applicativo...", "windowTitle": "Titolo della finestra", - "windowTitlePlaceholder": "Inserisci il titolo della finestra..." + "windowTitlePlaceholder": "Inserisci il titolo della finestra...", + "import": "Importare", + "export": "Esportare" }, "configureThemes": { "title": "Configura il tema", @@ -3276,7 +3278,22 @@ "unknownError": "Si è verificato un errore imprevisto" }, "undo": "Sei sicuro di voler abbandonare la sessione di modifica del contesto?", - "showTutorial": "Mostra tutorial" + "showTutorial": "Mostra tutorial", + "errors":{ + "loading": { + "title": "Errore durante il caricamento del contesto", + "import": "Impossibile importare il contesto", + "export": "Impossibile esportare il contesto" + } + }, + "importDialog": { + "selectFiles": "Seleziona un file", + "heading": "Rilascia un file context.json esportato in precedenza", + "note": "I dati nel file importato sostituiranno i dati nel contesto corrente" + }, + "exportDialog": { + "heading": "Esporta il contesto come file .json" + } }, "contextManager": { "title": "Gestisci contesti",