From 4949ea044dc19fb86eeb152009e40a62578dae46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Moitti=C3=A9?= Date: Fri, 2 Aug 2024 15:26:15 +0200 Subject: [PATCH 01/14] Update plugin-core and plugins version --- .github/workflows/CI.yml | 4 ++-- CONTRIBUTING.md | 8 ++++---- README.md | 28 ++++++++++++++-------------- leto-modelizer-plugin-cli.json | 12 ++++++------ 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 5e8674655..bb2709f17 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -159,8 +159,8 @@ jobs: run: | npm install -g npm@8.19.3 && \ npm ci && \ - npm run plugin:install -- repository-name="githubator-plugin" repository-url="https://github.com/ditrit/githubator-plugin.git#0.4.1" && \ - npm run plugin:install -- repository-name="terrator-plugin" repository-url="https://github.com/ditrit/terrator-plugin.git#0.10.0" && \ + npm run plugin:install -- repository-name="githubator-plugin" repository-url="https://github.com/ditrit/githubator-plugin.git#0.4.2" && \ + npm run plugin:install -- repository-name="terrator-plugin" repository-url="https://github.com/ditrit/terrator-plugin.git#0.11.0" && \ npm run plugin:init && \ docker build -t leto-modelizer -f DockerfileE2E . - name: Run application diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5c4eb74f9..af4bdf81d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,8 +54,8 @@ To run all the e2e tests, you need to run the application with ALL official plug ```bash npm ci -npm run plugin:install -- repository-name="terrator-plugin" repository-url="https://github.com/ditrit/terrator-plugin.git#0.10.0" -npm run plugin:install -- repository-name="githubator-plugin" repository-url="https://github.com/ditrit/githubator-plugin.git#0.4.1" +npm run plugin:install -- repository-name="terrator-plugin" repository-url="https://github.com/ditrit/terrator-plugin.git#0.11.0" +npm run plugin:install -- repository-name="githubator-plugin" repository-url="https://github.com/ditrit/githubator-plugin.git#0.4.2" npm run plugin:init TEMPLATE_LIBRARY_BASE_URL="https://raw.githubusercontent.com/ditrit/leto-modelizer-templates-library/leto-modelizer/e2e_test" npm run dev ``` @@ -66,8 +66,8 @@ TEMPLATE_LIBRARY_BASE_URL="https://raw.githubusercontent.com/ditrit/leto-modeliz ```bash npm ci -npm run plugin:install -- repository-name="terrator-plugin" repository-url="https://github.com/ditrit/terrator-plugin.git#0.10.0" -npm run plugin:install -- repository-name="githubator-plugin" repository-url="https://github.com/ditrit/githubator-plugin.git#0.4.1" +npm run plugin:install -- repository-name="terrator-plugin" repository-url="https://github.com/ditrit/terrator-plugin.git#0.11.0" +npm run plugin:install -- repository-name="githubator-plugin" repository-url="https://github.com/ditrit/githubator-plugin.git#0.4.2" npm run plugin:init ``` diff --git a/README.md b/README.md index 79f5f521e..997831648 100644 --- a/README.md +++ b/README.md @@ -50,19 +50,19 @@ For now, we don't have many plugins to offer you, but follow us and in the next Plugin to manage terraform files, by default it comes with aws provider definition. -[GitHub url](https://github.com/ditrit/terrator-plugin#0.10.0) +[GitHub url](https://github.com/ditrit/terrator-plugin#0.11.0) ### Github plugin Plugin to manage GitHub action files. -[GitHub url](https://github.com/ditrit/githubator-plugin#0.4.1) +[GitHub url](https://github.com/ditrit/githubator-plugin#0.4.2) ### Kubernetes plugin Plugin to manage Kubernetes files. -[GitHub url](https://github.com/ditrit/kubernator-plugin#0.2.0) +[GitHub url](https://github.com/ditrit/kubernator-plugin#0.2.1) ## Compatibility versions table @@ -110,10 +110,10 @@ Plugin to manage Kubernetes files. next version - = 0.25.0 - = 0.10.0 - = 0.4.1 - = 0.2.0 + = 0.26.2 + = 0.11.0 + = 0.4.2 + = 0.2.1 @@ -146,13 +146,13 @@ Choose __Custom plugin__ to install a specific plugin not referenced as an offic Examples with official plugins: - terrator-plugin: - plugin name: `terrator-plugin` - - git repository url: `https://github.com/ditrit/terrator-plugin.git#0.10.0` + - git repository url: `https://github.com/ditrit/terrator-plugin.git#0.11.0` - githubator-plugin: - plugin name: `githubator-plugin` - - git repository url: `https://github.com/ditrit/githubator-plugin.git#0.4.1` + - git repository url: `https://github.com/ditrit/githubator-plugin.git#0.4.2` - kubernator-plugin: - plugin name: `kubernator-plugin` - - git repository url: `https://github.com/ditrit/kubernator-plugin.git#0.2.0` + - git repository url: `https://github.com/ditrit/kubernator-plugin.git#0.2.1` ### Install custom plugin in command line @@ -160,13 +160,13 @@ Options `repository-name` and `repository-url` can be added with the `npm run pl ```bash # Example with terraform plugin -npm run plugin:install -- repository-name="terrator-plugin" repository-url="https://github.com/ditrit/terrator-plugin.git#0.10.0" +npm run plugin:install -- repository-name="terrator-plugin" repository-url="https://github.com/ditrit/terrator-plugin.git#0.11.0" # Example with github action plugin -npm run plugin:install -- repository-name="githubator-plugin" repository-url="https://github.com/ditrit/githubator-plugin.git#0.4.1" +npm run plugin:install -- repository-name="githubator-plugin" repository-url="https://github.com/ditrit/githubator-plugin.git#0.4.2" # Example with kubernator plugin -npm run plugin:install -- repository-name="kubernator-plugin" repository-url="https://github.com/ditrit/kubernator-plugin.git#0.2.0" +npm run plugin:install -- repository-name="kubernator-plugin" repository-url="https://github.com/ditrit/kubernator-plugin.git#0.2.1" ``` Now that your plugin is installed, you can continue to install other plugins with the same command if you want. @@ -210,7 +210,7 @@ It will generate the built application in the `dist` folder. To build this app with docker (the two main plugins for terraform & github are included), please use this command: ```bash -docker build . -build-arg TERRATOR_PLUGIN_VERSION="0.10.0" -build-arg GITHUBATOR_PLUGIN_VERSION="0.4.1" -build-arg KUBERNATOR_PLUGIN_VERSION="0.2.0" -t leto-modelizer +docker build . -build-arg TERRATOR_PLUGIN_VERSION="0.11.0" -build-arg GITHUBATOR_PLUGIN_VERSION="0.4.2" -build-arg KUBERNATOR_PLUGIN_VERSION="0.2.1" -t leto-modelizer ``` ### Docker run diff --git a/leto-modelizer-plugin-cli.json b/leto-modelizer-plugin-cli.json index b522671ea..5a36f35dd 100644 --- a/leto-modelizer-plugin-cli.json +++ b/leto-modelizer-plugin-cli.json @@ -1,17 +1,17 @@ [ { "name": "terrator-plugin", - "url": "https://github.com/ditrit/terrator-plugin.git#0.10.0", - "version": "0.10.0" + "url": "https://github.com/ditrit/terrator-plugin.git#0.11.0", + "version": "0.11.0" }, { "name": "githubator-plugin", - "url": "https://github.com/ditrit/githubator-plugin.git#0.4.1", - "version": "0.4.1" + "url": "https://github.com/ditrit/githubator-plugin.git#0.4.2", + "version": "0.4.2" }, { "name": "kubernator-plugin", - "url": "https://github.com/ditrit/kubernator-plugin.git#0.2.0", - "version": "0.2.0" + "url": "https://github.com/ditrit/kubernator-plugin.git#0.2.1", + "version": "0.2.1" } ] From bb0d5d3f7ed5a817f754bbc6ed2340c59aefce03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Moitti=C3=A9?= Date: Fri, 2 Aug 2024 15:30:50 +0200 Subject: [PATCH 02/14] Add new event to manage log for ConsolePanel --- src/composables/events/LogEvent.js | 11 +++++++++++ tests/unit/composables/events/LogEvent.spec.js | 9 +++++++++ 2 files changed, 20 insertions(+) create mode 100644 src/composables/events/LogEvent.js create mode 100644 tests/unit/composables/events/LogEvent.spec.js diff --git a/src/composables/events/LogEvent.js b/src/composables/events/LogEvent.js new file mode 100644 index 000000000..2e1f34f76 --- /dev/null +++ b/src/composables/events/LogEvent.js @@ -0,0 +1,11 @@ +import { Subject } from 'rxjs'; + +/** + * Represent a rxjs Event object to emit and to receive log of current editing file. + * @typedef {Subject} FileLogEvent + */ +const FileLogEvent = new Subject(); + +export default { + FileLogEvent, +}; diff --git a/tests/unit/composables/events/LogEvent.spec.js b/tests/unit/composables/events/LogEvent.spec.js new file mode 100644 index 000000000..7840028d4 --- /dev/null +++ b/tests/unit/composables/events/LogEvent.spec.js @@ -0,0 +1,9 @@ +import { Subject } from 'rxjs'; +import LogEvent from 'src/composables/events/LogEvent'; + +describe('Test composable: LogEvent', () => { + it('should export a Subject', () => { + expect(LogEvent.FileLogEvent).toBeDefined(); + expect(LogEvent.FileLogEvent).toEqual(new Subject()); + }); +}); From aed94ea45ddc249fb1c9e1fdfb388f6ac7b5ac70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Moitti=C3=A9?= Date: Fri, 2 Aug 2024 15:32:20 +0200 Subject: [PATCH 03/14] Add new translation for error --- src/i18n/en-US/index.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/i18n/en-US/index.js b/src/i18n/en-US/index.js index b338d1ceb..d71bfc7da 100644 --- a/src/i18n/en-US/index.js +++ b/src/i18n/en-US/index.js @@ -510,4 +510,34 @@ export default { local: 'Local', remote: 'Remote', }, + parser: { + severity: { + 1: 'Hint', + 2: 'Info', + 4: 'Warning', + 8: 'Error', + }, + error: { + parsing: 'Error during parsing.\nInitial error message: "{ initialErrorMessage }".', + invalidLinkType: 'Wrong type of link attribute, must be an Array.', + invalidReferenceType: 'Wrong type of reference attribute, must be a String.', + notBoolean: 'Wrong value type, must be a Boolean.', + notString: 'Wrong value type, must be a String.', + notNumber: 'Wrong value type, must be a Number.', + notObject: 'Wrong value type, must be an Array.', + notArray: 'Wrong value type, must be an Array.', + required: 'Attribute "{attribute}" is required', + minString: 'The string must have a minimum length of {extraData}.', + minNumber: 'The number must be at least {extraData}.', + minArray: 'The array must have at least {extraData} items.', + maxString: 'The string must have a maximum length of {extraData}.', + maxNumber: 'The number must be at most {extraData}.', + maxArray: 'The array must have at most {extraData} items.', + invalidValue: 'The value is not one of the default values.\nPossible default values are: {extraData}.', + regex: 'The format of this value is invalid', + }, + warning: { + noComponentDefinition: 'Unreferenced component.', + }, + }, }; From ebae4916dee2971bd1f45a9fadd12424203221df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Moitti=C3=A9?= Date: Fri, 2 Aug 2024 16:09:05 +0200 Subject: [PATCH 04/14] Initialize plugins translation on SplashPage --- src/pages/SplashPage.vue | 25 +++++++++++-- tests/unit/pages/SplashPage.spec.js | 58 +++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 8 deletions(-) diff --git a/src/pages/SplashPage.vue b/src/pages/SplashPage.vue index 43b4fa983..bec0b025e 100644 --- a/src/pages/SplashPage.vue +++ b/src/pages/SplashPage.vue @@ -30,11 +30,11 @@ import { Notify } from 'quasar'; import { useI18n } from 'vue-i18n'; import { useRoute, useRouter } from 'vue-router'; import { onMounted } from 'vue'; -import { initPlugins } from 'src/composables/PluginManager'; +import { getPlugins, initPlugins } from 'src/composables/PluginManager'; import PluginEvent from 'src/composables/events/PluginEvent'; import * as UserService from 'src/services/UserService'; -const { t } = useI18n(); +const i18n = useI18n(); const route = useRoute(); const router = useRouter(); @@ -52,7 +52,7 @@ async function initUser() { .catch(() => { Notify.create({ type: 'negative', - message: t('errors.authentication.fetchingUserInformation'), + message: i18n.t('errors.authentication.fetchingUserInformation'), html: true, }); }), @@ -60,16 +60,33 @@ async function initUser() { .catch(() => { Notify.create({ type: 'negative', - message: t('errors.authentication.fetchingUserPermissions'), + message: i18n.t('errors.authentication.fetchingUserPermissions'), html: true, }); }), ]); } +/** + * Initialize translation of plugins. + */ +function initPluginsI18n() { + i18n.availableLocales.forEach((local) => { + const newMessages = {}; + + getPlugins().forEach((plugin) => { + newMessages[plugin.data.name] = plugin.configuration.i18n[local]; + }); + + i18n.mergeLocaleMessage(local, newMessages); + }); +} + onMounted(async () => { await initUser(); await initPlugins(); + initPluginsI18n(); + PluginEvent.InitEvent.next(); // Wait 2s to avoid blinking effect and let user admire our beautiful splash screen. diff --git a/tests/unit/pages/SplashPage.spec.js b/tests/unit/pages/SplashPage.spec.js index 6ee65b535..7dc0bdf1c 100644 --- a/tests/unit/pages/SplashPage.spec.js +++ b/tests/unit/pages/SplashPage.spec.js @@ -6,18 +6,32 @@ import PluginManager from 'src/composables/PluginManager'; import { initUserInformation, initUserPermissions } from 'src/services/UserService'; import { setActivePinia, createPinia } from 'pinia'; import { Notify } from 'quasar'; +import { useI18n } from 'vue-i18n'; installQuasarPlugin(); jest.mock('vue-i18n', () => ({ - useI18n: () => ({ + useI18n: jest.fn(() => ({ t: (t) => t, - }), + mergeLocaleMessage: jest.fn(), + availableLocales: ['en-US'], + })), })); jest.mock('src/composables/PluginManager', () => ({ initPlugins: () => Promise.resolve(), - getPlugins: jest.fn(), + getPlugins: jest.fn(() => [{ + data: { + name: 'test', + }, + configuration: { + i18n: { + 'en-US': { + test: 'test', + }, + }, + }, + }]), })); jest.mock('src/composables/events/PluginEvent', () => ({ @@ -53,7 +67,19 @@ describe('Test component: SplashPage', () => { beforeEach(() => { PluginManager.getPlugins.mockImplementation(() => [ - { data: { deleteAllEventLogsBefore: jest.fn(() => {}) } }, + { + data: { + deleteAllEventLogsBefore: jest.fn(() => {}), + name: 'plugin-test', + }, + configuration: { + i18n: { + 'en-US': { + test: 'test', + }, + }, + }, + }, ]); setActivePinia(createPinia()); @@ -82,6 +108,30 @@ describe('Test component: SplashPage', () => { }); }); + describe('Test function: initPluginsI18n', () => { + it('should update translations', () => { + const mergeLocaleMessage = jest.fn(); + + useI18n.mockImplementation(() => ({ + t: (t) => t, + mergeLocaleMessage, + availableLocales: ['en-US'], + })); + + wrapper = shallowMount(SplashPage, { + global: { + stubs: { + qIcon: true, + }, + }, + }); + + wrapper.vm.initPluginsI18n(); + + expect(mergeLocaleMessage).toBeCalledWith('en-US', { 'plugin-test': { test: 'test' } }); + }); + }); + describe('Test function: initUser', () => { beforeEach(() => { initUserInformation.mockClear(); From a2dd110f46617d4aeabb7c43593da57c3946cbbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Moitti=C3=A9?= Date: Fri, 2 Aug 2024 16:41:47 +0200 Subject: [PATCH 05/14] Add analyzeFile function and return logs on initComponents --- src/composables/PluginManager.js | 27 +++++ tests/unit/composables/PluginManager.spec.js | 112 +++++++------------ 2 files changed, 68 insertions(+), 71 deletions(-) diff --git a/src/composables/PluginManager.js b/src/composables/PluginManager.js index 821b06164..59c3391ea 100644 --- a/src/composables/PluginManager.js +++ b/src/composables/PluginManager.js @@ -331,6 +331,33 @@ export async function initComponents(projectName, plugin, path) { const diagram = new FileInformation({ path: path ? `${projectName}/${path}` : projectName }); plugin.parse(diagram, config, fileInputs); + + return plugin.data.parseLogs; +} + +/** + * Analyze file and return all generated parser logs. + * @param {FileInput} fileInput - File to analyze. + * @returns {ParserLog[]} Logs to return. + */ +export function analyzeFile(fileInput) { + const plugin = getPlugins().find((p) => p.isParsable(fileInput)); + + if (!plugin) { + return []; + } + + const paths = fileInput.path.split('/'); + + plugin.parse( + new FileInformation({ path: paths.slice(0, -1).join('/') }), + new FileInformation({ + path: `${paths[0]}/${configurationFileName}`, + }), + [fileInput], + ); + + return plugin.data.parseLogs; } /** diff --git a/tests/unit/composables/PluginManager.spec.js b/tests/unit/composables/PluginManager.spec.js index 3950111cf..b2ad986b0 100644 --- a/tests/unit/composables/PluginManager.spec.js +++ b/tests/unit/composables/PluginManager.spec.js @@ -1,6 +1,6 @@ import * as PluginManager from 'src/composables/PluginManager'; import { deleteProjectFile, writeProjectFile, setFiles } from 'src/composables/Project'; -import { FileInformation } from 'leto-modelizer-plugin-core'; +import { FileInformation, FileInput } from 'leto-modelizer-plugin-core'; jest.mock('src/plugins', () => ({ test: class { @@ -12,6 +12,7 @@ jest.mock('src/plugins', () => ({ links: [], }, components: [], + parseLogs: [], }; this.configuration = { tags: [{ @@ -26,6 +27,7 @@ jest.mock('src/plugins', () => ({ }], extraResources: [], }; + this.parse = jest.fn(); } // eslint-disable-next-line class-methods-use-this @@ -60,6 +62,7 @@ jest.mock('src/plugins', () => ({ links: [], }, components: [], + parseLogs: [], }; this.configuration = { tags: [{ @@ -74,6 +77,7 @@ jest.mock('src/plugins', () => ({ }], extraResources: [], }; + this.parse = jest.fn(); } // eslint-disable-next-line class-methods-use-this @@ -221,79 +225,18 @@ describe('Test composable: PluginManager', () => { describe('Test function: initPlugins', () => { it('should instantiate all plugins', async () => { await PluginManager.initPlugins(); - expect(PluginManager.getPlugins()).toEqual([{ - data: { - name: 'test', - definitions: { - links: [], - components: [], - }, - components: [], - }, - configuration: { - tags: [{ - type: 'category', - value: 'a', - }, { - type: 'category', - value: 'd', - }, { - type: 'category', - value: 'e', - }], - extraResources: [], - }, - }, { - data: { - name: 'test2', - definitions: { - links: [], - components: [], - }, - components: [], - }, - configuration: { - tags: [{ - type: 'category', - value: 'a', - }, { - type: 'category', - value: 'd', - }, { - type: 'category', - value: 'e', - }], - extraResources: [], - }, - }]); + + const plugins = PluginManager.getPlugins(); + + expect(plugins.length).toEqual(2); + expect(plugins[0].data.name).toEqual('test'); + expect(plugins[1].data.name).toEqual('test2'); }); }); describe('Test function: getPluginByName', () => { it('should return the plugin according to the given name', () => { - expect(PluginManager.getPluginByName('test')).toEqual({ - data: { - name: 'test', - definitions: { - links: [], - components: [], - }, - components: [], - }, - configuration: { - tags: [{ - type: 'category', - value: 'a', - }, { - type: 'category', - value: 'd', - }, { - type: 'category', - value: 'e', - }], - extraResources: [], - }, - }); + expect(PluginManager.getPluginByName('test').data.name).toEqual('test'); }); }); @@ -472,13 +415,17 @@ describe('Test composable: PluginManager', () => { configuration: { isFolderTypeDiagram: false, }, + data: { + parseLogs: [], + }, }; expect(plugin.parse).toHaveBeenCalledTimes(0); - await PluginManager.initComponents('projectName', plugin, 'plugin/model'); + const logs = await PluginManager.initComponents('projectName', plugin, 'plugin/model'); expect(plugin.parse).toHaveBeenCalledTimes(1); + expect(logs).toEqual([]); }); it('should call setFiles if isFolderTypeDiagram is true', async () => { @@ -488,13 +435,36 @@ describe('Test composable: PluginManager', () => { configuration: { isFolderTypeDiagram: true, }, + data: { + parseLogs: [], + }, }; expect(setFiles).toHaveBeenCalledTimes(0); - await PluginManager.initComponents('projectName', plugin, ''); + const logs = await PluginManager.initComponents('projectName', plugin, ''); expect(setFiles).toHaveBeenCalledTimes(1); + expect(logs).toEqual([]); + }); + }); + + describe('Test function: analyzeFile', () => { + it('should return logs', async () => { + await PluginManager.initPlugins(); + + const plugin = PluginManager.getPlugins()[0]; + const input = new FileInput({ + path: 'test1/test2/test3.tf', + content: 'test', + }); + + expect(PluginManager.analyzeFile(input)).toEqual([]); + expect(plugin.parse).toBeCalledWith( + { path: 'test1/test2' }, + { path: 'test1/leto-modelizer.config.json' }, + [{ content: 'test', path: 'test1/test2/test3.tf' }], + ); }); }); From d0bb60ff243d8daa1b1feef6c8d31924d1341ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Moitti=C3=A9?= Date: Mon, 5 Aug 2024 10:26:26 +0200 Subject: [PATCH 06/14] Update ConsoleFooter to make it dynamic --- src/components/drawer/ConsoleFooter.vue | 50 +++++++++++++++---- .../components/drawer/ConsoleFooter.spec.js | 40 +++++++++++++++ 2 files changed, 79 insertions(+), 11 deletions(-) diff --git a/src/components/drawer/ConsoleFooter.vue b/src/components/drawer/ConsoleFooter.vue index 8fd1889a3..660244406 100644 --- a/src/components/drawer/ConsoleFooter.vue +++ b/src/components/drawer/ConsoleFooter.vue @@ -11,9 +11,9 @@ @@ -26,28 +26,38 @@ name="errors" class="text-h6" > - + diff --git a/src/components/editor/MonacoEditor.vue b/src/components/editor/MonacoEditor.vue index ac277b3e2..db5b9b1e2 100644 --- a/src/components/editor/MonacoEditor.vue +++ b/src/components/editor/MonacoEditor.vue @@ -238,17 +238,14 @@ onUnmounted(() => { diff --git a/src/css/app.scss b/src/css/app.scss index ab4920216..9dcc0c6cd 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -28,3 +28,7 @@ code { background-color: white; mask: url(../assets/logo.svg) no-repeat center; } + .flex-1 { + flex: 1; + height: 100% + } diff --git a/src/pages/ModelizerDrawPage.vue b/src/pages/ModelizerDrawPage.vue index e86818e87..e9dee6da7 100644 --- a/src/pages/ModelizerDrawPage.vue +++ b/src/pages/ModelizerDrawPage.vue @@ -1,13 +1,12 @@ - - From 11bc1b10fc7da063ce69bc0734683a833acb0750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Moitti=C3=A9?= Date: Mon, 5 Aug 2024 15:00:10 +0200 Subject: [PATCH 12/14] Update translations --- src/components/drawer/ModelizerDrawLeftDrawer.vue | 2 +- src/components/list/LibraryList.vue | 3 ++- src/i18n/en-US/index.js | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/drawer/ModelizerDrawLeftDrawer.vue b/src/components/drawer/ModelizerDrawLeftDrawer.vue index b7ef212b6..4d83dae61 100644 --- a/src/components/drawer/ModelizerDrawLeftDrawer.vue +++ b/src/components/drawer/ModelizerDrawLeftDrawer.vue @@ -6,11 +6,11 @@ side="left" :width="400" data-cy="draw-page-left-drawer" + class="no-scroll" >