diff --git a/README.md b/README.md index f9a6fbf2..8fb92015 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ # Antares SQL Client -  [](https://actions-badge.atrox.dev/fabio286/antares/goto) [](https://snapcraft.io/antares) [](https://snapcraft.io/antares) [](https://twitter.com/AntaresSQL) [](https://www.treedom.net/en/user/fabio-di-stasio/event/antares-for-the-planet) +  [](https://actions-badge.atrox.dev/fabio286/antares/goto) [](https://snapcraft.io/antares) [](https://snapcraft.io/antares) + [](https://twitter.com/AntaresSQL) [](https://www.treedom.net/en/user/fabio-di-stasio/event/antares-for-the-planet) Antares is an SQL client based on [Electron.js](https://github.com/electron/electron) and [Vue.js](https://github.com/vuejs/vue) that aims to become a useful tool, especially for developers. Our target is to support as many databases as possible, and all major operating systems, including the ARM versions. @@ -17,7 +18,7 @@ However, there are all the features necessary to have a pleasant database manage We are actively working on it, hoping to provide new cool features, improvements and fixes as soon as possible. 🔗 If you are curious to try Antares you can download and install the [latest release](https://github.com/Fabio286/antares/releases/latest). -👁 To stay tuned for new releases [follow Antares SQL](https://twitter.com/AntaresSQL) on Twitter. +👁 To stay tuned for new releases follow Antares SQL on [Mastodon](https://fosstodon.org/@AntaresSQL) or [Twitter](https://twitter.com/AntaresSQL). 🌟 Don't forget to **leave a star** if you appreciate this project. 🗳️ Polls: diff --git a/package-lock.json b/package-lock.json index 25fdd969..a76a9b18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "leaflet": "~1.7.1", "marked": "~4.0.19", "moment": "~2.29.4", - "mysql2": "~2.3.2", + "mysql2": "~3.5.2", "node-firebird": "~1.1.4", "pg": "~8.11.1", "pg-connection-string": "~2.5.0", @@ -89,6 +89,7 @@ "stylelint-scss": "~4.3.0", "tree-kill": "~1.2.2", "ts-loader": "~9.2.8", + "ts-node": "~10.9.1", "typescript": "~4.6.3", "unzip-crx-3": "~0.2.0", "vue-eslint-parser": "~8.3.0", @@ -1697,6 +1698,28 @@ "node": ">=6.9.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@csstools/selector-specificity": { "version": "2.2.0", "dev": true, @@ -2148,6 +2171,30 @@ "node": ">=10" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@turf/helpers": { "version": "6.5.0", "license": "MIT", @@ -3116,6 +3163,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/add-stream": { "version": "1.0.0", "dev": true, @@ -3387,6 +3443,12 @@ "dev": true, "license": "ISC" }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "license": "Python-2.0" @@ -4881,6 +4943,12 @@ "node": ">=10.0.0" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-env": { "version": "7.0.3", "dev": true, @@ -5279,6 +5347,15 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-compare": { "version": "2.4.0", "dev": true, @@ -9170,6 +9247,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/map-obj": { "version": "4.3.0", "dev": true, @@ -9664,15 +9747,16 @@ "license": "ISC" }, "node_modules/mysql2": { - "version": "2.3.3", - "license": "MIT", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.5.2.tgz", + "integrity": "sha512-cptobmhYkYeTBIFp2c0piw2+gElpioga1rUw5UidHvo8yaHijMZoo8A3zyBVoo/K71f7ZFvrShA9iMIy9dCzCA==", "dependencies": { - "denque": "^2.0.1", + "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" }, @@ -9680,19 +9764,18 @@ "node": ">= 8.0" } }, - "node_modules/mysql2/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "node_modules/mysql2/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, - "node_modules/mysql2/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" + "node_modules/mysql2/node_modules/lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "engines": { + "node": ">=16.14" + } }, "node_modules/named-placeholders": { "version": "1.1.3", @@ -13635,6 +13718,61 @@ "dev": true, "license": "ISC" }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "dev": true, @@ -14015,6 +14153,12 @@ "dev": true, "license": "MIT" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "dev": true, @@ -14940,6 +15084,15 @@ "fd-slicer": "~1.1.0" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "dev": true, diff --git a/package.json b/package.json index cb6e143b..2d9eef5a 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "release:beta": "npm run release -- --prerelease beta", "devtools:install": "node scripts/devtoolsInstaller", "postinstall": "electron-builder install-app-deps", + "translation:check": "ts-node ./scripts/translationCheck.ts", "test:e2e": "npm run compile && npm run test:e2e-dry", "test:e2e-dry": "xvfb-maybe -- playwright test", "lint": "eslint . --ext .js,.ts,.vue && stylelint \"./src/**/*.{css,scss,sass,vue}\"", @@ -66,6 +67,7 @@ "target": "deb", "arch": [ "x64", + "arm64", "armv7l" ] }, @@ -73,6 +75,7 @@ "target": "AppImage", "arch": [ "x64", + "arm64", "armv7l" ] } @@ -134,7 +137,7 @@ "leaflet": "~1.7.1", "marked": "~4.0.19", "moment": "~2.29.4", - "mysql2": "~2.3.2", + "mysql2": "~3.5.2", "node-firebird": "~1.1.4", "pg": "~8.11.1", "pg-connection-string": "~2.5.0", @@ -196,6 +199,7 @@ "stylelint-scss": "~4.3.0", "tree-kill": "~1.2.2", "ts-loader": "~9.2.8", + "ts-node": "~10.9.1", "typescript": "~4.6.3", "unzip-crx-3": "~0.2.0", "vue-eslint-parser": "~8.3.0", diff --git a/scripts/translationCheck.ts b/scripts/translationCheck.ts new file mode 100644 index 00000000..09a74ed4 --- /dev/null +++ b/scripts/translationCheck.ts @@ -0,0 +1,45 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +import { localesNames } from '../src/renderer/i18n/supported-locales'; +import { enUS } from '../src/renderer/i18n/en-US'; +const locale = process.argv[2]; +let fullCount = 0; +let checkCount = 0; + +if (!locale) { + console.log('Please specify locale code as first argument.'); + process.exit(); +} + +if (!Object.keys(localesNames).includes(locale)) { + console.log(`Translation ${locale} not fount in supported locales.`); + process.exit(); +} + +console.log('Checking missing translations for:', locale); + +const i18nFile = require(`../src/renderer/i18n/${locale}`)[locale.replace('-', '')]; + +for (const group in enUS) { + // @ts-ignore + fullCount += Object.keys(enUS[group]).length; + + if (!Object.keys(i18nFile).includes(group)) { + console.log(`Group "\u001b[31m${group}\u001b[0m" missing!`); + continue; + } + + // @ts-ignore + for (const term in enUS[group]) { + if (!Object.keys(i18nFile[group]).includes(term)) + console.log(`Translation "\u001b[33m${group}.${term}\u001b[0m" missing!`); + // @ts-ignore + else if (i18nFile[group][term] === enUS[group][term]) { + console.log(`Term "\u001b[36m${group}.${term}\u001b[0m" not translated!`); + checkCount++; + } + else + checkCount++; + } +} + +console.log(checkCount, 'of', fullCount, 'strings are present in', locale, `(\u001b[32m${(checkCount*100/fullCount).toFixed(1)}%\u001b[0m)`); diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 701d2131..40c6f48a 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -4,7 +4,7 @@ summary: Open source SQL client made to be simple and complete. description: | Antares is an SQL client that aims to become an useful and complete tool, especially for developers. The target is to support as many databases as possible, and all major operating systems, including the ARM versions. -base: core20 +base: core22 grade: stable confinement: strict @@ -119,10 +119,10 @@ parts: cleanup: after: [antares] plugin: nil - build-snaps: [gnome-3-38-2004] + build-snaps: [gnome-42-2204] override-prime: | set -eux - cd /snap/gnome-3-38-2004/current + cd /snap/gnome-42-2204/current find . -type f,l -exec rm -f $SNAPCRAFT_PRIME/{} \; mdns-lookup: @@ -136,7 +136,7 @@ parts: - libnss-mdns override-prime: | set -eux - sed -Ee 's/^\s*hosts:(\s+)files/hosts:\1files mdns4_minimal \[NOTFOUND=return\]/' /snap/core20/current/etc/nsswitch.conf > $SNAPCRAFT_STAGE/etc/nsswitch.conf + sed -Ee 's/^\s*hosts:(\s+)files/hosts:\1files mdns4_minimal \[NOTFOUND=return\]/' /snap/core22/current/etc/nsswitch.conf > $SNAPCRAFT_STAGE/etc/nsswitch.conf snapcraftctl prime prime: - lib/$SNAPCRAFT_ARCH_TRIPLET/libnss_mdns4_minimal* @@ -146,10 +146,7 @@ apps: antares: command: opt/Antares/antares --no-sandbox desktop: usr/share/applications/antares.desktop - extensions: [gnome-3-38] - environment: - # Fallback to XWayland if running in a Wayland session. - DISABLE_WAYLAND: 1 + extensions: [gnome] plugs: - browser-support - cups-control diff --git a/src/common/shortcuts.ts b/src/common/shortcuts.ts index 46822cfe..0f63517c 100644 --- a/src/common/shortcuts.ts +++ b/src/common/shortcuts.ts @@ -1,22 +1,22 @@ export const shortcutEvents: { [key: string]: { l18n: string; l18nParam?: string | number; context?: 'tab' }} = { - 'run-or-reload': { l18n: 'message.runOrReload', context: 'tab' }, - 'open-new-tab': { l18n: 'message.openNewTab', context: 'tab' }, - 'close-tab': { l18n: 'message.closeTab', context: 'tab' }, - 'format-query': { l18n: 'message.formatQuery', context: 'tab' }, - 'kill-query': { l18n: 'message.killQuery', context: 'tab' }, - 'query-history': { l18n: 'message.queryHistory', context: 'tab' }, - 'clear-query': { l18n: 'message.clearQuery', context: 'tab' }, - 'next-tab': { l18n: 'message.nextTab' }, - 'prev-tab': { l18n: 'message.previousTab' }, - 'open-all-connections': { l18n: 'message.openAllConnections' }, - 'open-filter': { l18n: 'message.openFilter' }, - 'next-page': { l18n: 'message.nextResultsPage' }, - 'prev-page': { l18n: 'message.previousResultsPage' }, - 'toggle-console': { l18n: 'message.toggleConsole' }, - 'save-content': { l18n: 'message.saveContent' }, - 'create-connection': { l18n: 'message.createNewConnection' }, - 'open-settings': { l18n: 'message.openSettings' }, - 'open-scratchpad': { l18n: 'message.openScratchpad' } + 'run-or-reload': { l18n: 'application.runOrReload', context: 'tab' }, + 'open-new-tab': { l18n: 'application.openNewTab', context: 'tab' }, + 'close-tab': { l18n: 'application.closeTab', context: 'tab' }, + 'format-query': { l18n: 'database.formatQuery', context: 'tab' }, + 'kill-query': { l18n: 'database.killQuery', context: 'tab' }, + 'query-history': { l18n: 'database.queryHistory', context: 'tab' }, + 'clear-query': { l18n: 'database.clearQuery', context: 'tab' }, + 'next-tab': { l18n: 'application.nextTab' }, + 'prev-tab': { l18n: 'application.previousTab' }, + 'open-all-connections': { l18n: 'application.openAllConnections' }, + 'open-filter': { l18n: 'application.openFilter' }, + 'next-page': { l18n: 'application.nextResultsPage' }, + 'prev-page': { l18n: 'application.previousResultsPage' }, + 'toggle-console': { l18n: 'application.toggleConsole' }, + 'save-content': { l18n: 'application.saveContent' }, + 'create-connection': { l18n: 'connection.createNewConnection' }, + 'open-settings': { l18n: 'application.openSettings' }, + 'open-scratchpad': { l18n: 'application.openScratchpad' } }; interface ShortcutRecord { @@ -124,7 +124,7 @@ const shortcuts: ShortcutRecord[] = [ for (let i = 1; i <= 9; i++) { shortcutEvents[`select-tab-${i}`] = { - l18n: 'message.selectTabNumber', + l18n: 'application.selectTabNumber', l18nParam: i }; diff --git a/src/main/libs/importers/sql/MySQLlImporter.ts b/src/main/libs/importers/sql/MySQLlImporter.ts index 51c8e418..9888e0d0 100644 --- a/src/main/libs/importers/sql/MySQLlImporter.ts +++ b/src/main/libs/importers/sql/MySQLlImporter.ts @@ -47,7 +47,7 @@ export default class MySQLImporter extends BaseImporter { catch (error) { this.emit('query-error', { sql: query, - message: error.sqlMessage, + message: error.sqlMessage || error.message, sqlSnippet: error.sql, time: new Date().getTime() }); diff --git a/src/renderer/App.vue b/src/renderer/App.vue index 3d3b720f..5686c4dd 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -21,7 +21,15 @@ - + + + @@ -33,9 +41,11 @@ import { useI18n } from 'vue-i18n'; import { Menu, getCurrentWindow } from '@electron/remote'; import { useApplicationStore } from '@/stores/application'; import { useConnectionsStore } from '@/stores/connections'; +import { useSchemaExportStore } from '@/stores/schemaExport'; import { useSettingsStore } from '@/stores/settings'; import { useWorkspacesStore } from '@/stores/workspaces'; import TheSettingBar from '@/components/TheSettingBar.vue'; +import ModalExportSchema from '@/components/ModalExportSchema.vue'; const { t } = useI18n(); @@ -65,6 +75,10 @@ const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore); const { checkVersionUpdate } = applicationStore; const { changeApplicationTheme } = settingsStore; +const schemaExportStore = useSchemaExportStore(); +const { hideExportModal } = schemaExportStore; +const { isExportModal: isExportSchemaModal } = storeToRefs(schemaExportStore); + const isAllConnectionsModal: Ref = ref(false); document.addEventListener('DOMContentLoaded', () => { @@ -95,22 +109,22 @@ onMounted(() => { const InputMenu = Menu.buildFromTemplate([ { - label: t('word.cut'), + label: t('general.cut'), role: 'cut' }, { - label: t('word.copy'), + label: t('general.copy'), role: 'copy' }, { - label: t('word.paste'), + label: t('general.paste'), role: 'paste' }, { type: 'separator' }, { - label: t('message.selectAll'), + label: t('general.selectAll'), role: 'selectAll' } ]); diff --git a/src/renderer/components/BaseConfirmModal.vue b/src/renderer/components/BaseConfirmModal.vue index 76481f79..61a98278 100644 --- a/src/renderer/components/BaseConfirmModal.vue +++ b/src/renderer/components/BaseConfirmModal.vue @@ -31,13 +31,13 @@ class="btn btn-primary mr-2" @click.stop="confirmModal" > - {{ confirmText || t('word.confirm') }} + {{ confirmText || t('general.confirm') }} - {{ cancelText || t('word.cancel') }} + {{ cancelText || t('general.cancel') }} diff --git a/src/renderer/components/FakerSelect.vue b/src/renderer/components/FakerSelect.vue index 49385bd3..8aea2fb3 100644 --- a/src/renderer/components/FakerSelect.vue +++ b/src/renderer/components/FakerSelect.vue @@ -4,7 +4,7 @@ v-model="selectedGroup" class="form-select" :options="[{name: 'manual'}, ...fakerGroups]" - :option-label="(opt: any) => opt.name === 'manual' ? t('message.manualValue') : t(`faker.${opt.name}`)" + :option-label="(opt: any) => opt.name === 'manual' ? t('general.manualValue') : t(`faker.${opt.name}`)" option-track-by="name" :disabled="!isChecked" :style="'flex-grow: 0;'" @@ -41,7 +41,7 @@ diff --git a/src/renderer/components/KeyPressDetector.vue b/src/renderer/components/KeyPressDetector.vue index 283f6c96..df89eac5 100644 --- a/src/renderer/components/KeyPressDetector.vue +++ b/src/renderer/components/KeyPressDetector.vue @@ -4,7 +4,7 @@ class="form-input" type="text" :value="pressedKeys" - :placeholder="t('message.registerAShortcut')" + :placeholder="t('application.registerAShortcut')" @focus="isFocus = true" @blur="isFocus = false" @keydown.prevent.stop="onKey" @@ -49,7 +49,7 @@ const pressedKeys = computed(() => { keys.push('Shift'); if (keyboardEvent.value.code) { if (keys.length === 0 && (keyboardEvent.value.key.length === 1 || singleKeysToIgnore.includes(keyboardEvent.value.key))) - return t('message.invalidShortcutMessage'); + return t('application.invalidShortcutMessage'); else if (!specialKeys.includes(keyboardEvent.value.key)) { if (keyboardEvent.value.key === 'Dead') { keys.push(keyboardEvent.value.code @@ -82,7 +82,7 @@ const pressedKeys = computed(() => { } } else - return t('message.invalidShortcutMessage'); + return t('application.invalidShortcutMessage'); } } @@ -96,7 +96,7 @@ const onKey = (e: KeyboardEvent) => { }; watch(pressedKeys, (value) => { - if (value !== t('message.invalidShortcutMessage')) + if (value !== t('application.invalidShortcutMessage')) emit('update:modelValue', pressedKeys.value); }); diff --git a/src/renderer/components/ModalAllConnections.vue b/src/renderer/components/ModalAllConnections.vue index 16bd4131..3cadbaed 100644 --- a/src/renderer/components/ModalAllConnections.vue +++ b/src/renderer/components/ModalAllConnections.vue @@ -7,7 +7,7 @@ - {{ t('message.allConnections') }} + {{ t('connection.allConnections') }} @@ -21,7 +21,7 @@ v-model="searchTerm" class="form-input" type="text" - :placeholder="t('message.searchForConnections')" + :placeholder="t('connection.searchForConnections')" @keypress.esc="searchTerm = ''" > @@ -58,7 +58,7 @@ @@ -130,12 +130,12 @@ > - {{ t('message.deleteConnection') }} + {{ t('connection.deleteConnection') }} - {{ t('message.deleteConfirm') }} {{ selectedConnectionName }}? + {{ t('general.deleteConfirm') }} {{ selectedConnectionName }}? diff --git a/src/renderer/components/ModalAskCredentials.vue b/src/renderer/components/ModalAskCredentials.vue index d3f6f850..d506f086 100644 --- a/src/renderer/components/ModalAskCredentials.vue +++ b/src/renderer/components/ModalAskCredentials.vue @@ -6,7 +6,7 @@ - {{ t('word.credentials') }} + {{ t('connection.credentials') }} @@ -16,7 +16,7 @@ - {{ t('word.user') }} + {{ t('connection.user') }} - {{ t('word.password') }} + {{ t('connection.password') }} diff --git a/src/renderer/components/ModalAskParameters.vue b/src/renderer/components/ModalAskParameters.vue index c6aa0063..93154c1a 100644 --- a/src/renderer/components/ModalAskParameters.vue +++ b/src/renderer/components/ModalAskParameters.vue @@ -1,7 +1,7 @@ - {{ t('word.parameters') }}: {{ localRoutine.name }} + {{ t('database.parameters') }}: {{ localRoutine.name }} diff --git a/src/renderer/components/ModalConnectionAppearance.vue b/src/renderer/components/ModalConnectionAppearance.vue index f1b4301d..02ac0241 100644 --- a/src/renderer/components/ModalConnectionAppearance.vue +++ b/src/renderer/components/ModalConnectionAppearance.vue @@ -7,7 +7,7 @@ - {{ t('message.editConnectionAppearance') }} + {{ t('connection.editConnectionAppearance') }} @@ -17,7 +17,7 @@ - {{ t('word.label') }} + {{ t('application.label') }} - {{ t('word.icon') }} + {{ t('application.icon') }} diff --git a/src/renderer/components/ModalDiscardChanges.vue b/src/renderer/components/ModalDiscardChanges.vue index 5eeccc6b..c26e4aad 100644 --- a/src/renderer/components/ModalDiscardChanges.vue +++ b/src/renderer/components/ModalDiscardChanges.vue @@ -1,18 +1,18 @@ - {{ t('message.unsavedChanges') }} + {{ t('application.unsavedChanges') }} - {{ t('message.discardUnsavedChanges') }} + {{ t('application.discardUnsavedChanges') }} diff --git a/src/renderer/components/ModalEditSchema.vue b/src/renderer/components/ModalEditSchema.vue index dadd0e44..1494447d 100644 --- a/src/renderer/components/ModalEditSchema.vue +++ b/src/renderer/components/ModalEditSchema.vue @@ -7,7 +7,7 @@ - {{ t('message.editSchema') }} + {{ t('database.editSchema') }} @@ -17,7 +17,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.collation') }} + {{ t('database.collation') }} - {{ t('message.serverDefault') }}: {{ defaultCollation }} + {{ t('database.serverDefault') }}: {{ defaultCollation }} @@ -52,10 +52,10 @@ diff --git a/src/renderer/components/ModalExportSchema.vue b/src/renderer/components/ModalExportSchema.vue index b7de183e..14072bb3 100644 --- a/src/renderer/components/ModalExportSchema.vue +++ b/src/renderer/components/ModalExportSchema.vue @@ -7,7 +7,7 @@ - {{ t('message.exportSchema') }} + {{ t('database.exportSchema') }} @@ -16,7 +16,7 @@ - {{ t('message.directoryPath') }} + {{ t('general.directoryPath') }} @@ -26,14 +26,14 @@ type="text" required readonly - :placeholder="t('message.schemaName')" + :placeholder="t('database.schemaName')" > - {{ t('word.change') }} + {{ t('general.change') }} @@ -42,35 +42,41 @@ - - - - {{ filename }} + + + + - + - + - + @@ -122,22 +128,22 @@ - {{ t('word.table') }} + {{ t('database.table') }} - {{ t('word.structure') }} + {{ t('database.structure') }} - {{ t('word.content') }} + {{ t('general.content') }} - {{ t('word.drop') }} + {{ t('database.drop') }} @@ -148,6 +154,7 @@ v-for="item in tables" :key="item.table" class="tr" + :class="{'selected': item.table === selectedTable}" > {{ item.table }} @@ -183,19 +190,19 @@ - {{ t('word.options') }} + {{ t('general.options') }} - {{ t('word.includes') }}: + {{ t('general.includes') }}: - {{ t(`word.${key}`, 2) }} + {{ t(`database.${String(key).slice(0, -1)}`, 2) }} - {{ t('message.newInsertStmtEvery') }}: + {{ t('database.newInsertStmtEvery') }}: @@ -209,21 +216,21 @@ - {{ t('message.outputFormat') }}: + {{ t('general.outputFormat') }}: @@ -245,7 +252,7 @@ - {{ t('word.close') }} + {{ t('general.close') }} - {{ t('word.export') }} + {{ t('database.export') }} @@ -272,6 +279,7 @@ import { useI18n } from 'vue-i18n'; import { ClientCode, SchemaInfos } from 'common/interfaces/antares'; import { ExportOptions, ExportState } from 'common/interfaces/exporter'; import { useNotificationsStore } from '@/stores/notifications'; +import { useSchemaExportStore } from '@/stores/schemaExport'; import { useWorkspacesStore } from '@/stores/workspaces'; import { useFocusTrap } from '@/composables/useFocusTrap'; import Application from '@/ipc-api/Application'; @@ -279,15 +287,12 @@ import Schema from '@/ipc-api/Schema'; import { Customizations } from 'common/interfaces/customizations'; import BaseSelect from '@/components/BaseSelect.vue'; -const props = defineProps({ - selectedSchema: String -}); - const emit = defineEmits(['close']); const { t } = useI18n(); const { addNotification } = useNotificationsStore(); const workspacesStore = useWorkspacesStore(); +const schemaExportStore = useSchemaExportStore(); const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore); @@ -298,6 +303,8 @@ const { refreshSchema } = workspacesStore; +const { selectedTable, selectedSchema } = storeToRefs(schemaExportStore); + const isExporting = ref(false); const isRefreshing = ref(false); const progressPercentage = ref(0); @@ -309,18 +316,19 @@ const tables: Ref<{ includeDropStatement: boolean; }[]> = ref([]); const options: Ref> = ref({ - schema: props.selectedSchema, + schema: selectedSchema.value, includes: {} as {[key: string]: boolean}, outputFormat: 'sql' as 'sql' | 'sql.zip', sqlInsertAfter: 250, sqlInsertDivider: 'bytes' as 'bytes' | 'rows' }); const basePath = ref(''); +const chosenFilename = ref(''); const currentWorkspace = computed(() => getWorkspace(selectedWorkspace.value)); const clientCustoms: Ref = computed(() => currentWorkspace.value.customizations); const schemaItems = computed(() => { - const db: SchemaInfos = currentWorkspace.value.structure.find((db: SchemaInfos) => db.name === props.selectedSchema); + const db: SchemaInfos = currentWorkspace.value.structure.find((db: SchemaInfos) => db.name === selectedSchema.value); if (db) return db.tables.filter(table => table.type === 'table'); @@ -328,9 +336,9 @@ const schemaItems = computed(() => { }); const filename = computed(() => { const date = moment().format('YYYY-MM-DD_HH-mm-ss'); - return `${props.selectedSchema}_${date}.${options.value.outputFormat}`; + return `${selectedTable.value || selectedSchema.value}_${date}`; }); -const dumpFilePath = computed(() => `${basePath.value}/${filename.value}`); +const dumpFilePath = computed(() => `${basePath.value}/${chosenFilename.value || filename.value}.${options.value.outputFormat}`); const includeStructureStatus = computed(() => { if (tables.value.every(item => item.includeStructure)) return 1; else if (tables.value.some(item => item.includeStructure)) return 2; @@ -353,7 +361,7 @@ const startExport = async () => { const params = { uid, type: client, - schema: props.selectedSchema, + schema: selectedSchema.value, outputFile: dumpFilePath.value, tables: [...tables.value], ...options.value @@ -362,7 +370,7 @@ const startExport = async () => { try { const { status, response } = await Schema.export(params); if (status === 'success') - progressStatus.value = response.cancelled ? t('word.aborted') : t('word.completed'); + progressStatus.value = response.cancelled ? t('general.aborted') : t('general.completed'); else { progressStatus.value = response; addNotification({ status: 'error', message: response }); @@ -379,13 +387,13 @@ const updateProgress = (event: Event, state: ExportState) => { progressPercentage.value = Number((state.currentItemIndex / state.totalItems * 100).toFixed(1)); switch (state.op) { case 'PROCESSING': - progressStatus.value = t('message.processingTableExport', { table: state.currentItem }); + progressStatus.value = t('database.processingTableExport', { table: state.currentItem }); break; case 'FETCH': - progressStatus.value = t('message.fetchingTableExport', { table: state.currentItem }); + progressStatus.value = t('database.fetchingTableExport', { table: state.currentItem }); break; case 'WRITE': - progressStatus.value = t('message.writingTableExport', { table: state.currentItem }); + progressStatus.value = t('database.writingTableExport', { table: state.currentItem }); break; } }; @@ -431,7 +439,7 @@ const toggleAllTablesOption = (option: 'includeStructure' | 'includeContent' |'i const refresh = async () => { isRefreshing.value = true; - await refreshSchema({ uid: currentWorkspace.value.uid, schema: props.selectedSchema }); + await refreshSchema({ uid: currentWorkspace.value.uid, schema: selectedSchema.value }); isRefreshing.value = false; }; @@ -446,12 +454,31 @@ const openPathDialog = async () => { window.addEventListener('keydown', onKey); + if (selectedTable.value) { + setTimeout(() => { + const element = document.querySelector('.modal.active .selected'); + + if (element) { + const rect = element.getBoundingClientRect(); + const elemTop = rect.top; + const elemBottom = rect.bottom; + const isVisible = (elemTop >= 0) && (elemBottom <= window.innerHeight); + + if (!isVisible) { + element.setAttribute('tabindex', '-1'); + element.focus(); + element.removeAttribute('tabindex'); + } + } + }, 100); + } + basePath.value = await Application.getDownloadPathDirectory(); tables.value = schemaItems.value.map(item => ({ table: item.name, - includeStructure: true, - includeContent: true, - includeDropStatement: true + includeStructure: !selectedTable.value ? true : selectedTable.value === item.name, + includeContent: !selectedTable.value ? true : selectedTable.value === item.name, + includeDropStatement: !selectedTable.value ? true : selectedTable.value === item.name })); const structure = ['functions', 'views', 'triggers', 'routines', 'schedulers']; @@ -459,7 +486,7 @@ const openPathDialog = async () => { structure.forEach((feat: keyof Customizations) => { const val = clientCustoms.value[feat]; if (val) - options.value.includes[feat] = true; + options.value.includes[feat] = !selectedTable.value; }); ipcRenderer.on('export-progress', updateProgress); diff --git a/src/renderer/components/ModalFakerRows.vue b/src/renderer/components/ModalFakerRows.vue index 3ad6b937..4da9414a 100644 --- a/src/renderer/components/ModalFakerRows.vue +++ b/src/renderer/components/ModalFakerRows.vue @@ -7,7 +7,7 @@ - {{ t('message.insertRow', 2) }} + {{ t('database.insertRow', 2) }} @@ -39,7 +39,7 @@ {{ field.type }} {{ wrapNumber(fieldLength(field)) }} - + diff --git a/src/renderer/components/ModalImportSchema.vue b/src/renderer/components/ModalImportSchema.vue index 3d313999..2b37a5b8 100644 --- a/src/renderer/components/ModalImportSchema.vue +++ b/src/renderer/components/ModalImportSchema.vue @@ -7,7 +7,7 @@ - {{ t('message.importSchema') }} + {{ t('database.importSchema') }} @@ -15,7 +15,7 @@ {{ sqlFile }} - {{ t('message.importQueryErrors', queryErrors.length) }} + {{ t('database.importQueryErrors', queryErrors.length) }} - {{ progressPercentage }}% - {{ progressStatus }} - {{ t('message.executedQueries', queryCount) }} + {{ progressPercentage }}% - {{ progressStatus }} - {{ t('database.executedQueries', queryCount) }} - {{ completed ? t('word.close') : t('word.cancel') }} + {{ completed ? t('general.close') : t('general.cancel') }} @@ -108,7 +108,7 @@ const startImport = async (file: string) => { const { status, response } = await Schema.import(params); if (status === 'success') - progressStatus.value = response.cancelled ? t('word.aborted') : t('word.completed'); + progressStatus.value = response.cancelled ? t('general.aborted') : t('general.completed'); else { progressStatus.value = response; addNotification({ status: 'error', message: response }); diff --git a/src/renderer/components/ModalNewSchema.vue b/src/renderer/components/ModalNewSchema.vue index 235c65d2..1bfd2f4a 100644 --- a/src/renderer/components/ModalNewSchema.vue +++ b/src/renderer/components/ModalNewSchema.vue @@ -7,7 +7,7 @@ - {{ t('message.createNewSchema') }} + {{ t('database.createNewSchema') }} @@ -17,7 +17,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.collation') }} + {{ t('database.collation') }} - {{ t('message.serverDefault') }}: {{ defaultCollation }} + {{ t('database.serverDefault') }}: {{ defaultCollation }} @@ -55,10 +55,10 @@ :class="{'loading': isLoading}" @click.stop="createSchema" > - {{ t('word.add') }} + {{ t('general.add') }} - {{ t('word.close') }} + {{ t('general.close') }} diff --git a/src/renderer/components/ModalProcessesList.vue b/src/renderer/components/ModalProcessesList.vue index 0758e73c..79f2ecde 100644 --- a/src/renderer/components/ModalProcessesList.vue +++ b/src/renderer/components/ModalProcessesList.vue @@ -17,7 +17,7 @@ - {{ t('message.processesList') }}: {{ connectionName }} + {{ t('database.processesList') }}: {{ connectionName }} @@ -29,7 +29,7 @@ @@ -39,7 +39,7 @@ - {{ t('word.autoRefresh') }}: {{ +autorefreshTimer ? `${autorefreshTimer}s` : 'OFF' }} + {{ t('general.autoRefresh') }}: {{ +autorefreshTimer ? `${autorefreshTimer}s` : 'OFF' }} - {{ t('word.export') }} + {{ t('database.export') }} @@ -74,7 +74,7 @@ - {{ t('word.processes') }}: {{ sortedResults.length.toLocaleString() }} + {{ t('database.processes') }}: {{ sortedResults.length.toLocaleString() }} diff --git a/src/renderer/components/ModalProcessesListContext.vue b/src/renderer/components/ModalProcessesListContext.vue index 2c999824..a741b492 100644 --- a/src/renderer/components/ModalProcessesListContext.vue +++ b/src/renderer/components/ModalProcessesListContext.vue @@ -4,7 +4,7 @@ @close-context="closeContext" > - {{ t('word.copy') }} + {{ t('general.copy') }} - {{ t('word.cell', 1) }} + {{ t('database.cell', 1) }} - {{ t('word.row', 1) }} + {{ t('database.row', 1) }} @@ -33,7 +33,7 @@ @click="killProcess" > - {{ t('message.killProcess') }} + {{ t('database.killProcess') }} diff --git a/src/renderer/components/ModalProcessesListRow.vue b/src/renderer/components/ModalProcessesListRow.vue index 84e0fbc3..76cb217f 100644 --- a/src/renderer/components/ModalProcessesListRow.vue +++ b/src/renderer/components/ModalProcessesListRow.vue @@ -16,15 +16,15 @@ - {{ t('message.processInfo') }} + {{ t('database.processInfo') }} diff --git a/src/renderer/components/ModalSettings.vue b/src/renderer/components/ModalSettings.vue index 77092342..f2a5050e 100644 --- a/src/renderer/components/ModalSettings.vue +++ b/src/renderer/components/ModalSettings.vue @@ -7,7 +7,7 @@ - {{ t('word.settings') }} + {{ t('application.settings') }} @@ -21,21 +21,21 @@ :class="{'active': selectedTab === 'general'}" @click="selectTab('general')" > - {{ t('word.general') }} + {{ t('application.general') }} - {{ t('word.themes') }} + {{ t('application.themes') }} - {{ t('word.shortcuts') }} + {{ t('application.shortcuts') }} - {{ t('word.update') }} + {{ t('application.update') }} - {{ t('word.changelog') }} + {{ t('application.changelog') }} - {{ t('word.about') }} + {{ t('application.about') }} @@ -65,14 +65,14 @@ - {{ t('word.application') }} + {{ t('application.application') }} - {{ t('word.language') }} + {{ t('application.language') }} @@ -87,15 +87,15 @@ - {{ t('message.missingOrIncompleteTranslation') }} - {{ t('message.findOutHowToContribute') }} + {{ t('application.missingOrIncompleteTranslation') }} + {{ t('application.findOutHowToContribute') }} - {{ t('message.dataTabPageSize') }} + {{ t('application.dataTabPageSize') }} @@ -110,7 +110,7 @@ - {{ t('message.restorePreviousSession') }} + {{ t('application.restorePreviousSession') }} @@ -123,7 +123,7 @@ - {{ t('message.showTableSize') }} + {{ t('application.showTableSize') }} @@ -134,14 +134,14 @@ - {{ t('message.showTableSizeDescription') }} + {{ t('application.showTableSizeDescription') }} - {{ t('message.disableBlur') }} + {{ t('application.disableBlur') }} @@ -154,7 +154,7 @@ - {{ t('message.disableScratchpad') }} + {{ t('application.disableScratchpad') }} @@ -167,7 +167,7 @@ - {{ t('message.notificationsTimeout') }} + {{ t('application.notificationsTimeout') }} @@ -179,19 +179,19 @@ min="1" @focusout="checkNotificationsTimeout" > - {{ t('word.seconds') }} + {{ t('general.seconds') }} - {{ t('word.editor') }} + {{ t('application.editor') }} - {{ t('word.autoCompletion') }} + {{ t('application.autoCompletion') }} @@ -204,7 +204,7 @@ - {{ t('message.wrapLongLines') }} + {{ t('application.wrapLongLines') }} @@ -217,7 +217,7 @@ - {{ t('message.executeSelectedQuery') }} + {{ t('database.executeSelectedQuery') }} @@ -229,13 +229,13 @@ - {{ t('word.resultsTable') }} + {{ t('database.resultsTable') }} - {{ t('message.defaultCopyType') }} + {{ t('application.defaultCopyType') }} @@ -258,7 +258,7 @@ - {{ t('message.applicationTheme') }} + {{ t('application.applicationTheme') }} - {{ t('word.dark') }} + {{ t('application.dark') }} @@ -282,7 +282,7 @@ - {{ t('word.light') }} + {{ t('application.light') }} @@ -290,7 +290,7 @@ - {{ t('message.editorTheme') }} + {{ t('application.editorTheme') }} {{ appName }} - {{ t('word.version') }} {{ appVersion }} + {{ t('general.version') }} {{ appVersion }} GitHub • Twitter • Website - {{ t('word.author') }} {{ appAuthor }} + {{ t('general.author') }} {{ appAuthor }} - {{ t('word.contributors') }}: + {{ t('general.contributors') }}: {{ i !== 0 ? ', ' : '' }}{{ contributor }} - {{ t('message.madeWithJS') }} + {{ t('application.madeWithJS') }} @@ -500,7 +500,7 @@ const selectedTab: Ref = ref('general'); const editorThemes = computed(() => [ { - group: t('word.light'), + group: t('application.light'), themes: [ { code: 'chrome', name: 'Chrome' }, { code: 'clouds', name: 'Clouds' }, @@ -520,7 +520,7 @@ const editorThemes = computed(() => [ ] }, { - group: t('word.dark'), + group: t('application.dark'), themes: [ { code: 'ambiance', name: 'Ambiance' }, { code: 'chaos', name: 'Chaos' }, @@ -557,8 +557,8 @@ const locales = computed(() => { }); const copyTypes = computed(() => [ - { code: 'cell', name: t('word.cell') }, - { code: 'html', name: t('word.table') }, + { code: 'cell', name: t('database.cell') }, + { code: 'html', name: t('database.table') }, { code: 'json', name: 'JSON' }, { code: 'csv', name: 'CSV' }, { code: 'sql', name: 'SQL insert' } diff --git a/src/renderer/components/ModalSettingsChangelog.vue b/src/renderer/components/ModalSettingsChangelog.vue index d71bf4ad..6e982b51 100644 --- a/src/renderer/components/ModalSettingsChangelog.vue +++ b/src/renderer/components/ModalSettingsChangelog.vue @@ -18,6 +18,7 @@ import { marked } from 'marked'; import BaseLoader from '@/components/BaseLoader.vue'; import { useApplicationStore } from '@/stores/application'; import { ref } from 'vue'; +import { shell } from 'electron'; const { appVersion } = useApplicationStore(); @@ -26,6 +27,10 @@ const isLoading = ref(true); const error = ref(''); const isError = ref(false); +const openOutside = (link: string) => { + shell.openExternal(link); +}; + const getChangelog = async () => { try { const apiRes = await fetch(`https://api.github.com/repos/antares-sql/antares/releases/tags/v${appVersion}`, { @@ -40,7 +45,7 @@ const getChangelog = async () => { const renderer = { link (href: string, title: string, text: string) { - return text; + return `${text}`; }, listitem (text: string) { return `${text.replace(/ *\([^)]*\) */g, '')}`; @@ -57,6 +62,17 @@ const getChangelog = async () => { } isLoading.value = false; + + setTimeout(() => { + const links = document.querySelectorAll('.changelog-link'); + + for (const link of links) { + link.addEventListener('click', e => { + e.preventDefault(); + openOutside(link.href); + }); + } + }, 0); }; getChangelog(); diff --git a/src/renderer/components/ModalSettingsShortcuts.vue b/src/renderer/components/ModalSettingsShortcuts.vue index 23aebfd6..a28d338c 100644 --- a/src/renderer/components/ModalSettingsShortcuts.vue +++ b/src/renderer/components/ModalSettingsShortcuts.vue @@ -2,10 +2,10 @@ - {{ t('message.addShortcut') }} + {{ t('application.addShortcut') }} - {{ t('message.restoreDefaults') }} + {{ t('application.restoreDefaults') }} @@ -14,12 +14,12 @@ - {{ t('word.event') }} + {{ t('application.event') }} - {{ t('word.key', 2) }} + {{ t('application.key', 2) }} @@ -43,10 +43,10 @@ /> - {{ t('word.edit') }} + {{ t('general.edit') }} - {{ t('word.delete') }} + {{ t('general.delete') }} @@ -58,20 +58,20 @@ - {{ t('message.addShortcut') }} + {{ t('application.addShortcut') }} - {{ t('word.event') }} + {{ t('application.event') }} - {{ t('word.key', 2) }} + {{ t('application.key', 2) }} - {{ t('message.shortcutAlreadyExists') }} + {{ t('application.shortcutAlreadyExists') }} - {{ t('message.editShortcut') }} + {{ t('application.editShortcut') }} - {{ t('word.event') }} + {{ t('application.event') }} - {{ t('word.key', 2) }} + {{ t('application.key', 2) }} - {{ t('message.shortcutAlreadyExists') }} + {{ t('application.shortcutAlreadyExists') }} @@ -132,12 +132,12 @@ > - {{ t('message.deleteShortcut') }} + {{ t('application.deleteShortcut') }} - {{ t('message.deleteConfirm') }} {{ t(shortcutEvents[shortcutToDelete.event].l18n, {param: shortcutEvents[shortcutToDelete.event].l18nParam}) }} ()? + {{ t('general.deleteConfirm') }} {{ t(shortcutEvents[shortcutToDelete.event].l18n, {param: shortcutEvents[shortcutToDelete.event].l18nParam}) }} ()? @@ -150,12 +150,12 @@ > - {{ t('message.restoreDefaults') }} + {{ t('application.restoreDefaults') }} - {{ t('message.restoreDefaultsQuestion') }} + {{ t('application.restoreDefaultsQuestion') }} diff --git a/src/renderer/components/ModalSettingsUpdate.vue b/src/renderer/components/ModalSettingsUpdate.vue index 6a0ec15b..e68c61a9 100644 --- a/src/renderer/components/ModalSettingsUpdate.vue +++ b/src/renderer/components/ModalSettingsUpdate.vue @@ -26,27 +26,27 @@ :class="{'loading': updateStatus === 'checking'}" @click="checkForUpdates" > - {{ t('message.checkForUpdates') }} + {{ t('application.checkForUpdates') }} - {{ t('message.restartToInstall') }} + {{ t('application.restartToInstall') }} - {{ t('message.goToDownloadPage') }} + {{ t('application.goToDownloadPage') }} - {{ t('message.includeBetaUpdates') }} + {{ t('application.includeBetaUpdates') }} @@ -76,19 +76,19 @@ const { changeAllowPrerelease } = settingsStore; const updateMessage = computed(() => { switch (updateStatus.value) { case 'noupdate': - return t('message.noUpdatesAvailable'); + return t('application.noUpdatesAvailable'); case 'checking': - return t('message.checkingForUpdate'); + return t('application.checkingForUpdate'); case 'nocheck': - return t('message.checkFailure'); + return t('application.checkFailure'); case 'available': - return t('message.updateAvailable'); + return t('application.updateAvailable'); case 'downloading': - return t('message.downloadingUpdate'); + return t('application.downloadingUpdate'); case 'downloaded': - return t('message.updateDownloaded'); + return t('application.updateDownloaded'); case 'link': - return t('message.updateAvailable'); + return t('application.updateAvailable'); default: return updateStatus.value; } diff --git a/src/renderer/components/SettingBarContext.vue b/src/renderer/components/SettingBarContext.vue index 013756e7..b90b641b 100644 --- a/src/renderer/components/SettingBarContext.vue +++ b/src/renderer/components/SettingBarContext.vue @@ -8,20 +8,20 @@ class="context-element" @click="disconnect" > - {{ t('word.disconnect') }} + {{ t('connection.disconnect') }} - {{ t('word.duplicate') }} + {{ t('general.duplicate') }} - {{ t('word.appearance') }} + {{ t('application.appearance') }} - {{ t('word.delete') }} + {{ t('general.delete') }} - {{ t(contextConnection.isFolder ? 'message.deleteFolder' : 'message.deleteConnection') }} + {{ t(contextConnection.isFolder ? 'application.deleteFolder' : 'connection.deleteConnection') }} - {{ t('message.deleteConfirm') }} {{ connectionName }}? + {{ t('general.deleteConfirm') }} {{ connectionName }}? @@ -96,7 +96,7 @@ const isConfirmModal = ref(false); const isFolderEdit = ref(false); const isConnectionEdit = ref(false); -const connectionName = computed(() => props.contextConnection.name || getConnectionName(props.contextConnection.uid) || t('word.folder', 1)); +const connectionName = computed(() => props.contextConnection.name || getConnectionName(props.contextConnection.uid) || t('general.folder', 1)); const isConnected = computed(() => getWorkspace(props.contextConnection.uid)?.connectionStatus === 'connected'); const confirmDeleteConnection = () => { diff --git a/src/renderer/components/TheFooter.vue b/src/renderer/components/TheFooter.vue index 7998a3e9..6297e0d8 100644 --- a/src/renderer/components/TheFooter.vue +++ b/src/renderer/components/TheFooter.vue @@ -12,7 +12,7 @@ - {{ t('message.readOnlyMode') }} + {{ t('connection.readOnlyMode') }} @@ -33,22 +33,22 @@ @click="toggleConsole()" > - {{ t('word.console') }} + {{ t('application.console') }} - {{ t('word.donate') }} + {{ t('general.donate') }} diff --git a/src/renderer/components/TheScratchpad.vue b/src/renderer/components/TheScratchpad.vue index c841e3cc..c43300bf 100644 --- a/src/renderer/components/TheScratchpad.vue +++ b/src/renderer/components/TheScratchpad.vue @@ -1,14 +1,14 @@ - {{ t('word.scratchpad') }} + {{ t('application.scratchpad') }} @@ -22,7 +22,7 @@ :show-line-numbers="false" /> - {{ t('message.markdownSupported') }} + {{ t('application.markdownSupported') }} diff --git a/src/renderer/components/TheSettingBar.vue b/src/renderer/components/TheSettingBar.vue index 90b1f047..589907c6 100644 --- a/src/renderer/components/TheSettingBar.vue +++ b/src/renderer/components/TheSettingBar.vue @@ -22,7 +22,7 @@ v-tooltip="{ strategy: 'fixed', placement: 'right', - content: t('message.allConnections') + content: t('connection.allConnections') }" class="settingbar-element btn btn-link" @click="emit('show-connections-modal')" @@ -35,7 +35,7 @@ v-tooltip="{ strategy: 'fixed', placement: 'right', - content: t('message.addConnection') + content: t('connection.addConnection') }" class="settingbar-element btn btn-link" :class="{ 'selected': 'NEW' === selectedWorkspace }" @@ -55,7 +55,7 @@ v-tooltip="{ strategy: 'fixed', placement: 'right', - content: t('word.scratchpad') + content: t('application.scratchpad') }" class="settingbar-element btn btn-link" @click="showScratchpad" @@ -66,7 +66,7 @@ v-tooltip="{ strategy: 'fixed', placement: 'right', - content: t('word.settings') + content: t('application.settings') }" class="settingbar-element btn btn-link" @click="showSettingModal('general')" diff --git a/src/renderer/components/TheTitleBar.vue b/src/renderer/components/TheTitleBar.vue index 92b400ee..2950dcd4 100644 --- a/src/renderer/components/TheTitleBar.vue +++ b/src/renderer/components/TheTitleBar.vue @@ -63,7 +63,7 @@ const isLinux = process.platform === 'linux'; const windowTitle = computed(() => { if (!selectedWorkspace.value) return ''; - if (selectedWorkspace.value === 'NEW') return t('message.createNewConnection'); + if (selectedWorkspace.value === 'NEW') return t('connection.createNewConnection'); const connectionName = getConnectionName(selectedWorkspace.value); const workspace = getWorkspace(selectedWorkspace.value); diff --git a/src/renderer/components/Workspace.vue b/src/renderer/components/Workspace.vue index eb9bf1c5..3af2a035 100644 --- a/src/renderer/components/Workspace.vue +++ b/src/renderer/components/Workspace.vue @@ -45,7 +45,7 @@ {{ cutText(element.content || 'Query', 20, true) }} #{{ element.index }} @@ -58,11 +58,11 @@ @dblclick="openAsPermanentTab(element)" > - + {{ cutText(element.elementName, 20, true) }} @@ -71,11 +71,11 @@ - + {{ cutText(element.elementName, 20, true) }} @@ -88,11 +88,11 @@ :class="{'badge': element.isChanged}" > - - {{ t('message.newTable') }} + + {{ t('database.newTable') }} @@ -105,11 +105,11 @@ :class="{'badge': element.isChanged}" > - + {{ cutText(element.elementName, 20, true) }} @@ -122,11 +122,11 @@ :class="{'badge': element.isChanged}" > - + {{ cutText(element.elementName, 20, true) }} @@ -139,11 +139,11 @@ :class="{'badge': element.isChanged}" > - - {{ t('message.newView') }} + + {{ t('database.newView') }} @@ -156,11 +156,11 @@ :class="{'badge': element.isChanged}" > - - {{ t('message.newTrigger') }} + + {{ t('database.newTrigger') }} @@ -173,11 +173,11 @@ :class="{'badge': element.isChanged}" > - - {{ t('message.newRoutine') }} + + {{ t('database.newRoutine') }} @@ -190,11 +190,11 @@ :class="{'badge': element.isChanged}" > - - {{ t('message.newFunction') }} + + {{ t('database.newFunction') }} @@ -207,11 +207,11 @@ :class="{'badge': element.isChanged}" > - - {{ t('message.newTriggerFunction') }} + + {{ t('database.newTriggerFunction') }} @@ -224,11 +224,11 @@ :class="{'badge': element.isChanged}" > - - {{ t('message.newScheduler') }} + + {{ t('database.newScheduler') }} @@ -242,11 +242,11 @@ @dblclick="openAsPermanentTab(element)" > - + {{ cutText(element.elementName, 20, true) }} @@ -259,11 +259,11 @@ :class="{'badge': element.isChanged}" > - + {{ cutText(element.elementName, 20, true) }} @@ -279,7 +279,7 @@ @@ -287,13 +287,13 @@ - {{ t('message.processesList') }} + {{ t('database.processesList') }} - {{ t('word.console') }} + {{ t('application.console') }} - {{ t('word.variables') }} + {{ t('database.variables') }} - {{ t('message.manageUsers') }} + {{ t('database.manageUsers') }} @@ -323,7 +323,7 @@ diff --git a/src/renderer/components/WorkspaceAddConnectionPanel.vue b/src/renderer/components/WorkspaceAddConnectionPanel.vue index da2803a6..2cf39ee6 100644 --- a/src/renderer/components/WorkspaceAddConnectionPanel.vue +++ b/src/renderer/components/WorkspaceAddConnectionPanel.vue @@ -8,7 +8,7 @@ :class="{'active': selectedTab === 'general'}" @click="selectTab('general')" > - {{ t('word.general') }} + {{ t('application.general') }} - {{ t('word.ssl') }} + {{ t('connection.ssl') }} - {{ t('word.sshTunnel') }} + {{ t('connection.sshTunnel') }} @@ -34,7 +34,7 @@ - {{ t('word.connectionName') }} + {{ t('connection.connectionName') }} - {{ t('word.client') }} + {{ t('connection.client') }} - {{ t('word.connectionString') }} + {{ t('connection.connectionString') }} - {{ t('word.hostName') }}/IP + {{ t('connection.hostName') }}/IP - {{ t('word.database') }} + {{ t('database.database') }} @@ -99,7 +99,7 @@ - {{ t('word.port') }} + {{ t('connection.port') }} - {{ t('word.database') }} + {{ t('database.database') }} - {{ t('word.user') }} + {{ t('connection.user') }} - {{ t('word.password') }} + {{ t('connection.password') }} - {{ t('word.schema') }} + {{ t('database.schema') }} @@ -167,7 +167,7 @@ - {{ t('message.readOnlyMode') }} + {{ t('connection.readOnlyMode') }} @@ -175,7 +175,7 @@ - {{ t('message.askCredentials') }} + {{ t('connection.askCredentials') }} @@ -189,7 +189,7 @@ - {{ t('message.enableSsl') }} + {{ t('connection.enableSsl') }} @@ -202,12 +202,12 @@ - {{ t('word.privateKey') }} + {{ t('connection.privateKey') }} @@ -215,12 +215,12 @@ - {{ t('word.certificate') }} + {{ t('connection.certificate') }} @@ -228,12 +228,12 @@ - {{ t('word.caCertificate') }} + {{ t('connection.caCertificate') }} @@ -241,7 +241,7 @@ - {{ t('word.ciphers') }} + {{ t('connection.ciphers') }} - {{ t('message.untrustedConnection') }} + {{ t('connection.untrustedConnection') }} @@ -270,7 +270,7 @@ - {{ t('message.enableSsh') }} + {{ t('connection.enableSsh') }} @@ -283,7 +283,7 @@ - {{ t('word.hostName') }}/IP + {{ t('connection.hostName') }}/IP - {{ t('word.user') }} + {{ t('connection.user') }} - {{ t('word.password') }} + {{ t('connection.password') }} - {{ t('word.port') }} + {{ t('connection.port') }} - {{ t('word.privateKey') }} + {{ t('connection.privateKey') }} @@ -346,7 +346,7 @@ - {{ t('word.passphrase') }} + {{ t('connection.passphrase') }} - {{ t('message.testConnection') }} + {{ t('connection.testConnection') }} - {{ t('word.save') }} + {{ t('general.save') }} @@ -484,7 +484,7 @@ const startTest = async () => { if (res.status === 'error') addNotification({ status: 'error', message: res.response.message || res.response.toString() }); else - addNotification({ status: 'success', message: t('message.connectionSuccessfullyMade') }); + addNotification({ status: 'success', message: t('connection.connectionSuccessfullyMade') }); } catch (err) { addNotification({ status: 'error', message: err.stack }); @@ -508,7 +508,7 @@ const continueTest = async (credentials: { user: string; password: string }) => if (res.status === 'error') addNotification({ status: 'error', message: res.response.message || res.response.toString() }); else - addNotification({ status: 'success', message: t('message.connectionSuccessfullyMade') }); + addNotification({ status: 'success', message: t('connection.connectionSuccessfullyMade') }); } } catch (err) { diff --git a/src/renderer/components/WorkspaceEditConnectionPanel.vue b/src/renderer/components/WorkspaceEditConnectionPanel.vue index 1943f104..aecad339 100644 --- a/src/renderer/components/WorkspaceEditConnectionPanel.vue +++ b/src/renderer/components/WorkspaceEditConnectionPanel.vue @@ -8,7 +8,7 @@ :class="{'active': selectedTab === 'general'}" @click="selectTab('general')" > - {{ t('word.general') }} + {{ t('application.general') }} - {{ t('word.ssl') }} + {{ t('connection.ssl') }} - {{ t('word.sshTunnel') }} + {{ t('connection.sshTunnel') }} @@ -34,7 +34,7 @@ - {{ t('word.connectionName') }} + {{ t('connection.connectionName') }} - {{ t('word.client') }} + {{ t('connection.client') }} - {{ t('word.connectionString') }} + {{ t('connection.connectionString') }} - {{ t('word.hostName') }}/IP + {{ t('connection.hostName') }}/IP - {{ t('word.database') }} + {{ t('database.database') }} @@ -101,7 +101,7 @@ - {{ t('word.port') }} + {{ t('connection.port') }} - {{ t('word.database') }} + {{ t('database.database') }} - {{ t('word.user') }} + {{ t('connection.user') }} - {{ t('word.password') }} + {{ t('connection.password') }} - {{ t('word.schema') }} + {{ t('database.schema') }} @@ -169,7 +169,7 @@ - {{ t('message.readOnlyMode') }} + {{ t('connection.readOnlyMode') }} @@ -177,7 +177,7 @@ - {{ t('message.askCredentials') }} + {{ t('connection.askCredentials') }} @@ -191,7 +191,7 @@ - {{ t('message.enableSsl') }} + {{ t('connection.enableSsl') }} @@ -204,12 +204,12 @@ - {{ t('word.privateKey') }} + {{ t('connection.privateKey') }} @@ -217,12 +217,12 @@ - {{ t('word.certificate') }} + {{ t('connection.certificate') }} @@ -230,12 +230,12 @@ - {{ t('word.caCertificate') }} + {{ t('connection.caCertificate') }} @@ -243,7 +243,7 @@ - {{ t('word.ciphers') }} + {{ t('connection.ciphers') }} - {{ t('message.untrustedConnection') }} + {{ t('connection.untrustedConnection') }} @@ -272,7 +272,7 @@ - {{ t('message.enableSsh') }} + {{ t('connection.enableSsh') }} @@ -285,7 +285,7 @@ - {{ t('word.hostName') }}/IP + {{ t('connection.hostName') }}/IP - {{ t('word.user') }} + {{ t('connection.user') }} - {{ t('word.password') }} + {{ t('connection.password') }} - {{ t('word.port') }} + {{ t('connection.port') }} - {{ t('word.privateKey') }} + {{ t('connection.privateKey') }} @@ -348,7 +348,7 @@ - {{ t('word.passphrase') }} + {{ t('connection.passphrase') }} - {{ t('message.testConnection') }} + {{ t('connection.testConnection') }} - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.connect') }} + {{ t('connection.connect') }} @@ -479,7 +479,7 @@ const startTest = async () => { if (res.status === 'error') addNotification({ status: 'error', message: res.response.message || res.response.toString() }); else - addNotification({ status: 'success', message: t('message.connectionSuccessfullyMade') }); + addNotification({ status: 'success', message: t('connection.connectionSuccessfullyMade') }); } catch (err) { addNotification({ status: 'error', message: err.stack }); @@ -503,7 +503,7 @@ const continueTest = async (credentials: {user: string; password: string }) => { if (res.status === 'error') addNotification({ status: 'error', message: res.response.message || res.response.toString() }); else - addNotification({ status: 'success', message: t('message.connectionSuccessfullyMade') }); + addNotification({ status: 'success', message: t('connection.connectionSuccessfullyMade') }); } } catch (err) { diff --git a/src/renderer/components/WorkspaceEmptyState.vue b/src/renderer/components/WorkspaceEmptyState.vue index f2bb0abb..f5068768 100644 --- a/src/renderer/components/WorkspaceEmptyState.vue +++ b/src/renderer/components/WorkspaceEmptyState.vue @@ -4,12 +4,12 @@ - {{ t('message.noOpenTabs') }} + {{ t('application.noOpenTabs') }} - {{ t('message.openNewTab') }} + {{ t('application.openNewTab') }} diff --git a/src/renderer/components/WorkspaceExploreBar.vue b/src/renderer/components/WorkspaceExploreBar.vue index bbb45328..89694ae9 100644 --- a/src/renderer/components/WorkspaceExploreBar.vue +++ b/src/renderer/components/WorkspaceExploreBar.vue @@ -13,7 +13,7 @@ @@ -46,7 +46,7 @@ @@ -56,7 +56,7 @@ v-model="searchTerm" class="form-input input-sm" type="text" - :placeholder="searchMethod === 'elements' ? t('message.searchForElements') : t('message.searchForSchemas')" + :placeholder="searchMethod === 'elements' ? t('database.searchForElements') : t('database.searchForSchemas')" > - {{ t('word.run') }} + {{ t('general.run') }} - {{ t('word.enable') }} + {{ t('general.enable') }} - {{ t('word.disable') }} + {{ t('general.disable') }} - {{ t('word.enable') }} + {{ t('general.enable') }} - {{ t('word.disable') }} + {{ t('general.disable') }} - {{ t('word.delete') }} + {{ t('general.delete') }} - {{ t('message.deleteConfirm') }} "{{ selectedMisc.name }}"? + {{ t('general.deleteConfirm') }} "{{ selectedMisc.name }}"? @@ -117,14 +117,14 @@ const customizations = computed(() => { const deleteMessage = computed(() => { switch (props.selectedMisc.type) { case 'trigger': - return t('message.deleteTrigger'); + return t('database.deleteTrigger'); case 'procedure': - return t('message.deleteRoutine'); + return t('database.deleteRoutine'); case 'function': case 'triggerFunction': - return t('message.deleteFunction'); + return t('database.deleteFunction'); case 'scheduler': - return t('message.deleteScheduler'); + return t('database.deleteScheduler'); default: return ''; } diff --git a/src/renderer/components/WorkspaceExploreBarMiscFolderContext.vue b/src/renderer/components/WorkspaceExploreBarMiscFolderContext.vue index 723cefd4..10b0ff08 100644 --- a/src/renderer/components/WorkspaceExploreBarMiscFolderContext.vue +++ b/src/renderer/components/WorkspaceExploreBarMiscFolderContext.vue @@ -8,35 +8,35 @@ class="context-element" @click="emit('open-create-trigger-tab')" > - {{ t('message.createNewTrigger') }} + {{ t('database.createNewTrigger') }} - {{ t('message.createNewRoutine') }} + {{ t('database.createNewRoutine') }} - {{ t('message.createNewFunction') }} + {{ t('database.createNewFunction') }} - {{ t('message.createNewFunction') }} + {{ t('database.createNewFunction') }} - {{ t('message.createNewScheduler') }} + {{ t('database.createNewScheduler') }} diff --git a/src/renderer/components/WorkspaceExploreBarSchema.vue b/src/renderer/components/WorkspaceExploreBarSchema.vue index 2aae47fd..33af515d 100644 --- a/src/renderer/components/WorkspaceExploreBarSchema.vue +++ b/src/renderer/components/WorkspaceExploreBarSchema.vue @@ -60,7 +60,7 @@ @contextmenu.prevent="showMiscFolderContext($event, 'trigger')" > - {{ t('word.trigger', 2) }} + {{ t('database.trigger', 2) }} @@ -82,7 +82,7 @@ @@ -101,7 +101,7 @@ @contextmenu.prevent="showMiscFolderContext($event, 'routine')" > - {{ t('word.storedRoutine', 2) }} + {{ t('database.storedRoutine', 2) }} @@ -134,7 +134,7 @@ @contextmenu.prevent="showMiscFolderContext($event, 'triggerFunction')" > - {{ t('word.triggerFunction', 2) }} + {{ t('database.triggerFunction', 2) }} @@ -167,7 +167,7 @@ @contextmenu.prevent="showMiscFolderContext($event, 'function')" > - {{ t('word.function', 2) }} + {{ t('database.function', 2) }} @@ -200,7 +200,7 @@ @contextmenu.prevent="showMiscFolderContext($event, 'scheduler')" > - {{ t('word.scheduler', 2) }} + {{ t('database.scheduler', 2) }} @@ -222,7 +222,7 @@ diff --git a/src/renderer/components/WorkspaceExploreBarSchemaContext.vue b/src/renderer/components/WorkspaceExploreBarSchemaContext.vue index e2624ebb..ed80cdb8 100644 --- a/src/renderer/components/WorkspaceExploreBarSchemaContext.vue +++ b/src/renderer/components/WorkspaceExploreBarSchemaContext.vue @@ -4,7 +4,7 @@ @close-context="closeContext" > - {{ t('word.add') }} + {{ t('general.add') }} - {{ t('word.table') }} + {{ t('database.table') }} - {{ t('word.view') }} + {{ t('database.view') }} - {{ t('word.trigger', 1) }} + {{ t('database.trigger', 1) }} - {{ t('word.storedRoutine', 1) }} + {{ t('database.storedRoutine', 1) }} - {{ t('word.function', 1) }} + {{ t('database.function', 1) }} - {{ t('word.triggerFunction', 1) }} + {{ t('database.triggerFunction', 1) }} - {{ t('word.scheduler', 1) }} + {{ t('database.scheduler', 1) }} @@ -63,28 +63,28 @@ class="context-element" @click="showExportSchemaModal" > - {{ t('word.export') }} + {{ t('database.export') }} - {{ t('word.import') }} + {{ t('database.import') }} - {{ t('word.edit') }} + {{ t('database.editSchema') }} - {{ t('word.delete') }} + {{ t('database.deleteSchema') }} - {{ t('message.deleteSchema') }} + {{ t('database.deleteSchema') }} - {{ t('message.deleteConfirm') }} "{{ selectedSchema }}"? + {{ t('general.deleteConfirm') }} "{{ selectedSchema }}"? @@ -109,11 +109,6 @@ :selected-schema="selectedSchema" @close="hideEditModal" /> - void}> = ref(null); const isDeleteModal = ref(false); const isEditModal = ref(false); -const isExportSchemaModal = ref(false); const isImportSchemaModal = ref(false); const workspace = computed(() => getWorkspace(selectedWorkspace.value)); @@ -220,11 +216,7 @@ const hideEditModal = () => { }; const showExportSchemaModal = () => { - isExportSchemaModal.value = true; -}; - -const hideExportSchemaModal = () => { - isExportSchemaModal.value = false; + showExportModal(props.selectedSchema); closeContext(); }; diff --git a/src/renderer/components/WorkspaceExploreBarTableContext.vue b/src/renderer/components/WorkspaceExploreBarTableContext.vue index b48dacb7..8abc97f9 100644 --- a/src/renderer/components/WorkspaceExploreBarTableContext.vue +++ b/src/renderer/components/WorkspaceExploreBarTableContext.vue @@ -8,31 +8,38 @@ class="context-element" @click="openTableSettingTab" > - {{ t('word.settings') }} + {{ t('application.settings') }} + + + {{ t('database.exportTable') }} - {{ t('word.settings') }} + {{ t('application.settings') }} - {{ t('message.duplicateTable') }} + {{ t('database.duplicateTable') }} - {{ t('message.emptyTable') }} + {{ t('database.emptyTable') }} - {{ t('word.delete') }} + {{ t('database.deleteTable') }} - {{ t('message.emptyTable') }} + {{ t('database.emptyTable') }} - {{ t('message.emptyConfirm') }} "{{ selectedTable.name }}"? + {{ t('database.emptyConfirm') }} "{{ selectedTable.name }}"? - {{ t('message.disableFKChecks') }} + {{ t('database.disableFKChecks') }} @@ -64,12 +71,12 @@ - {{ selectedTable.type === 'table' ? t('message.deleteTable') : t('message.deleteView') }} + {{ selectedTable.type === 'table' ? t('database.deleteTable') : t('database.deleteView') }} - {{ t('message.deleteConfirm') }} "{{ selectedTable.name }}"? + {{ t('general.deleteConfirm') }} "{{ selectedTable.name }}"? @@ -81,6 +88,7 @@ import { computed, ref } from 'vue'; import { storeToRefs } from 'pinia'; import { useNotificationsStore } from '@/stores/notifications'; import { useWorkspacesStore } from '@/stores/workspaces'; +import { useSchemaExportStore } from '@/stores/schemaExport'; import BaseContextMenu from '@/components/BaseContextMenu.vue'; import ConfirmModal from '@/components/BaseConfirmModal.vue'; import Tables from '@/ipc-api/Tables'; @@ -98,6 +106,7 @@ const emit = defineEmits(['close-context', 'duplicate-table', 'reload', 'delete- const { addNotification } = useNotificationsStore(); const workspacesStore = useWorkspacesStore(); +const { showExportModal } = useSchemaExportStore(); const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore); @@ -116,6 +125,11 @@ const forceTruncate = ref(false); const workspace = computed(() => getWorkspace(selectedWorkspace.value)); const customizations = computed(() => workspace.value && workspace.value.customizations ? workspace.value.customizations : null); +const showTableExportModal = () => { + showExportModal(props.selectedSchema, props.selectedTable.name); + closeContext(); +}; + const showDeleteModal = () => { isDeleteModal.value = true; }; diff --git a/src/renderer/components/WorkspaceQueryConsole.vue b/src/renderer/components/WorkspaceQueryConsole.vue index 570a1ab2..2d755a10 100644 --- a/src/renderer/components/WorkspaceQueryConsole.vue +++ b/src/renderer/components/WorkspaceQueryConsole.vue @@ -13,7 +13,7 @@ :style="{height: localHeight ? localHeight+'px' : ''}" > - {{ t('word.console') }} + {{ t('application.console') }} @@ -35,7 +35,7 @@ @close-context="isContext = false" > - {{ t('word.copy') }} + {{ t('general.copy') }} diff --git a/src/renderer/components/WorkspaceTabNewFunction.vue b/src/renderer/components/WorkspaceTabNewFunction.vue index 7d300252..2dd0a290 100644 --- a/src/renderer/components/WorkspaceTabNewFunction.vue +++ b/src/renderer/components/WorkspaceTabNewFunction.vue @@ -10,27 +10,27 @@ @click="saveChanges" > - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.clear') }} + {{ t('general.clear') }} - {{ t('word.parameters') }} + {{ t('database.parameters') }} - + {{ schema }} @@ -41,7 +41,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.language') }} + {{ t('application.language') }} - {{ t('word.definer') }} + {{ t('database.definer') }} - {{ t('word.returns') }} + {{ t('database.returns') }} @@ -108,7 +108,7 @@ - {{ t('word.comment') }} + {{ t('database.comment') }} - {{ t('message.sqlSecurity') }} + {{ t('database.sqlSecurity') }} - {{ t('message.dataAccess') }} + {{ t('database.dataAccess') }} . - {{ t('word.deterministic') }} + {{ t('database.deterministic') }} @@ -153,7 +153,7 @@ - {{ t('message.functionBody') }} + {{ t('database.functionBody') }} - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.clear') }} + {{ t('general.clear') }} - {{ t('word.parameters') }} + {{ t('database.parameters') }} - + {{ schema }} @@ -41,7 +41,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.language') }} + {{ t('application.language') }} - {{ t('word.definer') }} + {{ t('database.definer') }} - {{ t('word.comment') }} + {{ t('database.comment') }} - {{ t('message.sqlSecurity') }} + {{ t('database.sqlSecurity') }} - {{ t('message.dataAccess') }} + {{ t('database.dataAccess') }} . - {{ t('word.deterministic') }} + {{ t('database.deterministic') }} @@ -125,7 +125,7 @@ - {{ t('message.routineBody') }} + {{ t('database.routineBody') }} - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.clear') }} + {{ t('general.clear') }} - {{ t('word.timing') }} + {{ t('database.timing') }} - + {{ schema }} @@ -39,7 +39,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.definer') }} + {{ t('database.definer') }} @@ -62,7 +62,7 @@ - {{ t('word.comment') }} + {{ t('database.comment') }} - {{ t('word.state') }} + {{ t('database.state') }} - {{ t('message.schedulerBody') }} + {{ t('database.schedulerBody') }} - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.clear') }} + {{ t('general.clear') }} @@ -27,20 +27,20 @@ - {{ t('word.add') }} + {{ t('general.add') }} - {{ t('word.indexes') }} + {{ t('database.indexes') }} - {{ t('word.foreignKeys') }} + {{ t('database.foreignKeys') }} - + {{ schema }} @@ -62,7 +62,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.comment') }} + {{ t('database.comment') }} - {{ t('word.collation') }} + {{ t('database.collation') }} - {{ t('word.engine') }} + {{ t('database.engine') }} { const uid = uidGen(); localFields.value.push({ _antares_id: uid, - name: `${t('word.field', 1)}_${uid.substring(0, 4)}`, + name: `${t('database.field', 1)}_${uid.substring(0, 4)}`, key: '', // eslint-disable-next-line @typescript-eslint/no-explicit-any type: (workspace.value.dataTypes[0] as any).types[0].name, diff --git a/src/renderer/components/WorkspaceTabNewTableEmptyState.vue b/src/renderer/components/WorkspaceTabNewTableEmptyState.vue index 670b8b29..d629975d 100644 --- a/src/renderer/components/WorkspaceTabNewTableEmptyState.vue +++ b/src/renderer/components/WorkspaceTabNewTableEmptyState.vue @@ -1,12 +1,12 @@ - {{ t('message.thereAreNoTableFields') }} + {{ t('database.thereAreNoTableFields') }} - {{ t('message.addNewField') }} + {{ t('database.addNewField') }} diff --git a/src/renderer/components/WorkspaceTabNewTrigger.vue b/src/renderer/components/WorkspaceTabNewTrigger.vue index 3d7c4d85..f1e9038e 100644 --- a/src/renderer/components/WorkspaceTabNewTrigger.vue +++ b/src/renderer/components/WorkspaceTabNewTrigger.vue @@ -10,20 +10,20 @@ @click="saveChanges" > - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.clear') }} + {{ t('general.clear') }} - + {{ schema }} @@ -33,7 +33,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.definer') }} + {{ t('database.definer') }} @@ -57,7 +57,7 @@ - {{ t('word.table') }} + {{ t('database.table') }} - {{ t('word.event') }} + {{ t('database.event') }} - {{ t('message.triggerStatement') }} + {{ t('database.triggerStatement') }} - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.clear') }} + {{ t('general.clear') }} @@ -29,7 +29,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.language') }} + {{ t('application.language') }} - {{ t('word.definer') }} + {{ t('database.definer') }} @@ -67,7 +67,7 @@ - {{ t('word.comment') }} + {{ t('database.comment') }} - {{ t('message.functionBody') }} + {{ t('database.functionBody') }} - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.clear') }} + {{ t('general.clear') }} - + {{ schema }} @@ -33,7 +33,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.definer') }} + {{ t('database.definer') }} @@ -56,7 +56,7 @@ - {{ t('message.sqlSecurity') }} + {{ t('database.sqlSecurity') }} - {{ t('word.algorithm') }} + {{ t('database.algorithm') }} - {{ t('message.updateOption') }} + {{ t('database.updateOption') }} - {{ t('message.selectStatement') }} + {{ t('database.selectStatement') }} - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.clear') }} + {{ t('general.clear') }} @@ -30,15 +30,15 @@ @click="runFunctionCheck" > - {{ t('word.run') }} + {{ t('general.run') }} - {{ t('word.parameters') }} + {{ t('database.parameters') }} - + {{ schema }} @@ -49,7 +49,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.language') }} + {{ t('application.language') }} - {{ t('word.definer') }} + {{ t('database.definer') }} - {{ t('word.returns') }} + {{ t('database.returns') }} @@ -117,7 +117,7 @@ - {{ t('word.comment') }} + {{ t('database.comment') }} - {{ t('message.sqlSecurity') }} + {{ t('database.sqlSecurity') }} - {{ t('message.dataAccess') }} + {{ t('database.dataAccess') }} . - {{ t('word.deterministic') }} + {{ t('database.deterministic') }} @@ -162,7 +162,7 @@ - {{ t('message.functionBody') }} + {{ t('database.functionBody') }} - {{ t('word.parameters') }} "{{ func }}" + {{ t('database.parameters') }} "{{ func }}" @@ -20,16 +20,16 @@ - {{ t('word.add') }} + {{ t('general.add') }} - {{ t('word.clear') }} + {{ t('general.clear') }} @@ -55,7 +55,7 @@ @@ -74,7 +74,7 @@ > - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.type') }} + {{ t('database.type') }} - {{ t('word.length') }} + {{ t('database.length') }} - {{ t('word.context') }} + {{ t('database.context') }} @@ -150,11 +150,11 @@ - {{ t('message.thereAreNoParameters') }} + {{ t('database.thereAreNoParameters') }} - {{ t('message.createNewParameter') }} + {{ t('database.createNewParameter') }} diff --git a/src/renderer/components/WorkspaceTabPropsRoutine.vue b/src/renderer/components/WorkspaceTabPropsRoutine.vue index 87ad1c3b..42fbf8fc 100644 --- a/src/renderer/components/WorkspaceTabPropsRoutine.vue +++ b/src/renderer/components/WorkspaceTabPropsRoutine.vue @@ -10,16 +10,16 @@ @click="saveChanges" > - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.clear') }} + {{ t('general.clear') }} @@ -30,15 +30,15 @@ @click="runRoutineCheck" > - {{ t('word.run') }} + {{ t('general.run') }} - {{ t('word.parameters') }} + {{ t('database.parameters') }} - + {{ schema }} @@ -49,7 +49,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.language') }} + {{ t('application.language') }} - {{ t('word.definer') }} + {{ t('database.definer') }} - {{ t('word.comment') }} + {{ t('database.comment') }} - {{ t('message.sqlSecurity') }} + {{ t('database.sqlSecurity') }} - {{ t('message.dataAccess') }} + {{ t('database.dataAccess') }} . - {{ t('word.deterministic') }} + {{ t('database.deterministic') }} @@ -134,7 +134,7 @@ - {{ t('message.routineBody') }} + {{ t('database.routineBody') }} - {{ t('word.parameters') }} "{{ routine }}" + {{ t('database.parameters') }} "{{ routine }}" @@ -20,16 +20,16 @@ - {{ t('word.add') }} + {{ t('general.add') }} - {{ t('word.clear') }} + {{ t('general.clear') }} @@ -55,7 +55,7 @@ @@ -74,7 +74,7 @@ > - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.type') }} + {{ t('database.type') }} - {{ t('word.length') }} + {{ t('database.length') }} - {{ t('word.context') }} + {{ t('database.context') }} - {{ t('message.thereAreNoParameters') }} + {{ t('database.thereAreNoParameters') }} - {{ t('message.createNewParameter') }} + {{ t('database.createNewParameter') }} diff --git a/src/renderer/components/WorkspaceTabPropsScheduler.vue b/src/renderer/components/WorkspaceTabPropsScheduler.vue index c390fbb1..98f46379 100644 --- a/src/renderer/components/WorkspaceTabPropsScheduler.vue +++ b/src/renderer/components/WorkspaceTabPropsScheduler.vue @@ -10,26 +10,26 @@ @click="saveChanges" > - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.clear') }} + {{ t('general.clear') }} - {{ t('word.timing') }} + {{ t('database.timing') }} - + {{ schema }} @@ -39,7 +39,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.definer') }} + {{ t('database.definer') }} @@ -61,7 +61,7 @@ - {{ t('word.comment') }} + {{ t('database.comment') }} - {{ t('word.state') }} + {{ t('database.state') }} - {{ t('message.schedulerBody') }} + {{ t('database.schedulerBody') }} - {{ t('word.timing') }} "{{ localOptions.name }}" + {{ t('database.timing') }} "{{ localOptions.name }}" - {{ t('word.execution') }} + {{ t('database.execution') }} - {{ t('word.starts') }} + {{ t('database.starts') }} @@ -83,7 +83,7 @@ - {{ t('word.ends') }} + {{ t('database.ends') }} @@ -125,7 +125,7 @@ - {{ t('message.preserveOnCompletion') }} + {{ t('database.preserveOnCompletion') }} diff --git a/src/renderer/components/WorkspaceTabPropsTable.vue b/src/renderer/components/WorkspaceTabPropsTable.vue index b13a1f07..f58c7899 100644 --- a/src/renderer/components/WorkspaceTabPropsTable.vue +++ b/src/renderer/components/WorkspaceTabPropsTable.vue @@ -10,16 +10,16 @@ @click="saveChanges" > - {{ t('word.save') }} + {{ t('general.save') }} - {{ t('word.clear') }} + {{ t('general.clear') }} @@ -27,20 +27,20 @@ - {{ t('word.add') }} + {{ t('general.add') }} - {{ t('word.indexes') }} + {{ t('database.indexes') }} - {{ t('word.foreignKeys') }} + {{ t('database.foreignKeys') }} @@ -60,11 +60,11 @@ @click="showDdlModal" > - {{ t('word.ddl') }} + {{ t('database.ddl') }} - + {{ schema }} @@ -74,7 +74,7 @@ - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.comment') }} + {{ t('database.comment') }} - {{ t('word.autoIncrement') }} + {{ t('database.autoIncrement') }} - {{ t('word.collation') }} + {{ t('database.collation') }} - {{ t('word.engine') }} + {{ t('database.engine') }} { const uid = uidGen(); localFields.value.push({ _antares_id: uid, - name: `${t('word.field', 1)}_${uid.substring(0, 4)}`, + name: `${t('database.field', 1)}_${uid.substring(0, 4)}`, key: '', // eslint-disable-next-line @typescript-eslint/no-explicit-any type: (workspace.value.dataTypes[0] as any).types[0].name, diff --git a/src/renderer/components/WorkspaceTabPropsTableContext.vue b/src/renderer/components/WorkspaceTabPropsTableContext.vue index d66bee41..4f2515f7 100644 --- a/src/renderer/components/WorkspaceTabPropsTableContext.vue +++ b/src/renderer/components/WorkspaceTabPropsTableContext.vue @@ -4,7 +4,7 @@ @close-context="closeContext" > - {{ t('message.createNewIndex') }} + {{ t('database.createNewIndex') }} - {{ t('message.addToIndex') }} + {{ t('database.addToIndex') }} - {{ t('word.duplicate') }} + {{ t('general.duplicate') }} - {{ t('message.deleteField') }} + {{ t('database.deleteField') }} diff --git a/src/renderer/components/WorkspaceTabPropsTableDdlModal.vue b/src/renderer/components/WorkspaceTabPropsTableDdlModal.vue index 973f244a..94884c3f 100644 --- a/src/renderer/components/WorkspaceTabPropsTableDdlModal.vue +++ b/src/renderer/components/WorkspaceTabPropsTableDdlModal.vue @@ -1,16 +1,16 @@ - {{ t('word.ddl') }} "{{ table }}" + {{ t('database.ddl') }} "{{ table }}" diff --git a/src/renderer/components/WorkspaceTabPropsTableFields.vue b/src/renderer/components/WorkspaceTabPropsTableFields.vue index 9f564f60..555d47d1 100644 --- a/src/renderer/components/WorkspaceTabPropsTableFields.vue +++ b/src/renderer/components/WorkspaceTabPropsTableFields.vue @@ -21,81 +21,81 @@ - {{ t('word.order') }} + {{ t('database.order') }} - {{ t('word.key', 2) }} + {{ t('database.key', 2) }} - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.type') }} + {{ t('database.type') }} - {{ t('word.array') }} + {{ t('database.array') }} - {{ t('word.length') }} + {{ t('database.length') }} - {{ t('word.unsigned') }} + {{ t('database.unsigned') }} - {{ t('message.allowNull') }} + {{ t('database.allowNull') }} - {{ t('message.zeroFill') }} + {{ t('database.zeroFill') }} - {{ t('word.default') }} + {{ t('database.default') }} - {{ t('word.comment') }} + {{ t('database.comment') }} - {{ t('word.collation') }} + {{ t('database.collation') }} diff --git a/src/renderer/components/WorkspaceTabPropsTableForeignModal.vue b/src/renderer/components/WorkspaceTabPropsTableForeignModal.vue index 5232d11f..bc8620cd 100644 --- a/src/renderer/components/WorkspaceTabPropsTableForeignModal.vue +++ b/src/renderer/components/WorkspaceTabPropsTableForeignModal.vue @@ -1,6 +1,6 @@ - {{ t('word.foreignKeys') }} "{{ table }}" + {{ t('database.foreignKeys') }} "{{ table }}" @@ -20,16 +20,16 @@ - {{ t('word.add') }} + {{ t('general.add') }} - {{ t('word.clear') }} + {{ t('general.clear') }} @@ -67,7 +67,7 @@ @@ -86,7 +86,7 @@ > - {{ t('word.name') }} + {{ t('general.name') }} - {{ t('word.field', 1) }} + {{ t('database.field', 1) }} - {{ t('message.referenceTable') }} + {{ t('database.referenceTable') }} - {{ t('message.referenceField') }} + {{ t('database.referenceField') }}
- {{ t('word.version') }} {{ appVersion }} + {{ t('general.version') }} {{ appVersion }} GitHub • Twitter • Website - {{ t('word.author') }} {{ appAuthor }} + {{ t('general.author') }} {{ appAuthor }}
- {{ t('message.noOpenTabs') }} + {{ t('application.noOpenTabs') }}
- {{ t('message.thereAreNoTableFields') }} + {{ t('database.thereAreNoTableFields') }}
- {{ t('message.thereAreNoParameters') }} + {{ t('database.thereAreNoParameters') }}