1
1
mirror of https://github.com/Fabio286/antares.git synced 2025-06-05 21:59:22 +02:00

Compare commits

..

80 Commits

Author SHA1 Message Date
3a77f0818d chore(release): 0.7.16-beta.0 2023-08-11 16:50:20 +02:00
6cd2f89bbf refactor: ts improvements 2023-08-11 16:42:34 +02:00
16ec82eb7e Merge branch 'develop' of https://github.com/antares-sql/antares into beta 2023-08-11 16:30:16 +02:00
84b2255bf4 feat: ability to export a table dump from table context menu 2023-08-11 11:49:49 +02:00
2e39d810b5 feat: ability to change sql dump file name 2023-08-11 09:52:25 +02:00
56918d89c7 Merge branch 'master' of https://github.com/antares-sql/antares into develop 2023-08-09 18:45:05 +02:00
083198af8f chore: update README.md 2023-08-09 18:44:31 +02:00
ad7e459c68 feat: support to links in changelog 2023-08-08 18:05:27 +02:00
8c4c93cb07 chore(translation): add translation helper script 2023-08-04 12:28:03 +02:00
eee85d24b7 ci: update snapcraft.yml 2023-08-03 18:36:27 +02:00
92fe029906 refactor: minor translation improvements 2023-08-03 18:36:09 +02:00
1dd2147b68 refactor(translation): complete refactor of translations structure 2023-08-03 18:28:50 +02:00
5a54e7ac33 Merge branch 'master' of https://github.com/antares-sql/antares into beta 2023-08-02 09:21:24 +02:00
c19bac2373 Merge branch 'master' of https://github.com/antares-sql/antares into develop 2023-08-02 09:20:29 +02:00
7b1cb4ff86 fix(MySQL): missing error details on mysql importer with some exceptione 2023-08-01 10:04:00 +02:00
f120af25f4 build(deps): update mysql2 2023-08-01 10:02:35 +02:00
83b3ca563a chore(release): 0.7.15 2023-07-31 13:04:53 +02:00
0fab3bc43c ci: arrangements for beta channel 2023-07-31 13:04:30 +02:00
473c4636cf ci: arrangements for beta channel 2023-07-31 10:55:05 +02:00
2e11a0c032 chore: update dependabot branch target 2023-07-26 17:57:14 +02:00
193042b92d chore: update dependabot branch target 2023-07-26 17:42:16 +02:00
51b14195a8 fix(MySQL): error insertinf new fields with some MySQL configurations, fixes #360 2023-07-24 09:09:11 +02:00
f831fcd442 fix: display content of BLOB fields if not binary, fixes #628 2023-07-21 18:17:31 +02:00
3104847b92 Merge pull request #630 from SmileYzn/master
Update pt-BR.ts 🇧🇷
2023-07-21 08:44:11 +02:00
Cleverson
bc0b029369 Update pt-BR.ts 2023-07-20 16:55:23 -03:00
efee7f3a0e Merge branch 'master' of https://github.com/antares-sql/antares 2023-07-17 18:00:43 +02:00
7c820b1827 fix(MySQL): unable to set more than one value in SET fields 2023-07-17 18:00:40 +02:00
38ec703705 Merge pull request #625 from antares-sql/all-contributors/add-zxp19821005
docs: add zxp19821005 as a contributor for platform
2023-07-17 09:34:48 +02:00
allcontributors[bot]
2afb66a2e6 docs: update .all-contributorsrc [skip ci] 2023-07-17 07:34:13 +00:00
allcontributors[bot]
5a5af3af5e docs: update README.md [skip ci] 2023-07-17 07:34:12 +00:00
8f0e5407ae Merge branch 'master' of https://github.com/antares-sql/antares 2023-07-16 11:33:30 +02:00
8bed7c2f34 chore: update README.md AUR link 2023-07-16 11:33:28 +02:00
f4a2f43ea4 Merge pull request #621 from brdtheo/i18n-french-translation
chore(i18n): update french translation
2023-07-16 11:16:41 +02:00
Théo Billardey
6063b3f697 chore(i18n): update french translation 2023-07-15 21:57:18 +02:00
2f5fa0f2e4 feat: export file name with hour, minutes and seconds, closes #610 2023-07-12 15:20:44 +02:00
703a515462 chore(release): 0.7.14 2023-07-07 15:22:53 +02:00
9d8e9a5e1f perf(PostgreSQL): minor improvement to schema selection 2023-07-07 15:22:16 +02:00
1c73503138 fix: unable to insert new rows 2023-07-07 15:21:48 +02:00
32bbc45329 feat: button to open view settings tab 2023-07-07 09:04:40 +02:00
9d90dc362e chore(release): 0.7.13 2023-07-06 22:02:55 +02:00
e808b86c52 fix(PostgreSQL): unable to connect to database, fixes #614 2023-07-06 22:01:41 +02:00
6e01f0f2e7 fix: unable to copy as sql inserts with BIT fileds, fixes #613 2023-07-06 12:06:32 +02:00
38bfea279c feat: button to open table settings tab, closes #608 2023-07-05 18:27:30 +02:00
0044522390 Merge pull request #611 from 64knl/feat/update-connection-icons
feat: update connection icons
2023-07-05 17:42:49 +02:00
Rene
462ede8dc7 feat: update connection
icons to better match other icons
2023-07-05 15:50:17 +02:00
60dd4df5ec chore(release): 0.7.12 2023-07-03 09:04:25 +02:00
fa006798cf Merge pull request #602 from antares-sql/all-contributors/add-64knl
docs: add 64knl as a contributor for translation
2023-06-30 08:07:37 +02:00
c5abc3d6b2 Merge pull request #599 from 64knl/feat/locale-dutch
feat: Add Dutch translation
2023-06-30 08:07:15 +02:00
allcontributors[bot]
a8dc30c9dd docs: update .all-contributorsrc [skip ci] 2023-06-30 06:07:02 +00:00
allcontributors[bot]
2cfed3e79b docs: update README.md [skip ci] 2023-06-30 06:07:01 +00:00
Rene
001983c5a2 fix: update source string to fix spelling 2023-06-24 17:13:12 +02:00
470f7455c0 Merge pull request #598 from antares-sql/all-contributors/add-64knl
docs: add 64knl as a contributor for code
2023-06-24 13:18:21 +02:00
allcontributors[bot]
70e00a7ee6 docs: update .all-contributorsrc [skip ci] 2023-06-24 11:18:08 +00:00
allcontributors[bot]
b76247e304 docs: update README.md [skip ci] 2023-06-24 11:18:07 +00:00
f58c30ff17 Merge pull request #597 from 64knl/feat/sort-available-languages
feat: Sort available languages
2023-06-24 13:16:46 +02:00
5bdbebfbc3 Merge pull request #596 from 64knl/fix/spelling-appearance
fix: spelling corrections
2023-06-24 13:16:27 +02:00
Rene
03c4a1c797 wip: more translations 2023-06-22 19:06:02 +02:00
Rene
e18604b3ce wip: translation 2023-06-22 18:59:23 +02:00
Rene
3ff8d2571b feat: Sort available languages alphabetically 2023-06-22 18:27:41 +02:00
Rene
f22f8d2317 wip: translation 2023-06-22 18:22:44 +02:00
Rene
8a4a099e37 fix: rename components and variables in SettingBarContext 2023-06-22 18:18:13 +02:00
Rene
702ffb81ef style: formatting 2023-06-22 17:40:23 +02:00
Rene
93e16fdda2 fix: spelling corrections
- Updated appearence -> appearance across files
- Fixed some English spelling mistakes
2023-06-22 17:36:53 +02:00
Rene
575c8ea8ca feat: more translations 2023-06-22 15:06:53 +02:00
Rene
4ff1d107b8 feat: add Dutch language support 2023-06-22 14:43:15 +02:00
3ad1e51f42 feat: format options of csv export, closes #196 2023-06-14 19:47:09 +02:00
e07e7b736e fix(PostgreSQL): unable to export as sql inserts 2023-06-14 09:38:54 +02:00
89815bf5e7 feat(PostgreSQL): ability to switch the database, closes #432 2023-06-13 18:10:52 +02:00
9d00f58998 chore: update README.md 2023-06-12 21:44:06 +02:00
f5d001846a Merge pull request #554 from antares-sql/dependabot/npm_and_yarn/sql-formatter-12.2.0
build(deps): bump sql-formatter from 12.0.3 to 12.2.0
2023-06-12 15:07:19 +02:00
0a6907b549 Merge branch 'master' into dependabot/npm_and_yarn/sql-formatter-12.2.0 2023-06-12 15:01:48 +02:00
322f92b734 Merge pull request #591 from m1khal3v/patch-3
Update ru-RU.ts
2023-06-07 03:57:34 +02:00
Anton Mikhalev
038e4494f5 Update ru-RU.ts 2023-06-06 23:41:22 +03:00
56b71ec0d1 chore(release): 0.7.11 2023-06-04 10:43:42 +02:00
787014c38d feat: context menu to close tabs, closes #392 2023-06-03 19:13:20 +02:00
e60726c741 fix: disable filter during table content loading, fixes #588 2023-06-01 18:00:16 +02:00
904670781d fix(MySQL): unable to get users list with some db settings 2023-06-01 11:47:31 +02:00
22bdaac18b fix: weird behavior in some text editors 2023-06-01 11:42:19 +02:00
446199827b fix: unique keys not recognized in table settings on some MariaDB versions 2023-05-30 18:33:37 +02:00
dependabot[bot]
12f3e03b45 build(deps): bump sql-formatter from 12.0.3 to 12.2.0
Bumps [sql-formatter](https://github.com/sql-formatter-org/sql-formatter) from 12.0.3 to 12.2.0.
- [Release notes](https://github.com/sql-formatter-org/sql-formatter/releases)
- [Changelog](https://github.com/sql-formatter-org/sql-formatter/blob/master/.release-it.json)
- [Commits](https://github.com/sql-formatter-org/sql-formatter/compare/v12.0.3...v12.2.0)

---
updated-dependencies:
- dependency-name: sql-formatter
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 20:01:44 +00:00
116 changed files with 5726 additions and 12955 deletions

View File

@@ -220,8 +220,28 @@
"contributions": [ "contributions": [
"translation" "translation"
] ]
},
{
"login": "64knl",
"name": "René",
"avatar_url": "https://avatars.githubusercontent.com/u/3864423?v=4",
"profile": "https://64k.nl/",
"contributions": [
"code",
"translation"
]
},
{
"login": "zxp19821005",
"name": "Woodenman",
"avatar_url": "https://avatars.githubusercontent.com/u/4915850?v=4",
"profile": "https://github.com/zxp19821005",
"contributions": [
"platform"
]
} }
], ],
"contributorsPerLine": 7, "contributorsPerLine": 7,
"skipCi": true "skipCi": true,
"commitType": "docs"
} }

View File

@@ -11,3 +11,4 @@ updates:
directory: "/" directory: "/"
schedule: schedule:
interval: "monthly" interval: "monthly"
target-branch: "develop"

42
.github/workflows/build-beta.yml vendored Normal file
View File

@@ -0,0 +1,42 @@
name: Build & release [BETA]
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+-beta.[0-9]+'
env:
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
jobs:
release:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-11, ubuntu-latest, windows-latest]
steps:
- name: Check out Git repository
uses: actions/checkout@v3
with:
ref: beta
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: npm i
- name: "Build"
run: npm run build
- name: Release
uses: ncipollo/release-action@v1
with:
artifacts: "build/*.AppImage,build/*.yml,build/*.deb,build/*.dmg,build/*.blockmap,build/*.zip,build/*.exe"
allowUpdates: true
draft: true
generateReleaseNotes: true

View File

@@ -1,9 +1,12 @@
name: Build & release name: Build & release [STABLE]
on: on:
push: push:
tags: tags:
- "v*" - 'v[0-9]+.[0-9]+.[0-9]+'
env:
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
jobs: jobs:
release: release:
@@ -11,11 +14,19 @@ jobs:
strategy: strategy:
matrix: matrix:
os: [macos-11, ubuntu-20.04, windows-latest] os: [macos-11, ubuntu-latest, windows-latest]
steps: steps:
- name: Exit if not on master branch
if: contains(env.BRANCH_NAME, 'master') == false
run: |
echo "Wrong environment ${{env.BRANCH_NAME}}"
exit 0
- name: Check out Git repository - name: Check out Git repository
uses: actions/checkout@v3 uses: actions/checkout@v3
with:
ref: master
- name: Install Node.js - name: Install Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3

View File

@@ -1,6 +1,9 @@
name: Test end-to-end [WINDOWS] name: Test end-to-end [WINDOWS]
on: push on:
push:
branches:
- master
jobs: jobs:
release: release:

View File

@@ -2,6 +2,99 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [0.7.16-beta.0](https://github.com/antares-sql/antares/compare/v0.7.15...v0.7.16-beta.0) (2023-08-11)
### Features
* ability to change sql dump file name ([2e39d81](https://github.com/antares-sql/antares/commit/2e39d810b519401d0410cbb76520c07c595329fc))
* ability to export a table dump from table context menu ([84b2255](https://github.com/antares-sql/antares/commit/84b2255bf405431070511890b2bca770fc4cc2bc))
* support to links in changelog ([ad7e459](https://github.com/antares-sql/antares/commit/ad7e459c689d70ca664b9a3091d3dcab3f26ce4d))
### Bug Fixes
* **MySQL:** missing error details on mysql importer with some exceptione ([7b1cb4f](https://github.com/antares-sql/antares/commit/7b1cb4ff86dddb5fb4b4d960b47ea17f38a24aa6))
### [0.7.15](https://github.com/antares-sql/antares/compare/v0.7.14...v0.7.15) (2023-07-31)
### Features
* export file name with hour, minutes and seconds, closes [#610](https://github.com/antares-sql/antares/issues/610) ([2f5fa0f](https://github.com/antares-sql/antares/commit/2f5fa0f2e416e88753c9dc2bf32edefba8c4e072))
### Bug Fixes
* display content of BLOB fields if not binary, fixes [#628](https://github.com/antares-sql/antares/issues/628) ([f831fcd](https://github.com/antares-sql/antares/commit/f831fcd442f16a03f0ea83ff5bf77a4a79906eb6))
* **MySQL:** error insertinf new fields with some MySQL configurations, fixes [#360](https://github.com/antares-sql/antares/issues/360) ([51b1419](https://github.com/antares-sql/antares/commit/51b14195a8a6c7e7f1b12bd4b86b7164a56b2aa5))
* **MySQL:** unable to set more than one value in SET fields ([7c820b1](https://github.com/antares-sql/antares/commit/7c820b18276e4ed5e381d91110acd032862a5be9))
### [0.7.14](https://github.com/antares-sql/antares/compare/v0.7.13...v0.7.14) (2023-07-07)
### Features
* button to open view settings tab ([32bbc45](https://github.com/antares-sql/antares/commit/32bbc453294736970ddbcadd3cc45597277f5bda))
### Bug Fixes
* unable to insert new rows ([1c73503](https://github.com/antares-sql/antares/commit/1c735031380c48aa8b08ed5ce3df80008dc72af8))
### Improvements
* **PostgreSQL:** minor improvement to schema selection ([9d8e9a5](https://github.com/antares-sql/antares/commit/9d8e9a5e1fda190ee7b3d4fd59e6178dd5ec1651))
### [0.7.13](https://github.com/antares-sql/antares/compare/v0.7.12...v0.7.13) (2023-07-06)
### Features
* button to open table settings tab, closes [#608](https://github.com/antares-sql/antares/issues/608) ([38bfea2](https://github.com/antares-sql/antares/commit/38bfea279ce93366dfd2021d0e91622a5a88878e))
* update connection ([462ede8](https://github.com/antares-sql/antares/commit/462ede8dc701aaf9c6089b3ec41eea0f31babdf9))
### Bug Fixes
* **PostgreSQL:** unable to connect to database, fixes [#614](https://github.com/antares-sql/antares/issues/614) ([e808b86](https://github.com/antares-sql/antares/commit/e808b86c52b8488e0c079a9f0ddce225338af4c0))
* unable to copy as sql inserts with BIT fileds, fixes [#613](https://github.com/antares-sql/antares/issues/613) ([6e01f0f](https://github.com/antares-sql/antares/commit/6e01f0f2e7194284341f89a44839d16398358f9b))
### [0.7.12](https://github.com/antares-sql/antares/compare/v0.7.11...v0.7.12) (2023-07-03)
### Features
* add Dutch language support ([4ff1d10](https://github.com/antares-sql/antares/commit/4ff1d107b8837887ceb3ffecaed46b9bdb908127))
* format options of csv export, closes [#196](https://github.com/antares-sql/antares/issues/196) ([3ad1e51](https://github.com/antares-sql/antares/commit/3ad1e51f42f3cc37ad66bdab64e9a8a0eadea74b))
* more translations ([575c8ea](https://github.com/antares-sql/antares/commit/575c8ea8cabc1fb315bad1693df6cd4ccd869838))
* **PostgreSQL:** ability to switch the database, closes [#432](https://github.com/antares-sql/antares/issues/432) ([89815bf](https://github.com/antares-sql/antares/commit/89815bf5e7c4062950b7418b31b45552ae0e1276))
* Sort available languages alphabetically ([3ff8d25](https://github.com/antares-sql/antares/commit/3ff8d2571be306a8a72e5ad2b9f963b285e8db26))
### Bug Fixes
* **PostgreSQL:** unable to export as sql inserts ([e07e7b7](https://github.com/antares-sql/antares/commit/e07e7b736ef29368262ec4b17d9e1f54ef3ec390))
* rename components and variables in SettingBarContext ([8a4a099](https://github.com/antares-sql/antares/commit/8a4a099e37c9bbc1365f322f6276f32153e24379))
* spelling corrections ([93e16fd](https://github.com/antares-sql/antares/commit/93e16fdda29601f3e898b1a9470bd8546ea95df6))
* update source string to fix spelling ([001983c](https://github.com/antares-sql/antares/commit/001983c5a2ebe17c943a9be3a58cc587f5cd09e3))
### [0.7.11](https://github.com/antares-sql/antares/compare/v0.7.10...v0.7.11) (2023-06-04)
### Features
* context menu to close tabs, closes [#392](https://github.com/antares-sql/antares/issues/392) ([787014c](https://github.com/antares-sql/antares/commit/787014c38df743315c04962871a3801805a93c55))
### Bug Fixes
* disable filter during table content loading, fixes [#588](https://github.com/antares-sql/antares/issues/588) ([e60726c](https://github.com/antares-sql/antares/commit/e60726c741276b7da0d54c0986d2a45ed9979bc9))
* **MySQL:** unable to get users list with some db settings ([9046707](https://github.com/antares-sql/antares/commit/904670781d47b1ac0dcfd982215ba1786f8c8145))
* unique keys not recognized in table settings on some MariaDB versions ([4461998](https://github.com/antares-sql/antares/commit/446199827be4b07382453739f42d46fa0201d04c))
* weird behavior in some text editors ([22bdaac](https://github.com/antares-sql/antares/commit/22bdaac18b1c46a57802cbbd3ad339ee075ec70b))
### [0.7.10](https://github.com/antares-sql/antares/compare/v0.7.9...v0.7.10) (2023-05-28) ### [0.7.10](https://github.com/antares-sql/antares/compare/v0.7.9...v0.7.10) (2023-05-28)

View File

@@ -7,7 +7,8 @@
# Antares SQL Client # Antares SQL Client
![GitHub package.json version](https://img.shields.io/github/package-json/v/fabio286/antares) ![GitHub](https://img.shields.io/github/license/fabio286/antares) [![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Ffabio286%2Fantares%2Fbadge&style=flat)](https://actions-badge.atrox.dev/fabio286/antares/goto) [![antares](https://snapcraft.io/antares/badge.svg)](https://snapcraft.io/antares) [![antares](https://snapcraft.io/antares/trending.svg?name=0)](https://snapcraft.io/antares) [![Twitter Follow](https://img.shields.io/twitter/follow/AntaresSQL?style=social)](https://twitter.com/AntaresSQL) [![Plant a Tree](https://raw.githubusercontent.com/Fabio286/treedom-badge/master/svg/plant-a-tree.svg)](https://www.treedom.net/en/user/fabio-di-stasio/event/antares-for-the-planet) ![GitHub package.json version](https://img.shields.io/github/package-json/v/fabio286/antares) ![GitHub](https://img.shields.io/github/license/fabio286/antares) [![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Ffabio286%2Fantares%2Fbadge&style=flat)](https://actions-badge.atrox.dev/fabio286/antares/goto) [![antares](https://snapcraft.io/antares/badge.svg)](https://snapcraft.io/antares) [![antares](https://snapcraft.io/antares/trending.svg?name=0)](https://snapcraft.io/antares)
![Mastodon Follow](https://img.shields.io/mastodon/follow/%20110860460902482117?domain=https%3A%2F%2Ffosstodon.org&style=social) [![Twitter Follow](https://img.shields.io/twitter/follow/AntaresSQL?style=social)](https://twitter.com/AntaresSQL) [![Plant a Tree](https://raw.githubusercontent.com/Fabio286/treedom-badge/master/svg/plant-a-tree.svg)](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. 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. Our target is to support as many databases as possible, and all major operating systems, including the ARM versions.
@@ -17,9 +18,12 @@ 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. 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). 🔗 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. 🌟 Don't forget to **leave a star** if you appreciate this project.
🗳️ Poll: **[Which is the main OS you use Antares on?](https://github.com/antares-sql/antares/discussions/379)**
🗳️ Polls:
- **[Which is the main OS you use Antares on?](https://github.com/antares-sql/antares/discussions/379)**
- **[Which database do you use the most?](https://github.com/antares-sql/antares/discussions/594)**
## Current key features ## Current key features
@@ -63,7 +67,7 @@ On macOS you can run `.dmg` distribution following [this guide](https://support.
## Download ## Download
[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/antares) [![Get it from AUR](https://raw.githubusercontent.com/Fabio286/antares/3e00c4bae6e036300c752c1a40c5a038fea9c169/docs/aur-badge.svg)](https://aur.archlinux.org/packages/antares-sql/) [<img src="https://developer.microsoft.com/store/badges/images/English_get-it-from-MS.png" style="height: 56px">](https://www.microsoft.com/p/antares-sql-client/9nhtb9sq51r1?cid=storebadge&ocid=badge&rtc=1&activetab=pivot:overviewtab) [![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/antares) [![Get it from AUR](https://raw.githubusercontent.com/Fabio286/antares/3e00c4bae6e036300c752c1a40c5a038fea9c169/docs/aur-badge.svg)](https://aur.archlinux.org/packages/antares-sql-bin) [<img src="https://developer.microsoft.com/store/badges/images/English_get-it-from-MS.png" style="height: 56px">](https://www.microsoft.com/p/antares-sql-client/9nhtb9sq51r1?cid=storebadge&ocid=badge&rtc=1&activetab=pivot:overviewtab)
🚀 **[Other Downloads](https://github.com/Fabio286/antares/releases/latest)** 🚀 **[Other Downloads](https://github.com/Fabio286/antares/releases/latest)**
## Coming soon ## Coming soon
@@ -147,6 +151,8 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/555cider"><img src="https://avatars.githubusercontent.com/u/73565447?v=4?s=100" width="100px;" alt="555cider"/><br /><sub><b>555cider</b></sub></a><br /><a href="#translation-555cider" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/555cider"><img src="https://avatars.githubusercontent.com/u/73565447?v=4?s=100" width="100px;" alt="555cider"/><br /><sub><b>555cider</b></sub></a><br /><a href="#translation-555cider" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/m1khal3v"><img src="https://avatars.githubusercontent.com/u/41085561?v=4?s=100" width="100px;" alt="Anton Mikhalev"/><br /><sub><b>Anton Mikhalev</b></sub></a><br /><a href="#translation-m1khal3v" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/m1khal3v"><img src="https://avatars.githubusercontent.com/u/41085561?v=4?s=100" width="100px;" alt="Anton Mikhalev"/><br /><sub><b>Anton Mikhalev</b></sub></a><br /><a href="#translation-m1khal3v" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://64k.nl/"><img src="https://avatars.githubusercontent.com/u/3864423?v=4?s=100" width="100px;" alt="René"/><br /><sub><b>René</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=64knl" title="Code">💻</a> <a href="#translation-64knl" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zxp19821005"><img src="https://avatars.githubusercontent.com/u/4915850?v=4?s=100" width="100px;" alt="Woodenman"/><br /><sub><b>Woodenman</b></sub></a><br /><a href="#platform-zxp19821005" title="Packaging/porting to new platform">📦</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

12299
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"name": "antares", "name": "antares",
"productName": "Antares", "productName": "Antares",
"version": "0.7.10", "version": "0.7.16-beta.0",
"description": "A modern, fast and productivity driven SQL client with a focus in UX.", "description": "A modern, fast and productivity driven SQL client with a focus in UX.",
"license": "MIT", "license": "MIT",
"repository": "https://github.com/antares-sql/antares.git", "repository": "https://github.com/antares-sql/antares.git",
@@ -16,9 +16,10 @@
"build:appx": "npm run build -- --win appx", "build:appx": "npm run build -- --win appx",
"rebuild:electron": "rimraf ./dist && npm run postinstall && npm run devtools:install", "rebuild:electron": "rimraf ./dist && npm run postinstall && npm run devtools:install",
"release": "standard-version", "release": "standard-version",
"release:pre": "npm run release -- --prerelease alpha", "release:beta": "npm run release -- --prerelease beta",
"devtools:install": "node scripts/devtoolsInstaller", "devtools:install": "node scripts/devtoolsInstaller",
"postinstall": "electron-builder install-app-deps", "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": "npm run compile && npm run test:e2e-dry",
"test:e2e-dry": "xvfb-maybe -- playwright test", "test:e2e-dry": "xvfb-maybe -- playwright test",
"lint": "eslint . --ext .js,.ts,.vue && stylelint \"./src/**/*.{css,scss,sass,vue}\"", "lint": "eslint . --ext .js,.ts,.vue && stylelint \"./src/**/*.{css,scss,sass,vue}\"",
@@ -66,6 +67,7 @@
"target": "deb", "target": "deb",
"arch": [ "arch": [
"x64", "x64",
"arm64",
"armv7l" "armv7l"
] ]
}, },
@@ -73,6 +75,7 @@
"target": "AppImage", "target": "AppImage",
"arch": [ "arch": [
"x64", "x64",
"arm64",
"armv7l" "armv7l"
] ]
} }
@@ -134,16 +137,16 @@
"leaflet": "~1.7.1", "leaflet": "~1.7.1",
"marked": "~4.0.19", "marked": "~4.0.19",
"moment": "~2.29.4", "moment": "~2.29.4",
"mysql2": "~2.3.2", "mysql2": "~3.5.2",
"node-firebird": "~1.1.4", "node-firebird": "~1.1.4",
"pg": "~8.7.1", "pg": "~8.11.1",
"pg-connection-string": "~2.5.0", "pg-connection-string": "~2.5.0",
"pg-query-stream": "~4.2.3", "pg-query-stream": "~4.2.3",
"pgsql-ast-parser": "~7.2.1", "pgsql-ast-parser": "~7.2.1",
"pinia": "~2.0.28", "pinia": "~2.0.28",
"source-map-support": "~0.5.20", "source-map-support": "~0.5.20",
"spectre.css": "~0.5.9", "spectre.css": "~0.5.9",
"sql-formatter": "~12.0.3", "sql-formatter": "~12.2.0",
"ssh2-promise": "~1.0.2", "ssh2-promise": "~1.0.2",
"v-mask": "~2.3.0", "v-mask": "~2.3.0",
"vue": "~3.2.45", "vue": "~3.2.45",
@@ -196,6 +199,7 @@
"stylelint-scss": "~4.3.0", "stylelint-scss": "~4.3.0",
"tree-kill": "~1.2.2", "tree-kill": "~1.2.2",
"ts-loader": "~9.2.8", "ts-loader": "~9.2.8",
"ts-node": "~10.9.1",
"typescript": "~4.6.3", "typescript": "~4.6.3",
"unzip-crx-3": "~0.2.0", "unzip-crx-3": "~0.2.0",
"vue-eslint-parser": "~8.3.0", "vue-eslint-parser": "~8.3.0",

View File

@@ -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)`);

View File

@@ -4,7 +4,7 @@ summary: Open source SQL client made to be simple and complete.
description: | description: |
Antares is an SQL client that aims to become an useful and complete tool, especially for developers. 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. 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 grade: stable
confinement: strict confinement: strict
@@ -119,10 +119,10 @@ parts:
cleanup: cleanup:
after: [antares] after: [antares]
plugin: nil plugin: nil
build-snaps: [gnome-3-38-2004] build-snaps: [gnome-42-2204]
override-prime: | override-prime: |
set -eux set -eux
cd /snap/gnome-3-38-2004/current cd /snap/gnome-42-2204/current
find . -type f,l -exec rm -f $SNAPCRAFT_PRIME/{} \; find . -type f,l -exec rm -f $SNAPCRAFT_PRIME/{} \;
mdns-lookup: mdns-lookup:
@@ -136,7 +136,7 @@ parts:
- libnss-mdns - libnss-mdns
override-prime: | override-prime: |
set -eux 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 snapcraftctl prime
prime: prime:
- lib/$SNAPCRAFT_ARCH_TRIPLET/libnss_mdns4_minimal* - lib/$SNAPCRAFT_ARCH_TRIPLET/libnss_mdns4_minimal*
@@ -146,10 +146,7 @@ apps:
antares: antares:
command: opt/Antares/antares --no-sandbox command: opt/Antares/antares --no-sandbox
desktop: usr/share/applications/antares.desktop desktop: usr/share/applications/antares.desktop
extensions: [gnome-3-38] extensions: [gnome]
environment:
# Fallback to XWayland if running in a Wayland session.
DISABLE_WAYLAND: 1
plugs: plugs:
- browser-support - browser-support
- cups-control - cups-control

View File

@@ -72,7 +72,7 @@ export const escapeAndQuote = (val: string, client: ClientCode) => {
export const valueToSqlString = (args: { export const valueToSqlString = (args: {
val: any; val: any;
client: ClientCode; client: ClientCode;
field: {type: string; datePrecision: number; isArray?: boolean}; field: {type: string; datePrecision?: number; precision?: number | false; isArray?: boolean};
}): string => { }): string => {
let parsedValue; let parsedValue;
const { val, client, field } = args; const { val, client, field } = args;
@@ -105,7 +105,7 @@ export const valueToSqlString = (args: {
else if (TEXT_SEARCH.includes(field.type)) else if (TEXT_SEARCH.includes(field.type))
parsedValue = `'${val.replaceAll('\'', '\'\'')}'`; parsedValue = `'${val.replaceAll('\'', '\'\'')}'`;
else if (BIT.includes(field.type)) else if (BIT.includes(field.type))
parsedValue = `b'${hexToBinary(Buffer.from(val).toString('hex') as undefined as HexChar[])}'`; parsedValue = `b'${hexToBinary(Buffer.from(new Uint8Array(Object.values(val))).toString('hex') as undefined as HexChar[])}'`;
else if (BLOB.includes(field.type)) { else if (BLOB.includes(field.type)) {
let buffer: Buffer; let buffer: Buffer;
if (val instanceof Uint8Array) if (val instanceof Uint8Array)

View File

@@ -1,22 +1,22 @@
export const shortcutEvents: { [key: string]: { l18n: string; l18nParam?: string | number; context?: 'tab' }} = { export const shortcutEvents: { [key: string]: { l18n: string; l18nParam?: string | number; context?: 'tab' }} = {
'run-or-reload': { l18n: 'message.runOrReload', context: 'tab' }, 'run-or-reload': { l18n: 'application.runOrReload', context: 'tab' },
'open-new-tab': { l18n: 'message.openNewTab', context: 'tab' }, 'open-new-tab': { l18n: 'application.openNewTab', context: 'tab' },
'close-tab': { l18n: 'message.closeTab', context: 'tab' }, 'close-tab': { l18n: 'application.closeTab', context: 'tab' },
'format-query': { l18n: 'message.formatQuery', context: 'tab' }, 'format-query': { l18n: 'database.formatQuery', context: 'tab' },
'kill-query': { l18n: 'message.killQuery', context: 'tab' }, 'kill-query': { l18n: 'database.killQuery', context: 'tab' },
'query-history': { l18n: 'message.queryHistory', context: 'tab' }, 'query-history': { l18n: 'database.queryHistory', context: 'tab' },
'clear-query': { l18n: 'message.clearQuery', context: 'tab' }, 'clear-query': { l18n: 'database.clearQuery', context: 'tab' },
'next-tab': { l18n: 'message.nextTab' }, 'next-tab': { l18n: 'application.nextTab' },
'prev-tab': { l18n: 'message.previousTab' }, 'prev-tab': { l18n: 'application.previousTab' },
'open-all-connections': { l18n: 'message.openAllConnections' }, 'open-all-connections': { l18n: 'application.openAllConnections' },
'open-filter': { l18n: 'message.openFilter' }, 'open-filter': { l18n: 'application.openFilter' },
'next-page': { l18n: 'message.nextResultsPage' }, 'next-page': { l18n: 'application.nextResultsPage' },
'prev-page': { l18n: 'message.previousResultsPage' }, 'prev-page': { l18n: 'application.previousResultsPage' },
'toggle-console': { l18n: 'message.toggleConsole' }, 'toggle-console': { l18n: 'application.toggleConsole' },
'save-content': { l18n: 'message.saveContent' }, 'save-content': { l18n: 'application.saveContent' },
'create-connection': { l18n: 'message.createNewConnection' }, 'create-connection': { l18n: 'connection.createNewConnection' },
'open-settings': { l18n: 'message.openSettings' }, 'open-settings': { l18n: 'application.openSettings' },
'open-scratchpad': { l18n: 'message.openScratchpad' } 'open-scratchpad': { l18n: 'application.openScratchpad' }
}; };
interface ShortcutRecord { interface ShortcutRecord {
@@ -124,7 +124,7 @@ const shortcuts: ShortcutRecord[] = [
for (let i = 1; i <= 9; i++) { for (let i = 1; i <= 9; i++) {
shortcutEvents[`select-tab-${i}`] = { shortcutEvents[`select-tab-${i}`] = {
l18n: 'message.selectTabNumber', l18n: 'application.selectTabNumber',
l18nParam: i l18nParam: i
}; };

View File

@@ -0,0 +1,14 @@
import * as antares from 'common/interfaces/antares';
import { ipcMain } from 'electron';
export default (connections: {[key: string]: antares.Client}) => {
ipcMain.handle('get-databases', async (event, uid) => {
try {
const result = await connections[uid].getDatabases();
return { status: 'success', response: result };
}
catch (err) {
return { status: 'error', response: err.toString() };
}
});
};

View File

@@ -9,6 +9,7 @@ import functions from './functions';
import schedulers from './schedulers'; import schedulers from './schedulers';
import updates from './updates'; import updates from './updates';
import application from './application'; import application from './application';
import database from './database';
import schema from './schema'; import schema from './schema';
import users from './users'; import users from './users';
@@ -22,6 +23,7 @@ export default () => {
routines(connections); routines(connections);
functions(connections); functions(connections);
schedulers(connections); schedulers(connections);
database(connections);
schema(connections); schema(connections);
users(connections); users(connections);
updates(); updates();

View File

@@ -1,11 +1,20 @@
import { ipcMain } from 'electron'; import { ipcMain } from 'electron';
import { autoUpdater } from 'electron-updater'; import { autoUpdater } from 'electron-updater';
import * as Store from 'electron-store'; import * as Store from 'electron-store';
const persistentStore = new Store({ name: 'settings', clearInvalidConfig: true });
const isMacOS = process.platform === 'darwin';
const persistentStore = new Store({
name: 'settings',
clearInvalidConfig: true,
migrations: {
'0.7.15': store => {
store.set('allow_prerelease', false);
}
}
});
const isMacOS = process.platform === 'darwin';
let mainWindow: Electron.IpcMainEvent; let mainWindow: Electron.IpcMainEvent;
autoUpdater.allowPrerelease = persistentStore.get('allow_prerelease', true) as boolean; autoUpdater.allowPrerelease = persistentStore.get('allow_prerelease', false) as boolean;
export default () => { export default () => {
ipcMain.on('check-for-updates', event => { ipcMain.on('check-for-updates', event => {

View File

@@ -162,6 +162,10 @@ export abstract class AntaresCore {
throw new Error('Method "getDbConfig" not implemented'); throw new Error('Method "getDbConfig" not implemented');
} }
getDatabases () {
throw new Error('Method "getDatabases" not implemented');
}
createSchema (...args: any) { createSchema (...args: any) {
throw new Error('Method "createSchema" not implemented'); throw new Error('Method "createSchema" not implemented');
} }

View File

@@ -582,7 +582,7 @@ export class MySQLClient extends AntaresCore {
return rows.map((field) => { return rows.map((field) => {
const numLengthMatch = field.COLUMN_TYPE.match(/int\(([^)]+)\)/); const numLengthMatch = field.COLUMN_TYPE.match(/int\(([^)]+)\)/);
const numLength = numLengthMatch ? +numLengthMatch.pop() : field.NUMERIC_PRECISION || null; const numLength = numLengthMatch ? +numLengthMatch.pop() : field.NUMERIC_PRECISION || null;
const enumValues = /(enum|set)/.test(field.COLUMN_TYPE) const enumValues = /(enum)/.test(field.COLUMN_TYPE)
? field.COLUMN_TYPE.match(/\(([^)]+)\)/)[0].slice(1, -1) ? field.COLUMN_TYPE.match(/\(([^)]+)\)/)[0].slice(1, -1)
: null; : null;
@@ -689,11 +689,11 @@ export class MySQLClient extends AntaresCore {
return rows.map(row => { return rows.map(row => {
return { return {
unique: !row.Non_unique, unique: !Number(row.Non_unique),
name: row.Key_name, name: row.Key_name,
column: row.Column_name, column: row.Column_name,
indexType: row.Index_type, indexType: row.Index_type,
type: row.Key_name === 'PRIMARY' ? 'PRIMARY' : !row.Non_unique ? 'UNIQUE' : row.Index_type === 'FULLTEXT' ? 'FULLTEXT' : 'INDEX', type: row.Key_name === 'PRIMARY' ? 'PRIMARY' : !Number(row.Non_unique) ? 'UNIQUE' : row.Index_type === 'FULLTEXT' ? 'FULLTEXT' : 'INDEX',
cardinality: row.Cardinality, cardinality: row.Cardinality,
comment: row.Comment, comment: row.Comment,
indexComment: row.Index_comment indexComment: row.Index_comment
@@ -764,7 +764,7 @@ export class MySQLClient extends AntaresCore {
} }
async getUsers () { async getUsers () {
const { rows } = await this.raw('SELECT `user`, `host`, authentication_string AS `password` FROM `mysql`.`user`'); const { rows } = await this.raw('SELECT `user` as \'user\', `host` as \'host\', authentication_string AS `password` FROM `mysql`.`user`');
return rows.map(row => { return rows.map(row => {
return { return {
@@ -865,21 +865,23 @@ export class MySQLClient extends AntaresCore {
options options
} = params; } = params;
let sql = `ALTER TABLE \`${schema}\`.\`${table}\` `; const sql = `ALTER TABLE \`${schema}\`.\`${table}\` `;
const alterColumns: string[] = []; const alterColumnsAdd: string[] = [];
const alterColumnsChange: string[] = [];
const alterColumnsDrop: string[] = [];
// OPTIONS // OPTIONS
if ('comment' in options) alterColumns.push(`COMMENT='${options.comment}'`); if ('comment' in options) alterColumnsChange.push(`COMMENT='${options.comment}'`);
if ('engine' in options) alterColumns.push(`ENGINE=${options.engine}`); if ('engine' in options) alterColumnsChange.push(`ENGINE=${options.engine}`);
if ('autoIncrement' in options) alterColumns.push(`AUTO_INCREMENT=${+options.autoIncrement}`); if ('autoIncrement' in options) alterColumnsChange.push(`AUTO_INCREMENT=${+options.autoIncrement}`);
if ('collation' in options) alterColumns.push(`COLLATE='${options.collation}'`); if ('collation' in options) alterColumnsChange.push(`COLLATE='${options.collation}'`);
// ADD FIELDS // ADD FIELDS
additions.forEach(addition => { additions.forEach(addition => {
const typeInfo = this.getTypeInfo(addition.type); const typeInfo = this.getTypeInfo(addition.type);
const length = typeInfo.length ? addition.enumValues || addition.numLength || addition.charLength || addition.datePrecision : false; const length = typeInfo.length ? addition.enumValues || addition.numLength || addition.charLength || addition.datePrecision : false;
alterColumns.push(`ADD COLUMN \`${addition.name}\` alterColumnsAdd.push(`ADD COLUMN \`${addition.name}\`
${addition.type.toUpperCase()}${length ? `(${length}${addition.numScale ? `,${addition.numScale}` : ''})` : ''} ${addition.type.toUpperCase()}${length ? `(${length}${addition.numScale ? `,${addition.numScale}` : ''})` : ''}
${addition.unsigned ? 'UNSIGNED' : ''} ${addition.unsigned ? 'UNSIGNED' : ''}
${addition.zerofill ? 'ZEROFILL' : ''} ${addition.zerofill ? 'ZEROFILL' : ''}
@@ -898,18 +900,18 @@ export class MySQLClient extends AntaresCore {
let type = addition.type; let type = addition.type;
if (type === 'PRIMARY') if (type === 'PRIMARY')
alterColumns.push(`ADD PRIMARY KEY (${fields})`); alterColumnsAdd.push(`ADD PRIMARY KEY (${fields})`);
else { else {
if (type === 'UNIQUE') if (type === 'UNIQUE')
type = 'UNIQUE INDEX'; type = 'UNIQUE INDEX';
alterColumns.push(`ADD ${type} \`${addition.name}\` (${fields})`); alterColumnsAdd.push(`ADD ${type} \`${addition.name}\` (${fields})`);
} }
}); });
// ADD FOREIGN KEYS // ADD FOREIGN KEYS
foreignChanges.additions.forEach(addition => { foreignChanges.additions.forEach(addition => {
alterColumns.push(`ADD CONSTRAINT \`${addition.constraintName}\` FOREIGN KEY (\`${addition.field}\`) REFERENCES \`${addition.refTable}\` (\`${addition.refField}\`) ON UPDATE ${addition.onUpdate} ON DELETE ${addition.onDelete}`); alterColumnsAdd.push(`ADD CONSTRAINT \`${addition.constraintName}\` FOREIGN KEY (\`${addition.field}\`) REFERENCES \`${addition.refTable}\` (\`${addition.refField}\`) ON UPDATE ${addition.onUpdate} ON DELETE ${addition.onDelete}`);
}); });
// CHANGE FIELDS // CHANGE FIELDS
@@ -917,7 +919,7 @@ export class MySQLClient extends AntaresCore {
const typeInfo = this.getTypeInfo(change.type); const typeInfo = this.getTypeInfo(change.type);
const length = typeInfo.length ? change.enumValues || change.numLength || change.charLength || change.datePrecision : false; const length = typeInfo.length ? change.enumValues || change.numLength || change.charLength || change.datePrecision : false;
alterColumns.push(`CHANGE COLUMN \`${change.orgName}\` \`${change.name}\` alterColumnsChange.push(`CHANGE COLUMN \`${change.orgName}\` \`${change.name}\`
${change.type.toUpperCase()}${length ? `(${length}${change.numScale ? `,${change.numScale}` : ''})` : ''} ${change.type.toUpperCase()}${length ? `(${length}${change.numScale ? `,${change.numScale}` : ''})` : ''}
${change.unsigned ? 'UNSIGNED' : ''} ${change.unsigned ? 'UNSIGNED' : ''}
${change.zerofill ? 'ZEROFILL' : ''} ${change.zerofill ? 'ZEROFILL' : ''}
@@ -933,53 +935,56 @@ export class MySQLClient extends AntaresCore {
// CHANGE INDEX // CHANGE INDEX
indexChanges.changes.forEach(change => { indexChanges.changes.forEach(change => {
if (change.oldType === 'PRIMARY') if (change.oldType === 'PRIMARY')
alterColumns.push('DROP PRIMARY KEY'); alterColumnsChange.push('DROP PRIMARY KEY');
else else
alterColumns.push(`DROP INDEX \`${change.oldName}\``); alterColumnsChange.push(`DROP INDEX \`${change.oldName}\``);
const fields = change.fields.map(field => `\`${field}\``).join(','); const fields = change.fields.map(field => `\`${field}\``).join(',');
let type = change.type; let type = change.type;
if (type === 'PRIMARY') if (type === 'PRIMARY')
alterColumns.push(`ADD PRIMARY KEY (${fields})`); alterColumnsChange.push(`ADD PRIMARY KEY (${fields})`);
else { else {
if (type === 'UNIQUE') if (type === 'UNIQUE')
type = 'UNIQUE INDEX'; type = 'UNIQUE INDEX';
alterColumns.push(`ADD ${type} \`${change.name}\` (${fields})`); alterColumnsChange.push(`ADD ${type} \`${change.name}\` (${fields})`);
} }
}); });
// CHANGE FOREIGN KEYS // CHANGE FOREIGN KEYS
foreignChanges.changes.forEach(change => { foreignChanges.changes.forEach(change => {
alterColumns.push(`DROP FOREIGN KEY \`${change.oldName}\``); alterColumnsChange.push(`DROP FOREIGN KEY \`${change.oldName}\``);
alterColumns.push(`ADD CONSTRAINT \`${change.constraintName}\` FOREIGN KEY (\`${change.field}\`) REFERENCES \`${change.refTable}\` (\`${change.refField}\`) ON UPDATE ${change.onUpdate} ON DELETE ${change.onDelete}`); alterColumnsChange.push(`ADD CONSTRAINT \`${change.constraintName}\` FOREIGN KEY (\`${change.field}\`) REFERENCES \`${change.refTable}\` (\`${change.refField}\`) ON UPDATE ${change.onUpdate} ON DELETE ${change.onDelete}`);
}); });
// DROP FIELDS // DROP FIELDS
deletions.forEach(deletion => { deletions.forEach(deletion => {
alterColumns.push(`DROP COLUMN \`${deletion.name}\``); alterColumnsDrop.push(`DROP COLUMN \`${deletion.name}\``);
}); });
// DROP INDEX // DROP INDEX
indexChanges.deletions.forEach(deletion => { indexChanges.deletions.forEach(deletion => {
if (deletion.type === 'PRIMARY') if (deletion.type === 'PRIMARY')
alterColumns.push('DROP PRIMARY KEY'); alterColumnsDrop.push('DROP PRIMARY KEY');
else else
alterColumns.push(`DROP INDEX \`${deletion.name}\``); alterColumnsDrop.push(`DROP INDEX \`${deletion.name}\``);
}); });
// DROP FOREIGN KEYS // DROP FOREIGN KEYS
foreignChanges.deletions.forEach(deletion => { foreignChanges.deletions.forEach(deletion => {
alterColumns.push(`DROP FOREIGN KEY \`${deletion.constraintName}\``); alterColumnsDrop.push(`DROP FOREIGN KEY \`${deletion.constraintName}\``);
}); });
sql += alterColumns.join(', '); const alterQueryes = [];
if (alterColumnsAdd.length) alterQueryes.push(sql+alterColumnsAdd.join(', '));
if (alterColumnsChange.length) alterQueryes.push(sql+alterColumnsChange.join(', '));
if (alterColumnsDrop.length) alterQueryes.push(sql+alterColumnsDrop.join(', '));
// RENAME // RENAME
if (options.name) sql += `; RENAME TABLE \`${schema}\`.\`${table}\` TO \`${schema}\`.\`${options.name}\``; if (options.name) alterQueryes.push(`RENAME TABLE \`${schema}\`.\`${table}\` TO \`${schema}\`.\`${options.name}\``);
return await this.raw(sql); return await this.raw(alterQueryes.join(';'));
} }
async duplicateTable (params: { schema: string; table: string }) { async duplicateTable (params: { schema: string; table: string }) {

View File

@@ -1,11 +1,11 @@
import * as antares from 'common/interfaces/antares'; import * as antares from 'common/interfaces/antares';
import * as mysql from 'mysql2';
import * as pg from 'pg'; import * as pg from 'pg';
import * as pgAst from 'pgsql-ast-parser'; import * as pgAst from 'pgsql-ast-parser';
import { AntaresCore } from '../AntaresCore'; import { AntaresCore } from '../AntaresCore';
import dataTypes from 'common/data-types/postgresql'; import dataTypes from 'common/data-types/postgresql';
import SSH2Promise = require('ssh2-promise'); import SSH2Promise = require('ssh2-promise');
import SSHConfig from 'ssh2-promise/lib/sshConfig'; import SSHConfig from 'ssh2-promise/lib/sshConfig';
import { ConnectionOptions } from 'tls';
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
function pgToString (value: any) { function pgToString (value: any) {
@@ -98,7 +98,7 @@ export class PostgreSQLClient extends AntaresCore {
_varchar: 'CHARACTER VARYING' _varchar: 'CHARACTER VARYING'
} }
_params: pg.ClientConfig & {schema: string; ssl?: mysql.SslOptions; ssh?: SSHConfig; readonly: boolean}; _params: pg.ClientConfig & {schema: string; ssl?: ConnectionOptions; ssh?: SSHConfig; readonly: boolean};
constructor (args: antares.ClientParams) { constructor (args: antares.ClientParams) {
super(args); super(args);
@@ -154,9 +154,9 @@ export class PostgreSQLClient extends AntaresCore {
host: this._params.host, host: this._params.host,
port: this._params.port, port: this._params.port,
user: this._params.user, user: this._params.user,
database: undefined as string | undefined, database: 'postgres' as string,
password: this._params.password, password: this._params.password,
ssl: null as mysql.SslOptions ssl: null as ConnectionOptions
}; };
if (this._params.database?.length) dbConfig.database = this._params.database; if (this._params.database?.length) dbConfig.database = this._params.database;
@@ -262,6 +262,18 @@ export class PostgreSQLClient extends AntaresCore {
return []; return [];
} }
async getDatabases () {
const { rows } = await this.raw('SELECT datname FROM pg_database WHERE datistemplate = false');
if (rows) {
return rows.reduce((acc, cur) => {
acc.push(cur.datname);
return acc;
}, [] as string[]);
}
else
return [];
}
async getStructure (schemas: Set<string>) { async getStructure (schemas: Set<string>) {
/* eslint-disable camelcase */ /* eslint-disable camelcase */
interface ShowTableResult { interface ShowTableResult {
@@ -1567,7 +1579,7 @@ export class PostgreSQLClient extends AntaresCore {
if (args.tabUid && isPool) if (args.tabUid && isPool)
this._runningConnections.set(args.tabUid, (connection as pg.PoolClient & { processID: number }).processID); this._runningConnections.set(args.tabUid, (connection as pg.PoolClient & { processID: number }).processID);
if (args.schema && args.schema !== 'public') if (args.schema)
await this.use(args.schema, connection); await this.use(args.schema, connection);
for (const query of queries) { for (const query of queries) {

View File

@@ -47,7 +47,7 @@ export default class MySQLImporter extends BaseImporter {
catch (error) { catch (error) {
this.emit('query-error', { this.emit('query-error', {
sql: query, sql: query,
message: error.sqlMessage, message: error.sqlMessage || error.message,
sqlSnippet: error.sql, sqlSnippet: error.sql,
time: new Date().getTime() time: new Date().getTime()
}); });

View File

@@ -21,7 +21,15 @@
<BaseTextEditor class="d-none" value="" /> <BaseTextEditor class="d-none" value="" />
</div> </div>
</div> </div>
<ModalAllConnections v-if="isAllConnectionsModal" @close="isAllConnectionsModal = false" /> <ModalAllConnections
v-if="isAllConnectionsModal"
@close="isAllConnectionsModal = false"
/>
<ModalExportSchema
v-if="isExportSchemaModal"
@close="hideExportModal"
/>
</div> </div>
</template> </template>
@@ -33,9 +41,11 @@ import { useI18n } from 'vue-i18n';
import { Menu, getCurrentWindow } from '@electron/remote'; import { Menu, getCurrentWindow } from '@electron/remote';
import { useApplicationStore } from '@/stores/application'; import { useApplicationStore } from '@/stores/application';
import { useConnectionsStore } from '@/stores/connections'; import { useConnectionsStore } from '@/stores/connections';
import { useSchemaExportStore } from '@/stores/schemaExport';
import { useSettingsStore } from '@/stores/settings'; import { useSettingsStore } from '@/stores/settings';
import { useWorkspacesStore } from '@/stores/workspaces'; import { useWorkspacesStore } from '@/stores/workspaces';
import TheSettingBar from '@/components/TheSettingBar.vue'; import TheSettingBar from '@/components/TheSettingBar.vue';
import ModalExportSchema from '@/components/ModalExportSchema.vue';
const { t } = useI18n(); const { t } = useI18n();
@@ -65,6 +75,10 @@ const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore);
const { checkVersionUpdate } = applicationStore; const { checkVersionUpdate } = applicationStore;
const { changeApplicationTheme } = settingsStore; const { changeApplicationTheme } = settingsStore;
const schemaExportStore = useSchemaExportStore();
const { hideExportModal } = schemaExportStore;
const { isExportModal: isExportSchemaModal } = storeToRefs(schemaExportStore);
const isAllConnectionsModal: Ref<boolean> = ref(false); const isAllConnectionsModal: Ref<boolean> = ref(false);
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
@@ -95,22 +109,22 @@ onMounted(() => {
const InputMenu = Menu.buildFromTemplate([ const InputMenu = Menu.buildFromTemplate([
{ {
label: t('word.cut'), label: t('general.cut'),
role: 'cut' role: 'cut'
}, },
{ {
label: t('word.copy'), label: t('general.copy'),
role: 'copy' role: 'copy'
}, },
{ {
label: t('word.paste'), label: t('general.paste'),
role: 'paste' role: 'paste'
}, },
{ {
type: 'separator' type: 'separator'
}, },
{ {
label: t('message.selectAll'), label: t('general.selectAll'),
role: 'selectAll' role: 'selectAll'
} }
]); ]);

View File

@@ -31,13 +31,13 @@
class="btn btn-primary mr-2" class="btn btn-primary mr-2"
@click.stop="confirmModal" @click.stop="confirmModal"
> >
{{ confirmText || t('word.confirm') }} {{ confirmText || t('general.confirm') }}
</button> </button>
<button <button
class="btn btn-link" class="btn btn-link"
@click="hideModal" @click="hideModal"
> >
{{ cancelText || t('word.cancel') }} {{ cancelText || t('general.cancel') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -45,7 +45,7 @@ watch(() => props.mode, () => {
}); });
watch(() => props.modelValue, () => { watch(() => props.modelValue, () => {
if (editor) if (editor && props.readOnly)
editor.session.setValue(props.modelValue); editor.session.setValue(props.modelValue);
}); });

View File

@@ -4,7 +4,7 @@
v-model="selectedGroup" v-model="selectedGroup"
class="form-select" class="form-select"
:options="[{name: 'manual'}, ...fakerGroups]" :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" option-track-by="name"
:disabled="!isChecked" :disabled="!isChecked"
:style="'flex-grow: 0;'" :style="'flex-grow: 0;'"
@@ -41,7 +41,7 @@
<BaseUploadInput <BaseUploadInput
v-else-if="inputProps().type === 'file'" v-else-if="inputProps().type === 'file'"
:model-value="selectedValue" :model-value="selectedValue"
:message="t('word.browse')" :message="t('general.browse')"
@clear="clearValue" @clear="clearValue"
@change="filesChange($event)" @change="filesChange($event)"
/> />

View File

@@ -4,7 +4,7 @@
class="form-input" class="form-input"
type="text" type="text"
:value="pressedKeys" :value="pressedKeys"
:placeholder="t('message.registerAShortcut')" :placeholder="t('application.registerAShortcut')"
@focus="isFocus = true" @focus="isFocus = true"
@blur="isFocus = false" @blur="isFocus = false"
@keydown.prevent.stop="onKey" @keydown.prevent.stop="onKey"
@@ -49,7 +49,7 @@ const pressedKeys = computed(() => {
keys.push('Shift'); keys.push('Shift');
if (keyboardEvent.value.code) { if (keyboardEvent.value.code) {
if (keys.length === 0 && (keyboardEvent.value.key.length === 1 || singleKeysToIgnore.includes(keyboardEvent.value.key))) 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)) { else if (!specialKeys.includes(keyboardEvent.value.key)) {
if (keyboardEvent.value.key === 'Dead') { if (keyboardEvent.value.key === 'Dead') {
keys.push(keyboardEvent.value.code keys.push(keyboardEvent.value.code
@@ -82,7 +82,7 @@ const pressedKeys = computed(() => {
} }
} }
else else
return t('message.invalidShortcutMessage'); return t('application.invalidShortcutMessage');
} }
} }
@@ -96,7 +96,7 @@ const onKey = (e: KeyboardEvent) => {
}; };
watch(pressedKeys, (value) => { watch(pressedKeys, (value) => {
if (value !== t('message.invalidShortcutMessage')) if (value !== t('application.invalidShortcutMessage'))
emit('update:modelValue', pressedKeys.value); emit('update:modelValue', pressedKeys.value);
}); });

View File

@@ -7,7 +7,7 @@
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-apps mr-1" /> <i class="mdi mdi-24px mdi-apps mr-1" />
<span class="cut-text">{{ t('message.allConnections') }}</span> <span class="cut-text">{{ t('connection.allConnections') }}</span>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
@@ -21,7 +21,7 @@
v-model="searchTerm" v-model="searchTerm"
class="form-input" class="form-input"
type="text" type="text"
:placeholder="t('message.searchForConnections')" :placeholder="t('connection.searchForConnections')"
@keypress.esc="searchTerm = ''" @keypress.esc="searchTerm = ''"
> >
<i v-if="!searchTerm" class="form-icon mdi mdi-magnify mdi-18px pr-4" /> <i v-if="!searchTerm" class="form-icon mdi mdi-magnify mdi-18px pr-4" />
@@ -58,7 +58,7 @@
<div class="all-connections-buttons p-absolute d-flex" :style="'top: 0; right: 0;'"> <div class="all-connections-buttons p-absolute d-flex" :style="'top: 0; right: 0;'">
<i <i
class="all-connections-delete mdi mdi-delete mdi-18px ml-2" class="all-connections-delete mdi mdi-delete mdi-18px ml-2"
:title="t('word.delete')" :title="t('general.delete')"
@click.stop="askToDelete(connection)" @click.stop="askToDelete(connection)"
/> />
</div> </div>
@@ -130,12 +130,12 @@
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-server-remove mr-1" /> {{ t('message.deleteConnection') }} <i class="mdi mdi-24px mdi-server-remove mr-1" /> {{ t('connection.deleteConnection') }}
</div> </div>
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
{{ t('message.deleteCorfirm') }} <b>{{ selectedConnectionName }}</b>? {{ t('general.deleteConfirm') }} <b>{{ selectedConnectionName }}</b>?
</div> </div>
</template> </template>
</ConfirmModal> </ConfirmModal>

View File

@@ -6,7 +6,7 @@
<div class="modal-header pl-2"> <div class="modal-header pl-2">
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-key-variant mr-1" /> {{ t('word.credentials') }} <i class="mdi mdi-24px mdi-key-variant mr-1" /> {{ t('connection.credentials') }}
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
@@ -16,7 +16,7 @@
<form class="form-horizontal"> <form class="form-horizontal">
<div class="form-group"> <div class="form-group">
<div class="col-3"> <div class="col-3">
<label class="form-label">{{ t('word.user') }}</label> <label class="form-label">{{ t('connection.user') }}</label>
</div> </div>
<div class="col-9"> <div class="col-9">
<input <input
@@ -29,7 +29,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-3"> <div class="col-3">
<label class="form-label">{{ t('word.password') }}</label> <label class="form-label">{{ t('connection.password') }}</label>
</div> </div>
<div class="col-9"> <div class="col-9">
<input <input
@@ -44,10 +44,10 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button class="btn btn-primary mr-2" @click.stop="sendCredentials"> <button class="btn btn-primary mr-2" @click.stop="sendCredentials">
{{ t('word.send') }} {{ t('general.send') }}
</button> </button>
<button class="btn btn-link" @click.stop="closeModal"> <button class="btn btn-link" @click.stop="closeModal">
{{ t('word.close') }} {{ t('general.close') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -1,7 +1,7 @@
<template> <template>
<ConfirmModal <ConfirmModal
:confirm-text="t('word.run')" :confirm-text="t('general.run')"
:cancel-text="t('word.cancel')" :cancel-text="t('general.cancel')"
size="400" size="400"
@confirm="runRoutine" @confirm="runRoutine"
@hide="closeModal" @hide="closeModal"
@@ -9,7 +9,7 @@
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-play mr-1" /> <i class="mdi mdi-24px mdi-play mr-1" />
<span class="cut-text">{{ t('word.parameters') }}: {{ localRoutine.name }}</span> <span class="cut-text">{{ t('database.parameters') }}: {{ localRoutine.name }}</span>
</div> </div>
</template> </template>
<template #body> <template #body>

View File

@@ -7,7 +7,7 @@
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-brush-variant mr-1" /> <i class="mdi mdi-24px mdi-brush-variant mr-1" />
<span class="cut-text">{{ t('message.editConnectionAppearence') }}</span> <span class="cut-text">{{ t('connection.editConnectionAppearance') }}</span>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
@@ -17,7 +17,7 @@
<form class="form-horizontal"> <form class="form-horizontal">
<div class="form-group mb-4"> <div class="form-group mb-4">
<div class="col-3"> <div class="col-3">
<label class="form-label">{{ t('word.label') }}</label> <label class="form-label">{{ t('application.label') }}</label>
</div> </div>
<div class="col-9"> <div class="col-9">
<input <input
@@ -31,7 +31,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-3"> <div class="col-3">
<label class="form-label">{{ t('word.icon') }}</label> <label class="form-label">{{ t('application.icon') }}</label>
</div> </div>
<div class="col-9 icons-wrapper"> <div class="col-9 icons-wrapper">
<div <div
@@ -48,11 +48,11 @@
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button class="btn btn-primary mr-2" @click.stop="editFolderAppearence"> <button class="btn btn-primary mr-2" @click.stop="editFolderAppearance">
{{ t('word.update') }} {{ t('application.update') }}
</button> </button>
<button class="btn btn-link" @click.stop="closeModal"> <button class="btn btn-link" @click.stop="closeModal">
{{ t('word.close') }} {{ t('general.close') }}
</button> </button>
</div> </div>
</div> </div>
@@ -136,7 +136,7 @@ const { trapRef } = useFocusTrap();
const firstInput: Ref<HTMLInputElement> = ref(null); const firstInput: Ref<HTMLInputElement> = ref(null);
const localConnection: Ref<SidebarElement> = ref(unproxify(props.connection)); const localConnection: Ref<SidebarElement> = ref(unproxify(props.connection));
const editFolderAppearence = () => { const editFolderAppearance = () => {
updateConnectionOrder(localConnection.value); updateConnectionOrder(localConnection.value);
closeModal(); closeModal();
}; };

View File

@@ -1,18 +1,18 @@
<template> <template>
<ConfirmModal <ConfirmModal
:confirm-text="t('word.discard')" :confirm-text="t('general.discard')"
:cancel-text="t('word.stay')" :cancel-text="t('general.stay')"
@confirm="emit('confirm')" @confirm="emit('confirm')"
@hide="emit('close')" @hide="emit('close')"
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-content-save-alert mr-1" /> {{ t('message.unsavedChanges') }} <i class="mdi mdi-24px mdi-content-save-alert mr-1" /> {{ t('application.unsavedChanges') }}
</div> </div>
</template> </template>
<template #body> <template #body>
<div> <div>
{{ t('message.discardUnsavedChanges') }} {{ t('application.discardUnsavedChanges') }}
</div> </div>
</template> </template>
</ConfirmModal> </ConfirmModal>

View File

@@ -7,7 +7,7 @@
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-database-edit mr-1" /> <i class="mdi mdi-24px mdi-database-edit mr-1" />
<span class="cut-text">{{ t('message.editSchema') }}</span> <span class="cut-text">{{ t('database.editSchema') }}</span>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
@@ -17,7 +17,7 @@
<form class="form-horizontal"> <form class="form-horizontal">
<div class="form-group"> <div class="form-group">
<div class="col-3"> <div class="col-3">
<label class="form-label">{{ t('word.name') }}</label> <label class="form-label">{{ t('general.name') }}</label>
</div> </div>
<div class="col-9"> <div class="col-9">
<input <input
@@ -26,14 +26,14 @@
class="form-input" class="form-input"
type="text" type="text"
required required
:placeholder="t('message.schemaName')" :placeholder="t('database.schemaName')"
readonly readonly
> >
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-3"> <div class="col-3">
<label class="form-label">{{ t('word.collation') }}</label> <label class="form-label">{{ t('database.collation') }}</label>
</div> </div>
<div class="col-9"> <div class="col-9">
<BaseSelect <BaseSelect
@@ -44,7 +44,7 @@
option-label="collation" option-label="collation"
option-track-by="collation" option-track-by="collation"
/> />
<small>{{ t('message.serverDefault') }}: {{ defaultCollation }}</small> <small>{{ t('database.serverDefault') }}: {{ defaultCollation }}</small>
</div> </div>
</div> </div>
</form> </form>
@@ -52,10 +52,10 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button class="btn btn-primary mr-2" @click.stop="updateSchema"> <button class="btn btn-primary mr-2" @click.stop="updateSchema">
{{ t('word.update') }} {{ t('application.update') }}
</button> </button>
<button class="btn btn-link" @click.stop="closeModal"> <button class="btn btn-link" @click.stop="closeModal">
{{ t('word.close') }} {{ t('general.close') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -7,7 +7,7 @@
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-database-export mr-1" /> <i class="mdi mdi-24px mdi-database-export mr-1" />
<span class="cut-text">{{ t('message.exportSchema') }}</span> <span class="cut-text">{{ t('database.exportSchema') }}</span>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
@@ -16,7 +16,7 @@
<div class="container"> <div class="container">
<div class="columns"> <div class="columns">
<div class="col-3"> <div class="col-3">
<label class="form-label">{{ t('message.directoryPath') }}</label> <label class="form-label">{{ t('general.directoryPath') }}</label>
</div> </div>
<div class="col-9"> <div class="col-9">
<fieldset class="input-group"> <fieldset class="input-group">
@@ -26,14 +26,14 @@
type="text" type="text"
required required
readonly readonly
:placeholder="t('message.schemaName')" :placeholder="t('database.schemaName')"
> >
<button <button
type="button" type="button"
class="btn btn-primary input-group-btn" class="btn btn-primary input-group-btn"
@click.prevent="openPathDialog" @click.prevent="openPathDialog"
> >
{{ t('word.change') }} {{ t('general.change') }}
</button> </button>
</fieldset> </fieldset>
</div> </div>
@@ -42,35 +42,41 @@
<div class="columns export-options"> <div class="columns export-options">
<div class="column col-8 left"> <div class="column col-8 left">
<div class="columns mb-2"> <div class="columns mb-2 mt-1 p-vcentered">
<div class="column col-auto d-flex text-italic "> <div class="column col-auto input-group d-flex text-italic" :style="'flex-grow: 1'">
<i class="mdi mdi-file-document-outline mr-2" /> <i class="input-group-addon mdi mdi-file-document-outline" />
{{ filename }} <input
v-model="chosenFilename"
class="form-input"
type="text"
:placeholder="filename"
:title="t('application.fileName')"
>
</div> </div>
<div class="column col-auto col-ml-auto "> <div class="column col-auto col-ml-auto ">
<button <button
class="btn btn-dark btn-sm" class="btn btn-dark btn-sm"
:title="t('word.refresh')" :title="t('general.refresh')"
@click="refresh" @click="refresh"
> >
<i class="mdi mdi-database-refresh" /> <i class="mdi mdi-refresh" />
</button> </button>
<button <button
class="btn btn-dark btn-sm mx-1" class="btn btn-dark btn-sm mx-1"
:title="t('message.uncheckAllTables')" :title="t('database.uncheckAllTables')"
:disabled="isRefreshing" :disabled="isRefreshing"
@click="uncheckAllTables" @click="uncheckAllTables"
> >
<i class="mdi mdi-file-tree-outline" /> <i class="mdi mdi-checkbox-blank-outline" />
</button> </button>
<button <button
class="btn btn-dark btn-sm" class="btn btn-dark btn-sm"
:title="t('message.checkAllTables')" :title="t('database.checkAllTables')"
:disabled="isRefreshing" :disabled="isRefreshing"
@click="checkAllTables" @click="checkAllTables"
> >
<i class="mdi mdi-file-tree" /> <i class="mdi mdi-checkbox-marked-outline" />
</button> </button>
</div> </div>
</div> </div>
@@ -122,22 +128,22 @@
<div class="tr"> <div class="tr">
<div class="th" :style="'width: 50%;'"> <div class="th" :style="'width: 50%;'">
<div class="table-column-title"> <div class="table-column-title">
<span>{{ t('word.table') }}</span> <span>{{ t('database.table') }}</span>
</div> </div>
</div> </div>
<div class="th text-center"> <div class="th text-center">
<div class="table-column-title"> <div class="table-column-title">
<span>{{ t('word.structure') }}</span> <span>{{ t('database.structure') }}</span>
</div> </div>
</div> </div>
<div class="th text-center"> <div class="th text-center">
<div class="table-column-title"> <div class="table-column-title">
<span>{{ t('word.content') }}</span> <span>{{ t('general.content') }}</span>
</div> </div>
</div> </div>
<div class="th text-center"> <div class="th text-center">
<div class="table-column-title"> <div class="table-column-title">
<span>{{ t('word.drop') }}</span> <span>{{ t('database.drop') }}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -148,6 +154,7 @@
v-for="item in tables" v-for="item in tables"
:key="item.table" :key="item.table"
class="tr" class="tr"
:class="{'selected': item.table === selectedTable}"
> >
<div class="td"> <div class="td">
{{ item.table }} {{ item.table }}
@@ -183,19 +190,19 @@
</div> </div>
<div class="column col-4"> <div class="column col-4">
<h5 class="h5"> <h5 class="h5">
{{ t('word.options') }} {{ t('general.options') }}
</h5> </h5>
<span class="h6">{{ t('word.includes') }}:</span> <span class="h6">{{ t('general.includes') }}:</span>
<label <label
v-for="(_, key) in options.includes" v-for="(_, key) in options.includes"
:key="key" :key="key"
class="form-checkbox" class="form-checkbox"
> >
<input v-model="options.includes[key]" type="checkbox"><i class="form-icon" /> {{ t(`word.${key}`, 2) }} <input v-model="options.includes[key]" type="checkbox"><i class="form-icon" /> {{ t(`database.${String(key).slice(0, -1)}`, 2) }}
</label> </label>
<div v-if="clientCustoms.exportByChunks"> <div v-if="clientCustoms.exportByChunks">
<div class="h6 mt-4 mb-2"> <div class="h6 mt-4 mb-2">
{{ t('message.newInserStmtEvery') }}: {{ t('database.newInsertStmtEvery') }}:
</div> </div>
<div class="columns"> <div class="columns">
<div class="column col-6"> <div class="column col-6">
@@ -209,21 +216,21 @@
<BaseSelect <BaseSelect
v-model="options.sqlInsertDivider" v-model="options.sqlInsertDivider"
class="form-select" class="form-select"
:options="[{value: 'bytes', label: 'KiB'}, {value: 'rows', label: t('word.row', 2)}]" :options="[{value: 'bytes', label: 'KiB'}, {value: 'rows', label: t('database.row', 2)}]"
/> />
</div> </div>
</div> </div>
</div> </div>
<div class="h6 mb-2 mt-4"> <div class="h6 mb-2 mt-4">
{{ t('message.ourputFormat') }}: {{ t('general.outputFormat') }}:
</div> </div>
<div class="columns"> <div class="columns">
<div class="column h5 mb-4"> <div class="column h5 mb-4">
<BaseSelect <BaseSelect
v-model="options.outputFormat" v-model="options.outputFormat"
class="form-select" class="form-select"
:options="[{value: 'sql', label: t('message.singleFile', {ext: '.sql'})}, {value: 'sql.zip', label: t('message.zipCompressedFile', {ext: '.sql'})}]" :options="[{value: 'sql', label: t('general.singleFile', {ext: '.sql'})}, {value: 'sql.zip', label: t('general.zipCompressedFile', {ext: '.sql'})}]"
/> />
</div> </div>
</div> </div>
@@ -245,7 +252,7 @@
</div> </div>
<div class="column col-auto px-0"> <div class="column col-auto px-0">
<button class="btn btn-link" @click.stop="closeModal"> <button class="btn btn-link" @click.stop="closeModal">
{{ t('word.close') }} {{ t('general.close') }}
</button> </button>
<button <button
class="btn btn-primary mr-2" class="btn btn-primary mr-2"
@@ -254,7 +261,7 @@
autofocus autofocus
@click.prevent="startExport" @click.prevent="startExport"
> >
{{ t('word.export') }} {{ t('database.export') }}
</button> </button>
</div> </div>
</div> </div>
@@ -272,6 +279,7 @@ import { useI18n } from 'vue-i18n';
import { ClientCode, SchemaInfos } from 'common/interfaces/antares'; import { ClientCode, SchemaInfos } from 'common/interfaces/antares';
import { ExportOptions, ExportState } from 'common/interfaces/exporter'; import { ExportOptions, ExportState } from 'common/interfaces/exporter';
import { useNotificationsStore } from '@/stores/notifications'; import { useNotificationsStore } from '@/stores/notifications';
import { useSchemaExportStore } from '@/stores/schemaExport';
import { useWorkspacesStore } from '@/stores/workspaces'; import { useWorkspacesStore } from '@/stores/workspaces';
import { useFocusTrap } from '@/composables/useFocusTrap'; import { useFocusTrap } from '@/composables/useFocusTrap';
import Application from '@/ipc-api/Application'; import Application from '@/ipc-api/Application';
@@ -279,15 +287,12 @@ import Schema from '@/ipc-api/Schema';
import { Customizations } from 'common/interfaces/customizations'; import { Customizations } from 'common/interfaces/customizations';
import BaseSelect from '@/components/BaseSelect.vue'; import BaseSelect from '@/components/BaseSelect.vue';
const props = defineProps({
selectedSchema: String
});
const emit = defineEmits(['close']); const emit = defineEmits(['close']);
const { t } = useI18n(); const { t } = useI18n();
const { addNotification } = useNotificationsStore(); const { addNotification } = useNotificationsStore();
const workspacesStore = useWorkspacesStore(); const workspacesStore = useWorkspacesStore();
const schemaExportStore = useSchemaExportStore();
const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore); const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore);
@@ -298,6 +303,8 @@ const {
refreshSchema refreshSchema
} = workspacesStore; } = workspacesStore;
const { selectedTable, selectedSchema } = storeToRefs(schemaExportStore);
const isExporting = ref(false); const isExporting = ref(false);
const isRefreshing = ref(false); const isRefreshing = ref(false);
const progressPercentage = ref(0); const progressPercentage = ref(0);
@@ -309,28 +316,29 @@ const tables: Ref<{
includeDropStatement: boolean; includeDropStatement: boolean;
}[]> = ref([]); }[]> = ref([]);
const options: Ref<Partial<ExportOptions>> = ref({ const options: Ref<Partial<ExportOptions>> = ref({
schema: props.selectedSchema, schema: selectedSchema.value,
includes: {} as {[key: string]: boolean}, includes: {} as {[key: string]: boolean},
outputFormat: 'sql' as 'sql' | 'sql.zip', outputFormat: 'sql' as 'sql' | 'sql.zip',
sqlInsertAfter: 250, sqlInsertAfter: 250,
sqlInsertDivider: 'bytes' as 'bytes' | 'rows' sqlInsertDivider: 'bytes' as 'bytes' | 'rows'
}); });
const basePath = ref(''); const basePath = ref('');
const chosenFilename = ref('');
const currentWorkspace = computed(() => getWorkspace(selectedWorkspace.value)); const currentWorkspace = computed(() => getWorkspace(selectedWorkspace.value));
const clientCustoms: Ref<Customizations> = computed(() => currentWorkspace.value.customizations); const clientCustoms: Ref<Customizations> = computed(() => currentWorkspace.value.customizations);
const schemaItems = computed(() => { 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) if (db)
return db.tables.filter(table => table.type === 'table'); return db.tables.filter(table => table.type === 'table');
return []; return [];
}); });
const filename = computed(() => { const filename = computed(() => {
const date = moment().format('YYYY-MM-DD'); 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(() => { const includeStructureStatus = computed(() => {
if (tables.value.every(item => item.includeStructure)) return 1; if (tables.value.every(item => item.includeStructure)) return 1;
else if (tables.value.some(item => item.includeStructure)) return 2; else if (tables.value.some(item => item.includeStructure)) return 2;
@@ -353,7 +361,7 @@ const startExport = async () => {
const params = { const params = {
uid, uid,
type: client, type: client,
schema: props.selectedSchema, schema: selectedSchema.value,
outputFile: dumpFilePath.value, outputFile: dumpFilePath.value,
tables: [...tables.value], tables: [...tables.value],
...options.value ...options.value
@@ -362,7 +370,7 @@ const startExport = async () => {
try { try {
const { status, response } = await Schema.export(params); const { status, response } = await Schema.export(params);
if (status === 'success') if (status === 'success')
progressStatus.value = response.cancelled ? t('word.aborted') : t('word.completed'); progressStatus.value = response.cancelled ? t('general.aborted') : t('general.completed');
else { else {
progressStatus.value = response; progressStatus.value = response;
addNotification({ status: 'error', message: 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)); progressPercentage.value = Number((state.currentItemIndex / state.totalItems * 100).toFixed(1));
switch (state.op) { switch (state.op) {
case 'PROCESSING': case 'PROCESSING':
progressStatus.value = t('message.processingTableExport', { table: state.currentItem }); progressStatus.value = t('database.processingTableExport', { table: state.currentItem });
break; break;
case 'FETCH': case 'FETCH':
progressStatus.value = t('message.fechingTableExport', { table: state.currentItem }); progressStatus.value = t('database.fetchingTableExport', { table: state.currentItem });
break; break;
case 'WRITE': case 'WRITE':
progressStatus.value = t('message.writingTableExport', { table: state.currentItem }); progressStatus.value = t('database.writingTableExport', { table: state.currentItem });
break; break;
} }
}; };
@@ -431,7 +439,7 @@ const toggleAllTablesOption = (option: 'includeStructure' | 'includeContent' |'i
const refresh = async () => { const refresh = async () => {
isRefreshing.value = true; isRefreshing.value = true;
await refreshSchema({ uid: currentWorkspace.value.uid, schema: props.selectedSchema }); await refreshSchema({ uid: currentWorkspace.value.uid, schema: selectedSchema.value });
isRefreshing.value = false; isRefreshing.value = false;
}; };
@@ -446,12 +454,31 @@ const openPathDialog = async () => {
window.addEventListener('keydown', onKey); window.addEventListener('keydown', onKey);
if (selectedTable.value) {
setTimeout(() => {
const element = document.querySelector<HTMLElement>('.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(); basePath.value = await Application.getDownloadPathDirectory();
tables.value = schemaItems.value.map(item => ({ tables.value = schemaItems.value.map(item => ({
table: item.name, table: item.name,
includeStructure: true, includeStructure: !selectedTable.value ? true : selectedTable.value === item.name,
includeContent: true, includeContent: !selectedTable.value ? true : selectedTable.value === item.name,
includeDropStatement: true includeDropStatement: !selectedTable.value ? true : selectedTable.value === item.name
})); }));
const structure = ['functions', 'views', 'triggers', 'routines', 'schedulers']; const structure = ['functions', 'views', 'triggers', 'routines', 'schedulers'];
@@ -459,7 +486,7 @@ const openPathDialog = async () => {
structure.forEach((feat: keyof Customizations) => { structure.forEach((feat: keyof Customizations) => {
const val = clientCustoms.value[feat]; const val = clientCustoms.value[feat];
if (val) if (val)
options.value.includes[feat] = true; options.value.includes[feat] = !selectedTable.value;
}); });
ipcRenderer.on('export-progress', updateProgress); ipcRenderer.on('export-progress', updateProgress);

View File

@@ -7,7 +7,7 @@
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-playlist-plus mr-1" /> <i class="mdi mdi-24px mdi-playlist-plus mr-1" />
<span class="cut-text">{{ t('message.insertRow', 2) }}</span> <span class="cut-text">{{ t('database.insertRow', 2) }}</span>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
@@ -39,7 +39,7 @@
<span class="input-group-addon field-type" :class="typeClass(field.type)"> <span class="input-group-addon field-type" :class="typeClass(field.type)">
{{ field.type }} {{ wrapNumber(fieldLength(field)) }} {{ field.type }} {{ wrapNumber(fieldLength(field)) }}
</span> </span>
<label class="form-checkbox ml-3" :title="t('word.insert')"> <label class="form-checkbox ml-3" :title="t('general.insert')">
<input <input
type="checkbox" type="checkbox"
:checked="!fieldsToExclude.includes(field.name)" :checked="!fieldsToExclude.includes(field.name)"
@@ -55,7 +55,7 @@
</div> </div>
<div class="modal-footer columns"> <div class="modal-footer columns">
<div class="column d-flex" :class="hasFakes ? 'col-4' : 'col-2'"> <div class="column d-flex" :class="hasFakes ? 'col-4' : 'col-2'">
<div class="input-group tooltip tooltip-right" :data-tooltip="t('message.numberOfInserts')"> <div class="input-group tooltip tooltip-right" :data-tooltip="t('database.numberOfInserts')">
<input <input
v-model="nInserts" v-model="nInserts"
type="number" type="number"
@@ -70,7 +70,7 @@
<div <div
v-if="hasFakes" v-if="hasFakes"
class="tooltip tooltip-right ml-2" class="tooltip tooltip-right ml-2"
:data-tooltip="t('message.fakeDataLanguage')" :data-tooltip="t('database.fakeDataLanguage')"
> >
<BaseSelect <BaseSelect
v-model="fakerLocale" v-model="fakerLocale"
@@ -85,10 +85,10 @@
:class="{'loading': isInserting}" :class="{'loading': isInserting}"
@click.stop="insertRows" @click.stop="insertRows"
> >
{{ t('word.insert') }} {{ t('general.insert') }}
</button> </button>
<button class="btn btn-link" @click.stop="closeModal"> <button class="btn btn-link" @click.stop="closeModal">
{{ t('word.close') }} {{ t('general.close') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -7,7 +7,7 @@
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-folder-edit mr-1" /> <i class="mdi mdi-24px mdi-folder-edit mr-1" />
<span class="cut-text">{{ t('message.editFolder') }}</span> <span class="cut-text">{{ t('application.editFolder') }}</span>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
@@ -17,7 +17,7 @@
<form class="form-horizontal"> <form class="form-horizontal">
<div class="form-group mb-4"> <div class="form-group mb-4">
<div class="col-3"> <div class="col-3">
<label class="form-label">{{ t('word.name') }}</label> <label class="form-label">{{ t('general.name') }}</label>
</div> </div>
<div class="col-9"> <div class="col-9">
<input <input
@@ -26,13 +26,13 @@
class="form-input" class="form-input"
type="text" type="text"
required required
:placeholder="t('message.folderName')" :placeholder="t('application.folderName')"
> >
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-3"> <div class="col-3">
<label class="form-label">{{ t('word.color') }}</label> <label class="form-label">{{ t('application.color') }}</label>
</div> </div>
<div class="col-9 color-wrapper"> <div class="col-9 color-wrapper">
<div <div
@@ -51,11 +51,11 @@
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button class="btn btn-primary mr-2" @click.stop="editFolderAppearence"> <button class="btn btn-primary mr-2" @click.stop="editFolderAppearance">
{{ t('word.update') }} {{ t('application.update') }}
</button> </button>
<button class="btn btn-link" @click.stop="closeModal"> <button class="btn btn-link" @click.stop="closeModal">
{{ t('word.close') }} {{ t('general.close') }}
</button> </button>
</div> </div>
</div> </div>
@@ -110,7 +110,7 @@ const { trapRef } = useFocusTrap();
const firstInput: Ref<HTMLInputElement> = ref(null); const firstInput: Ref<HTMLInputElement> = ref(null);
const localFolder: Ref<SidebarElement> = ref(unproxify(props.folder)); const localFolder: Ref<SidebarElement> = ref(unproxify(props.folder));
const editFolderAppearence = () => { const editFolderAppearance = () => {
updateConnectionOrder(localFolder.value); updateConnectionOrder(localFolder.value);
closeModal(); closeModal();
}; };

View File

@@ -7,7 +7,7 @@
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-history mr-1" /> <i class="mdi mdi-24px mdi-history mr-1" />
<span class="cut-text">{{ t('word.history') }}: {{ connectionName }}</span> <span class="cut-text">{{ t('general.history') }}: {{ connectionName }}</span>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
@@ -22,7 +22,7 @@
v-model="searchTerm" v-model="searchTerm"
class="form-input" class="form-input"
type="text" type="text"
:placeholder="t('message.searchForQueries')" :placeholder="t('database.searchForQueries')"
> >
<i v-if="!searchTerm" class="form-icon mdi mdi-magnify mdi-18px pr-4" /> <i v-if="!searchTerm" class="form-icon mdi mdi-magnify mdi-18px pr-4" />
<i <i
@@ -67,13 +67,13 @@
<small class="tile-subtitle">{{ query.schema }} · {{ formatDate(query.date) }}</small> <small class="tile-subtitle">{{ query.schema }} · {{ formatDate(query.date) }}</small>
<div class="tile-history-buttons"> <div class="tile-history-buttons">
<button class="btn btn-link pl-1" @click.stop="$emit('select-query', query.sql)"> <button class="btn btn-link pl-1" @click.stop="$emit('select-query', query.sql)">
<i class="mdi mdi-open-in-app pr-1" /> {{ t('word.select') }} <i class="mdi mdi-open-in-app pr-1" /> {{ t('general.select') }}
</button> </button>
<button class="btn btn-link pl-1" @click="copyQuery(query.sql)"> <button class="btn btn-link pl-1" @click="copyQuery(query.sql)">
<i class="mdi mdi-content-copy pr-1" /> {{ t('word.copy') }} <i class="mdi mdi-content-copy pr-1" /> {{ t('general.copy') }}
</button> </button>
<button class="btn btn-link pl-1" @click="deleteQuery(query)"> <button class="btn btn-link pl-1" @click="deleteQuery(query)">
<i class="mdi mdi-delete-forever pr-1" /> {{ t('word.delete') }} <i class="mdi mdi-delete-forever pr-1" /> {{ t('general.delete') }}
</button> </button>
</div> </div>
</div> </div>
@@ -88,7 +88,7 @@
<i class="mdi mdi-history mdi-48px" /> <i class="mdi mdi-history mdi-48px" />
</div> </div>
<p class="empty-title h5"> <p class="empty-title h5">
{{ t('message.thereIsNoQueriesYet') }} {{ t('database.thereIsNoQueriesYet') }}
</p> </p>
</div> </div>
</div> </div>

View File

@@ -7,7 +7,7 @@
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-database-import mr-1" /> <i class="mdi mdi-24px mdi-database-import mr-1" />
<span class="cut-text">{{ t('message.importSchema') }}</span> <span class="cut-text">{{ t('database.importSchema') }}</span>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
@@ -15,7 +15,7 @@
<div class="modal-body pb-0"> <div class="modal-body pb-0">
{{ sqlFile }} {{ sqlFile }}
<div v-if="queryErrors.length > 0" class="mt-2"> <div v-if="queryErrors.length > 0" class="mt-2">
<label>{{ t('message.importQueryErrors', queryErrors.length) }}</label> <label>{{ t('database.importQueryErrors', queryErrors.length) }}</label>
<textarea <textarea
v-model="formattedQueryErrors" v-model="formattedQueryErrors"
class="form-input" class="form-input"
@@ -28,7 +28,7 @@
<div class="column col modal-progress-wrapper text-left"> <div class="column col modal-progress-wrapper text-left">
<div class="import-progress"> <div class="import-progress">
<span class="progress-status"> <span class="progress-status">
{{ progressPercentage }}% - {{ progressStatus }} - {{ t('message.executedQueries', queryCount) }} {{ progressPercentage }}% - {{ progressStatus }} - {{ t('database.executedQueries', queryCount) }}
</span> </span>
<progress <progress
class="progress d-block" class="progress d-block"
@@ -39,7 +39,7 @@
</div> </div>
<div class="column col-auto px-0"> <div class="column col-auto px-0">
<button class="btn btn-link" @click.stop="closeModal"> <button class="btn btn-link" @click.stop="closeModal">
{{ completed ? t('word.close') : t('word.cancel') }} {{ completed ? t('general.close') : t('general.cancel') }}
</button> </button>
</div> </div>
</div> </div>
@@ -108,7 +108,7 @@ const startImport = async (file: string) => {
const { status, response } = await Schema.import(params); const { status, response } = await Schema.import(params);
if (status === 'success') if (status === 'success')
progressStatus.value = response.cancelled ? t('word.aborted') : t('word.completed'); progressStatus.value = response.cancelled ? t('general.aborted') : t('general.completed');
else { else {
progressStatus.value = response; progressStatus.value = response;
addNotification({ status: 'error', message: response }); addNotification({ status: 'error', message: response });

View File

@@ -7,7 +7,7 @@
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-database-plus mr-1" /> <i class="mdi mdi-24px mdi-database-plus mr-1" />
<span class="cut-text">{{ t('message.createNewSchema') }}</span> <span class="cut-text">{{ t('database.createNewSchema') }}</span>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
@@ -17,7 +17,7 @@
<form class="form-horizontal" @submit.prevent="createSchema"> <form class="form-horizontal" @submit.prevent="createSchema">
<div class="form-group"> <div class="form-group">
<div class="col-3"> <div class="col-3">
<label class="form-label">{{ t('word.name') }}</label> <label class="form-label">{{ t('general.name') }}</label>
</div> </div>
<div class="col-9"> <div class="col-9">
<input <input
@@ -26,13 +26,13 @@
class="form-input" class="form-input"
type="text" type="text"
required required
:placeholder="t('message.schemaName')" :placeholder="t('database.schemaName')"
> >
</div> </div>
</div> </div>
<div v-if="customizations.collations" class="form-group"> <div v-if="customizations.collations" class="form-group">
<div class="col-3"> <div class="col-3">
<label class="form-label">{{ t('word.collation') }}</label> <label class="form-label">{{ t('database.collation') }}</label>
</div> </div>
<div class="col-9"> <div class="col-9">
<BaseSelect <BaseSelect
@@ -43,7 +43,7 @@
option-label="collation" option-label="collation"
option-track-by="collation" option-track-by="collation"
/> />
<small>{{ t('message.serverDefault') }}: {{ defaultCollation }}</small> <small>{{ t('database.serverDefault') }}: {{ defaultCollation }}</small>
</div> </div>
</div> </div>
</form> </form>
@@ -55,10 +55,10 @@
:class="{'loading': isLoading}" :class="{'loading': isLoading}"
@click.stop="createSchema" @click.stop="createSchema"
> >
{{ t('word.add') }} {{ t('general.add') }}
</button> </button>
<button class="btn btn-link" @click.stop="closeModal"> <button class="btn btn-link" @click.stop="closeModal">
{{ t('word.close') }} {{ t('general.close') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -17,7 +17,7 @@
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-memory mr-1" /> <i class="mdi mdi-24px mdi-memory mr-1" />
<span class="cut-text">{{ t('message.processesList') }}: {{ connectionName }}</span> <span class="cut-text">{{ t('database.processesList') }}: {{ connectionName }}</span>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
@@ -29,7 +29,7 @@
<button <button
class="btn btn-dark btn-sm mr-0 pr-1 d-flex" class="btn btn-dark btn-sm mr-0 pr-1 d-flex"
:class="{'loading':isQuering}" :class="{'loading':isQuering}"
:title="`${t('word.refresh')}`" :title="`${t('general.refresh')}`"
@click="getProcessesList" @click="getProcessesList"
> >
<i v-if="!+autorefreshTimer" class="mdi mdi-24px mdi-refresh mr-1" /> <i v-if="!+autorefreshTimer" class="mdi mdi-24px mdi-refresh mr-1" />
@@ -39,7 +39,7 @@
<i class="mdi mdi-24px mdi-menu-down" /> <i class="mdi mdi-24px mdi-menu-down" />
</div> </div>
<div class="menu px-3"> <div class="menu px-3">
<span>{{ t('word.autoRefresh') }}: <b>{{ +autorefreshTimer ? `${autorefreshTimer}s` : 'OFF' }}</b></span> <span>{{ t('general.autoRefresh') }}: <b>{{ +autorefreshTimer ? `${autorefreshTimer}s` : 'OFF' }}</b></span>
<input <input
v-model="autorefreshTimer" v-model="autorefreshTimer"
class="slider no-border" class="slider no-border"
@@ -59,7 +59,7 @@
tabindex="0" tabindex="0"
> >
<i class="mdi mdi-24px mdi-file-export mr-1" /> <i class="mdi mdi-24px mdi-file-export mr-1" />
<span>{{ t('word.export') }}</span> <span>{{ t('database.export') }}</span>
<i class="mdi mdi-24px mdi-menu-down" /> <i class="mdi mdi-24px mdi-menu-down" />
</button> </button>
<ul class="menu text-left"> <ul class="menu text-left">
@@ -74,7 +74,7 @@
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div v-if="sortedResults.length"> <div v-if="sortedResults.length">
{{ t('word.processes') }}: <b>{{ sortedResults.length.toLocaleString() }}</b> {{ t('database.processes') }}: <b>{{ sortedResults.length.toLocaleString() }}</b>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -4,7 +4,7 @@
@close-context="closeContext" @close-context="closeContext"
> >
<div v-if="props.selectedRow" class="context-element"> <div v-if="props.selectedRow" class="context-element">
<span class="d-flex"><i class="mdi mdi-18px mdi-content-copy text-light pr-1" /> {{ t('word.copy') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-content-copy text-light pr-1" /> {{ t('general.copy') }}</span>
<i class="mdi mdi-18px mdi-chevron-right text-light pl-1" /> <i class="mdi mdi-18px mdi-chevron-right text-light pl-1" />
<div class="context-submenu"> <div class="context-submenu">
<div <div
@@ -13,7 +13,7 @@
@click="copyCell" @click="copyCell"
> >
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-numeric-0 mdi-rotate-90 text-light pr-1" /> {{ t('word.cell', 1) }} <i class="mdi mdi-18px mdi-numeric-0 mdi-rotate-90 text-light pr-1" /> {{ t('database.cell', 1) }}
</span> </span>
</div> </div>
<div <div
@@ -22,7 +22,7 @@
@click="copyRow" @click="copyRow"
> >
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('word.row', 1) }} <i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('database.row', 1) }}
</span> </span>
</div> </div>
</div> </div>
@@ -33,7 +33,7 @@
@click="killProcess" @click="killProcess"
> >
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-close-circle-outline text-light pr-1" /> {{ t('message.killProcess') }} <i class="mdi mdi-18px mdi-close-circle-outline text-light pr-1" /> {{ t('database.killProcess') }}
</span> </span>
</div> </div>
</BaseContextMenu> </BaseContextMenu>

View File

@@ -16,15 +16,15 @@
</div> </div>
<ConfirmModal <ConfirmModal
v-if="isInfoModal" v-if="isInfoModal"
:confirm-text="t('word.update')" :confirm-text="t('application.update')"
:cancel-text="t('word.close')" :cancel-text="t('general.close')"
size="medium" size="medium"
:hide-footer="true" :hide-footer="true"
@hide="hideInfoModal" @hide="hideInfoModal"
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-information-outline mr-1" /> {{ t('message.processInfo') }} <i class="mdi mdi-24px mdi-information-outline mr-1" /> {{ t('database.processInfo') }}
</div> </div>
</template> </template>
<template #body> <template #body>

View File

@@ -7,7 +7,7 @@
<div class="modal-title h6"> <div class="modal-title h6">
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-cog mr-1" /> <i class="mdi mdi-24px mdi-cog mr-1" />
<span class="cut-text">{{ t('word.settings') }}</span> <span class="cut-text">{{ t('application.settings') }}</span>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click="closeModal" /> <a class="btn btn-clear c-hand" @click="closeModal" />
@@ -21,21 +21,21 @@
:class="{'active': selectedTab === 'general'}" :class="{'active': selectedTab === 'general'}"
@click="selectTab('general')" @click="selectTab('general')"
> >
<a class="tab-link">{{ t('word.general') }}</a> <a class="tab-link">{{ t('application.general') }}</a>
</li> </li>
<li <li
class="tab-item c-hand" class="tab-item c-hand"
:class="{'active': selectedTab === 'themes'}" :class="{'active': selectedTab === 'themes'}"
@click="selectTab('themes')" @click="selectTab('themes')"
> >
<a class="tab-link">{{ t('word.themes') }}</a> <a class="tab-link">{{ t('application.themes') }}</a>
</li> </li>
<li <li
class="tab-item c-hand" class="tab-item c-hand"
:class="{'active': selectedTab === 'shortcuts'}" :class="{'active': selectedTab === 'shortcuts'}"
@click="selectTab('shortcuts')" @click="selectTab('shortcuts')"
> >
<a class="tab-link">{{ t('word.shortcuts') }}</a> <a class="tab-link">{{ t('application.shortcuts') }}</a>
</li> </li>
<li <li
v-if="updateStatus !== 'disabled'" v-if="updateStatus !== 'disabled'"
@@ -43,21 +43,21 @@
:class="{'active': selectedTab === 'update'}" :class="{'active': selectedTab === 'update'}"
@click="selectTab('update')" @click="selectTab('update')"
> >
<a class="tab-link" :class="{'badge badge-update': hasUpdates}">{{ t('word.update') }}</a> <a class="tab-link" :class="{'badge badge-update': hasUpdates}">{{ t('application.update') }}</a>
</li> </li>
<li <li
class="tab-item c-hand" class="tab-item c-hand"
:class="{'active': selectedTab === 'changelog'}" :class="{'active': selectedTab === 'changelog'}"
@click="selectTab('changelog')" @click="selectTab('changelog')"
> >
<a class="tab-link">{{ t('word.changelog') }}</a> <a class="tab-link">{{ t('application.changelog') }}</a>
</li> </li>
<li <li
class="tab-item c-hand" class="tab-item c-hand"
:class="{'active': selectedTab === 'about'}" :class="{'active': selectedTab === 'about'}"
@click="selectTab('about')" @click="selectTab('about')"
> >
<a class="tab-link">{{ t('word.about') }}</a> <a class="tab-link">{{ t('application.about') }}</a>
</li> </li>
</ul> </ul>
</div> </div>
@@ -65,14 +65,14 @@
<div class="container"> <div class="container">
<form class="form-horizontal columns"> <form class="form-horizontal columns">
<div class="column col-12 h6 text-uppercase mb-1"> <div class="column col-12 h6 text-uppercase mb-1">
{{ t('word.application') }} {{ t('application.application') }}
</div> </div>
<div class="column col-12 col-sm-12 mb-2 columns"> <div class="column col-12 col-sm-12 mb-2 columns">
<div class="form-group column col-12"> <div class="form-group column col-12">
<div class="col-5 col-sm-12"> <div class="col-5 col-sm-12">
<label class="form-label"> <label class="form-label">
<i class="mdi mdi-18px mdi-translate mr-1" /> <i class="mdi mdi-18px mdi-translate mr-1" />
{{ t('word.language') }} {{ t('application.language') }}
</label> </label>
</div> </div>
<div class="col-3 col-sm-12"> <div class="col-3 col-sm-12">
@@ -87,15 +87,15 @@
</div> </div>
<div class="col-4 col-sm-12 px-2 p-vcentered"> <div class="col-4 col-sm-12 px-2 p-vcentered">
<small class="d-block" :style="'line-height: 1.1; font-size: 70%;'"> <small class="d-block" :style="'line-height: 1.1; font-size: 70%;'">
{{ t('message.missingOrIncompleteTranslation') }}<br> {{ t('application.missingOrIncompleteTranslation') }}<br>
<a class="text-bold c-hand" @click="openOutside('https://github.com/antares-sql/antares/wiki/Translate-Antares')">{{ t('message.findOutHowToContribute') }}</a> <a class="text-bold c-hand" @click="openOutside('https://github.com/antares-sql/antares/wiki/Translate-Antares')">{{ t('application.findOutHowToContribute') }}</a>
</small> </small>
</div> </div>
</div> </div>
<div class="form-group column col-12"> <div class="form-group column col-12">
<div class="col-5 col-sm-12"> <div class="col-5 col-sm-12">
<label class="form-label"> <label class="form-label">
{{ t('message.dataTabPageSize') }} {{ t('application.dataTabPageSize') }}
</label> </label>
</div> </div>
<div class="col-3 col-sm-12"> <div class="col-3 col-sm-12">
@@ -110,7 +110,7 @@
<div class="form-group column col-12 mb-0"> <div class="form-group column col-12 mb-0">
<div class="col-5 col-sm-12"> <div class="col-5 col-sm-12">
<label class="form-label"> <label class="form-label">
{{ t('message.restorePreviourSession') }} {{ t('application.restorePreviousSession') }}
</label> </label>
</div> </div>
<div class="col-3 col-sm-12"> <div class="col-3 col-sm-12">
@@ -123,7 +123,7 @@
<div class="form-group column col-12 mb-0"> <div class="form-group column col-12 mb-0">
<div class="col-5 col-sm-12"> <div class="col-5 col-sm-12">
<label class="form-label"> <label class="form-label">
{{ t('message.showTableSize') }} {{ t('application.showTableSize') }}
</label> </label>
</div> </div>
<div class="col-1 col-sm-12"> <div class="col-1 col-sm-12">
@@ -134,14 +134,14 @@
</div> </div>
<div class="col-6 col-sm-12 px-2 p-vcentered"> <div class="col-6 col-sm-12 px-2 p-vcentered">
<small class="d-block" :style="'line-height: 1.1; font-size: 70%;'"> <small class="d-block" :style="'line-height: 1.1; font-size: 70%;'">
{{ t('message.showTableSizeDescription') }} {{ t('application.showTableSizeDescription') }}
</small> </small>
</div> </div>
</div> </div>
<div class="form-group column col-12 mb-0"> <div class="form-group column col-12 mb-0">
<div class="col-5 col-sm-12"> <div class="col-5 col-sm-12">
<label class="form-label"> <label class="form-label">
{{ t('message.disableBlur') }} {{ t('application.disableBlur') }}
</label> </label>
</div> </div>
<div class="col-3 col-sm-12"> <div class="col-3 col-sm-12">
@@ -154,7 +154,7 @@
<div class="form-group column col-12 mb-0"> <div class="form-group column col-12 mb-0">
<div class="col-5 col-sm-12"> <div class="col-5 col-sm-12">
<label class="form-label"> <label class="form-label">
{{ t('message.disableScratchpad') }} {{ t('application.disableScratchpad') }}
</label> </label>
</div> </div>
<div class="col-3 col-sm-12"> <div class="col-3 col-sm-12">
@@ -167,7 +167,7 @@
<div class="form-group column col-12"> <div class="form-group column col-12">
<div class="col-5 col-sm-12"> <div class="col-5 col-sm-12">
<label class="form-label"> <label class="form-label">
{{ t('message.notificationsTimeout') }} {{ t('application.notificationsTimeout') }}
</label> </label>
</div> </div>
<div class="col-3 col-sm-12"> <div class="col-3 col-sm-12">
@@ -179,19 +179,19 @@
min="1" min="1"
@focusout="checkNotificationsTimeout" @focusout="checkNotificationsTimeout"
> >
<span class="input-group-addon">{{ t('word.seconds') }}</span> <span class="input-group-addon">{{ t('general.seconds') }}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="column col-12 h6 mt-4 text-uppercase mb-1"> <div class="column col-12 h6 mt-4 text-uppercase mb-1">
{{ t('word.editor') }} {{ t('application.editor') }}
</div> </div>
<div class="column col-12 col-sm-12 columns"> <div class="column col-12 col-sm-12 columns">
<div class="form-group column col-12 mb-0"> <div class="form-group column col-12 mb-0">
<div class="col-5 col-sm-12"> <div class="col-5 col-sm-12">
<label class="form-label"> <label class="form-label">
{{ t('word.autoCompletion') }} {{ t('application.autoCompletion') }}
</label> </label>
</div> </div>
<div class="col-3 col-sm-12"> <div class="col-3 col-sm-12">
@@ -204,7 +204,7 @@
<div class="form-group column col-12 mb-0"> <div class="form-group column col-12 mb-0">
<div class="col-5 col-sm-12"> <div class="col-5 col-sm-12">
<label class="form-label"> <label class="form-label">
{{ t('message.wrapLongLines') }} {{ t('application.wrapLongLines') }}
</label> </label>
</div> </div>
<div class="col-3 col-sm-12"> <div class="col-3 col-sm-12">
@@ -217,7 +217,7 @@
<div class="form-group column col-12 mb-0"> <div class="form-group column col-12 mb-0">
<div class="col-5 col-sm-12"> <div class="col-5 col-sm-12">
<label class="form-label"> <label class="form-label">
{{ t('message.executeSelectedQuery') }} {{ t('database.executeSelectedQuery') }}
</label> </label>
</div> </div>
<div class="col-3 col-sm-12"> <div class="col-3 col-sm-12">
@@ -229,13 +229,13 @@
</div> </div>
</div> </div>
<div class="column col-12 h6 mt-4 text-uppercase mb-1"> <div class="column col-12 h6 mt-4 text-uppercase mb-1">
{{ t('word.resultsTable') }} {{ t('database.resultsTable') }}
</div> </div>
<div class="column col-12 col-sm-12 columns"> <div class="column col-12 col-sm-12 columns">
<div class="form-group column col-12"> <div class="form-group column col-12">
<div class="col-5 col-sm-12"> <div class="col-5 col-sm-12">
<label class="form-label"> <label class="form-label">
{{ t('message.defaultCopyType') }} {{ t('application.defaultCopyType') }}
</label> </label>
</div> </div>
<div class="col-3 col-sm-12"> <div class="col-3 col-sm-12">
@@ -258,7 +258,7 @@
<div class="container"> <div class="container">
<div class="columns"> <div class="columns">
<div class="column col-12 h6 text-uppercase mb-2"> <div class="column col-12 h6 text-uppercase mb-2">
{{ t('message.applicationTheme') }} {{ t('application.applicationTheme') }}
</div> </div>
<div <div
class="column col-6 c-hand theme-block" class="column col-6 c-hand theme-block"
@@ -269,7 +269,7 @@
<div class="theme-name text-light"> <div class="theme-name text-light">
<i class="mdi mdi-moon-waning-crescent mdi-48px" /> <i class="mdi mdi-moon-waning-crescent mdi-48px" />
<div class="h6 mt-4"> <div class="h6 mt-4">
{{ t('word.dark') }} {{ t('application.dark') }}
</div> </div>
</div> </div>
</div> </div>
@@ -282,7 +282,7 @@
<div class="theme-name text-dark"> <div class="theme-name text-dark">
<i class="mdi mdi-white-balance-sunny mdi-48px" /> <i class="mdi mdi-white-balance-sunny mdi-48px" />
<div class="h6 mt-4"> <div class="h6 mt-4">
{{ t('word.light') }} {{ t('application.light') }}
</div> </div>
</div> </div>
</div> </div>
@@ -290,7 +290,7 @@
<div class="columns mt-4"> <div class="columns mt-4">
<div class="column col-12 h6 text-uppercase mb-2 mt-4"> <div class="column col-12 h6 text-uppercase mb-2 mt-4">
{{ t('message.editorTheme') }} {{ t('application.editorTheme') }}
</div> </div>
<div class="column col-5 h5 mb-4"> <div class="column col-5 h5 mb-4">
<BaseSelect <BaseSelect
@@ -378,16 +378,16 @@
<img :src="appLogo" width="128"> <img :src="appLogo" width="128">
<h4>{{ appName }}</h4> <h4>{{ appName }}</h4>
<p class="mb-2"> <p class="mb-2">
{{ t('word.version') }} {{ appVersion }}<br> {{ t('general.version') }} {{ appVersion }}<br>
<a class="c-hand" @click="openOutside('https://github.com/antares-sql/antares')"><i class="mdi mdi-github d-inline" /> GitHub</a> <a class="c-hand" @click="openOutside('https://twitter.com/AntaresSQL')"><i class="mdi mdi-twitter d-inline" /> Twitter</a> <a class="c-hand" @click="openOutside('https://antares-sql.app/')"><i class="mdi mdi-web d-inline" /> Website</a><br> <a class="c-hand" @click="openOutside('https://github.com/antares-sql/antares')"><i class="mdi mdi-github d-inline" /> GitHub</a> <a class="c-hand" @click="openOutside('https://twitter.com/AntaresSQL')"><i class="mdi mdi-twitter d-inline" /> Twitter</a> <a class="c-hand" @click="openOutside('https://antares-sql.app/')"><i class="mdi mdi-web d-inline" /> Website</a><br>
<small>{{ t('word.author') }} <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">{{ appAuthor }}</a></small><br> <small>{{ t('general.author') }} <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">{{ appAuthor }}</a></small><br>
</p> </p>
<div class="mb-2"> <div class="mb-2">
<small class="d-block text-uppercase">{{ t('word.contributors') }}:</small> <small class="d-block text-uppercase">{{ t('general.contributors') }}:</small>
<div class="d-block py-1"> <div class="d-block py-1">
<small v-for="(contributor, i) in otherContributors" :key="i">{{ i !== 0 ? ', ' : '' }}{{ contributor }}</small> <small v-for="(contributor, i) in otherContributors" :key="i">{{ i !== 0 ? ', ' : '' }}{{ contributor }}</small>
</div> </div>
<small>{{ t('message.madeWithJS') }}</small> <small>{{ t('application.madeWithJS') }}</small>
</div> </div>
</div> </div>
</div> </div>
@@ -500,7 +500,7 @@ const selectedTab: Ref<string> = ref('general');
const editorThemes = computed(() => [ const editorThemes = computed(() => [
{ {
group: t('word.light'), group: t('application.light'),
themes: [ themes: [
{ code: 'chrome', name: 'Chrome' }, { code: 'chrome', name: 'Chrome' },
{ code: 'clouds', name: 'Clouds' }, { code: 'clouds', name: 'Clouds' },
@@ -520,7 +520,7 @@ const editorThemes = computed(() => [
] ]
}, },
{ {
group: t('word.dark'), group: t('application.dark'),
themes: [ themes: [
{ code: 'ambiance', name: 'Ambiance' }, { code: 'ambiance', name: 'Ambiance' },
{ code: 'chaos', name: 'Chaos' }, { code: 'chaos', name: 'Chaos' },
@@ -553,12 +553,12 @@ const locales = computed(() => {
for (const locale of Object.keys(localesNames)) for (const locale of Object.keys(localesNames))
locales.push({ code: locale, name: localesNames[locale] }); locales.push({ code: locale, name: localesNames[locale] });
return locales; return locales.sort((a, b) => (a.name.localeCompare(b.name)));
}); });
const copyTypes = computed(() => [ const copyTypes = computed(() => [
{ code: 'cell', name: t('word.cell') }, { code: 'cell', name: t('database.cell') },
{ code: 'html', name: t('word.table') }, { code: 'html', name: t('database.table') },
{ code: 'json', name: 'JSON' }, { code: 'json', name: 'JSON' },
{ code: 'csv', name: 'CSV' }, { code: 'csv', name: 'CSV' },
{ code: 'sql', name: 'SQL insert' } { code: 'sql', name: 'SQL insert' }

View File

@@ -18,6 +18,7 @@ import { marked } from 'marked';
import BaseLoader from '@/components/BaseLoader.vue'; import BaseLoader from '@/components/BaseLoader.vue';
import { useApplicationStore } from '@/stores/application'; import { useApplicationStore } from '@/stores/application';
import { ref } from 'vue'; import { ref } from 'vue';
import { shell } from 'electron';
const { appVersion } = useApplicationStore(); const { appVersion } = useApplicationStore();
@@ -26,6 +27,10 @@ const isLoading = ref(true);
const error = ref(''); const error = ref('');
const isError = ref(false); const isError = ref(false);
const openOutside = (link: string) => {
shell.openExternal(link);
};
const getChangelog = async () => { const getChangelog = async () => {
try { try {
const apiRes = await fetch(`https://api.github.com/repos/antares-sql/antares/releases/tags/v${appVersion}`, { 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 = { const renderer = {
link (href: string, title: string, text: string) { link (href: string, title: string, text: string) {
return text; return `<a class="changelog-link" href="${href}" title="${title || ''}" target="_blank">${text}</a>`;
}, },
listitem (text: string) { listitem (text: string) {
return `<li>${text.replace(/ *\([^)]*\) */g, '')}</li>`; return `<li>${text.replace(/ *\([^)]*\) */g, '')}</li>`;
@@ -57,6 +62,17 @@ const getChangelog = async () => {
} }
isLoading.value = false; isLoading.value = false;
setTimeout(() => {
const links = document.querySelectorAll<HTMLAnchorElement>('.changelog-link');
for (const link of links) {
link.addEventListener('click', e => {
e.preventDefault();
openOutside(link.href);
});
}
}, 0);
}; };
getChangelog(); getChangelog();

View File

@@ -2,10 +2,10 @@
<div class="p-relative"> <div class="p-relative">
<div class="shortcuts-tools pb-2 px-2"> <div class="shortcuts-tools pb-2 px-2">
<button class="btn btn-dark btn-sm d-flex ml-2" @click="showAddModal"> <button class="btn btn-dark btn-sm d-flex ml-2" @click="showAddModal">
<i class="mdi mdi-24px mdi-plus mr-1" /><span>{{ t('message.addShortcut') }}</span> <i class="mdi mdi-24px mdi-plus mr-1" /><span>{{ t('application.addShortcut') }}</span>
</button> </button>
<button class="btn btn-dark btn-sm d-flex ml-2" @click="isConfirmRestoreModal = true"> <button class="btn btn-dark btn-sm d-flex ml-2" @click="isConfirmRestoreModal = true">
<i class="mdi mdi-24px mdi-undo mr-1" /><span>{{ t('message.restoreDefaults') }}</span> <i class="mdi mdi-24px mdi-undo mr-1" /><span>{{ t('application.restoreDefaults') }}</span>
</button> </button>
</div> </div>
<div class="container workspace-query-results"> <div class="container workspace-query-results">
@@ -14,12 +14,12 @@
<div class="tr text-uppercase"> <div class="tr text-uppercase">
<div class="th no-border"> <div class="th no-border">
<div> <div>
{{ t('word.event') }} {{ t('application.event') }}
</div> </div>
</div> </div>
<div class="th no-border" style="width: 100%;"> <div class="th no-border" style="width: 100%;">
<div> <div>
{{ t('word.key', 2) }} {{ t('application.key', 2) }}
</div> </div>
</div> </div>
<div class="th no-border" /> <div class="th no-border" />
@@ -43,10 +43,10 @@
/> />
<div class="td py-1 pr-2"> <div class="td py-1 pr-2">
<button class="shortcut-button btn btn-link btn-sm d-flex p-0 px-1 mr-2" @click="showEditModal({...shortcut, index: i})"> <button class="shortcut-button btn btn-link btn-sm d-flex p-0 px-1 mr-2" @click="showEditModal({...shortcut, index: i})">
<span>{{ t('word.edit') }}</span><i class="mdi mdi-pencil ml-1" /> <span>{{ t('general.edit') }}</span><i class="mdi mdi-pencil ml-1" />
</button> </button>
<button class="shortcut-button btn btn-link btn-sm d-flex p-0 px-1" @click="showDeleteModal(shortcut)"> <button class="shortcut-button btn btn-link btn-sm d-flex p-0 px-1" @click="showDeleteModal(shortcut)">
<span>{{ t('word.delete') }}</span><i class="mdi mdi-delete-outline ml-1" /> <span>{{ t('general.delete') }}</span><i class="mdi mdi-delete-outline ml-1" />
</button> </button>
</div> </div>
</div> </div>
@@ -58,20 +58,20 @@
<ConfirmModal <ConfirmModal
v-if="isConfirmAddModal" v-if="isConfirmAddModal"
:disable-autofocus="true" :disable-autofocus="true"
:confirm-text="t('word.save')" :confirm-text="t('general.save')"
:close-on-confirm="false" :close-on-confirm="false"
@confirm="addShortcut" @confirm="addShortcut"
@hide="closeAddModal" @hide="closeAddModal"
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-plus mr-1" /> {{ t('message.addShortcut') }} <i class="mdi mdi-24px mdi-plus mr-1" /> {{ t('application.addShortcut') }}
</div> </div>
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.event') }}</label> <label class="form-label">{{ t('application.event') }}</label>
<BaseSelect <BaseSelect
v-model="shortcutToAdd.event" v-model="shortcutToAdd.event"
class="form-select" class="form-select"
@@ -81,31 +81,31 @@
</div> </div>
<div class="mb-2"> <div class="mb-2">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.key', 2) }}</label> <label class="form-label">{{ t('application.key', 2) }}</label>
<KeyPressDetector v-model="typedShortcut" /> <KeyPressDetector v-model="typedShortcut" />
</div> </div>
</div> </div>
<small v-if="doesShortcutExists" class="text-warning">{{ t('message.shortcutAlreadyExists') }}</small> <small v-if="doesShortcutExists" class="text-warning">{{ t('application.shortcutAlreadyExists') }}</small>
</template> </template>
</ConfirmModal> </ConfirmModal>
<ConfirmModal <ConfirmModal
v-if="isConfirmEditModal" v-if="isConfirmEditModal"
:disable-autofocus="true" :disable-autofocus="true"
:confirm-text="t('word.save')" :confirm-text="t('general.save')"
:close-on-confirm="false" :close-on-confirm="false"
@confirm="editShortcut" @confirm="editShortcut"
@hide="closeEditModal" @hide="closeEditModal"
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-plus mr-1" /> {{ t('message.editShortcut') }} <i class="mdi mdi-24px mdi-plus mr-1" /> {{ t('application.editShortcut') }}
</div> </div>
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.event') }}</label> <label class="form-label">{{ t('application.event') }}</label>
<BaseSelect <BaseSelect
v-model="shortcutToEdit.event" v-model="shortcutToEdit.event"
class="form-select" class="form-select"
@@ -116,11 +116,11 @@
</div> </div>
<div class="mb-2"> <div class="mb-2">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.key', 2) }}</label> <label class="form-label">{{ t('application.key', 2) }}</label>
<KeyPressDetector v-model="shortcutToEdit.keys[0]" /> <KeyPressDetector v-model="shortcutToEdit.keys[0]" />
</div> </div>
</div> </div>
<small v-if="doesShortcutExists" class="text-warning">{{ t('message.shortcutAlreadyExists') }}</small> <small v-if="doesShortcutExists" class="text-warning">{{ t('application.shortcutAlreadyExists') }}</small>
</template> </template>
</ConfirmModal> </ConfirmModal>
@@ -132,12 +132,12 @@
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-delete mr-1" /> {{ t('message.deleteShortcut') }} <i class="mdi mdi-24px mdi-delete mr-1" /> {{ t('application.deleteShortcut') }}
</div> </div>
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
{{ t('message.deleteCorfirm') }} <b>{{ t(shortcutEvents[shortcutToDelete.event].l18n, {param: shortcutEvents[shortcutToDelete.event].l18nParam}) }} (<span v-html="parseKeys(shortcutToDelete.keys)" />)</b>? {{ t('general.deleteConfirm') }} <b>{{ t(shortcutEvents[shortcutToDelete.event].l18n, {param: shortcutEvents[shortcutToDelete.event].l18nParam}) }} (<span v-html="parseKeys(shortcutToDelete.keys)" />)</b>?
</div> </div>
</template> </template>
</ConfirmModal> </ConfirmModal>
@@ -150,12 +150,12 @@
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-undo mr-1" /> {{ t('message.restoreDefaults') }} <i class="mdi mdi-24px mdi-undo mr-1" /> {{ t('application.restoreDefaults') }}
</div> </div>
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
{{ t('message.restoreDefaultsQuestion') }} {{ t('application.restoreDefaultsQuestion') }}
</div> </div>
</template> </template>
</ConfirmModal> </ConfirmModal>

View File

@@ -26,27 +26,27 @@
:class="{'loading': updateStatus === 'checking'}" :class="{'loading': updateStatus === 'checking'}"
@click="checkForUpdates" @click="checkForUpdates"
> >
{{ t('message.checkForUpdates') }} {{ t('application.checkForUpdates') }}
</button> </button>
<button <button
v-else-if="updateStatus === 'downloaded'" v-else-if="updateStatus === 'downloaded'"
class="btn btn-primary" class="btn btn-primary"
@click="restartToUpdate" @click="restartToUpdate"
> >
{{ t('message.restartToInstall') }} {{ t('application.restartToInstall') }}
</button> </button>
<button <button
v-else-if="updateStatus === 'link'" v-else-if="updateStatus === 'link'"
class="btn btn-primary" class="btn btn-primary"
@click="openOutside('https://antares-sql.app/download.html')" @click="openOutside('https://antares-sql.app/download.html')"
> >
{{ t('message.goToDownloadPage') }} {{ t('application.goToDownloadPage') }}
</button> </button>
</div> </div>
<div class="form-group mt-4"> <div class="form-group mt-4">
<label class="form-switch d-inline-block disabled" @click.prevent="toggleAllowPrerelease"> <label class="form-switch d-inline-block" @click.prevent="toggleAllowPrerelease">
<input type="checkbox" :checked="allowPrerelease"> <input type="checkbox" :checked="allowPrerelease">
<i class="form-icon" /> {{ t('message.includeBetaUpdates') }} <i class="form-icon" /> {{ t('application.includeBetaUpdates') }}
</label> </label>
</div> </div>
</div> </div>
@@ -76,19 +76,19 @@ const { changeAllowPrerelease } = settingsStore;
const updateMessage = computed(() => { const updateMessage = computed(() => {
switch (updateStatus.value) { switch (updateStatus.value) {
case 'noupdate': case 'noupdate':
return t('message.noUpdatesAvailable'); return t('application.noUpdatesAvailable');
case 'checking': case 'checking':
return t('message.checkingForUpdate'); return t('application.checkingForUpdate');
case 'nocheck': case 'nocheck':
return t('message.checkFailure'); return t('application.checkFailure');
case 'available': case 'available':
return t('message.updateAvailable'); return t('application.updateAvailable');
case 'downloading': case 'downloading':
return t('message.downloadingUpdate'); return t('application.downloadingUpdate');
case 'downloaded': case 'downloaded':
return t('message.updateDownloaded'); return t('application.updateDownloaded');
case 'link': case 'link':
return t('message.updateAvailable'); return t('application.updateAvailable');
default: default:
return updateStatus.value; return updateStatus.value;
} }

View File

@@ -380,7 +380,7 @@ emit('folder-sort');// To apply changes on component key change
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
line-height: 1; line-height: 1.02;
transition: bottom .2s; transition: bottom .2s;
} }
} }
@@ -444,7 +444,7 @@ emit('folder-sort');// To apply changes on component key change
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
line-height: 1; line-height: 1.02;
} }
} }
} }

View File

@@ -8,20 +8,20 @@
class="context-element" class="context-element"
@click="disconnect" @click="disconnect"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-power text-light pr-1" /> {{ t('word.disconnect') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-power text-light pr-1" /> {{ t('connection.disconnect') }}</span>
</div> </div>
<div <div
v-if="!contextConnection.isFolder" v-if="!contextConnection.isFolder"
class="context-element" class="context-element"
@click="duplicateConnection" @click="duplicateConnection"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-content-duplicate text-light pr-1" /> {{ t('word.duplicate') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-content-duplicate text-light pr-1" /> {{ t('general.duplicate') }}</span>
</div> </div>
<div class="context-element" @click.stop="showAppearenceModal"> <div class="context-element" @click.stop="showAppearanceModal">
<span class="d-flex"><i class="mdi mdi-18px mdi-brush-variant text-light pr-1" /> {{ t('word.appearence') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-brush-variant text-light pr-1" /> {{ t('application.appearance') }}</span>
</div> </div>
<div class="context-element" @click="showConfirmModal"> <div class="context-element" @click="showConfirmModal">
<span class="d-flex"><i class="mdi mdi-18px mdi-delete text-light pr-1" /> {{ t('word.delete') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-delete text-light pr-1" /> {{ t('general.delete') }}</span>
</div> </div>
<ConfirmModal <ConfirmModal
@@ -31,24 +31,24 @@
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mr-1" :class="[contextConnection.isFolder ? 'mdi-folder-remove' : 'mdi-server-remove']" /> {{ t(contextConnection.isFolder ? 'message.deleteFolder' : 'message.deleteConnection') }} <i class="mdi mdi-24px mr-1" :class="[contextConnection.isFolder ? 'mdi-folder-remove' : 'mdi-server-remove']" /> {{ t(contextConnection.isFolder ? 'application.deleteFolder' : 'connection.deleteConnection') }}
</div> </div>
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
{{ t('message.deleteCorfirm') }} <b>{{ connectionName }}</b>? {{ t('general.deleteConfirm') }} <b>{{ connectionName }}</b>?
</div> </div>
</template> </template>
</ConfirmModal> </ConfirmModal>
<ModalFolderAppearence <ModalFolderAppearance
v-if="isFolderEdit" v-if="isFolderEdit"
:folder="contextConnection" :folder="contextConnection"
@close="hideAppearenceModal" @close="hideAppearanceModal"
/> />
<ModalConnectionAppearence <ModalConnectionAppearance
v-if="isConnectionEdit" v-if="isConnectionEdit"
:connection="contextConnection" :connection="contextConnection"
@close="hideAppearenceModal" @close="hideAppearanceModal"
/> />
</BaseContextMenu> </BaseContextMenu>
</template> </template>
@@ -62,8 +62,8 @@ import { SidebarElement, useConnectionsStore } from '@/stores/connections';
import { useWorkspacesStore } from '@/stores/workspaces'; import { useWorkspacesStore } from '@/stores/workspaces';
import BaseContextMenu from '@/components/BaseContextMenu.vue'; import BaseContextMenu from '@/components/BaseContextMenu.vue';
import ConfirmModal from '@/components/BaseConfirmModal.vue'; import ConfirmModal from '@/components/BaseConfirmModal.vue';
import ModalFolderAppearence from '@/components/ModalFolderAppearence.vue'; import ModalFolderAppearance from '@/components/ModalFolderAppearance.vue';
import ModalConnectionAppearence from '@/components/ModalConnectionAppearence.vue'; import ModalConnectionAppearance from '@/components/ModalConnectionAppearance.vue';
const { t } = useI18n(); const { t } = useI18n();
@@ -96,7 +96,7 @@ const isConfirmModal = ref(false);
const isFolderEdit = ref(false); const isFolderEdit = ref(false);
const isConnectionEdit = 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 isConnected = computed(() => getWorkspace(props.contextConnection.uid)?.connectionStatus === 'connected');
const confirmDeleteConnection = () => { const confirmDeleteConnection = () => {
@@ -118,14 +118,14 @@ const duplicateConnection = () => {
closeContext(); closeContext();
}; };
const showAppearenceModal = () => { const showAppearanceModal = () => {
if (props.contextConnection.isFolder) if (props.contextConnection.isFolder)
isFolderEdit.value = true; isFolderEdit.value = true;
else else
isConnectionEdit.value = true; isConnectionEdit.value = true;
}; };
const hideAppearenceModal = () => { const hideAppearanceModal = () => {
isConnectionEdit.value = false; isConnectionEdit.value = false;
isFolderEdit.value = false; isFolderEdit.value = false;
closeContext(); closeContext();

View File

@@ -12,7 +12,7 @@
</li> </li>
<li v-if="connectionInfos && connectionInfos.readonly" class="footer-element"> <li v-if="connectionInfos && connectionInfos.readonly" class="footer-element">
<i class="mdi mdi-18px mdi-lock mr-1" /> <i class="mdi mdi-18px mdi-lock mr-1" />
<small>{{ t('message.readOnlyMode') }}</small> <small>{{ t('connection.readOnlyMode') }}</small>
</li> </li>
<li v-if="connectionInfos && connectionInfos.ssl" class="footer-element"> <li v-if="connectionInfos && connectionInfos.ssl" class="footer-element">
<i class="mdi mdi-18px mdi-shield-key mr-1" /> <i class="mdi mdi-18px mdi-shield-key mr-1" />
@@ -33,22 +33,22 @@
@click="toggleConsole()" @click="toggleConsole()"
> >
<i class="mdi mdi-18px mdi-console-line mr-1" /> <i class="mdi mdi-18px mdi-console-line mr-1" />
<small>{{ t('word.console') }}</small> <small>{{ t('application.console') }}</small>
</li> </li>
<li class="footer-element footer-link" @click="openOutside('https://www.paypal.com/paypalme/fabiodistasio')"> <li class="footer-element footer-link" @click="openOutside('https://www.paypal.com/paypalme/fabiodistasio')">
<i class="mdi mdi-18px mdi-coffee mr-1" /> <i class="mdi mdi-18px mdi-coffee mr-1" />
<small>{{ t('word.donate') }}</small> <small>{{ t('general.donate') }}</small>
</li> </li>
<li <li
class="footer-element footer-link" class="footer-element footer-link"
:title="t('message.reportABug')" :title="t('application.reportABug')"
@click="openOutside('https://github.com/antares-sql/antares/issues')" @click="openOutside('https://github.com/antares-sql/antares/issues')"
> >
<i class="mdi mdi-18px mdi-bug" /> <i class="mdi mdi-18px mdi-bug" />
</li> </li>
<li <li
class="footer-element footer-link" class="footer-element footer-link"
:title="t('word.about')" :title="t('application.about')"
@click="showSettingModal('about')" @click="showSettingModal('about')"
> >
<i class="mdi mdi-18px mdi-information-outline" /> <i class="mdi mdi-18px mdi-information-outline" />

View File

@@ -1,14 +1,14 @@
<template> <template>
<ConfirmModal <ConfirmModal
:confirm-text="t('word.update')" :confirm-text="t('application.update')"
:cancel-text="t('word.close')" :cancel-text="t('general.close')"
size="large" size="large"
:hide-footer="true" :hide-footer="true"
@hide="hideScratchpad" @hide="hideScratchpad"
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-notebook-edit-outline mr-1" /> {{ t('word.scratchpad') }} <i class="mdi mdi-24px mdi-notebook-edit-outline mr-1" /> {{ t('application.scratchpad') }}
</div> </div>
</template> </template>
<template #body> <template #body>
@@ -22,7 +22,7 @@
:show-line-numbers="false" :show-line-numbers="false"
/> />
</div> </div>
<small class="text-gray">{{ t('message.markdownSupported') }}</small> <small class="text-gray">{{ t('application.markdownSupported') }}</small>
</div> </div>
</template> </template>
</ConfirmModal> </ConfirmModal>

View File

@@ -22,7 +22,7 @@
v-tooltip="{ v-tooltip="{
strategy: 'fixed', strategy: 'fixed',
placement: 'right', placement: 'right',
content: t('message.allConnections') content: t('connection.allConnections')
}" }"
class="settingbar-element btn btn-link" class="settingbar-element btn btn-link"
@click="emit('show-connections-modal')" @click="emit('show-connections-modal')"
@@ -35,7 +35,7 @@
v-tooltip="{ v-tooltip="{
strategy: 'fixed', strategy: 'fixed',
placement: 'right', placement: 'right',
content: t('message.addConnection') content: t('connection.addConnection')
}" }"
class="settingbar-element btn btn-link" class="settingbar-element btn btn-link"
:class="{ 'selected': 'NEW' === selectedWorkspace }" :class="{ 'selected': 'NEW' === selectedWorkspace }"
@@ -55,7 +55,7 @@
v-tooltip="{ v-tooltip="{
strategy: 'fixed', strategy: 'fixed',
placement: 'right', placement: 'right',
content: t('word.scratchpad') content: t('application.scratchpad')
}" }"
class="settingbar-element btn btn-link" class="settingbar-element btn btn-link"
@click="showScratchpad" @click="showScratchpad"
@@ -66,7 +66,7 @@
v-tooltip="{ v-tooltip="{
strategy: 'fixed', strategy: 'fixed',
placement: 'right', placement: 'right',
content: t('word.settings') content: t('application.settings')
}" }"
class="settingbar-element btn btn-link" class="settingbar-element btn btn-link"
@click="showSettingModal('general')" @click="showSettingModal('general')"

View File

@@ -63,7 +63,7 @@ const isLinux = process.platform === 'linux';
const windowTitle = computed(() => { const windowTitle = computed(() => {
if (!selectedWorkspace.value) return ''; 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 connectionName = getConnectionName(selectedWorkspace.value);
const workspace = getWorkspace(selectedWorkspace.value); const workspace = getWorkspace(selectedWorkspace.value);

View File

@@ -1,5 +1,15 @@
<template> <template>
<div v-show="isSelected" class="workspace column columns col-gapless"> <div v-show="isSelected" class="workspace column columns col-gapless">
<WorkspaceTabsContext
v-if="isTabContext"
:context-event="contextEvent"
:selected-tab="selectedContextTab"
@close-all-tabs="closeAllTabs"
@close-other-tabs="closeOtherTabs"
@close-to-left="closeTabsToLeft"
@close-to-right="closeTabsToRight"
@close-context="closeContext"
/>
<WorkspaceExploreBar <WorkspaceExploreBar
v-if="workspace?.connectionStatus === 'connected'" v-if="workspace?.connectionStatus === 'connected'"
:connection="connection" :connection="connection"
@@ -23,6 +33,7 @@
:class="{'active': selectedTab === element.uid}" :class="{'active': selectedTab === element.uid}"
@mousedown.left="selectTab({uid: workspace.uid, tab: element.uid})" @mousedown.left="selectTab({uid: workspace.uid, tab: element.uid})"
@mouseup.middle="closeTab(element)" @mouseup.middle="closeTab(element)"
@contextmenu.prevent="contextMenu($event, element)"
> >
<a <a
v-if="element.type === 'query'" v-if="element.type === 'query'"
@@ -34,7 +45,7 @@
<span>{{ cutText(element.content || 'Query', 20, true) }} #{{ element.index }}</span> <span>{{ cutText(element.content || 'Query', 20, true) }} #{{ element.index }}</span>
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -47,11 +58,11 @@
@dblclick="openAsPermanentTab(element)" @dblclick="openAsPermanentTab(element)"
> >
<i class="mdi mdi-18px mr-1" :class="element.elementType === 'view' ? 'mdi-table-eye' : 'mdi-table'" /> <i class="mdi mdi-18px mr-1" :class="element.elementType === 'view' ? 'mdi-table-eye' : 'mdi-table'" />
<span :title="`${t('word.data').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('general.data').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
<span class=" text-italic">{{ cutText(element.elementName, 20, true) }}</span> <span class=" text-italic">{{ cutText(element.elementName, 20, true) }}</span>
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -60,11 +71,11 @@
<a v-else-if="element.type === 'data'" class="tab-link"> <a v-else-if="element.type === 'data'" class="tab-link">
<i class="mdi mdi-18px mr-1" :class="element.elementType === 'view' ? 'mdi-table-eye' : 'mdi-table'" /> <i class="mdi mdi-18px mr-1" :class="element.elementType === 'view' ? 'mdi-table-eye' : 'mdi-table'" />
<span :title="`${t('word.data').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('general.data').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
{{ cutText(element.elementName, 20, true) }} {{ cutText(element.elementName, 20, true) }}
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -77,11 +88,11 @@
:class="{'badge': element.isChanged}" :class="{'badge': element.isChanged}"
> >
<i class="mdi mdi-shape-square-plus mdi-18px mr-1" /> <i class="mdi mdi-shape-square-plus mdi-18px mr-1" />
<span :title="`${t('word.new').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('general.new').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
{{ t('message.newTable') }} {{ t('database.newTable') }}
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -93,12 +104,12 @@
class="tab-link" class="tab-link"
:class="{'badge': element.isChanged}" :class="{'badge': element.isChanged}"
> >
<i class="mdi mdi-tune-vertical-variant mdi-18px mr-1" /> <i class="mdi mdi-wrench-cog mdi-18px mr-1" />
<span :title="`${t('word.settings').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('application.settings').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
{{ cutText(element.elementName, 20, true) }} {{ cutText(element.elementName, 20, true) }}
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -110,12 +121,12 @@
class="tab-link" class="tab-link"
:class="{'badge': element.isChanged}" :class="{'badge': element.isChanged}"
> >
<i class="mdi mdi-tune-vertical-variant mdi-18px mr-1" /> <i class="mdi mdi-wrench-cog mdi-18px mr-1" />
<span :title="`${t('word.settings').toUpperCase()}: ${t(`word.view`)}`"> <span :title="`${t('application.settings').toUpperCase()}: ${t(`database.view`)}`">
{{ cutText(element.elementName, 20, true) }} {{ cutText(element.elementName, 20, true) }}
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -128,11 +139,11 @@
:class="{'badge': element.isChanged}" :class="{'badge': element.isChanged}"
> >
<i class="mdi mdi-shape-square-plus mdi-18px mr-1" /> <i class="mdi mdi-shape-square-plus mdi-18px mr-1" />
<span :title="`${t('word.new').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('general.new').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
{{ t('message.newView') }} {{ t('database.newView') }}
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -145,11 +156,11 @@
:class="{'badge': element.isChanged}" :class="{'badge': element.isChanged}"
> >
<i class="mdi mdi-shape-square-plus mdi-18px mr-1" /> <i class="mdi mdi-shape-square-plus mdi-18px mr-1" />
<span :title="`${t('word.new').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('general.new').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
{{ t('message.newTrigger') }} {{ t('database.newTrigger') }}
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -162,11 +173,11 @@
:class="{'badge': element.isChanged}" :class="{'badge': element.isChanged}"
> >
<i class="mdi mdi-shape-square-plus mdi-18px mr-1" /> <i class="mdi mdi-shape-square-plus mdi-18px mr-1" />
<span :title="`${t('word.new').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('general.new').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
{{ t('message.newRoutine') }} {{ t('database.newRoutine') }}
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -179,11 +190,11 @@
:class="{'badge': element.isChanged}" :class="{'badge': element.isChanged}"
> >
<i class="mdi mdi-shape-square-plus mdi-18px mr-1" /> <i class="mdi mdi-shape-square-plus mdi-18px mr-1" />
<span :title="`${t('word.new').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('general.new').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
{{ t('message.newFunction') }} {{ t('database.newFunction') }}
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -196,11 +207,11 @@
:class="{'badge': element.isChanged}" :class="{'badge': element.isChanged}"
> >
<i class="mdi mdi-shape-square-plus mdi-18px mr-1" /> <i class="mdi mdi-shape-square-plus mdi-18px mr-1" />
<span :title="`${t('word.new').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('general.new').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
{{ t('message.newTriggerFunction') }} {{ t('database.newTriggerFunction') }}
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -213,11 +224,11 @@
:class="{'badge': element.isChanged}" :class="{'badge': element.isChanged}"
> >
<i class="mdi mdi-shape-square-plus mdi-18px mr-1" /> <i class="mdi mdi-shape-square-plus mdi-18px mr-1" />
<span :title="`${t('word.new').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('general.new').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
{{ t('message.newScheduler') }} {{ t('database.newScheduler') }}
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -230,12 +241,12 @@
:class="{'badge': element.isChanged}" :class="{'badge': element.isChanged}"
@dblclick="openAsPermanentTab(element)" @dblclick="openAsPermanentTab(element)"
> >
<i class="mdi mdi-18px mdi-tune-vertical-variant mr-1" /> <i class="mdi mdi-18px mdi-wrench-cog mr-1" />
<span :title="`${t('word.settings').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('application.settings').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
<span class=" text-italic">{{ cutText(element.elementName, 20, true) }}</span> <span class=" text-italic">{{ cutText(element.elementName, 20, true) }}</span>
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -247,12 +258,12 @@
class="tab-link" class="tab-link"
:class="{'badge': element.isChanged}" :class="{'badge': element.isChanged}"
> >
<i class="mdi mdi-18px mdi-tune-vertical-variant mr-1" /> <i class="mdi mdi-18px mdi-wrench-cog mr-1" />
<span :title="`${t('word.settings').toUpperCase()}: ${t(`word.${element.elementType}`)}`"> <span :title="`${t('application.settings').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
{{ cutText(element.elementName, 20, true) }} {{ cutText(element.elementName, 20, true) }}
<span <span
class="btn btn-clear" class="btn btn-clear"
:title="t('word.close')" :title="t('general.close')"
@mousedown.left.stop @mousedown.left.stop
@click.stop="closeTab(element)" @click.stop="closeTab(element)"
/> />
@@ -268,7 +279,7 @@
<a <a
class="tab-link workspace-tools-link dropdown-toggle" class="tab-link workspace-tools-link dropdown-toggle"
tabindex="0" tabindex="0"
:title="t('word.tools')" :title="t('general.tools')"
> >
<i class="mdi mdi-24px mdi-tools" /> <i class="mdi mdi-24px mdi-tools" />
</a> </a>
@@ -276,13 +287,13 @@
<li class="menu-item"> <li class="menu-item">
<a class="c-hand p-vcentered" @click="showProcessesModal"> <a class="c-hand p-vcentered" @click="showProcessesModal">
<i class="mdi mdi-memory mr-1 tool-icon" /> <i class="mdi mdi-memory mr-1 tool-icon" />
<span>{{ t('message.processesList') }}</span> <span>{{ t('database.processesList') }}</span>
</a> </a>
</li> </li>
<li class="menu-item"> <li class="menu-item">
<a class="c-hand p-vcentered" @click="toggleConsole"> <a class="c-hand p-vcentered" @click="toggleConsole">
<i class="mdi mdi-console-line mr-1 tool-icon" /> <i class="mdi mdi-console-line mr-1 tool-icon" />
<span>{{ t('word.console') }}</span> <span>{{ t('application.console') }}</span>
</a> </a>
</li> </li>
<li <li
@@ -292,7 +303,7 @@
> >
<a class="c-hand p-vcentered disabled"> <a class="c-hand p-vcentered disabled">
<i class="mdi mdi-shape mr-1 tool-icon" /> <i class="mdi mdi-shape mr-1 tool-icon" />
<span>{{ t('word.variables') }}</span> <span>{{ t('database.variables') }}</span>
</a> </a>
</li> </li>
<li <li
@@ -302,7 +313,7 @@
> >
<a class="c-hand p-vcentered disabled"> <a class="c-hand p-vcentered disabled">
<i class="mdi mdi-account-group mr-1 tool-icon" /> <i class="mdi mdi-account-group mr-1 tool-icon" />
<span>{{ t('message.manageUsers') }}</span> <span>{{ t('database.manageUsers') }}</span>
</a> </a>
</li> </li>
</ul> </ul>
@@ -312,7 +323,7 @@
<li class="tab-item"> <li class="tab-item">
<a <a
class="tab-add" class="tab-add"
:title="t('message.openNewTab')" :title="t('application.openNewTab')"
@click="addQueryTab" @click="addQueryTab"
> >
<i class="mdi mdi-24px mdi-plus" /> <i class="mdi mdi-24px mdi-plus" />
@@ -320,8 +331,8 @@
</li> </li>
</template> </template>
</Draggable> </Draggable>
<WorkspaceEmptyState v-if="!workspace.tabs.length" @new-tab="addQueryTab" /> <WorkspaceEmptyState v-if="!draggableTabs.length" @new-tab="addQueryTab" />
<template v-for="tab of workspace.tabs" :key="tab.uid"> <template v-for="tab of draggableTabs" :key="tab.uid">
<WorkspaceTabQuery <WorkspaceTabQuery
v-if="tab.type ==='query'" v-if="tab.type ==='query'"
:tab-uid="tab.uid" :tab-uid="tab.uid"
@@ -501,6 +512,7 @@ import WorkspaceTabNewRoutine from '@/components/WorkspaceTabNewRoutine.vue';
import WorkspaceTabNewFunction from '@/components/WorkspaceTabNewFunction.vue'; import WorkspaceTabNewFunction from '@/components/WorkspaceTabNewFunction.vue';
import WorkspaceTabNewScheduler from '@/components/WorkspaceTabNewScheduler.vue'; import WorkspaceTabNewScheduler from '@/components/WorkspaceTabNewScheduler.vue';
import WorkspaceTabNewTriggerFunction from '@/components/WorkspaceTabNewTriggerFunction.vue'; import WorkspaceTabNewTriggerFunction from '@/components/WorkspaceTabNewTriggerFunction.vue';
import WorkspaceTabsContext from '@/components/WorkspaceTabsContext.vue';
import WorkspaceTabPropsTable from '@/components/WorkspaceTabPropsTable.vue'; import WorkspaceTabPropsTable from '@/components/WorkspaceTabPropsTable.vue';
import WorkspaceTabPropsView from '@/components/WorkspaceTabPropsView.vue'; import WorkspaceTabPropsView from '@/components/WorkspaceTabPropsView.vue';
@@ -545,11 +557,18 @@ const hasWheelEvent = ref(false);
const isProcessesModal = ref(false); const isProcessesModal = ref(false);
const unsavedTab = ref(null); const unsavedTab = ref(null);
const tabWrap = ref(null); const tabWrap = ref(null);
const contextEvent = ref(null);
const isTabContext = ref(false);
const selectedContextTab = ref(null);
const workspace = computed(() => getWorkspace(props.connection.uid)); const workspace = computed(() => getWorkspace(props.connection.uid));
const draggableTabs = computed<WorkspaceTab[]>({ const draggableTabs = computed<WorkspaceTab[]>({
get () { get () {
if (workspace.value.customizations.database)
return workspace.value.tabs.filter(tab => tab.type === 'query' || tab.database === workspace.value.database);
else
return workspace.value.tabs; return workspace.value.tabs;
}, },
set (val) { set (val) {
@@ -627,6 +646,34 @@ const closeTab = (tab: WorkspaceTab, force = false) => {
removeTab({ uid: props.connection.uid, tab: tab.uid }); removeTab({ uid: props.connection.uid, tab: tab.uid });
}; };
const closeAllTabs = () => {
for (const tab of draggableTabs.value)
removeTab({ uid: props.connection.uid, tab: tab.uid });
};
const closeOtherTabs = () => {
const otherTabs = draggableTabs.value.filter(t => t.uid !== selectedContextTab.value.uid);
for (const tab of otherTabs)
removeTab({ uid: props.connection.uid, tab: tab.uid });
};
const closeTabsToLeft = () => {
const tabIndex = draggableTabs.value.findIndex(t => t.uid === selectedContextTab.value.uid);
const leftTabs = draggableTabs.value.filter((t, i) => i < tabIndex);
for (const tab of leftTabs)
removeTab({ uid: props.connection.uid, tab: tab.uid });
};
const closeTabsToRight = () => {
const tabIndex = draggableTabs.value.findIndex(t => t.uid === selectedContextTab.value.uid);
const leftTabs = draggableTabs.value.filter((t, i) => i > tabIndex);
for (const tab of leftTabs)
removeTab({ uid: props.connection.uid, tab: tab.uid });
};
const showProcessesModal = () => { const showProcessesModal = () => {
isProcessesModal.value = true; isProcessesModal.value = true;
}; };
@@ -647,6 +694,16 @@ const addWheelEvent = () => {
} }
}; };
const contextMenu = (event: MouseEvent, tab: WorkspaceTab) => {
selectedContextTab.value = tab;
contextEvent.value = event;
isTabContext.value = true;
};
const closeContext = () => {
isTabContext.value = false;
};
(async () => { (async () => {
await addWorkspace(props.connection.uid); await addWorkspace(props.connection.uid);
const isInitiated = await Connection.checkConnection(props.connection.uid); const isInitiated = await Connection.checkConnection(props.connection.uid);

View File

@@ -8,7 +8,7 @@
:class="{'active': selectedTab === 'general'}" :class="{'active': selectedTab === 'general'}"
@click="selectTab('general')" @click="selectTab('general')"
> >
<a class="tab-link">{{ t('word.general') }}</a> <a class="tab-link">{{ t('application.general') }}</a>
</li> </li>
<li <li
v-if="clientCustomizations.sslConnection" v-if="clientCustomizations.sslConnection"
@@ -16,7 +16,7 @@
:class="{'active': selectedTab === 'ssl'}" :class="{'active': selectedTab === 'ssl'}"
@click="selectTab('ssl')" @click="selectTab('ssl')"
> >
<a class="tab-link">{{ t('word.ssl') }}</a> <a class="tab-link">{{ t('connection.ssl') }}</a>
</li> </li>
<li <li
v-if="clientCustomizations.sshConnection" v-if="clientCustomizations.sshConnection"
@@ -24,7 +24,7 @@
:class="{'active': selectedTab === 'ssh'}" :class="{'active': selectedTab === 'ssh'}"
@click="selectTab('ssh')" @click="selectTab('ssh')"
> >
<a class="tab-link">{{ t('word.sshTunnel') }}</a> <a class="tab-link">{{ t('connection.sshTunnel') }}</a>
</li> </li>
</ul> </ul>
</div> </div>
@@ -34,7 +34,7 @@
<fieldset class="m-0" :disabled="isBusy"> <fieldset class="m-0" :disabled="isBusy">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.connectionName') }}</label> <label class="form-label cut-text">{{ t('connection.connectionName') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -47,7 +47,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.client') }}</label> <label class="form-label cut-text">{{ t('connection.client') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseSelect <BaseSelect
@@ -61,7 +61,7 @@
</div> </div>
<div v-if="connection.client === 'pg'" class="form-group columns"> <div v-if="connection.client === 'pg'" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.connectionString') }}</label> <label class="form-label cut-text">{{ t('connection.connectionString') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -74,7 +74,7 @@
</div> </div>
<div v-if="!clientCustomizations.fileConnection" class="form-group columns"> <div v-if="!clientCustomizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.hostName') }}/IP</label> <label class="form-label cut-text">{{ t('connection.hostName') }}/IP</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -86,12 +86,12 @@
</div> </div>
<div v-if="clientCustomizations.fileConnection" class="form-group columns"> <div v-if="clientCustomizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.database') }}</label> <label class="form-label cut-text">{{ t('database.database') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
:model-value="connection.databasePath" :model-value="connection.databasePath"
:message="t('word.browse')" :message="t('general.browse')"
@clear="pathClear('databasePath')" @clear="pathClear('databasePath')"
@change="pathSelection($event, 'databasePath')" @change="pathSelection($event, 'databasePath')"
/> />
@@ -99,7 +99,7 @@
</div> </div>
<div v-if="!clientCustomizations.fileConnection" class="form-group columns"> <div v-if="!clientCustomizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.port') }}</label> <label class="form-label cut-text">{{ t('connection.port') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -113,19 +113,20 @@
</div> </div>
<div v-if="clientCustomizations.database" class="form-group columns"> <div v-if="clientCustomizations.database" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.database') }}</label> <label class="form-label cut-text">{{ t('database.database') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
v-model="connection.database" v-model="connection.database"
class="form-input" class="form-input"
type="text" type="text"
:placeholder="clientCustomizations.defaultDatabase"
> >
</div> </div>
</div> </div>
<div v-if="!clientCustomizations.fileConnection" class="form-group columns"> <div v-if="!clientCustomizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.user') }}</label> <label class="form-label cut-text">{{ t('connection.user') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -138,7 +139,7 @@
</div> </div>
<div v-if="!clientCustomizations.fileConnection" class="form-group columns"> <div v-if="!clientCustomizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.password') }}</label> <label class="form-label cut-text">{{ t('connection.password') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -151,14 +152,14 @@
</div> </div>
<div v-if="clientCustomizations.connectionSchema" class="form-group columns"> <div v-if="clientCustomizations.connectionSchema" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.schema') }}</label> <label class="form-label cut-text">{{ t('database.schema') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
v-model="connection.schema" v-model="connection.schema"
class="form-input" class="form-input"
type="text" type="text"
:placeholder="t('word.all')" :placeholder="t('general.all')"
> >
</div> </div>
</div> </div>
@@ -166,7 +167,7 @@
<div class="column col-4 col-sm-12" /> <div class="column col-4 col-sm-12" />
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<label class="form-checkbox form-inline"> <label class="form-checkbox form-inline">
<input v-model="connection.readonly" type="checkbox"><i class="form-icon" /> {{ t('message.readOnlyMode') }} <input v-model="connection.readonly" type="checkbox"><i class="form-icon" /> {{ t('connection.readOnlyMode') }}
</label> </label>
</div> </div>
</div> </div>
@@ -174,7 +175,7 @@
<div class="column col-4 col-sm-12" /> <div class="column col-4 col-sm-12" />
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<label class="form-checkbox form-inline"> <label class="form-checkbox form-inline">
<input v-model="connection.ask" type="checkbox"><i class="form-icon" /> {{ t('message.askCredentials') }} <input v-model="connection.ask" type="checkbox"><i class="form-icon" /> {{ t('connection.askCredentials') }}
</label> </label>
</div> </div>
</div> </div>
@@ -188,7 +189,7 @@
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text"> <label class="form-label cut-text">
{{ t('message.enableSsl') }} {{ t('connection.enableSsl') }}
</label> </label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
@@ -201,12 +202,12 @@
<fieldset class="m-0" :disabled="isBusy || !connection.ssl"> <fieldset class="m-0" :disabled="isBusy || !connection.ssl">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.privateKey') }}</label> <label class="form-label cut-text">{{ t('connection.privateKey') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
:model-value="connection.key" :model-value="connection.key"
:message="t('word.browse')" :message="t('general.browse')"
@clear="pathClear('key')" @clear="pathClear('key')"
@change="pathSelection($event, 'key')" @change="pathSelection($event, 'key')"
/> />
@@ -214,12 +215,12 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.certificate') }}</label> <label class="form-label cut-text">{{ t('connection.certificate') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
:model-value="connection.cert" :model-value="connection.cert"
:message="t('word.browse')" :message="t('general.browse')"
@clear="pathClear('cert')" @clear="pathClear('cert')"
@change="pathSelection($event, 'cert')" @change="pathSelection($event, 'cert')"
/> />
@@ -227,12 +228,12 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.caCertificate') }}</label> <label class="form-label cut-text">{{ t('connection.caCertificate') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
:model-value="connection.ca" :model-value="connection.ca"
:message="t('word.browse')" :message="t('general.browse')"
@clear="pathClear('ca')" @clear="pathClear('ca')"
@change="pathSelection($event, 'ca')" @change="pathSelection($event, 'ca')"
/> />
@@ -240,7 +241,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.ciphers') }}</label> <label class="form-label cut-text">{{ t('connection.ciphers') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -255,7 +256,7 @@
<div class="column col-4 col-sm-12" /> <div class="column col-4 col-sm-12" />
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<label class="form-checkbox form-inline"> <label class="form-checkbox form-inline">
<input v-model="connection.untrustedConnection" type="checkbox"><i class="form-icon" /> {{ t('message.untrustedConnection') }} <input v-model="connection.untrustedConnection" type="checkbox"><i class="form-icon" /> {{ t('connection.untrustedConnection') }}
</label> </label>
</div> </div>
</div> </div>
@@ -269,7 +270,7 @@
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text"> <label class="form-label cut-text">
{{ t('message.enableSsh') }} {{ t('connection.enableSsh') }}
</label> </label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
@@ -282,7 +283,7 @@
<fieldset class="m-0" :disabled="isBusy || !connection.ssh"> <fieldset class="m-0" :disabled="isBusy || !connection.ssh">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.hostName') }}/IP</label> <label class="form-label cut-text">{{ t('connection.hostName') }}/IP</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -294,7 +295,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.user') }}</label> <label class="form-label cut-text">{{ t('connection.user') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -306,7 +307,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.password') }}</label> <label class="form-label cut-text">{{ t('connection.password') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -318,7 +319,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.port') }}</label> <label class="form-label cut-text">{{ t('connection.port') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -332,12 +333,12 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.privateKey') }}</label> <label class="form-label cut-text">{{ t('connection.privateKey') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
:model-value="connection.sshKey" :model-value="connection.sshKey"
:message="t('word.browse')" :message="t('general.browse')"
@clear="pathClear('sshKey')" @clear="pathClear('sshKey')"
@change="pathSelection($event, 'sshKey')" @change="pathSelection($event, 'sshKey')"
/> />
@@ -345,7 +346,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.passphrase') }}</label> <label class="form-label cut-text">{{ t('connection.passphrase') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -368,7 +369,7 @@
@click="startTest" @click="startTest"
> >
<i class="mdi mdi-24px mdi-lightning-bolt mr-1" /> <i class="mdi mdi-24px mdi-lightning-bolt mr-1" />
{{ t('message.testConnection') }} {{ t('connection.testConnection') }}
</button> </button>
<button <button
id="connection-save" id="connection-save"
@@ -377,7 +378,7 @@
@click="saveConnection" @click="saveConnection"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
{{ t('word.save') }} {{ t('general.save') }}
</button> </button>
</div> </div>
</div> </div>
@@ -483,7 +484,7 @@ const startTest = async () => {
if (res.status === 'error') if (res.status === 'error')
addNotification({ status: 'error', message: res.response.message || res.response.toString() }); addNotification({ status: 'error', message: res.response.message || res.response.toString() });
else else
addNotification({ status: 'success', message: t('message.connectionSuccessfullyMade') }); addNotification({ status: 'success', message: t('connection.connectionSuccessfullyMade') });
} }
catch (err) { catch (err) {
addNotification({ status: 'error', message: err.stack }); addNotification({ status: 'error', message: err.stack });
@@ -507,7 +508,7 @@ const continueTest = async (credentials: { user: string; password: string }) =>
if (res.status === 'error') if (res.status === 'error')
addNotification({ status: 'error', message: res.response.message || res.response.toString() }); addNotification({ status: 'error', message: res.response.message || res.response.toString() });
else else
addNotification({ status: 'success', message: t('message.connectionSuccessfullyMade') }); addNotification({ status: 'success', message: t('connection.connectionSuccessfullyMade') });
} }
} }
catch (err) { catch (err) {

View File

@@ -8,7 +8,7 @@
:class="{'active': selectedTab === 'general'}" :class="{'active': selectedTab === 'general'}"
@click="selectTab('general')" @click="selectTab('general')"
> >
<a class="tab-link">{{ t('word.general') }}</a> <a class="tab-link">{{ t('application.general') }}</a>
</li> </li>
<li <li
v-if="clientCustomizations.sslConnection" v-if="clientCustomizations.sslConnection"
@@ -16,7 +16,7 @@
:class="{'active': selectedTab === 'ssl'}" :class="{'active': selectedTab === 'ssl'}"
@click="selectTab('ssl')" @click="selectTab('ssl')"
> >
<a class="tab-link">{{ t('word.ssl') }}</a> <a class="tab-link">{{ t('connection.ssl') }}</a>
</li> </li>
<li <li
v-if="clientCustomizations.sshConnection" v-if="clientCustomizations.sshConnection"
@@ -24,7 +24,7 @@
:class="{'active': selectedTab === 'ssh'}" :class="{'active': selectedTab === 'ssh'}"
@click="selectTab('ssh')" @click="selectTab('ssh')"
> >
<a class="tab-link">{{ t('word.sshTunnel') }}</a> <a class="tab-link">{{ t('connection.sshTunnel') }}</a>
</li> </li>
</ul> </ul>
</div> </div>
@@ -34,7 +34,7 @@
<fieldset class="m-0" :disabled="isBusy"> <fieldset class="m-0" :disabled="isBusy">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.connectionName') }}</label> <label class="form-label cut-text">{{ t('connection.connectionName') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -47,7 +47,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.client') }}</label> <label class="form-label cut-text">{{ t('connection.client') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseSelect <BaseSelect
@@ -63,7 +63,7 @@
</div> </div>
<div v-if="localConnection.client === 'pg'" class="form-group columns"> <div v-if="localConnection.client === 'pg'" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.connectionString') }}</label> <label class="form-label cut-text">{{ t('connection.connectionString') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -76,7 +76,7 @@
</div> </div>
<div v-if="!clientCustomizations.fileConnection" class="form-group columns"> <div v-if="!clientCustomizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.hostName') }}/IP</label> <label class="form-label cut-text">{{ t('connection.hostName') }}/IP</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -88,12 +88,12 @@
</div> </div>
<div v-if="clientCustomizations.fileConnection" class="form-group columns"> <div v-if="clientCustomizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.database') }}</label> <label class="form-label cut-text">{{ t('database.database') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
:model-value="localConnection.databasePath" :model-value="localConnection.databasePath"
:message="t('word.browse')" :message="t('general.browse')"
@clear="pathClear('databasePath')" @clear="pathClear('databasePath')"
@change="pathSelection($event, 'databasePath')" @change="pathSelection($event, 'databasePath')"
/> />
@@ -101,7 +101,7 @@
</div> </div>
<div v-if="!clientCustomizations.fileConnection" class="form-group columns"> <div v-if="!clientCustomizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.port') }}</label> <label class="form-label cut-text">{{ t('connection.port') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -115,19 +115,20 @@
</div> </div>
<div v-if="clientCustomizations.database" class="form-group columns"> <div v-if="clientCustomizations.database" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.database') }}</label> <label class="form-label cut-text">{{ t('database.database') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
v-model="localConnection.database" v-model="localConnection.database"
class="form-input" class="form-input"
type="text" type="text"
:placeholder="clientCustomizations.defaultDatabase"
> >
</div> </div>
</div> </div>
<div v-if="!clientCustomizations.fileConnection" class="form-group columns"> <div v-if="!clientCustomizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.user') }}</label> <label class="form-label cut-text">{{ t('connection.user') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -140,7 +141,7 @@
</div> </div>
<div v-if="!clientCustomizations.fileConnection" class="form-group columns"> <div v-if="!clientCustomizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.password') }}</label> <label class="form-label cut-text">{{ t('connection.password') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -153,14 +154,14 @@
</div> </div>
<div v-if="clientCustomizations.connectionSchema" class="form-group columns"> <div v-if="clientCustomizations.connectionSchema" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.schema') }}</label> <label class="form-label cut-text">{{ t('database.schema') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
v-model="localConnection.schema" v-model="localConnection.schema"
class="form-input" class="form-input"
type="text" type="text"
:placeholder="t('word.all')" :placeholder="t('general.all')"
> >
</div> </div>
</div> </div>
@@ -168,7 +169,7 @@
<div class="column col-4 col-sm-12" /> <div class="column col-4 col-sm-12" />
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<label class="form-checkbox form-inline"> <label class="form-checkbox form-inline">
<input v-model="localConnection.readonly" type="checkbox"><i class="form-icon" /> {{ t('message.readOnlyMode') }} <input v-model="localConnection.readonly" type="checkbox"><i class="form-icon" /> {{ t('connection.readOnlyMode') }}
</label> </label>
</div> </div>
</div> </div>
@@ -176,7 +177,7 @@
<div class="column col-4 col-sm-12" /> <div class="column col-4 col-sm-12" />
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<label class="form-checkbox form-inline"> <label class="form-checkbox form-inline">
<input v-model="localConnection.ask" type="checkbox"><i class="form-icon" /> {{ t('message.askCredentials') }} <input v-model="localConnection.ask" type="checkbox"><i class="form-icon" /> {{ t('connection.askCredentials') }}
</label> </label>
</div> </div>
</div> </div>
@@ -190,7 +191,7 @@
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text"> <label class="form-label cut-text">
{{ t('message.enableSsl') }} {{ t('connection.enableSsl') }}
</label> </label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
@@ -203,12 +204,12 @@
<fieldset class="m-0" :disabled="isBusy || !localConnection.ssl"> <fieldset class="m-0" :disabled="isBusy || !localConnection.ssl">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.privateKey') }}</label> <label class="form-label cut-text">{{ t('connection.privateKey') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
:model-value="localConnection.key" :model-value="localConnection.key"
:message="t('word.browse')" :message="t('general.browse')"
@clear="pathClear('key')" @clear="pathClear('key')"
@change="pathSelection($event, 'key')" @change="pathSelection($event, 'key')"
/> />
@@ -216,12 +217,12 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.certificate') }}</label> <label class="form-label cut-text">{{ t('connection.certificate') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
:model-value="localConnection.cert" :model-value="localConnection.cert"
:message="t('word.browse')" :message="t('general.browse')"
@clear="pathClear('cert')" @clear="pathClear('cert')"
@change="pathSelection($event, 'cert')" @change="pathSelection($event, 'cert')"
/> />
@@ -229,12 +230,12 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.caCertificate') }}</label> <label class="form-label cut-text">{{ t('connection.caCertificate') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
:model-value="localConnection.ca" :model-value="localConnection.ca"
:message="t('word.browse')" :message="t('general.browse')"
@clear="pathClear('ca')" @clear="pathClear('ca')"
@change="pathSelection($event, 'ca')" @change="pathSelection($event, 'ca')"
/> />
@@ -242,7 +243,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.ciphers') }}</label> <label class="form-label cut-text">{{ t('connection.ciphers') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -257,7 +258,7 @@
<div class="column col-4 col-sm-12" /> <div class="column col-4 col-sm-12" />
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<label class="form-checkbox form-inline"> <label class="form-checkbox form-inline">
<input v-model="localConnection.untrustedConnection" type="checkbox"><i class="form-icon" /> {{ t('message.untrustedConnection') }} <input v-model="localConnection.untrustedConnection" type="checkbox"><i class="form-icon" /> {{ t('connection.untrustedConnection') }}
</label> </label>
</div> </div>
</div> </div>
@@ -271,7 +272,7 @@
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text"> <label class="form-label cut-text">
{{ t('message.enableSsh') }} {{ t('connection.enableSsh') }}
</label> </label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
@@ -284,7 +285,7 @@
<fieldset class="m-0" :disabled="isBusy || !localConnection.ssh"> <fieldset class="m-0" :disabled="isBusy || !localConnection.ssh">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.hostName') }}/IP</label> <label class="form-label cut-text">{{ t('connection.hostName') }}/IP</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -296,7 +297,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.user') }}</label> <label class="form-label cut-text">{{ t('connection.user') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -308,7 +309,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.password') }}</label> <label class="form-label cut-text">{{ t('connection.password') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -320,7 +321,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.port') }}</label> <label class="form-label cut-text">{{ t('connection.port') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -334,12 +335,12 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.privateKey') }}</label> <label class="form-label cut-text">{{ t('connection.privateKey') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
:model-value="localConnection.sshKey" :model-value="localConnection.sshKey"
:message="t('word.browse')" :message="t('general.browse')"
@clear="pathClear('sshKey')" @clear="pathClear('sshKey')"
@change="pathSelection($event, 'sshKey')" @change="pathSelection($event, 'sshKey')"
/> />
@@ -347,7 +348,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label cut-text">{{ t('word.passphrase') }}</label> <label class="form-label cut-text">{{ t('connection.passphrase') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -370,7 +371,7 @@
@click="startTest" @click="startTest"
> >
<i class="mdi mdi-24px mdi-lightning-bolt mr-1" /> <i class="mdi mdi-24px mdi-lightning-bolt mr-1" />
{{ t('message.testConnection') }} {{ t('connection.testConnection') }}
</button> </button>
<button <button
id="connection-save" id="connection-save"
@@ -379,7 +380,7 @@
@click="saveConnection" @click="saveConnection"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
{{ t('word.save') }} {{ t('general.save') }}
</button> </button>
<button <button
id="connection-connect" id="connection-connect"
@@ -389,7 +390,7 @@
@click="startConnection" @click="startConnection"
> >
<i class="mdi mdi-24px mdi-connection mr-1" /> <i class="mdi mdi-24px mdi-connection mr-1" />
{{ t('word.connect') }} {{ t('connection.connect') }}
</button> </button>
</div> </div>
</div> </div>
@@ -478,7 +479,7 @@ const startTest = async () => {
if (res.status === 'error') if (res.status === 'error')
addNotification({ status: 'error', message: res.response.message || res.response.toString() }); addNotification({ status: 'error', message: res.response.message || res.response.toString() });
else else
addNotification({ status: 'success', message: t('message.connectionSuccessfullyMade') }); addNotification({ status: 'success', message: t('connection.connectionSuccessfullyMade') });
} }
catch (err) { catch (err) {
addNotification({ status: 'error', message: err.stack }); addNotification({ status: 'error', message: err.stack });
@@ -502,7 +503,7 @@ const continueTest = async (credentials: {user: string; password: string }) => {
if (res.status === 'error') if (res.status === 'error')
addNotification({ status: 'error', message: res.response.message || res.response.toString() }); addNotification({ status: 'error', message: res.response.message || res.response.toString() });
else else
addNotification({ status: 'success', message: t('message.connectionSuccessfullyMade') }); addNotification({ status: 'success', message: t('connection.connectionSuccessfullyMade') });
} }
} }
catch (err) { catch (err) {

View File

@@ -4,12 +4,12 @@
<img :src="logos[applicationTheme]" width="200"> <img :src="logos[applicationTheme]" width="200">
</div> </div>
<p class="h6 empty-subtitle"> <p class="h6 empty-subtitle">
{{ t('message.noOpenTabs') }} {{ t('application.noOpenTabs') }}
</p> </p>
<div class="empty-action"> <div class="empty-action">
<button class="btn btn-primary d-flex" @click="emit('new-tab')"> <button class="btn btn-primary d-flex" @click="emit('new-tab')">
<i class="mdi mdi-24px mdi-tab-plus mr-2" /> <i class="mdi mdi-24px mdi-tab-plus mr-2" />
{{ t('message.openNewTab') }} {{ t('application.openNewTab') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -10,23 +10,34 @@
@keydown="explorebarSearch" @keydown="explorebarSearch"
> >
<div class="workspace-explorebar-header"> <div class="workspace-explorebar-header">
<span class="workspace-explorebar-title">{{ connectionName }}</span> <div
v-if="customizations.database"
class="workspace-explorebar-database-switch"
:title="t('database.switchDatabase')"
>
<BaseSelect
v-model="selectedDatabase"
:options="databases"
class="form-select select-sm text-bold my-0"
/>
</div>
<span v-else class="workspace-explorebar-title">{{ connectionName }}</span>
<span v-if="workspace.connectionStatus === 'connected'" class="workspace-explorebar-tools"> <span v-if="workspace.connectionStatus === 'connected'" class="workspace-explorebar-tools">
<i <i
v-if="customizations.schemas" v-if="customizations.schemas"
class="mdi mdi-18px mdi-database-plus c-hand mr-2" class="mdi mdi-18px mdi-database-plus c-hand mr-2"
:title="t('message.createNewSchema')" :title="t('database.createNewSchema')"
@click="showNewDBModal" @click="showNewDBModal"
/> />
<i <i
class="mdi mdi-18px mdi-refresh c-hand mr-2" class="mdi mdi-18px mdi-refresh c-hand mr-2"
:class="{'rotate':isRefreshing}" :class="{'rotate':isRefreshing}"
:title="t('word.refresh')" :title="t('general.refresh')"
@click="refresh" @click="refresh"
/> />
<i <i
class="mdi mdi-18px mdi-power c-hand" class="mdi mdi-18px mdi-power c-hand"
:title="t('word.disconnect')" :title="t('connection.disconnect')"
@click="disconnectWorkspace(connection.uid)" @click="disconnectWorkspace(connection.uid)"
/> />
</span> </span>
@@ -35,7 +46,7 @@
<div v-if="workspace.connectionStatus === 'connected'" class="input-group has-icon-right"> <div v-if="workspace.connectionStatus === 'connected'" class="input-group has-icon-right">
<div <div
class="input-group-addon px-1 py-0 p-vcentered c-hand" class="input-group-addon px-1 py-0 p-vcentered c-hand"
:title="t('message.switchSearchMethod')" :title="t('application.switchSearchMethod')"
@click="toggleSearchMethod" @click="toggleSearchMethod"
> >
<i class="mdi mdi-18px" :class="[searchMethod === 'elements' ? 'mdi-shape' : 'mdi-database']" /> <i class="mdi mdi-18px" :class="[searchMethod === 'elements' ? 'mdi-shape' : 'mdi-database']" />
@@ -45,7 +56,7 @@
v-model="searchTerm" v-model="searchTerm"
class="form-input input-sm" class="form-input input-sm"
type="text" type="text"
:placeholder="searchMethod === 'elements' ? t('message.searchForElements') : t('message.searchForSchemas')" :placeholder="searchMethod === 'elements' ? t('database.searchForElements') : t('database.searchForSchemas')"
> >
<i v-if="!searchTerm" class="form-icon mdi mdi-magnify mdi-18px" /> <i v-if="!searchTerm" class="form-icon mdi mdi-magnify mdi-18px" />
<i <i
@@ -124,10 +135,11 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { Component, computed, onMounted, Ref, ref, watch } from 'vue'; import { Component, computed, onMounted, Prop, Ref, ref, watch } from 'vue';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import { useConnectionsStore } from '@/stores/connections'; import { useConnectionsStore } from '@/stores/connections';
import { ConnectionParams } from 'common/interfaces/antares';
import { useNotificationsStore } from '@/stores/notifications'; import { useNotificationsStore } from '@/stores/notifications';
import { useSettingsStore } from '@/stores/settings'; import { useSettingsStore } from '@/stores/settings';
import { useWorkspacesStore } from '@/stores/workspaces'; import { useWorkspacesStore } from '@/stores/workspaces';
@@ -141,12 +153,14 @@ import TableContext from '@/components/WorkspaceExploreBarTableContext.vue';
import MiscContext from '@/components/WorkspaceExploreBarMiscContext.vue'; import MiscContext from '@/components/WorkspaceExploreBarMiscContext.vue';
import MiscFolderContext from '@/components/WorkspaceExploreBarMiscFolderContext.vue'; import MiscFolderContext from '@/components/WorkspaceExploreBarMiscFolderContext.vue';
import ModalNewSchema from '@/components/ModalNewSchema.vue'; import ModalNewSchema from '@/components/ModalNewSchema.vue';
import BaseSelect from '@/components/BaseSelect.vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import Databases from '@/ipc-api/Databases';
const { t } = useI18n(); const { t } = useI18n();
const props = defineProps({ const props = defineProps({
connection: Object, connection: Object as Prop<ConnectionParams>,
isSelected: Boolean isSelected: Boolean
}); });
@@ -160,11 +174,13 @@ const { explorebarSize } = storeToRefs(settingsStore);
const { changeExplorebarSize } = settingsStore; const { changeExplorebarSize } = settingsStore;
const { const {
getWorkspace, getWorkspace,
switchConnection,
removeConnected: disconnectWorkspace, removeConnected: disconnectWorkspace,
refreshStructure, refreshStructure,
newTab, newTab,
removeTabs, removeTabs,
setSearchTerm, setSearchTerm,
setDatabase,
addLoadingElement, addLoadingElement,
removeLoadingElement removeLoadingElement
} = workspacesStore; } = workspacesStore;
@@ -172,6 +188,7 @@ const {
const searchInput: Ref<HTMLInputElement> = ref(null); const searchInput: Ref<HTMLInputElement> = ref(null);
const explorebar: Ref<HTMLInputElement> = ref(null); const explorebar: Ref<HTMLInputElement> = ref(null);
const resizer: Ref<HTMLInputElement> = ref(null); const resizer: Ref<HTMLInputElement> = ref(null);
const databases: Ref<string[]> = ref([]);
const schema: Ref<Component & { selectSchema: (name: string) => void; $refs: {schemaAccordion: HTMLDetailsElement} }[]> = ref(null); const schema: Ref<Component & { selectSchema: (name: string) => void; $refs: {schemaAccordion: HTMLDetailsElement} }[]> = ref(null);
const isRefreshing = ref(false); const isRefreshing = ref(false);
const isNewDBModal = ref(false); const isNewDBModal = ref(false);
@@ -185,6 +202,7 @@ const isMiscFolderContext = ref(false);
const databaseContextEvent = ref(null); const databaseContextEvent = ref(null);
const tableContextEvent = ref(null); const tableContextEvent = ref(null);
const miscContextEvent = ref(null); const miscContextEvent = ref(null);
const selectedDatabase = ref(props.connection.database);
const selectedSchema = ref(''); const selectedSchema = ref('');
const selectedTable = ref(null); const selectedTable = ref(null);
const selectedMisc = ref(null); const selectedMisc = ref(null);
@@ -230,9 +248,14 @@ watch(searchTerm, () => {
}, 200); }, 200);
}); });
watch(selectedDatabase, (val, oldVal) => {
if (oldVal)
switchConnection({ ...props.connection, database: selectedDatabase.value });
});
localWidth.value = explorebarSize.value; localWidth.value = explorebarSize.value;
onMounted(() => { onMounted(async () => {
resizer.value.addEventListener('mousedown', (e: MouseEvent) => { resizer.value.addEventListener('mousedown', (e: MouseEvent) => {
e.preventDefault(); e.preventDefault();
@@ -240,10 +263,28 @@ onMounted(() => {
window.addEventListener('mouseup', stopResize); window.addEventListener('mouseup', stopResize);
}); });
if (workspace.value.structure.length === 1) { // Auto-open if juust one schema if (workspace.value.structure.length === 1) { // Auto-open if just one schema
schema.value[0].selectSchema(workspace.value.structure[0].name); schema.value[0].selectSchema(workspace.value.structure[0].name);
schema.value[0].$refs.schemaAccordion.open = true; schema.value[0].$refs.schemaAccordion.open = true;
} }
if (customizations.value.database) {
try {
const { status, response } = await Databases.getDatabases(props.connection.uid);
if (status === 'success') {
databases.value = response;
if (selectedDatabase.value === '') {
selectedDatabase.value = response[0];
setDatabase(selectedDatabase.value);
}
}
else
addNotification({ status: 'error', message: response });
}
catch (err) {
addNotification({ status: 'error', message: err.stack });
}
}
}); });
const refresh = async () => { const refresh = async () => {
@@ -254,7 +295,10 @@ const refresh = async () => {
} }
}; };
const explorebarSearch = () => { const explorebarSearch = (event: KeyboardEvent) => {
const isLetter = (event.key >= 'a' && event.key <= 'z');
const isNumber = (event.key >= '0' && event.key <= '9');
if (isLetter || isNumber)
searchInput.value.focus(); searchInput.value.focus();
}; };
@@ -497,13 +541,31 @@ const toggleSearchMethod = () => {
} }
} }
.workspace-explorebar-database-switch {
width: 100%;
display: flex;
justify-content: space-between;
z-index: 20;
margin-right: 5px;
margin-left: -4px;
margin-top: -3px;
margin-bottom: -0.5rem;
height: 24px;
.form-select.select-sm {
font-size: 0.6rem;
height: 1.2rem;
line-height: 1rem;
}
}
.workspace-explorebar-search { .workspace-explorebar-search {
width: 100%; width: 100%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
font-size: 0.6rem; font-size: 0.6rem;
height: 28px; height: 28px;
margin: 5px 0; margin: 0 0 5px 0;
z-index: 10; z-index: 10;
.has-icon-right { .has-icon-right {
@@ -533,7 +595,7 @@ const toggleSearchMethod = () => {
.workspace-explorebar-body { .workspace-explorebar-body {
width: 100%; width: 100%;
height: calc((100vh - 68px) - #{$excluding-size}); height: calc((100vh - 63px) - #{$excluding-size});
overflow: overlay; overflow: overlay;
padding: 0 0.1rem; padding: 0 0.1rem;
} }

View File

@@ -8,7 +8,7 @@
class="context-element" class="context-element"
@click="runElementCheck" @click="runElementCheck"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-play text-light pr-1" /> {{ t('word.run') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-play text-light pr-1" /> {{ t('general.run') }}</span>
</div> </div>
<div <div
v-if="selectedMisc.type === 'trigger' && customizations.triggerEnableDisable" v-if="selectedMisc.type === 'trigger' && customizations.triggerEnableDisable"
@@ -16,10 +16,10 @@
@click="toggleTrigger" @click="toggleTrigger"
> >
<span v-if="!selectedMisc.enabled" class="d-flex"> <span v-if="!selectedMisc.enabled" class="d-flex">
<i class="mdi mdi-18px mdi-play text-light pr-1" /> {{ t('word.enable') }} <i class="mdi mdi-18px mdi-play text-light pr-1" /> {{ t('general.enable') }}
</span> </span>
<span v-else class="d-flex"> <span v-else class="d-flex">
<i class="mdi mdi-18px mdi-pause text-light pr-1" /> {{ t('word.disable') }} <i class="mdi mdi-18px mdi-pause text-light pr-1" /> {{ t('general.disable') }}
</span> </span>
</div> </div>
<div <div
@@ -28,14 +28,14 @@
@click="toggleScheduler" @click="toggleScheduler"
> >
<span v-if="!selectedMisc.enabled" class="d-flex"> <span v-if="!selectedMisc.enabled" class="d-flex">
<i class="mdi mdi-18px mdi-play text-light pr-1" /> {{ t('word.enable') }} <i class="mdi mdi-18px mdi-play text-light pr-1" /> {{ t('general.enable') }}
</span> </span>
<span v-else class="d-flex"> <span v-else class="d-flex">
<i class="mdi mdi-18px mdi-pause text-light pr-1" /> {{ t('word.disable') }} <i class="mdi mdi-18px mdi-pause text-light pr-1" /> {{ t('general.disable') }}
</span> </span>
</div> </div>
<div class="context-element" @click="showDeleteModal"> <div class="context-element" @click="showDeleteModal">
<span class="d-flex"><i class="mdi mdi-18px mdi-table-remove text-light pr-1" /> {{ t('word.delete') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-table-remove text-light pr-1" /> {{ t('general.delete') }}</span>
</div> </div>
<ConfirmModal <ConfirmModal
v-if="isDeleteModal" v-if="isDeleteModal"
@@ -50,7 +50,7 @@
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
{{ t('message.deleteCorfirm') }} "<b>{{ selectedMisc.name }}</b>"? {{ t('general.deleteConfirm') }} "<b>{{ selectedMisc.name }}</b>"?
</div> </div>
</template> </template>
</ConfirmModal> </ConfirmModal>
@@ -117,14 +117,14 @@ const customizations = computed(() => {
const deleteMessage = computed(() => { const deleteMessage = computed(() => {
switch (props.selectedMisc.type) { switch (props.selectedMisc.type) {
case 'trigger': case 'trigger':
return t('message.deleteTrigger'); return t('database.deleteTrigger');
case 'procedure': case 'procedure':
return t('message.deleteRoutine'); return t('database.deleteRoutine');
case 'function': case 'function':
case 'triggerFunction': case 'triggerFunction':
return t('message.deleteFunction'); return t('database.deleteFunction');
case 'scheduler': case 'scheduler':
return t('message.deleteScheduler'); return t('database.deleteScheduler');
default: default:
return ''; return '';
} }

View File

@@ -8,35 +8,35 @@
class="context-element" class="context-element"
@click="emit('open-create-trigger-tab')" @click="emit('open-create-trigger-tab')"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-table-cog text-light pr-1" /> {{ t('message.createNewTrigger') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-table-cog text-light pr-1" /> {{ t('database.createNewTrigger') }}</span>
</div> </div>
<div <div
v-if="['procedure', 'routine'].includes(props.selectedMisc)" v-if="['procedure', 'routine'].includes(props.selectedMisc)"
class="context-element" class="context-element"
@click="emit('open-create-routine-tab')" @click="emit('open-create-routine-tab')"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-sync-circle text-light pr-1" /> {{ t('message.createNewRoutine') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-sync-circle text-light pr-1" /> {{ t('database.createNewRoutine') }}</span>
</div> </div>
<div <div
v-if="props.selectedMisc === 'function'" v-if="props.selectedMisc === 'function'"
class="context-element" class="context-element"
@click="emit('open-create-function-tab')" @click="emit('open-create-function-tab')"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-arrow-right-bold-box text-light pr-1" /> {{ t('message.createNewFunction') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-arrow-right-bold-box text-light pr-1" /> {{ t('database.createNewFunction') }}</span>
</div> </div>
<div <div
v-if="props.selectedMisc === 'triggerFunction'" v-if="props.selectedMisc === 'triggerFunction'"
class="context-element" class="context-element"
@click="emit('open-create-trigger-function-tab')" @click="emit('open-create-trigger-function-tab')"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-cog-clockwise text-light pr-1" /> {{ t('message.createNewFunction') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-cog-clockwise text-light pr-1" /> {{ t('database.createNewFunction') }}</span>
</div> </div>
<div <div
v-if="props.selectedMisc === 'scheduler'" v-if="props.selectedMisc === 'scheduler'"
class="context-element" class="context-element"
@click="emit('open-create-scheduler-tab')" @click="emit('open-create-scheduler-tab')"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-calendar-clock text-light pr-1" /> {{ t('message.createNewScheduler') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-calendar-clock text-light pr-1" /> {{ t('database.createNewScheduler') }}</span>
</div> </div>
</BaseContextMenu> </BaseContextMenu>
</template> </template>

View File

@@ -60,7 +60,7 @@
@contextmenu.prevent="showMiscFolderContext($event, 'trigger')" @contextmenu.prevent="showMiscFolderContext($event, 'trigger')"
> >
<i class="misc-icon mdi mdi-18px mdi-folder-cog mr-1" /> <i class="misc-icon mdi mdi-18px mdi-folder-cog mr-1" />
{{ t('word.trigger', 2) }} {{ t('database.trigger', 2) }}
</summary> </summary>
<div class="accordion-body"> <div class="accordion-body">
<div> <div>
@@ -82,7 +82,7 @@
<div <div
v-if="trigger.enabled === false" v-if="trigger.enabled === false"
class="tooltip tooltip-left disabled-indicator" class="tooltip tooltip-left disabled-indicator"
:data-tooltip="t('word.disabled')" :data-tooltip="t('general.disabled')"
> >
<i class="table-icon mdi mdi-pause mdi-18px mr-1" /> <i class="table-icon mdi mdi-pause mdi-18px mr-1" />
</div> </div>
@@ -101,7 +101,7 @@
@contextmenu.prevent="showMiscFolderContext($event, 'routine')" @contextmenu.prevent="showMiscFolderContext($event, 'routine')"
> >
<i class="misc-icon mdi mdi-18px mdi-folder-sync mr-1" /> <i class="misc-icon mdi mdi-18px mdi-folder-sync mr-1" />
{{ t('word.storedRoutine', 2) }} {{ t('database.storedRoutine', 2) }}
</summary> </summary>
<div class="accordion-body"> <div class="accordion-body">
<div> <div>
@@ -134,7 +134,7 @@
@contextmenu.prevent="showMiscFolderContext($event, 'triggerFunction')" @contextmenu.prevent="showMiscFolderContext($event, 'triggerFunction')"
> >
<i class="misc-icon mdi mdi-18px mdi-folder-refresh mr-1" /> <i class="misc-icon mdi mdi-18px mdi-folder-refresh mr-1" />
{{ t('word.triggerFunction', 2) }} {{ t('database.triggerFunction', 2) }}
</summary> </summary>
<div class="accordion-body"> <div class="accordion-body">
<div> <div>
@@ -167,7 +167,7 @@
@contextmenu.prevent="showMiscFolderContext($event, 'function')" @contextmenu.prevent="showMiscFolderContext($event, 'function')"
> >
<i class="misc-icon mdi mdi-18px mdi-folder-move mr-1" /> <i class="misc-icon mdi mdi-18px mdi-folder-move mr-1" />
{{ t('word.function', 2) }} {{ t('database.function', 2) }}
</summary> </summary>
<div class="accordion-body"> <div class="accordion-body">
<div> <div>
@@ -200,7 +200,7 @@
@contextmenu.prevent="showMiscFolderContext($event, 'scheduler')" @contextmenu.prevent="showMiscFolderContext($event, 'scheduler')"
> >
<i class="misc-icon mdi mdi-18px mdi-folder-clock mr-1" /> <i class="misc-icon mdi mdi-18px mdi-folder-clock mr-1" />
{{ t('word.scheduler', 2) }} {{ t('database.scheduler', 2) }}
</summary> </summary>
<div class="accordion-body"> <div class="accordion-body">
<div> <div>
@@ -222,7 +222,7 @@
<div <div
v-if="scheduler.enabled === false" v-if="scheduler.enabled === false"
class="tooltip tooltip-left disabled-indicator" class="tooltip tooltip-left disabled-indicator"
:data-tooltip="t('word.disabled')" :data-tooltip="t('general.disabled')"
> >
<i class="table-icon mdi mdi-pause mdi-18px mr-1" /> <i class="table-icon mdi mdi-pause mdi-18px mr-1" />
</div> </div>

View File

@@ -4,7 +4,7 @@
@close-context="closeContext" @close-context="closeContext"
> >
<div class="context-element"> <div class="context-element">
<span class="d-flex"><i class="mdi mdi-18px mdi-plus text-light pr-1" /> {{ t('word.add') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-plus text-light pr-1" /> {{ t('general.add') }}</span>
<i class="mdi mdi-18px mdi-chevron-right text-light pl-1" /> <i class="mdi mdi-18px mdi-chevron-right text-light pl-1" />
<div class="context-submenu"> <div class="context-submenu">
<div <div
@@ -12,49 +12,49 @@
class="context-element" class="context-element"
@click="openCreateTableTab" @click="openCreateTableTab"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-table text-light pr-1" /> {{ t('word.table') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-table text-light pr-1" /> {{ t('database.table') }}</span>
</div> </div>
<div <div
v-if="workspace.customizations.viewAdd" v-if="workspace.customizations.viewAdd"
class="context-element" class="context-element"
@click="openCreateViewTab" @click="openCreateViewTab"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-table-eye text-light pr-1" /> {{ t('word.view') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-table-eye text-light pr-1" /> {{ t('database.view') }}</span>
</div> </div>
<div <div
v-if="workspace.customizations.triggerAdd" v-if="workspace.customizations.triggerAdd"
class="context-element" class="context-element"
@click="openCreateTriggerTab" @click="openCreateTriggerTab"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-table-cog text-light pr-1" /> {{ t('word.trigger', 1) }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-table-cog text-light pr-1" /> {{ t('database.trigger', 1) }}</span>
</div> </div>
<div <div
v-if="workspace.customizations.routineAdd" v-if="workspace.customizations.routineAdd"
class="context-element" class="context-element"
@click="openCreateRoutineTab" @click="openCreateRoutineTab"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-sync-circle pr-1" /> {{ t('word.storedRoutine', 1) }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-sync-circle pr-1" /> {{ t('database.storedRoutine', 1) }}</span>
</div> </div>
<div <div
v-if="workspace.customizations.functionAdd" v-if="workspace.customizations.functionAdd"
class="context-element" class="context-element"
@click="openCreateFunctionTab" @click="openCreateFunctionTab"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-arrow-right-bold-box pr-1" /> {{ t('word.function', 1) }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-arrow-right-bold-box pr-1" /> {{ t('database.function', 1) }}</span>
</div> </div>
<div <div
v-if="workspace.customizations.triggerFunctionAdd" v-if="workspace.customizations.triggerFunctionAdd"
class="context-element" class="context-element"
@click="openCreateTriggerFunctionTab" @click="openCreateTriggerFunctionTab"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-cog-clockwise pr-1" /> {{ t('word.triggerFunction', 1) }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-cog-clockwise pr-1" /> {{ t('database.triggerFunction', 1) }}</span>
</div> </div>
<div <div
v-if="workspace.customizations.schedulerAdd" v-if="workspace.customizations.schedulerAdd"
class="context-element" class="context-element"
@click="openCreateSchedulerTab" @click="openCreateSchedulerTab"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-calendar-clock text-light pr-1" /> {{ t('word.scheduler', 1) }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-calendar-clock text-light pr-1" /> {{ t('database.scheduler', 1) }}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -63,28 +63,28 @@
class="context-element" class="context-element"
@click="showExportSchemaModal" @click="showExportSchemaModal"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-database-export text-light pr-1" /> {{ t('word.export') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-database-export text-light pr-1" /> {{ t('database.export') }}</span>
</div> </div>
<div <div
v-if="workspace.customizations.schemaImport" v-if="workspace.customizations.schemaImport"
class="context-element" class="context-element"
@click="initImport" @click="initImport"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-database-import text-light pr-1" /> {{ t('word.import') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-database-import text-light pr-1" /> {{ t('database.import') }}</span>
</div> </div>
<div <div
v-if="workspace.customizations.schemaEdit" v-if="workspace.customizations.schemaEdit"
class="context-element" class="context-element"
@click="showEditModal" @click="showEditModal"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-database-edit text-light pr-1" /> {{ t('word.edit') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-database-edit text-light pr-1" /> {{ t('database.editSchema') }}</span>
</div> </div>
<div <div
v-if="workspace.customizations.schemaDrop" v-if="workspace.customizations.schemaDrop"
class="context-element" class="context-element"
@click="showDeleteModal" @click="showDeleteModal"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-database-remove text-light pr-1" /> {{ t('word.delete') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-database-remove text-light pr-1" /> {{ t('database.deleteSchema') }}</span>
</div> </div>
<ConfirmModal <ConfirmModal
@@ -95,12 +95,12 @@
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-database-remove mr-1" /> <i class="mdi mdi-24px mdi-database-remove mr-1" />
<span class="cut-text">{{ t('message.deleteSchema') }}</span> <span class="cut-text">{{ t('database.deleteSchema') }}</span>
</div> </div>
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
{{ t('message.deleteCorfirm') }} "<b>{{ selectedSchema }}</b>"? {{ t('general.deleteConfirm') }} "<b>{{ selectedSchema }}</b>"?
</div> </div>
</template> </template>
</ConfirmModal> </ConfirmModal>
@@ -109,11 +109,6 @@
:selected-schema="selectedSchema" :selected-schema="selectedSchema"
@close="hideEditModal" @close="hideEditModal"
/> />
<ModalExportSchema
v-if="isExportSchemaModal"
:selected-schema="selectedSchema"
@close="hideExportSchemaModal"
/>
<ModalImportSchema <ModalImportSchema
v-if="isImportSchemaModal" v-if="isImportSchemaModal"
ref="importModalRef" ref="importModalRef"
@@ -128,10 +123,10 @@ import { Component, computed, nextTick, Ref, ref } from 'vue';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import { useNotificationsStore } from '@/stores/notifications'; import { useNotificationsStore } from '@/stores/notifications';
import { useWorkspacesStore } from '@/stores/workspaces'; import { useWorkspacesStore } from '@/stores/workspaces';
import { useSchemaExportStore } from '@/stores/schemaExport';
import BaseContextMenu from '@/components/BaseContextMenu.vue'; import BaseContextMenu from '@/components/BaseContextMenu.vue';
import ConfirmModal from '@/components/BaseConfirmModal.vue'; import ConfirmModal from '@/components/BaseConfirmModal.vue';
import ModalEditSchema from '@/components/ModalEditSchema.vue'; import ModalEditSchema from '@/components/ModalEditSchema.vue';
import ModalExportSchema from '@/components/ModalExportSchema.vue';
import ModalImportSchema from '@/components/ModalImportSchema.vue'; import ModalImportSchema from '@/components/ModalImportSchema.vue';
import Schema from '@/ipc-api/Schema'; import Schema from '@/ipc-api/Schema';
import Application from '@/ipc-api/Application'; import Application from '@/ipc-api/Application';
@@ -158,6 +153,8 @@ const emit = defineEmits([
const { addNotification } = useNotificationsStore(); const { addNotification } = useNotificationsStore();
const workspacesStore = useWorkspacesStore(); const workspacesStore = useWorkspacesStore();
const schemaExportStore = useSchemaExportStore();
const { showExportModal } = schemaExportStore;
const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore); const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore);
@@ -169,7 +166,6 @@ const {
const importModalRef: Ref<Component & {startImport: (file: string) => void}> = ref(null); const importModalRef: Ref<Component & {startImport: (file: string) => void}> = ref(null);
const isDeleteModal = ref(false); const isDeleteModal = ref(false);
const isEditModal = ref(false); const isEditModal = ref(false);
const isExportSchemaModal = ref(false);
const isImportSchemaModal = ref(false); const isImportSchemaModal = ref(false);
const workspace = computed(() => getWorkspace(selectedWorkspace.value)); const workspace = computed(() => getWorkspace(selectedWorkspace.value));
@@ -220,11 +216,7 @@ const hideEditModal = () => {
}; };
const showExportSchemaModal = () => { const showExportSchemaModal = () => {
isExportSchemaModal.value = true; showExportModal(props.selectedSchema);
};
const hideExportSchemaModal = () => {
isExportSchemaModal.value = false;
closeContext(); closeContext();
}; };

View File

@@ -8,31 +8,38 @@
class="context-element" class="context-element"
@click="openTableSettingTab" @click="openTableSettingTab"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-tune-vertical-variant text-light pr-1" /> {{ t('word.settings') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-wrench-cog text-light pr-1" /> {{ t('application.settings') }}</span>
</div>
<div
v-if="selectedTable && selectedTable.type === 'table' && customizations.schemaExport"
class="context-element"
@click="showTableExportModal"
>
<span class="d-flex"><i class="mdi mdi-18px mdi-table-arrow-right text-light pr-1" /> {{ t('database.exportTable') }}</span>
</div> </div>
<div <div
v-if="selectedTable && selectedTable.type === 'view' && customizations.viewSettings" v-if="selectedTable && selectedTable.type === 'view' && customizations.viewSettings"
class="context-element" class="context-element"
@click="openViewSettingTab" @click="openViewSettingTab"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-tune-vertical-variant text-light pr-1" /> {{ t('word.settings') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-wrench-cog text-light pr-1" /> {{ t('application.settings') }}</span>
</div> </div>
<div <div
v-if="selectedTable && selectedTable.type === 'table' && customizations.tableDuplicate" v-if="selectedTable && selectedTable.type === 'table' && customizations.tableDuplicate"
class="context-element" class="context-element"
@click="duplicateTable" @click="duplicateTable"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-table-multiple text-light pr-1" /> {{ t('message.duplicateTable') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-table-multiple text-light pr-1" /> {{ t('database.duplicateTable') }}</span>
</div> </div>
<div <div
v-if="selectedTable && selectedTable.type === 'table'" v-if="selectedTable && selectedTable.type === 'table'"
class="context-element" class="context-element"
@click="showEmptyModal" @click="showEmptyModal"
> >
<span class="d-flex"><i class="mdi mdi-18px mdi-table-off text-light pr-1" /> {{ t('message.emptyTable') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-table-off text-light pr-1" /> {{ t('database.emptyTable') }}</span>
</div> </div>
<div class="context-element" @click="showDeleteModal"> <div class="context-element" @click="showDeleteModal">
<span class="d-flex"><i class="mdi mdi-18px mdi-table-remove text-light pr-1" /> {{ t('word.delete') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-table-remove text-light pr-1" /> {{ t('database.deleteTable') }}</span>
</div> </div>
<ConfirmModal <ConfirmModal
@@ -42,16 +49,16 @@
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-table-off mr-1" /> <span class="cut-text">{{ t('message.emptyTable') }}</span> <i class="mdi mdi-24px mdi-table-off mr-1" /> <span class="cut-text">{{ t('database.emptyTable') }}</span>
</div> </div>
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
{{ t('message.emptyCorfirm') }} "<b>{{ selectedTable.name }}</b>"? {{ t('database.emptyConfirm') }} "<b>{{ selectedTable.name }}</b>"?
</div> </div>
<div v-if="customizations.tableTruncateDisableFKCheck"> <div v-if="customizations.tableTruncateDisableFKCheck">
<label class="form-checkbox form-inline"> <label class="form-checkbox form-inline">
<input v-model="forceTruncate" type="checkbox"><i class="form-icon" /> {{ t('message.disableFKChecks') }} <input v-model="forceTruncate" type="checkbox"><i class="form-icon" /> {{ t('database.disableFKChecks') }}
</label> </label>
</div> </div>
</template> </template>
@@ -64,12 +71,12 @@
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-table-remove mr-1" /> <i class="mdi mdi-24px mdi-table-remove mr-1" />
<span class="cut-text">{{ selectedTable.type === 'table' ? t('message.deleteTable') : t('message.deleteView') }}</span> <span class="cut-text">{{ selectedTable.type === 'table' ? t('database.deleteTable') : t('database.deleteView') }}</span>
</div> </div>
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
{{ t('message.deleteCorfirm') }} "<b>{{ selectedTable.name }}</b>"? {{ t('general.deleteConfirm') }} "<b>{{ selectedTable.name }}</b>"?
</div> </div>
</template> </template>
</ConfirmModal> </ConfirmModal>
@@ -81,6 +88,7 @@ import { computed, ref } from 'vue';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import { useNotificationsStore } from '@/stores/notifications'; import { useNotificationsStore } from '@/stores/notifications';
import { useWorkspacesStore } from '@/stores/workspaces'; import { useWorkspacesStore } from '@/stores/workspaces';
import { useSchemaExportStore } from '@/stores/schemaExport';
import BaseContextMenu from '@/components/BaseContextMenu.vue'; import BaseContextMenu from '@/components/BaseContextMenu.vue';
import ConfirmModal from '@/components/BaseConfirmModal.vue'; import ConfirmModal from '@/components/BaseConfirmModal.vue';
import Tables from '@/ipc-api/Tables'; import Tables from '@/ipc-api/Tables';
@@ -98,6 +106,7 @@ const emit = defineEmits(['close-context', 'duplicate-table', 'reload', 'delete-
const { addNotification } = useNotificationsStore(); const { addNotification } = useNotificationsStore();
const workspacesStore = useWorkspacesStore(); const workspacesStore = useWorkspacesStore();
const { showExportModal } = useSchemaExportStore();
const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore); const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore);
@@ -116,6 +125,11 @@ const forceTruncate = ref(false);
const workspace = computed(() => getWorkspace(selectedWorkspace.value)); const workspace = computed(() => getWorkspace(selectedWorkspace.value));
const customizations = computed(() => workspace.value && workspace.value.customizations ? workspace.value.customizations : null); const customizations = computed(() => workspace.value && workspace.value.customizations ? workspace.value.customizations : null);
const showTableExportModal = () => {
showExportModal(props.selectedSchema, props.selectedTable.name);
closeContext();
};
const showDeleteModal = () => { const showDeleteModal = () => {
isDeleteModal.value = true; isDeleteModal.value = true;
}; };

View File

@@ -13,7 +13,7 @@
:style="{height: localHeight ? localHeight+'px' : ''}" :style="{height: localHeight ? localHeight+'px' : ''}"
> >
<div class="query-console-header"> <div class="query-console-header">
<div>{{ t('word.console') }}</div> <div>{{ t('application.console') }}</div>
<button class="btn btn-clear mr-1" @click="resizeConsole(0)" /> <button class="btn btn-clear mr-1" @click="resizeConsole(0)" />
</div> </div>
<div ref="queryConsoleBody" class="query-console-body"> <div ref="queryConsoleBody" class="query-console-body">
@@ -35,7 +35,7 @@
@close-context="isContext = false" @close-context="isContext = false"
> >
<div class="context-element" @click="copyQuery"> <div class="context-element" @click="copyQuery">
<span class="d-flex"><i class="mdi mdi-18px mdi-content-copy text-light pr-1" /> {{ t('word.copy') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-content-copy text-light pr-1" /> {{ t('general.copy') }}</span>
</div> </div>
</BaseContextMenu> </BaseContextMenu>
</template> </template>

View File

@@ -10,27 +10,27 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
<div class="divider-vert py-3" /> <div class="divider-vert py-3" />
<button class="btn btn-dark btn-sm" @click="showParamsModal"> <button class="btn btn-dark btn-sm" @click="showParamsModal">
<i class="mdi mdi-24px mdi-dots-horizontal mr-1" /> <i class="mdi mdi-24px mdi-dots-horizontal mr-1" />
<span>{{ t('word.parameters') }}</span> <span>{{ t('database.parameters') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -41,7 +41,7 @@
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.name') }} {{ t('general.name') }}
</label> </label>
<input <input
ref="firstInput" ref="firstInput"
@@ -54,7 +54,7 @@
<div v-if="customizations.languages" class="column col-auto"> <div v-if="customizations.languages" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.language') }} {{ t('application.language') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.language" v-model="localFunction.language"
@@ -66,11 +66,11 @@
<div v-if="customizations.definer" class="column col-auto"> <div v-if="customizations.definer" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.definer') }} {{ t('database.definer') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.definer" v-model="localFunction.definer"
:options="[{value: '', name:t('message.currentUser')}, ...workspace.users]" :options="[{value: '', name:t('database.currentUser')}, ...workspace.users]"
:option-label="(user: any) => user.value === '' ? user.name : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? user.name : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
@@ -80,7 +80,7 @@
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.returns') }} {{ t('database.returns') }}
</label> </label>
<div class="input-group"> <div class="input-group">
<BaseSelect <BaseSelect
@@ -100,7 +100,7 @@
class="form-input" class="form-input"
type="number" type="number"
min="0" min="0"
:placeholder="t('word.length')" :placeholder="t('database.length')"
> >
</div> </div>
</div> </div>
@@ -108,7 +108,7 @@
<div v-if="customizations.comment" class="column"> <div v-if="customizations.comment" class="column">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.comment') }} {{ t('database.comment') }}
</label> </label>
<input <input
v-model="localFunction.comment" v-model="localFunction.comment"
@@ -120,7 +120,7 @@
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('message.sqlSecurity') }} {{ t('database.sqlSecurity') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.security" v-model="localFunction.security"
@@ -132,7 +132,7 @@
<div v-if="customizations.functionDataAccess" class="column col-auto"> <div v-if="customizations.functionDataAccess" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('message.dataAccess') }} {{ t('database.dataAccess') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.dataAccess" v-model="localFunction.dataAccess"
@@ -145,7 +145,7 @@
<div class="form-group"> <div class="form-group">
<label class="form-label d-invisible">.</label> <label class="form-label d-invisible">.</label>
<label class="form-checkbox form-inline"> <label class="form-checkbox form-inline">
<input v-model="localFunction.deterministic" type="checkbox"><i class="form-icon" /> {{ t('word.deterministic') }} <input v-model="localFunction.deterministic" type="checkbox"><i class="form-icon" /> {{ t('database.deterministic') }}
</label> </label>
</div> </div>
</div> </div>
@@ -153,7 +153,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.functionBody') }}</label> <label class="form-label ml-2">{{ t('database.functionBody') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -10,27 +10,27 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
<div class="divider-vert py-3" /> <div class="divider-vert py-3" />
<button class="btn btn-dark btn-sm" @click="showParamsModal"> <button class="btn btn-dark btn-sm" @click="showParamsModal">
<i class="mdi mdi-24px mdi-dots-horizontal mr-1" /> <i class="mdi mdi-24px mdi-dots-horizontal mr-1" />
<span>{{ t('word.parameters') }}</span> <span>{{ t('database.parameters') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -41,7 +41,7 @@
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.name') }} {{ t('general.name') }}
</label> </label>
<input <input
ref="firstInput" ref="firstInput"
@@ -54,7 +54,7 @@
<div v-if="customizations.languages" class="column col-auto"> <div v-if="customizations.languages" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.language') }} {{ t('application.language') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localRoutine.language" v-model="localRoutine.language"
@@ -66,11 +66,11 @@
<div v-if="customizations.definer" class="column col-auto"> <div v-if="customizations.definer" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.definer') }} {{ t('database.definer') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localRoutine.definer" v-model="localRoutine.definer"
:options="[{value: '', name:t('message.currentUser')}, ...workspace.users]" :options="[{value: '', name:t('database.currentUser')}, ...workspace.users]"
:option-label="(user: any) => user.value === '' ? user.name : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? user.name : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
@@ -80,7 +80,7 @@
<div v-if="customizations.comment" class="column"> <div v-if="customizations.comment" class="column">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.comment') }} {{ t('database.comment') }}
</label> </label>
<input <input
v-model="localRoutine.comment" v-model="localRoutine.comment"
@@ -92,7 +92,7 @@
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('message.sqlSecurity') }} {{ t('database.sqlSecurity') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localRoutine.security" v-model="localRoutine.security"
@@ -104,7 +104,7 @@
<div v-if="customizations.procedureDataAccess" class="column col-auto"> <div v-if="customizations.procedureDataAccess" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('message.dataAccess') }} {{ t('database.dataAccess') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localRoutine.dataAccess" v-model="localRoutine.dataAccess"
@@ -117,7 +117,7 @@
<div class="form-group"> <div class="form-group">
<label class="form-label d-invisible">.</label> <label class="form-label d-invisible">.</label>
<label class="form-checkbox form-inline"> <label class="form-checkbox form-inline">
<input v-model="localRoutine.deterministic" type="checkbox"><i class="form-icon" /> {{ t('word.deterministic') }} <input v-model="localRoutine.deterministic" type="checkbox"><i class="form-icon" /> {{ t('database.deterministic') }}
</label> </label>
</div> </div>
</div> </div>
@@ -125,7 +125,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.routineBody') }}</label> <label class="form-label ml-2">{{ t('database.routineBody') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -10,26 +10,26 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
<div class="divider-vert py-3" /> <div class="divider-vert py-3" />
<button class="btn btn-dark btn-sm" @click="showTimingModal"> <button class="btn btn-dark btn-sm" @click="showTimingModal">
<i class="mdi mdi-24px mdi-timer mr-1" /> <i class="mdi mdi-24px mdi-timer mr-1" />
<span>{{ t('word.timing') }}</span> <span>{{ t('database.timing') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -39,7 +39,7 @@
<div class="columns"> <div class="columns">
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.name') }}</label> <label class="form-label">{{ t('general.name') }}</label>
<input <input
ref="firstInput" ref="firstInput"
v-model="localScheduler.name" v-model="localScheduler.name"
@@ -50,11 +50,11 @@
</div> </div>
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.definer') }}</label> <label class="form-label">{{ t('database.definer') }}</label>
<BaseSelect <BaseSelect
v-model="localScheduler.definer" v-model="localScheduler.definer"
:options="users" :options="users"
:option-label="(user: any) => user.value === '' ? t('message.currentUser') : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? t('database.currentUser') : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
/> />
@@ -62,7 +62,7 @@
</div> </div>
<div class="column"> <div class="column">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.comment') }}</label> <label class="form-label">{{ t('database.comment') }}</label>
<input <input
v-model="localScheduler.comment" v-model="localScheduler.comment"
class="form-input" class="form-input"
@@ -72,7 +72,7 @@
</div> </div>
<div class="column"> <div class="column">
<div class="form-group"> <div class="form-group">
<label class="form-label mr-2">{{ t('word.state') }}</label> <label class="form-label mr-2">{{ t('database.state') }}</label>
<label class="form-radio form-inline"> <label class="form-radio form-inline">
<input <input
v-model="localScheduler.state" v-model="localScheduler.state"
@@ -103,7 +103,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.schedulerBody') }}</label> <label class="form-label ml-2">{{ t('database.schedulerBody') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -10,16 +10,16 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged || isSaving" :disabled="!isChanged || isSaving"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
<div class="divider-vert py-3" /> <div class="divider-vert py-3" />
@@ -27,20 +27,20 @@
<button <button
:disabled="isSaving" :disabled="isSaving"
class="btn btn-dark btn-sm" class="btn btn-dark btn-sm"
:title="t('message.addNewField')" :title="t('database.addNewField')"
@click="addField" @click="addField"
> >
<i class="mdi mdi-24px mdi-playlist-plus mr-1" /> <i class="mdi mdi-24px mdi-playlist-plus mr-1" />
<span>{{ t('word.add') }}</span> <span>{{ t('general.add') }}</span>
</button> </button>
<button <button
:disabled="isSaving || !localFields.length" :disabled="isSaving || !localFields.length"
class="btn btn-dark btn-sm" class="btn btn-dark btn-sm"
:title="t('message.manageIndexes')" :title="t('database.manageIndexes')"
@click="showIntdexesModal" @click="showIntdexesModal"
> >
<i class="mdi mdi-24px mdi-key mdi-rotate-45 mr-1" /> <i class="mdi mdi-24px mdi-key mdi-rotate-45 mr-1" />
<span>{{ t('word.indexes') }}</span> <span>{{ t('database.indexes') }}</span>
</button> </button>
<button <button
class="btn btn-dark btn-sm" class="btn btn-dark btn-sm"
@@ -48,11 +48,11 @@
@click="showForeignModal" @click="showForeignModal"
> >
<i class="mdi mdi-24px mdi-key-link mr-1" /> <i class="mdi mdi-24px mdi-key-link mr-1" />
<span>{{ t('word.foreignKeys') }}</span> <span>{{ t('database.foreignKeys') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -62,7 +62,7 @@
<div class="columns mb-4"> <div class="columns mb-4">
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.name') }}</label> <label class="form-label">{{ t('general.name') }}</label>
<input <input
ref="firstInput" ref="firstInput"
v-model="localOptions.name" v-model="localOptions.name"
@@ -73,7 +73,7 @@
</div> </div>
<div v-if="workspace.customizations.comment" class="column"> <div v-if="workspace.customizations.comment" class="column">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.comment') }}</label> <label class="form-label">{{ t('database.comment') }}</label>
<input <input
v-model="localOptions.comment" v-model="localOptions.comment"
class="form-input" class="form-input"
@@ -85,7 +85,7 @@
<div v-if="workspace.customizations.collations" class="column col-auto"> <div v-if="workspace.customizations.collations" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.collation') }} {{ t('database.collation') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localOptions.collation" v-model="localOptions.collation"
@@ -100,7 +100,7 @@
<div v-if="workspace.customizations.engines" class="column col-auto"> <div v-if="workspace.customizations.engines" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.engine') }} {{ t('database.engine') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localOptions.engine" v-model="localOptions.engine"
@@ -315,7 +315,7 @@ const addField = () => {
const uid = uidGen(); const uid = uidGen();
localFields.value.push({ localFields.value.push({
_antares_id: uid, _antares_id: uid,
name: `${t('word.field', 1)}_${uid.substring(0, 4)}`, name: `${t('database.field', 1)}_${uid.substring(0, 4)}`,
key: '', key: '',
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
type: (workspace.value.dataTypes[0] as any).types[0].name, type: (workspace.value.dataTypes[0] as any).types[0].name,

View File

@@ -1,12 +1,12 @@
<template> <template>
<div class="column col-12 empty"> <div class="column col-12 empty">
<p class="h6 empty-subtitle"> <p class="h6 empty-subtitle">
{{ t('message.thereAreNoTableFields') }} {{ t('database.thereAreNoTableFields') }}
</p> </p>
<div class="empty-action"> <div class="empty-action">
<button class="btn btn-gray d-flex" @click="emit('new-field')"> <button class="btn btn-gray d-flex" @click="emit('new-field')">
<i class="mdi mdi-24px mdi-playlist-plus mr-2" /> <i class="mdi mdi-24px mdi-playlist-plus mr-2" />
{{ t('message.addNewField') }} {{ t('database.addNewField') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -10,20 +10,20 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -33,7 +33,7 @@
<div class="columns"> <div class="columns">
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.name') }}</label> <label class="form-label">{{ t('general.name') }}</label>
<input <input
ref="firstInput" ref="firstInput"
v-model="localTrigger.name" v-model="localTrigger.name"
@@ -44,11 +44,11 @@
</div> </div>
<div v-if="customizations.definer" class="column col-auto"> <div v-if="customizations.definer" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.definer') }}</label> <label class="form-label">{{ t('database.definer') }}</label>
<BaseSelect <BaseSelect
v-model="localTrigger.definer" v-model="localTrigger.definer"
:options="users" :options="users"
:option-label="(user: any) => user.value === '' ? t('message.currentUser') : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? t('database.currentUser') : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
/> />
@@ -57,7 +57,7 @@
<fieldset class="column columns mb-0" :disabled="customizations.triggerOnlyRename"> <fieldset class="column columns mb-0" :disabled="customizations.triggerOnlyRename">
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.table') }}</label> <label class="form-label">{{ t('database.table') }}</label>
<BaseSelect <BaseSelect
v-model="localTrigger.table" v-model="localTrigger.table"
:options="schemaTables" :options="schemaTables"
@@ -69,7 +69,7 @@
</div> </div>
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.event') }}</label> <label class="form-label">{{ t('database.event') }}</label>
<div class="input-group"> <div class="input-group">
<BaseSelect <BaseSelect
v-model="localTrigger.activation" v-model="localTrigger.activation"
@@ -100,7 +100,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.triggerStatement') }}</label> <label class="form-label ml-2">{{ t('database.triggerStatement') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -10,16 +10,16 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
</div> </div>
</div> </div>
@@ -29,7 +29,7 @@
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.name') }} {{ t('general.name') }}
</label> </label>
<input <input
ref="firstInput" ref="firstInput"
@@ -42,7 +42,7 @@
<div v-if="customizations.triggerFunctionlanguages" class="column col-auto"> <div v-if="customizations.triggerFunctionlanguages" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.language') }} {{ t('application.language') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.language" v-model="localFunction.language"
@@ -54,12 +54,12 @@
<div v-if="customizations.definer" class="column col-auto"> <div v-if="customizations.definer" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.definer') }} {{ t('database.definer') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.definer" v-model="localFunction.definer"
:options="workspace.users" :options="workspace.users"
:option-label="(user: any) => user.value === '' ? t('message.currentUser') : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? t('database.currentUser') : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
/> />
@@ -67,7 +67,7 @@
</div> </div>
<div v-if="customizations.comment" class="form-group"> <div v-if="customizations.comment" class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.comment') }} {{ t('database.comment') }}
</label> </label>
<input <input
v-model="localFunction.comment" v-model="localFunction.comment"
@@ -79,7 +79,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.functionBody') }}</label> <label class="form-label ml-2">{{ t('database.functionBody') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -10,20 +10,20 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -33,7 +33,7 @@
<div class="columns"> <div class="columns">
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.name') }}</label> <label class="form-label">{{ t('general.name') }}</label>
<input <input
ref="firstInput" ref="firstInput"
v-model="localView.name" v-model="localView.name"
@@ -44,11 +44,11 @@
</div> </div>
<div class="column col-auto"> <div class="column col-auto">
<div v-if="workspace.customizations.definer" class="form-group"> <div v-if="workspace.customizations.definer" class="form-group">
<label class="form-label">{{ t('word.definer') }}</label> <label class="form-label">{{ t('database.definer') }}</label>
<BaseSelect <BaseSelect
v-model="localView.definer" v-model="localView.definer"
:options="users" :options="users"
:option-label="(user: any) => user.value === '' ? t('message.currentUser') : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? t('database.currentUser') : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
/> />
@@ -56,7 +56,7 @@
</div> </div>
<div class="column col-auto mr-2"> <div class="column col-auto mr-2">
<div v-if="workspace.customizations.viewSqlSecurity" class="form-group"> <div v-if="workspace.customizations.viewSqlSecurity" class="form-group">
<label class="form-label">{{ t('message.sqlSecurity') }}</label> <label class="form-label">{{ t('database.sqlSecurity') }}</label>
<BaseSelect <BaseSelect
v-model="localView.security" v-model="localView.security"
:options="['DEFINER', 'INVOKER']" :options="['DEFINER', 'INVOKER']"
@@ -66,7 +66,7 @@
</div> </div>
<div class="column col-auto mr-2"> <div class="column col-auto mr-2">
<div v-if="workspace.customizations.viewAlgorithm" class="form-group"> <div v-if="workspace.customizations.viewAlgorithm" class="form-group">
<label class="form-label">{{ t('word.algorithm') }}</label> <label class="form-label">{{ t('database.algorithm') }}</label>
<BaseSelect <BaseSelect
v-model="localView.algorithm" v-model="localView.algorithm"
:options="['UNDEFINED', 'MERGE', 'TEMPTABLE']" :options="['UNDEFINED', 'MERGE', 'TEMPTABLE']"
@@ -76,7 +76,7 @@
</div> </div>
<div v-if="workspace.customizations.viewUpdateOption" class="column col-auto mr-2"> <div v-if="workspace.customizations.viewUpdateOption" class="column col-auto mr-2">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('message.updateOption') }}</label> <label class="form-label">{{ t('database.updateOption') }}</label>
<BaseSelect <BaseSelect
v-model="localView.updateOption" v-model="localView.updateOption"
:option-track-by="(user: any) => user.value" :option-track-by="(user: any) => user.value"
@@ -89,7 +89,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.selectStatement') }}</label> <label class="form-label ml-2">{{ t('database.selectStatement') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -10,16 +10,16 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
<div class="divider-vert py-3" /> <div class="divider-vert py-3" />
@@ -30,15 +30,15 @@
@click="runFunctionCheck" @click="runFunctionCheck"
> >
<i class="mdi mdi-24px mdi-play mr-1" /> <i class="mdi mdi-24px mdi-play mr-1" />
<span>{{ t('word.run') }}</span> <span>{{ t('general.run') }}</span>
</button> </button>
<button class="btn btn-dark btn-sm" @click="showParamsModal"> <button class="btn btn-dark btn-sm" @click="showParamsModal">
<i class="mdi mdi-24px mdi-dots-horizontal mr-1" /> <i class="mdi mdi-24px mdi-dots-horizontal mr-1" />
<span>{{ t('word.parameters') }}</span> <span>{{ t('database.parameters') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -49,7 +49,7 @@
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.name') }} {{ t('general.name') }}
</label> </label>
<input <input
ref="firstInput" ref="firstInput"
@@ -63,7 +63,7 @@
<div v-if="customizations.languages" class="column col-auto"> <div v-if="customizations.languages" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.language') }} {{ t('application.language') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.language" v-model="localFunction.language"
@@ -75,11 +75,11 @@
<div v-if="customizations.definer" class="column col-auto"> <div v-if="customizations.definer" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.definer') }} {{ t('database.definer') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.definer" v-model="localFunction.definer"
:options="[{value: '', name:t('message.currentUser')}, ...workspace.users]" :options="[{value: '', name:t('database.currentUser')}, ...workspace.users]"
:option-label="(user: any) => user.value === '' ? user.name : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? user.name : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
@@ -89,7 +89,7 @@
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.returns') }} {{ t('database.returns') }}
</label> </label>
<div class="input-group"> <div class="input-group">
<BaseSelect <BaseSelect
@@ -109,7 +109,7 @@
class="form-input" class="form-input"
type="number" type="number"
min="0" min="0"
:placeholder="t('word.length')" :placeholder="t('database.length')"
> >
</div> </div>
</div> </div>
@@ -117,7 +117,7 @@
<div v-if="customizations.comment" class="column"> <div v-if="customizations.comment" class="column">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.comment') }} {{ t('database.comment') }}
</label> </label>
<input <input
v-model="localFunction.comment" v-model="localFunction.comment"
@@ -129,7 +129,7 @@
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('message.sqlSecurity') }} {{ t('database.sqlSecurity') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.security" v-model="localFunction.security"
@@ -141,7 +141,7 @@
<div v-if="customizations.functionDataAccess" class="column col-auto"> <div v-if="customizations.functionDataAccess" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('message.dataAccess') }} {{ t('database.dataAccess') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.dataAccess" v-model="localFunction.dataAccess"
@@ -154,7 +154,7 @@
<div class="form-group"> <div class="form-group">
<label class="form-label d-invisible">.</label> <label class="form-label d-invisible">.</label>
<label class="form-checkbox form-inline"> <label class="form-checkbox form-inline">
<input v-model="localFunction.deterministic" type="checkbox"><i class="form-icon" /> {{ t('word.deterministic') }} <input v-model="localFunction.deterministic" type="checkbox"><i class="form-icon" /> {{ t('database.deterministic') }}
</label> </label>
</div> </div>
</div> </div>
@@ -162,7 +162,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.functionBody') }}</label> <label class="form-label ml-2">{{ t('database.functionBody') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -1,6 +1,6 @@
<template> <template>
<ConfirmModal <ConfirmModal
:confirm-text="t('word.confirm')" :confirm-text="t('general.confirm')"
size="medium" size="medium"
class="options-modal" class="options-modal"
@confirm="confirmParametersChange" @confirm="confirmParametersChange"
@@ -9,7 +9,7 @@
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-dots-horizontal mr-1" /> <i class="mdi mdi-24px mdi-dots-horizontal mr-1" />
<span class="cut-text">{{ t('word.parameters') }} "{{ func }}"</span> <span class="cut-text">{{ t('database.parameters') }} "{{ func }}"</span>
</div> </div>
</template> </template>
<template #body> <template #body>
@@ -20,16 +20,16 @@
<div class="d-flex"> <div class="d-flex">
<button class="btn btn-dark btn-sm d-flex" @click="addParameter"> <button class="btn btn-dark btn-sm d-flex" @click="addParameter">
<i class="mdi mdi-24px mdi-plus mr-1" /> <i class="mdi mdi-24px mdi-plus mr-1" />
<span>{{ t('word.add') }}</span> <span>{{ t('general.add') }}</span>
</button> </button>
<button <button
class="btn btn-dark btn-sm d-flex ml-2 mr-0" class="btn btn-dark btn-sm d-flex ml-2 mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
:disabled="!isChanged" :disabled="!isChanged"
@click.prevent="clearChanges" @click.prevent="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
</div> </div>
</div> </div>
@@ -55,7 +55,7 @@
<div class="tile-action"> <div class="tile-action">
<button <button
class="btn btn-link remove-field p-0 mr-2" class="btn btn-link remove-field p-0 mr-2"
:title="t('word.delete')" :title="t('general.delete')"
@click.prevent="removeParameter(param._antares_id)" @click.prevent="removeParameter(param._antares_id)"
> >
<i class="mdi mdi-close" /> <i class="mdi mdi-close" />
@@ -74,7 +74,7 @@
> >
<div class="form-group"> <div class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.name') }} {{ t('general.name') }}
</label> </label>
<div class="column"> <div class="column">
<input <input
@@ -86,7 +86,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.type') }} {{ t('database.type') }}
</label> </label>
<div class="column"> <div class="column">
<BaseSelect <BaseSelect
@@ -102,7 +102,7 @@
</div> </div>
<div v-if="customizations.parametersLength" class="form-group"> <div v-if="customizations.parametersLength" class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.length') }} {{ t('database.length') }}
</label> </label>
<div class="column"> <div class="column">
<input <input
@@ -115,7 +115,7 @@
</div> </div>
<div v-if="customizations.functionContext" class="form-group"> <div v-if="customizations.functionContext" class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.context') }} {{ t('database.context') }}
</label> </label>
<div class="column"> <div class="column">
<label class="form-radio"> <label class="form-radio">
@@ -150,11 +150,11 @@
<i class="mdi mdi-dots-horizontal mdi-48px" /> <i class="mdi mdi-dots-horizontal mdi-48px" />
</div> </div>
<p class="empty-title h5"> <p class="empty-title h5">
{{ t('message.thereAreNoParameters') }} {{ t('database.thereAreNoParameters') }}
</p> </p>
<div class="empty-action"> <div class="empty-action">
<button class="btn btn-primary" @click="addParameter"> <button class="btn btn-primary" @click="addParameter">
{{ t('message.createNewParameter') }} {{ t('database.createNewParameter') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -10,16 +10,16 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
<div class="divider-vert py-3" /> <div class="divider-vert py-3" />
@@ -30,15 +30,15 @@
@click="runRoutineCheck" @click="runRoutineCheck"
> >
<i class="mdi mdi-24px mdi-play mr-1" /> <i class="mdi mdi-24px mdi-play mr-1" />
<span>{{ t('word.run') }}</span> <span>{{ t('general.run') }}</span>
</button> </button>
<button class="btn btn-dark btn-sm" @click="showParamsModal"> <button class="btn btn-dark btn-sm" @click="showParamsModal">
<i class="mdi mdi-24px mdi-dots-horizontal mr-1" /> <i class="mdi mdi-24px mdi-dots-horizontal mr-1" />
<span>{{ t('word.parameters') }}</span> <span>{{ t('database.parameters') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -49,7 +49,7 @@
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.name') }} {{ t('general.name') }}
</label> </label>
<input <input
ref="firstInput" ref="firstInput"
@@ -63,7 +63,7 @@
<div v-if="customizations.languages" class="column col-auto"> <div v-if="customizations.languages" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.language') }} {{ t('application.language') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localRoutine.language" v-model="localRoutine.language"
@@ -75,11 +75,11 @@
<div v-if="customizations.definer" class="column col-auto"> <div v-if="customizations.definer" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.definer') }} {{ t('database.definer') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localRoutine.definer" v-model="localRoutine.definer"
:options="[{value: '', name: t('message.currentUser')}, ...workspace.users]" :options="[{value: '', name: t('database.currentUser')}, ...workspace.users]"
:option-label="(user: any) => user.value === '' ? user.name : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? user.name : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
@@ -89,7 +89,7 @@
<div v-if="customizations.comment" class="column"> <div v-if="customizations.comment" class="column">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.comment') }} {{ t('database.comment') }}
</label> </label>
<input <input
v-model="localRoutine.comment" v-model="localRoutine.comment"
@@ -101,7 +101,7 @@
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('message.sqlSecurity') }} {{ t('database.sqlSecurity') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localRoutine.security" v-model="localRoutine.security"
@@ -113,7 +113,7 @@
<div v-if="customizations.procedureDataAccess" class="column col-auto"> <div v-if="customizations.procedureDataAccess" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('message.dataAccess') }} {{ t('database.dataAccess') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localRoutine.dataAccess" v-model="localRoutine.dataAccess"
@@ -126,7 +126,7 @@
<div class="form-group"> <div class="form-group">
<label class="form-label d-invisible">.</label> <label class="form-label d-invisible">.</label>
<label class="form-checkbox form-inline"> <label class="form-checkbox form-inline">
<input v-model="localRoutine.deterministic" type="checkbox"><i class="form-icon" /> {{ t('word.deterministic') }} <input v-model="localRoutine.deterministic" type="checkbox"><i class="form-icon" /> {{ t('database.deterministic') }}
</label> </label>
</div> </div>
</div> </div>
@@ -134,7 +134,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.routineBody') }}</label> <label class="form-label ml-2">{{ t('database.routineBody') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -1,6 +1,6 @@
<template> <template>
<ConfirmModal <ConfirmModal
:confirm-text="t('word.confirm')" :confirm-text="t('general.confirm')"
size="medium" size="medium"
class="options-modal" class="options-modal"
@confirm="confirmParametersChange" @confirm="confirmParametersChange"
@@ -9,7 +9,7 @@
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-dots-horizontal mr-1" /> <i class="mdi mdi-24px mdi-dots-horizontal mr-1" />
<span class="cut-text">{{ t('word.parameters') }} "{{ routine }}"</span> <span class="cut-text">{{ t('database.parameters') }} "{{ routine }}"</span>
</div> </div>
</template> </template>
<template #body> <template #body>
@@ -20,16 +20,16 @@
<div class="d-flex"> <div class="d-flex">
<button class="btn btn-dark btn-sm d-flex" @click="addParameter"> <button class="btn btn-dark btn-sm d-flex" @click="addParameter">
<i class="mdi mdi-24px mdi-plus mr-1" /> <i class="mdi mdi-24px mdi-plus mr-1" />
<span>{{ t('word.add') }}</span> <span>{{ t('general.add') }}</span>
</button> </button>
<button <button
class="btn btn-dark btn-sm d-flex ml-2 mr-0" class="btn btn-dark btn-sm d-flex ml-2 mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
:disabled="!isChanged" :disabled="!isChanged"
@click.prevent="clearChanges" @click.prevent="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
</div> </div>
</div> </div>
@@ -55,7 +55,7 @@
<div class="tile-action"> <div class="tile-action">
<button <button
class="btn btn-link remove-field p-0 mr-2" class="btn btn-link remove-field p-0 mr-2"
:title="t('word.delete')" :title="t('general.delete')"
@click.prevent="removeParameter(param._antares_id)" @click.prevent="removeParameter(param._antares_id)"
> >
<i class="mdi mdi-close" /> <i class="mdi mdi-close" />
@@ -74,7 +74,7 @@
> >
<div class="form-group"> <div class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.name') }} {{ t('general.name') }}
</label> </label>
<div class="column"> <div class="column">
<input <input
@@ -86,7 +86,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.type') }} {{ t('database.type') }}
</label> </label>
<div class="column"> <div class="column">
<BaseSelect <BaseSelect
@@ -102,7 +102,7 @@
</div> </div>
<div v-if="customizations.parametersLength" class="form-group"> <div v-if="customizations.parametersLength" class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.length') }} {{ t('database.length') }}
</label> </label>
<div class="column"> <div class="column">
<input <input
@@ -115,7 +115,7 @@
</div> </div>
<div v-if="customizations.procedureContext" class="form-group"> <div v-if="customizations.procedureContext" class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.context') }} {{ t('database.context') }}
</label> </label>
<div class="column"> <div class="column">
<label <label
@@ -138,11 +138,11 @@
<i class="mdi mdi-dots-horizontal mdi-48px" /> <i class="mdi mdi-dots-horizontal mdi-48px" />
</div> </div>
<p class="empty-title h5"> <p class="empty-title h5">
{{ t('message.thereAreNoParameters') }} {{ t('database.thereAreNoParameters') }}
</p> </p>
<div class="empty-action"> <div class="empty-action">
<button class="btn btn-primary" @click="addParameter"> <button class="btn btn-primary" @click="addParameter">
{{ t('message.createNewParameter') }} {{ t('database.createNewParameter') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -10,26 +10,26 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
<div class="divider-vert py-3" /> <div class="divider-vert py-3" />
<button class="btn btn-dark btn-sm" @click="showTimingModal"> <button class="btn btn-dark btn-sm" @click="showTimingModal">
<i class="mdi mdi-24px mdi-timer mr-1" /> <i class="mdi mdi-24px mdi-timer mr-1" />
<span>{{ t('word.timing') }}</span> <span>{{ t('database.timing') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -39,7 +39,7 @@
<div class="columns"> <div class="columns">
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.name') }}</label> <label class="form-label">{{ t('general.name') }}</label>
<input <input
v-model="localScheduler.name" v-model="localScheduler.name"
class="form-input" class="form-input"
@@ -49,11 +49,11 @@
</div> </div>
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.definer') }}</label> <label class="form-label">{{ t('database.definer') }}</label>
<BaseSelect <BaseSelect
v-model="localScheduler.definer" v-model="localScheduler.definer"
:options="users" :options="users"
:option-label="(user: any) => user.value === '' ? t('message.currentUser') : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? t('database.currentUser') : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
/> />
@@ -61,7 +61,7 @@
</div> </div>
<div class="column"> <div class="column">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.comment') }}</label> <label class="form-label">{{ t('database.comment') }}</label>
<input <input
v-model="localScheduler.comment" v-model="localScheduler.comment"
class="form-input" class="form-input"
@@ -71,7 +71,7 @@
</div> </div>
<div class="column"> <div class="column">
<div class="form-group"> <div class="form-group">
<label class="form-label mr-2">{{ t('word.state') }}</label> <label class="form-label mr-2">{{ t('database.state') }}</label>
<label class="form-radio form-inline"> <label class="form-radio form-inline">
<input <input
v-model="localScheduler.state" v-model="localScheduler.state"
@@ -102,7 +102,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.schedulerBody') }}</label> <label class="form-label ml-2">{{ t('database.schedulerBody') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -1,6 +1,6 @@
<template> <template>
<ConfirmModal <ConfirmModal
:confirm-text="t('word.confirm')" :confirm-text="t('general.confirm')"
size="400" size="400"
:disable-autofocus="true" :disable-autofocus="true"
@confirm="confirmOptionsChange" @confirm="confirmOptionsChange"
@@ -9,14 +9,14 @@
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-timer mr-1" /> <i class="mdi mdi-24px mdi-timer mr-1" />
<span class="cut-text">{{ t('word.timing') }} "{{ localOptions.name }}"</span> <span class="cut-text">{{ t('database.timing') }} "{{ localOptions.name }}"</span>
</div> </div>
</template> </template>
<template #body> <template #body>
<form class="form-horizontal"> <form class="form-horizontal">
<div class="form-group"> <div class="form-group">
<label class="form-label col-4"> <label class="form-label col-4">
{{ t('word.execution') }} {{ t('database.execution') }}
</label> </label>
<div class="column"> <div class="column">
<BaseSelect <BaseSelect
@@ -62,7 +62,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label col-4"> <label class="form-label col-4">
{{ t('word.starts') }} {{ t('database.starts') }}
</label> </label>
<div class="column"> <div class="column">
<div class="input-group"> <div class="input-group">
@@ -83,7 +83,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label col-4"> <label class="form-label col-4">
{{ t('word.ends') }} {{ t('database.ends') }}
</label> </label>
<div class="column"> <div class="column">
<div class="input-group"> <div class="input-group">
@@ -125,7 +125,7 @@
<div class="col-4" /> <div class="col-4" />
<div class="column"> <div class="column">
<label class="form-checkbox form-inline mt-2"> <label class="form-checkbox form-inline mt-2">
<input v-model="optionsProxy.preserve" type="checkbox"><i class="form-icon" /> {{ t('message.preserveOnCompletion') }} <input v-model="optionsProxy.preserve" type="checkbox"><i class="form-icon" /> {{ t('database.preserveOnCompletion') }}
</label> </label>
</div> </div>
</div> </div>

View File

@@ -10,16 +10,16 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged || isSaving" :disabled="!isChanged || isSaving"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
<div class="divider-vert py-3" /> <div class="divider-vert py-3" />
@@ -27,20 +27,20 @@
<button <button
:disabled="isSaving" :disabled="isSaving"
class="btn btn-dark btn-sm" class="btn btn-dark btn-sm"
:title="t('message.addNewField')" :title="t('database.addNewField')"
@click="addField" @click="addField"
> >
<i class="mdi mdi-24px mdi-playlist-plus mr-1" /> <i class="mdi mdi-24px mdi-playlist-plus mr-1" />
<span>{{ t('word.add') }}</span> <span>{{ t('general.add') }}</span>
</button> </button>
<button <button
:disabled="isSaving" :disabled="isSaving"
class="btn btn-dark btn-sm" class="btn btn-dark btn-sm"
:title="t('message.manageIndexes')" :title="t('database.manageIndexes')"
@click="showIntdexesModal" @click="showIntdexesModal"
> >
<i class="mdi mdi-24px mdi-key mdi-rotate-45 mr-1" /> <i class="mdi mdi-24px mdi-key mdi-rotate-45 mr-1" />
<span>{{ t('word.indexes') }}</span> <span>{{ t('database.indexes') }}</span>
</button> </button>
<button <button
class="btn btn-dark btn-sm mr-0" class="btn btn-dark btn-sm mr-0"
@@ -48,7 +48,7 @@
@click="showForeignModal" @click="showForeignModal"
> >
<i class="mdi mdi-24px mdi-key-link mr-1" /> <i class="mdi mdi-24px mdi-key-link mr-1" />
<span>{{ t('word.foreignKeys') }}</span> <span>{{ t('database.foreignKeys') }}</span>
</button> </button>
<div class="divider-vert py-3" /> <div class="divider-vert py-3" />
@@ -60,11 +60,11 @@
@click="showDdlModal" @click="showDdlModal"
> >
<i class="mdi mdi-24px mdi-code-tags mr-1" /> <i class="mdi mdi-24px mdi-code-tags mr-1" />
<span>{{ t('word.ddl') }}</span> <span>{{ t('database.ddl') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -74,7 +74,7 @@
<div class="columns mb-4"> <div class="columns mb-4">
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.name') }}</label> <label class="form-label">{{ t('general.name') }}</label>
<input <input
v-model="localOptions.name" v-model="localOptions.name"
class="form-input" class="form-input"
@@ -84,7 +84,7 @@
</div> </div>
<div v-if="workspace.customizations.comment" class="column"> <div v-if="workspace.customizations.comment" class="column">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.comment') }}</label> <label class="form-label">{{ t('database.comment') }}</label>
<input <input
v-model="localOptions.comment" v-model="localOptions.comment"
class="form-input" class="form-input"
@@ -96,7 +96,7 @@
<div v-if="workspace.customizations.autoIncrement" class="column col-auto"> <div v-if="workspace.customizations.autoIncrement" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.autoIncrement') }} {{ t('database.autoIncrement') }}
</label> </label>
<input <input
ref="firstInput" ref="firstInput"
@@ -110,7 +110,7 @@
<div v-if="workspace.customizations.collations" class="column col-auto"> <div v-if="workspace.customizations.collations" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.collation') }} {{ t('database.collation') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localOptions.collation" v-model="localOptions.collation"
@@ -125,7 +125,7 @@
<div v-if="workspace.customizations.engines" class="column col-auto"> <div v-if="workspace.customizations.engines" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.engine') }} {{ t('database.engine') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localOptions.engine" v-model="localOptions.engine"
@@ -559,7 +559,7 @@ const addField = () => {
const uid = uidGen(); const uid = uidGen();
localFields.value.push({ localFields.value.push({
_antares_id: uid, _antares_id: uid,
name: `${t('word.field', 1)}_${uid.substring(0, 4)}`, name: `${t('database.field', 1)}_${uid.substring(0, 4)}`,
key: '', key: '',
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
type: (workspace.value.dataTypes[0] as any).types[0].name, type: (workspace.value.dataTypes[0] as any).types[0].name,

View File

@@ -4,7 +4,7 @@
@close-context="closeContext" @close-context="closeContext"
> >
<div class="context-element"> <div class="context-element">
<span class="d-flex"><i class="mdi mdi-18px mdi-key-plus text-light pr-1" /> {{ t('message.createNewIndex') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-key-plus text-light pr-1" /> {{ t('database.createNewIndex') }}</span>
<i class="mdi mdi-18px mdi-chevron-right text-light pl-1" /> <i class="mdi mdi-18px mdi-chevron-right text-light pl-1" />
<div class="context-submenu"> <div class="context-submenu">
<div <div
@@ -19,7 +19,7 @@
</div> </div>
</div> </div>
<div v-if="indexes.length" class="context-element"> <div v-if="indexes.length" class="context-element">
<span class="d-flex"><i class="mdi mdi-18px mdi-key-arrow-right text-light pr-1" /> {{ t('message.addToIndex') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-key-arrow-right text-light pr-1" /> {{ t('database.addToIndex') }}</span>
<i class="mdi mdi-18px mdi-chevron-right text-light pl-1" /> <i class="mdi mdi-18px mdi-chevron-right text-light pl-1" />
<div class="context-submenu"> <div class="context-submenu">
<div <div
@@ -34,10 +34,10 @@
</div> </div>
</div> </div>
<div class="context-element" @click="duplicateField"> <div class="context-element" @click="duplicateField">
<span class="d-flex"><i class="mdi mdi-18px mdi-content-duplicate text-light pr-1" /> {{ t('word.duplicate') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-content-duplicate text-light pr-1" /> {{ t('general.duplicate') }}</span>
</div> </div>
<div class="context-element" @click="deleteField"> <div class="context-element" @click="deleteField">
<span class="d-flex"><i class="mdi mdi-18px mdi-delete text-light pr-1" /> {{ t('message.deleteField') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-delete text-light pr-1" /> {{ t('database.deleteField') }}</span>
</div> </div>
</BaseContextMenu> </BaseContextMenu>
</template> </template>

View File

@@ -1,16 +1,16 @@
<template> <template>
<ConfirmModal <ConfirmModal
:confirm-text="t('word.confirm')" :confirm-text="t('general.confirm')"
size="large" size="large"
class="options-modal" class="options-modal"
:cancel-text="t('word.close')" :cancel-text="t('general.close')"
:hide-footer="true" :hide-footer="true"
@hide="$emit('hide')" @hide="$emit('hide')"
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-code-tags mr-1" /> <i class="mdi mdi-24px mdi-code-tags mr-1" />
<span class="cut-text">{{ t('word.ddl') }} "{{ table }}"</span> <span class="cut-text">{{ t('database.ddl') }} "{{ table }}"</span>
</div> </div>
</template> </template>
<template #body> <template #body>

View File

@@ -21,81 +21,81 @@
<div class="tr"> <div class="tr">
<div class="th"> <div class="th">
<div class="text-right"> <div class="text-right">
{{ t('word.order') }} {{ t('database.order') }}
</div> </div>
</div> </div>
<div class="th"> <div class="th">
<div class="table-column-title"> <div class="table-column-title">
{{ t('word.key', 2) }} {{ t('database.key', 2) }}
</div> </div>
</div> </div>
<div class="th"> <div class="th">
<div class="column-resizable min-100"> <div class="column-resizable min-100">
<div class="table-column-title"> <div class="table-column-title">
{{ t('word.name') }} {{ t('general.name') }}
</div> </div>
</div> </div>
</div> </div>
<div class="th"> <div class="th">
<div class="column-resizable min-100"> <div class="column-resizable min-100">
<div class="table-column-title"> <div class="table-column-title">
{{ t('word.type') }} {{ t('database.type') }}
</div> </div>
</div> </div>
</div> </div>
<div v-if="customizations.tableArray" class="th"> <div v-if="customizations.tableArray" class="th">
<div class="column-resizable"> <div class="column-resizable">
<div class="table-column-title"> <div class="table-column-title">
{{ t('word.array') }} {{ t('database.array') }}
</div> </div>
</div> </div>
</div> </div>
<div class="th"> <div class="th">
<div class="column-resizable"> <div class="column-resizable">
<div class="table-column-title"> <div class="table-column-title">
{{ t('word.length') }} {{ t('database.length') }}
</div> </div>
</div> </div>
</div> </div>
<div v-if="customizations.unsigned" class="th"> <div v-if="customizations.unsigned" class="th">
<div class="column-resizable"> <div class="column-resizable">
<div class="table-column-title"> <div class="table-column-title">
{{ t('word.unsigned') }} {{ t('database.unsigned') }}
</div> </div>
</div> </div>
</div> </div>
<div v-if="customizations.nullable" class="th"> <div v-if="customizations.nullable" class="th">
<div class="column-resizable"> <div class="column-resizable">
<div class="table-column-title"> <div class="table-column-title">
{{ t('message.allowNull') }} {{ t('database.allowNull') }}
</div> </div>
</div> </div>
</div> </div>
<div v-if="customizations.zerofill" class="th"> <div v-if="customizations.zerofill" class="th">
<div class="column-resizable"> <div class="column-resizable">
<div class="table-column-title"> <div class="table-column-title">
{{ t('message.zeroFill') }} {{ t('database.zeroFill') }}
</div> </div>
</div> </div>
</div> </div>
<div class="th"> <div class="th">
<div class="column-resizable"> <div class="column-resizable">
<div class="table-column-title"> <div class="table-column-title">
{{ t('word.default') }} {{ t('database.default') }}
</div> </div>
</div> </div>
</div> </div>
<div v-if="customizations.comment" class="th"> <div v-if="customizations.comment" class="th">
<div class="column-resizable"> <div class="column-resizable">
<div class="table-column-title"> <div class="table-column-title">
{{ t('word.comment') }} {{ t('database.comment') }}
</div> </div>
</div> </div>
</div> </div>
<div v-if="customizations.collation" class="th"> <div v-if="customizations.collation" class="th">
<div class="column-resizable min-100"> <div class="column-resizable min-100">
<div class="table-column-title"> <div class="table-column-title">
{{ t('word.collation') }} {{ t('database.collation') }}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -1,6 +1,6 @@
<template> <template>
<ConfirmModal <ConfirmModal
:confirm-text="t('word.confirm')" :confirm-text="t('general.confirm')"
size="medium" size="medium"
class="options-modal" class="options-modal"
@confirm="confirmForeignsChange" @confirm="confirmForeignsChange"
@@ -9,7 +9,7 @@
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-key-link mr-1" /> <i class="mdi mdi-24px mdi-key-link mr-1" />
<span class="cut-text">{{ t('word.foreignKeys') }} "{{ table }}"</span> <span class="cut-text">{{ t('database.foreignKeys') }} "{{ table }}"</span>
</div> </div>
</template> </template>
<template #body> <template #body>
@@ -20,16 +20,16 @@
<div class="d-flex"> <div class="d-flex">
<button class="btn btn-dark btn-sm d-flex" @click="addForeign"> <button class="btn btn-dark btn-sm d-flex" @click="addForeign">
<i class="mdi mdi-24px mdi-link-plus mr-1" /> <i class="mdi mdi-24px mdi-link-plus mr-1" />
<span>{{ t('word.add') }}</span> <span>{{ t('general.add') }}</span>
</button> </button>
<button <button
class="btn btn-dark btn-sm d-flex ml-2 mr-0" class="btn btn-dark btn-sm d-flex ml-2 mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
:disabled="!isChanged" :disabled="!isChanged"
@click.prevent="clearChanges" @click.prevent="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
</div> </div>
</div> </div>
@@ -67,7 +67,7 @@
<div class="tile-action"> <div class="tile-action">
<button <button
class="btn btn-link remove-field p-0 mr-2" class="btn btn-link remove-field p-0 mr-2"
:title="t('word.delete')" :title="t('general.delete')"
@click.prevent="removeIndex(foreign._antares_id)" @click.prevent="removeIndex(foreign._antares_id)"
> >
<i class="mdi mdi-close" /> <i class="mdi mdi-close" />
@@ -86,7 +86,7 @@
> >
<div class="form-group"> <div class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.name') }} {{ t('general.name') }}
</label> </label>
<div class="column"> <div class="column">
<input <input
@@ -98,7 +98,7 @@
</div> </div>
<div class="form-group mb-4"> <div class="form-group mb-4">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.field', 1) }} {{ t('database.field', 1) }}
</label> </label>
<div class="fields-list column pt-1"> <div class="fields-list column pt-1">
<label <label
@@ -114,7 +114,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('message.referenceTable') }} {{ t('database.referenceTable') }}
</label> </label>
<div class="column"> <div class="column">
<BaseSelect <BaseSelect
@@ -129,7 +129,7 @@
</div> </div>
<div class="form-group mb-4"> <div class="form-group mb-4">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('message.referenceField') }} {{ t('database.referenceField') }}
</label> </label>
<div class="fields-list column pt-1"> <div class="fields-list column pt-1">
<label <label
@@ -145,7 +145,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('message.onUpdate') }} {{ t('database.onUpdate') }}
</label> </label>
<div class="column"> <div class="column">
<BaseSelect <BaseSelect
@@ -157,7 +157,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('message.onDelete') }} {{ t('database.onDelete') }}
</label> </label>
<div class="column"> <div class="column">
<BaseSelect <BaseSelect
@@ -174,11 +174,11 @@
<i class="mdi mdi-key-link mdi-48px" /> <i class="mdi mdi-key-link mdi-48px" />
</div> </div>
<p class="empty-title h5"> <p class="empty-title h5">
{{ t('message.thereAreNoForeign') }} {{ t('database.thereAreNoForeign') }}
</p> </p>
<div class="empty-action"> <div class="empty-action">
<button class="btn btn-primary" @click="addForeign"> <button class="btn btn-primary" @click="addForeign">
{{ t('message.createNewForeign') }} {{ t('database.createNewForeign') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -1,6 +1,6 @@
<template> <template>
<ConfirmModal <ConfirmModal
:confirm-text="t('word.confirm')" :confirm-text="t('general.confirm')"
size="medium" size="medium"
class="options-modal" class="options-modal"
@confirm="confirmIndexesChange" @confirm="confirmIndexesChange"
@@ -9,7 +9,7 @@
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-key mdi-rotate-45 mr-1" /> <i class="mdi mdi-24px mdi-key mdi-rotate-45 mr-1" />
<span class="cut-text">{{ t('word.indexes') }} "{{ table }}"</span> <span class="cut-text">{{ t('database.indexes') }} "{{ table }}"</span>
</div> </div>
</template> </template>
<template #body> <template #body>
@@ -20,16 +20,16 @@
<div class="d-flex"> <div class="d-flex">
<button class="btn btn-dark btn-sm d-flex" @click="addIndex"> <button class="btn btn-dark btn-sm d-flex" @click="addIndex">
<i class="mdi mdi-24px mdi-key-plus mr-1" /> <i class="mdi mdi-24px mdi-key-plus mr-1" />
<span>{{ t('word.add') }}</span> <span>{{ t('general.add') }}</span>
</button> </button>
<button <button
class="btn btn-dark btn-sm d-flex ml-2 mr-0" class="btn btn-dark btn-sm d-flex ml-2 mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
:disabled="!isChanged" :disabled="!isChanged"
@click.prevent="clearChanges" @click.prevent="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
</div> </div>
</div> </div>
@@ -50,12 +50,12 @@
<div class="tile-title"> <div class="tile-title">
{{ index.name }} {{ index.name }}
</div> </div>
<small class="tile-subtitle text-gray">{{ index.type }} · {{ index.fields.length }} {{ t('word.field', index.fields.length) }}</small> <small class="tile-subtitle text-gray">{{ index.type }} · {{ index.fields.length }} {{ t('database.field', index.fields.length) }}</small>
</div> </div>
<div class="tile-action"> <div class="tile-action">
<button <button
class="btn btn-link remove-field p-0 mr-2" class="btn btn-link remove-field p-0 mr-2"
:title="t('word.delete')" :title="t('general.delete')"
@click.prevent="removeIndex(index._antares_id)" @click.prevent="removeIndex(index._antares_id)"
> >
<i class="mdi mdi-close" /> <i class="mdi mdi-close" />
@@ -74,7 +74,7 @@
> >
<div class="form-group"> <div class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.name') }} {{ t('general.name') }}
</label> </label>
<div class="column"> <div class="column">
<input <input
@@ -86,7 +86,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.type') }} {{ t('database.type') }}
</label> </label>
<div class="column"> <div class="column">
<BaseSelect <BaseSelect
@@ -99,7 +99,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label col-3"> <label class="form-label col-3">
{{ t('word.field', fields.length) }} {{ t('database.field', fields.length) }}
</label> </label>
<div class="fields-list column pt-1"> <div class="fields-list column pt-1">
<label <label
@@ -119,11 +119,11 @@
<i class="mdi mdi-key-outline mdi-48px" /> <i class="mdi mdi-key-outline mdi-48px" />
</div> </div>
<p class="empty-title h5"> <p class="empty-title h5">
{{ t('message.thereAreNoIndexes') }} {{ t('database.thereAreNoIndexes') }}
</p> </p>
<div class="empty-action"> <div class="empty-action">
<button class="btn btn-primary" @click="addIndex"> <button class="btn btn-primary" @click="addIndex">
{{ t('message.createNewIndex') }} {{ t('database.createNewIndex') }}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -220,7 +220,7 @@
</div> </div>
<ConfirmModal <ConfirmModal
v-if="isDefaultModal" v-if="isDefaultModal"
:confirm-text="t('word.confirm')" :confirm-text="t('general.confirm')"
size="400" size="400"
@confirm="editOFF" @confirm="editOFF"
@hide="hideDefaultModal" @hide="hideDefaultModal"
@@ -228,7 +228,7 @@
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-playlist-edit mr-1" /> <i class="mdi mdi-24px mdi-playlist-edit mr-1" />
<span class="cut-text">{{ t('word.default') }} "{{ row.name }}"</span> <span class="cut-text">{{ t('database.default') }} "{{ row.name }}"</span>
</div> </div>
</template> </template>
<template #body> <template #body>
@@ -251,7 +251,7 @@
value="custom" value="custom"
type="radio" type="radio"
name="default" name="default"
><i class="form-icon" /> {{ t('message.customValue') }} ><i class="form-icon" /> {{ t('database.customValue') }}
</label> </label>
<div class="column"> <div class="column">
<input <input
@@ -292,7 +292,7 @@
type="radio" type="radio"
name="default" name="default"
value="expression" value="expression"
><i class="form-icon" /> {{ t('word.expression') }} ><i class="form-icon" /> {{ t('database.expression') }}
</label> </label>
<div class="column"> <div class="column">
<input <input
@@ -307,7 +307,7 @@
<div v-if="customizations.onUpdate"> <div v-if="customizations.onUpdate">
<div class="form-group"> <div class="form-group">
<label class="form-label col-4"> <label class="form-label col-4">
{{ t('message.onUpdate') }} {{ t('database.onUpdate') }}
</label> </label>
<div class="column"> <div class="column">
<input <input

View File

@@ -10,20 +10,20 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -33,7 +33,7 @@
<div class="columns"> <div class="columns">
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.name') }}</label> <label class="form-label">{{ t('general.name') }}</label>
<input <input
v-model="localTrigger.name" v-model="localTrigger.name"
class="form-input" class="form-input"
@@ -43,11 +43,11 @@
</div> </div>
<div v-if="customizations.definer" class="column col-auto"> <div v-if="customizations.definer" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.definer') }}</label> <label class="form-label">{{ t('database.definer') }}</label>
<BaseSelect <BaseSelect
v-model="localTrigger.definer" v-model="localTrigger.definer"
:options="users" :options="users"
:option-label="(user: any) => user.value === '' ? t('message.currentUser') : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? t('database.currentUser') : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
/> />
@@ -56,7 +56,7 @@
<fieldset class="column columns mb-0" :disabled="customizations.triggerOnlyRename"> <fieldset class="column columns mb-0" :disabled="customizations.triggerOnlyRename">
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.table') }}</label> <label class="form-label">{{ t('database.table') }}</label>
<BaseSelect <BaseSelect
v-model="localTrigger.table" v-model="localTrigger.table"
:options="schemaTables" :options="schemaTables"
@@ -68,7 +68,7 @@
</div> </div>
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.event') }}</label> <label class="form-label">{{ t('database.event') }}</label>
<div class="input-group"> <div class="input-group">
<BaseSelect <BaseSelect
v-model="localTrigger.activation" v-model="localTrigger.activation"
@@ -100,7 +100,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.triggerStatement') }}</label> <label class="form-label ml-2">{{ t('database.triggerStatement') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -10,16 +10,16 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
</div> </div>
</div> </div>
@@ -29,7 +29,7 @@
<div v-if="customizations.triggerFunctionlanguages" class="column col-auto"> <div v-if="customizations.triggerFunctionlanguages" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.language') }} {{ t('application.language') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.language" v-model="localFunction.language"
@@ -41,12 +41,12 @@
<div v-if="customizations.definer" class="column col-auto"> <div v-if="customizations.definer" class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.definer') }} {{ t('database.definer') }}
</label> </label>
<BaseSelect <BaseSelect
v-model="localFunction.definer" v-model="localFunction.definer"
:options="workspace.users" :options="workspace.users"
:option-label="(user: any) => user.value === '' ? t('message.currentUser') : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? t('database.currentUser') : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
/> />
@@ -54,7 +54,7 @@
</div> </div>
<div v-if="customizations.comment" class="form-group"> <div v-if="customizations.comment" class="form-group">
<label class="form-label"> <label class="form-label">
{{ t('word.comment') }} {{ t('database.comment') }}
</label> </label>
<input <input
v-model="localFunction.comment" v-model="localFunction.comment"
@@ -66,7 +66,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.functionBody') }}</label> <label class="form-label ml-2">{{ t('database.functionBody') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -10,20 +10,20 @@
@click="saveChanges" @click="saveChanges"
> >
<i class="mdi mdi-24px mdi-content-save mr-1" /> <i class="mdi mdi-24px mdi-content-save mr-1" />
<span>{{ t('word.save') }}</span> <span>{{ t('general.save') }}</span>
</button> </button>
<button <button
:disabled="!isChanged" :disabled="!isChanged"
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
:title="t('message.clearChanges')" :title="t('database.clearChanges')"
@click="clearChanges" @click="clearChanges"
> >
<i class="mdi mdi-24px mdi-delete-sweep mr-1" /> <i class="mdi mdi-24px mdi-delete-sweep mr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -33,7 +33,7 @@
<div class="columns"> <div class="columns">
<div class="column col-auto"> <div class="column col-auto">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('word.name') }}</label> <label class="form-label">{{ t('general.name') }}</label>
<input <input
v-model="localView.name" v-model="localView.name"
class="form-input" class="form-input"
@@ -43,11 +43,11 @@
</div> </div>
<div class="column col-auto"> <div class="column col-auto">
<div v-if="workspace.customizations.definer" class="form-group"> <div v-if="workspace.customizations.definer" class="form-group">
<label class="form-label">{{ t('word.definer') }}</label> <label class="form-label">{{ t('database.definer') }}</label>
<BaseSelect <BaseSelect
v-model="localView.definer" v-model="localView.definer"
:options="users" :options="users"
:option-label="(user: any) => user.value === '' ? t('message.currentUser') : `${user.name}@${user.host}`" :option-label="(user: any) => user.value === '' ? t('database.currentUser') : `${user.name}@${user.host}`"
:option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``" :option-track-by="(user: any) => user.value === '' ? '' : `\`${user.name}\`@\`${user.host}\``"
class="form-select" class="form-select"
/> />
@@ -55,7 +55,7 @@
</div> </div>
<div class="column col-auto mr-2"> <div class="column col-auto mr-2">
<div v-if="workspace.customizations.viewSqlSecurity" class="form-group"> <div v-if="workspace.customizations.viewSqlSecurity" class="form-group">
<label class="form-label">{{ t('message.sqlSecurity') }}</label> <label class="form-label">{{ t('database.sqlSecurity') }}</label>
<BaseSelect <BaseSelect
v-model="localView.security" v-model="localView.security"
:options="['DEFINER', 'INVOKER']" :options="['DEFINER', 'INVOKER']"
@@ -65,7 +65,7 @@
</div> </div>
<div class="column col-auto mr-2"> <div class="column col-auto mr-2">
<div v-if="workspace.customizations.viewAlgorithm" class="form-group"> <div v-if="workspace.customizations.viewAlgorithm" class="form-group">
<label class="form-label">{{ t('word.algorithm') }}</label> <label class="form-label">{{ t('database.algorithm') }}</label>
<BaseSelect <BaseSelect
v-model="localView.algorithm" v-model="localView.algorithm"
:options="['UNDEFINED', 'MERGE', 'TEMPTABLE']" :options="['UNDEFINED', 'MERGE', 'TEMPTABLE']"
@@ -75,7 +75,7 @@
</div> </div>
<div v-if="workspace.customizations.viewUpdateOption" class="column col-auto mr-2"> <div v-if="workspace.customizations.viewUpdateOption" class="column col-auto mr-2">
<div class="form-group"> <div class="form-group">
<label class="form-label">{{ t('message.updateOption') }}</label> <label class="form-label">{{ t('database.updateOption') }}</label>
<BaseSelect <BaseSelect
v-model="localView.updateOption" v-model="localView.updateOption"
:option-track-by="(user: any) => user.value" :option-track-by="(user: any) => user.value"
@@ -88,7 +88,7 @@
</div> </div>
<div class="workspace-query-results column col-12 mt-2 p-relative"> <div class="workspace-query-results column col-12 mt-2 p-relative">
<BaseLoader v-if="isLoading" /> <BaseLoader v-if="isLoading" />
<label class="form-label ml-2">{{ t('message.selectStatement') }}</label> <label class="form-label ml-2">{{ t('database.selectStatement') }}</label>
<QueryEditor <QueryEditor
v-show="isSelected" v-show="isSelected"
ref="queryEditor" ref="queryEditor"

View File

@@ -24,11 +24,11 @@
v-if="showCancel && isQuering" v-if="showCancel && isQuering"
class="btn btn-primary btn-sm cancellable" class="btn btn-primary btn-sm cancellable"
:disabled="!query" :disabled="!query"
:title="t('word.cancel')" :title="t('general.cancel')"
@click="killTabQuery()" @click="killTabQuery()"
> >
<i class="mdi mdi-24px mdi-window-close" /> <i class="mdi mdi-24px mdi-window-close" />
<span class="d-invisible pr-1">{{ t('word.run') }}</span> <span class="d-invisible pr-1">{{ t('general.run') }}</span>
</button> </button>
<button <button
v-else v-else
@@ -38,7 +38,7 @@
@click="runQuery(query)" @click="runQuery(query)"
> >
<i class="mdi mdi-24px mdi-play pr-1" /> <i class="mdi mdi-24px mdi-play pr-1" />
<span>{{ t('word.run') }}</span> <span>{{ t('general.run') }}</span>
</button> </button>
</div> </div>
<button <button
@@ -48,7 +48,7 @@
@click="commitTab()" @click="commitTab()"
> >
<i class="mdi mdi-24px mdi-cube-send pr-1" /> <i class="mdi mdi-24px mdi-cube-send pr-1" />
<span>{{ t('word.commit') }}</span> <span>{{ t('database.commit') }}</span>
</button> </button>
<button <button
v-if="!autocommit" v-if="!autocommit"
@@ -57,7 +57,7 @@
@click="rollbackTab()" @click="rollbackTab()"
> >
<i class="mdi mdi-24px mdi-undo-variant pr-1" /> <i class="mdi mdi-24px mdi-undo-variant pr-1" />
<span>{{ t('word.rollback') }}</span> <span>{{ t('database.rollback') }}</span>
</button> </button>
<button <button
class="btn btn-link btn-sm mr-0" class="btn btn-link btn-sm mr-0"
@@ -65,7 +65,7 @@
@click="clear()" @click="clear()"
> >
<i class="mdi mdi-24px mdi-delete-sweep pr-1" /> <i class="mdi mdi-24px mdi-delete-sweep pr-1" />
<span>{{ t('word.clear') }}</span> <span>{{ t('general.clear') }}</span>
</button> </button>
<div class="divider-vert py-3" /> <div class="divider-vert py-3" />
@@ -76,7 +76,7 @@
@click="beautify()" @click="beautify()"
> >
<i class="mdi mdi-24px mdi-brush pr-1" /> <i class="mdi mdi-24px mdi-brush pr-1" />
<span>{{ t('word.format') }}</span> <span>{{ t('general.format') }}</span>
</button> </button>
<button <button
class="btn btn-dark btn-sm" class="btn btn-dark btn-sm"
@@ -84,7 +84,7 @@
@click="openHistoryModal()" @click="openHistoryModal()"
> >
<i class="mdi mdi-24px mdi-history pr-1" /> <i class="mdi mdi-24px mdi-history pr-1" />
<span>{{ t('word.history') }}</span> <span>{{ t('general.history') }}</span>
</button> </button>
<div class="dropdown table-dropdown pr-2"> <div class="dropdown table-dropdown pr-2">
<button <button
@@ -93,7 +93,7 @@
tabindex="0" tabindex="0"
> >
<i class="mdi mdi-24px mdi-file-export mr-1" /> <i class="mdi mdi-24px mdi-file-export mr-1" />
<span>{{ t('word.export') }}</span> <span>{{ t('database.export') }}</span>
<i class="mdi mdi-24px mdi-menu-down" /> <i class="mdi mdi-24px mdi-menu-down" />
</button> </button>
<ul class="menu text-left"> <ul class="menu text-left">
@@ -104,18 +104,18 @@
<a class="c-hand" @click="downloadTable('csv')">CSV</a> <a class="c-hand" @click="downloadTable('csv')">CSV</a>
</li> </li>
<li class="menu-item"> <li class="menu-item">
<a class="c-hand" @click="downloadTable('php')">{{ t('message.phpArray') }}</a> <a class="c-hand" @click="downloadTable('php')">{{ t('application.phpArray') }}</a>
</li> </li>
<li class="menu-item"> <li class="menu-item">
<a class="c-hand" @click="downloadTable('sql')">SQL INSERT</a> <a class="c-hand" @click="downloadTable('sql')">SQL INSERT</a>
</li> </li>
</ul> </ul>
</div> </div>
<div class="input-group pr-2" :title="t('message.commitMode')"> <div class="input-group pr-2" :title="t('database.commitMode')">
<i class="input-group-addon addon-sm mdi mdi-24px mdi-source-commit p-0" /> <i class="input-group-addon addon-sm mdi mdi-24px mdi-source-commit p-0" />
<BaseSelect <BaseSelect
v-model="autocommit" v-model="autocommit"
:options="[{value: true, label: t('message.autoCommit')}, {value: false, label: t('message.manualCommit')}]" :options="[{value: true, label: t('database.autoCommit')}, {value: false, label: t('database.manualCommit')}]"
:option-label="(opt: any) => opt.label" :option-label="(opt: any) => opt.label"
:option-track-by="(opt: any) => opt.value" :option-track-by="(opt: any) => opt.value"
class="form-select select-sm text-bold" class="form-select select-sm text-bold"
@@ -126,30 +126,30 @@
<div <div
v-if="results.length" v-if="results.length"
class="d-flex" class="d-flex"
:title="t('message.queryDuration')" :title="t('database.queryDuration')"
> >
<i class="mdi mdi-timer-sand mdi-rotate-180 pr-1" /> <b>{{ durationsCount / 1000 }}s</b> <i class="mdi mdi-timer-sand mdi-rotate-180 pr-1" /> <b>{{ durationsCount / 1000 }}s</b>
</div> </div>
<div <div
v-if="resultsCount" v-if="resultsCount"
class="d-flex" class="d-flex"
:title="t('word.results')" :title="t('general.results')"
> >
<i class="mdi mdi-equal pr-1" /> <b>{{ resultsCount.toLocaleString() }}</b> <i class="mdi mdi-equal pr-1" /> <b>{{ resultsCount.toLocaleString() }}</b>
</div> </div>
<div <div
v-if="hasAffected" v-if="hasAffected"
class="d-flex" class="d-flex"
:title="t('message.affectedRows')" :title="t('database.affectedRows')"
> >
<i class="mdi mdi-target pr-1" /> <b>{{ affectedCount }}</b> <i class="mdi mdi-target pr-1" /> <b>{{ affectedCount }}</b>
</div> </div>
<div class="input-group" :title="t('word.schema')"> <div class="input-group" :title="t('database.schema')">
<i class="input-group-addon addon-sm mdi mdi-24px mdi-database" /> <i class="input-group-addon addon-sm mdi mdi-24px mdi-database" />
<BaseSelect <BaseSelect
v-model="selectedSchema" v-model="selectedSchema"
:options="[{value: null, label: t('message.noSchema')}, ...databaseSchemas.map(el => ({label: el, value: el}))]" :options="[{value: null, label: t('database.noSchema')}, ...databaseSchemas.map(el => ({label: el, value: el}))]"
class="form-select select-sm text-bold" class="form-select select-sm text-bold"
/> />
</div> </div>
@@ -291,6 +291,11 @@ watch(selectedSchema, () => {
changeBreadcrumbs({ schema: selectedSchema.value, query: `Query #${props.tab.index}` }); changeBreadcrumbs({ schema: selectedSchema.value, query: `Query #${props.tab.index}` });
}); });
watch(databaseSchemas, () => {
if (!databaseSchemas.value.includes(selectedSchema.value))
selectedSchema.value = null;
}, { deep: true });
const runQuery = async (query: string) => { const runQuery = async (query: string) => {
if (!query || isQuering.value) return; if (!query || isQuering.value) return;
isQuering.value = true; isQuering.value = true;
@@ -463,7 +468,7 @@ const commitTab = async () => {
await Schema.commitTab(params); await Schema.commitTab(params);
setUnsavedChanges({ uid: props.connection.uid, tUid: props.tabUid, isChanged: false }); setUnsavedChanges({ uid: props.connection.uid, tUid: props.tabUid, isChanged: false });
addNotification({ status: 'success', message: t('message.actionSuccessful', { action: 'COMMIT' }) }); addNotification({ status: 'success', message: t('general.actionSuccessful', { action: 'COMMIT' }) });
} }
catch (err) { catch (err) {
addNotification({ status: 'error', message: err.stack }); addNotification({ status: 'error', message: err.stack });
@@ -482,7 +487,7 @@ const rollbackTab = async () => {
await Schema.rollbackTab(params); await Schema.rollbackTab(params);
setUnsavedChanges({ uid: props.connection.uid, tUid: props.tabUid, isChanged: false }); setUnsavedChanges({ uid: props.connection.uid, tUid: props.tabUid, isChanged: false });
addNotification({ status: 'success', message: t('message.actionSuccessful', { action: 'ROLLBACK' }) }); addNotification({ status: 'success', message: t('general.actionSuccessful', { action: 'ROLLBACK' }) });
} }
catch (err) { catch (err) {
addNotification({ status: 'error', message: err.stack }); addNotification({ status: 'error', message: err.stack });
@@ -496,9 +501,6 @@ defineExpose({ resizeResults });
query.value = props.tab.content as string; query.value = props.tab.content as string;
selectedSchema.value = props.tab.schema || breadcrumbsSchema.value; selectedSchema.value = props.tab.schema || breadcrumbsSchema.value;
if (!databaseSchemas.value.includes(selectedSchema.value))
selectedSchema.value = null;
window.addEventListener('resize', onWindowResize); window.addEventListener('resize', onWindowResize);
const reloadListener = () => { const reloadListener = () => {

View File

@@ -102,12 +102,12 @@
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-delete mr-1" /> <i class="mdi mdi-24px mdi-delete mr-1" />
<span class="cut-text">{{ t('message.deleteRows', selectedRows.length) }}</span> <span class="cut-text">{{ t('database.deleteRows', selectedRows.length) }}</span>
</div> </div>
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
{{ t('message.confirmToDeleteRows', selectedRows.length) }} {{ t('database.confirmToDeleteRows', selectedRows.length) }}
</div> </div>
</template> </template>
</ConfirmModal> </ConfirmModal>
@@ -120,12 +120,12 @@
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-file-export mr-1" /> <i class="mdi mdi-24px mdi-file-export mr-1" />
<span class="cut-text">{{ t('message.sqlExportOptions') }}</span> <span class="cut-text">{{ t('database.sqlExportOptions') }}</span>
</div> </div>
</template> </template>
<template #body> <template #body>
<div class="columns"> <div class="columns">
<label class="column col-12 h6 mb-2 cut-text">{{ t('message.targetTable') }}</label> <label class="column col-12 h6 mb-2 cut-text">{{ t('database.targetTable') }}</label>
<div class="column col-12"> <div class="column col-12">
<input <input
v-model.number="sqlExportOptions.targetTable" v-model.number="sqlExportOptions.targetTable"
@@ -134,7 +134,7 @@
:placeholder="chunkModalRequest" :placeholder="chunkModalRequest"
> >
</div> </div>
<label class="column col-12 h6 mb-2 mt-4 cut-text">{{ t('message.newInserStmtEvery') }}:</label> <label class="column col-12 h6 mb-2 mt-4 cut-text">{{ t('database.newInsertStmtEvery') }}:</label>
<div class="column col-6"> <div class="column col-6">
<input <input
v-model.number="sqlExportOptions.sqlInsertAfter" v-model.number="sqlExportOptions.sqlInsertAfter"
@@ -146,12 +146,83 @@
<BaseSelect <BaseSelect
v-model="sqlExportOptions.sqlInsertDivider" v-model="sqlExportOptions.sqlInsertDivider"
class="form-select" class="form-select"
:options="[{value: 'bytes', label: 'KiB'}, {value: 'rows', label: t('word.row', 2)}]" :options="[{value: 'bytes', label: 'KiB'}, {value: 'rows', label: t('database.row', 2)}]"
/> />
</div> </div>
</div> </div>
</template> </template>
</ConfirmModal> </ConfirmModal>
<ConfirmModal
v-if="csvModalRequest"
@confirm="downloadTable('csv', csvModalRequest as string, true)"
@hide="csvModalRequest = false"
>
<template #header>
<div class="d-flex">
<i class="mdi mdi-24px mdi-file-export mr-1" />
<span class="cut-text">{{ t('application.csvExportOptions') }}</span>
</div>
</template>
<template #body>
<div class="columns">
<div class="form-group column col-12 columns col-gapless">
<div class="column col-5">
<label class="form-label cut-text">{{ t('application.csvFieldDelimiter') }}:</label>
</div>
<div class="column col-7">
<input
v-model.number="csvExportOptions.fieldDelimiter"
type="string"
class="form-input"
>
</div>
</div>
<div class="form-group column col-12 columns col-gapless">
<div class="column col-5">
<label class="form-label cut-text">{{ t('application.csvStringDelimiter') }}:</label>
</div>
<div class="column col-7">
<BaseSelect
v-model="csvExportOptions.stringDelimiter"
class="form-select"
:options="[
{value: '', label: t('general.none')},
{value: 'single', label: t('general.singleQuote')},
{value: 'double', label: t('general.doubleQuote')}
]"
/>
</div>
</div>
<div class="form-group column col-12 columns col-gapless">
<div class="column col-5">
<label class="form-label cut-text">{{ t('application.csvLinesTerminator') }}:</label>
</div>
<div class="column col-7">
<textarea
v-model.number="csvExportOptions.linesTerminator"
class="form-input"
:style="'resize: none'"
rows="1"
/>
</div>
</div>
<div class="form-group column col-12 columns col-gapless">
<div class="column col-5">
<label class="form-label">
{{ t('application.csvIncludeHeader') }}
</label>
</div>
<div class="column col-7">
<label class="form-switch d-inline-block" @click.prevent="csvExportOptions.header = !csvExportOptions.header">
<input type="checkbox" :checked="csvExportOptions.header">
<i class="form-icon" />
</label>
</div>
</div>
</div>
</template>
</ConfirmModal>
</div> </div>
</template> </template>
@@ -223,11 +294,18 @@ const rowHeight = ref(23);
const selectedField = ref(null); const selectedField = ref(null);
const isEditingRow = ref(false); const isEditingRow = ref(false);
const chunkModalRequest: Ref<false | string> = ref(false); const chunkModalRequest: Ref<false | string> = ref(false);
const csvModalRequest: Ref<false | string> = ref(false);
const sqlExportOptions = ref({ const sqlExportOptions = ref({
sqlInsertAfter: 250, sqlInsertAfter: 250,
sqlInsertDivider: 'bytes' as 'bytes' | 'rows', sqlInsertDivider: 'bytes' as 'bytes' | 'rows',
targetTable: '' targetTable: ''
}); });
const csvExportOptions = ref({
header: true,
fieldDelimiter: ';',
linesTerminator: '\n',
stringDelimiter: 'double'
});
const workspaceSchema = computed(() => getWorkspace(props.connUid).breadcrumbs.schema); const workspaceSchema = computed(() => getWorkspace(props.connUid).breadcrumbs.schema);
const workspaceClient = computed(() => getWorkspace(props.connUid).client); const workspaceClient = computed(() => getWorkspace(props.connUid).client);
@@ -718,10 +796,10 @@ const selectResultset = (index: number) => {
resultsetIndex.value = index; resultsetIndex.value = index;
}; };
const downloadTable = (format: 'csv' | 'json' | 'sql' | 'php', table: string, chunks = false) => { const downloadTable = (format: 'csv' | 'json' | 'sql' | 'php', table: string, popup = false) => {
if (!sortedResults.value) return; if (!sortedResults.value) return;
if (format === 'sql' && !chunks && customizations.value.exportByChunks) { if (format === 'sql' && !popup && customizations.value.exportByChunks) {
sqlExportOptions.value = { sqlExportOptions.value = {
sqlInsertAfter: 250, sqlInsertAfter: 250,
sqlInsertDivider: 'bytes' as 'bytes' | 'rows', sqlInsertDivider: 'bytes' as 'bytes' | 'rows',
@@ -730,8 +808,20 @@ const downloadTable = (format: 'csv' | 'json' | 'sql' | 'php', table: string, ch
chunkModalRequest.value = table; chunkModalRequest.value = table;
return; return;
} }
else else if (format === 'csv' && !popup) {
csvExportOptions.value = {
header: true,
fieldDelimiter: ';',
linesTerminator: '\\n',
stringDelimiter: 'double'
};
csvModalRequest.value = table;
return;
}
else {
chunkModalRequest.value = false; chunkModalRequest.value = false;
csvModalRequest.value = false;
}
const rows = sortedResults.value.map((row: any) => { const rows = sortedResults.value.map((row: any) => {
const clonedRow = { ...row }; const clonedRow = { ...row };
@@ -747,7 +837,8 @@ const downloadTable = (format: 'csv' | 'json' | 'sql' | 'php', table: string, ch
}, },
client: workspaceClient.value, client: workspaceClient.value,
table, table,
sqlOptions: chunks ? { ...sqlExportOptions.value }: null sqlOptions: popup ? { ...sqlExportOptions.value }: null,
csvOptions: popup ? { ...csvExportOptions.value }: null
}); });
}; };

View File

@@ -4,7 +4,7 @@
@close-context="closeContext" @close-context="closeContext"
> >
<div class="context-element"> <div class="context-element">
<span class="d-flex"><i class="mdi mdi-18px mdi-content-copy text-light pr-1" /> {{ t('word.copy') }}</span> <span class="d-flex"><i class="mdi mdi-18px mdi-content-copy text-light pr-1" /> {{ t('general.copy') }}</span>
<i class="mdi mdi-18px mdi-chevron-right text-light pl-1" /> <i class="mdi mdi-18px mdi-chevron-right text-light pl-1" />
<div class="context-submenu"> <div class="context-submenu">
<div <div
@@ -13,32 +13,32 @@
@click="copyCell" @click="copyCell"
> >
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-numeric-0 mdi-rotate-90 text-light pr-1" /> {{ t('word.cell', 1) }} <i class="mdi mdi-18px mdi-numeric-0 mdi-rotate-90 text-light pr-1" /> {{ t('database.cell', 1) }}
</span> </span>
</div> </div>
<div class="context-element" @click="copyRow('html')"> <div class="context-element" @click="copyRow('html')">
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('word.row', selectedRows.length) }} ({{ t('word.table') }}) <i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('database.row', selectedRows.length) }} ({{ t('database.table') }})
</span> </span>
</div> </div>
<div class="context-element" @click="copyRow('json')"> <div class="context-element" @click="copyRow('json')">
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('word.row', selectedRows.length) }} (JSON) <i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('database.row', selectedRows.length) }} (JSON)
</span> </span>
</div> </div>
<div class="context-element" @click="copyRow('csv')"> <div class="context-element" @click="copyRow('csv')">
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('word.row', selectedRows.length) }} (CSV) <i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('database.row', selectedRows.length) }} (CSV)
</span> </span>
</div> </div>
<div class="context-element" @click="copyRow('php')"> <div class="context-element" @click="copyRow('php')">
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('word.row', selectedRows.length) }} (PHP) <i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('database.row', selectedRows.length) }} (PHP)
</span> </span>
</div> </div>
<div class="context-element" @click="copyRow('sql')"> <div class="context-element" @click="copyRow('sql')">
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('word.row', selectedRows.length) }} (SQL INSERT) <i class="mdi mdi-18px mdi-table-row text-light pr-1" /> {{ t('database.row', selectedRows.length) }} (SQL INSERT)
</span> </span>
</div> </div>
</div> </div>
@@ -49,7 +49,7 @@
@click="duplicateRow" @click="duplicateRow"
> >
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-content-duplicate text-light pr-1" /> {{ t('word.duplicate') }} <i class="mdi mdi-18px mdi-content-duplicate text-light pr-1" /> {{ t('general.duplicate') }}
</span> </span>
</div> </div>
<div <div
@@ -57,7 +57,7 @@
class="context-element" class="context-element"
> >
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-auto-fix text-light pr-1" /> {{ t('message.fillCell') }} <i class="mdi mdi-18px mdi-auto-fix text-light pr-1" /> {{ t('database.fillCell') }}
</span> </span>
<i class="mdi mdi-18px mdi-chevron-right text-light pl-1" /> <i class="mdi mdi-18px mdi-chevron-right text-light pl-1" />
<div class="context-submenu"> <div class="context-submenu">
@@ -79,7 +79,7 @@
@click="setNull" @click="setNull"
> >
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-null text-light pr-1" /> {{ t('message.setNull') }} <i class="mdi mdi-18px mdi-null text-light pr-1" /> {{ t('database.setNull') }}
</span> </span>
</div> </div>
<div <div
@@ -88,7 +88,7 @@
@click="showConfirmModal" @click="showConfirmModal"
> >
<span class="d-flex"> <span class="d-flex">
<i class="mdi mdi-18px mdi-delete text-light pr-1" /> {{ t('message.deleteRows', selectedRows.length) }} <i class="mdi mdi-18px mdi-delete text-light pr-1" /> {{ t('database.deleteRows', selectedRows.length) }}
</span> </span>
</div> </div>
</BaseContextMenu> </BaseContextMenu>

View File

@@ -73,7 +73,7 @@
</div> </div>
<ConfirmModal <ConfirmModal
v-if="isTextareaEditor" v-if="isTextareaEditor"
:confirm-text="t('word.update')" :confirm-text="t('application.update')"
size="medium" size="medium"
:disable-autofocus="true" :disable-autofocus="true"
@confirm="editOFF" @confirm="editOFF"
@@ -81,7 +81,7 @@
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-playlist-edit mr-1" /> <span class="cut-text">{{ t('word.edit') }} "{{ editingField }}"</span> <i class="mdi mdi-24px mdi-playlist-edit mr-1" /> <span class="cut-text">{{ t('general.edit') }} "{{ editingField }}"</span>
</div> </div>
</template> </template>
<template #body> <template #body>
@@ -96,7 +96,7 @@
<div class="editor-field-info p-vcentered"> <div class="editor-field-info p-vcentered">
<div class="d-flex p-vcentered"> <div class="d-flex p-vcentered">
<label for="editorMode" class="form-label mr-2"> <label for="editorMode" class="form-label mr-2">
<b>{{ t('word.content') }}</b>: <b>{{ t('general.content') }}</b>:
</label> </label>
<BaseSelect <BaseSelect
id="editorMode" id="editorMode"
@@ -110,10 +110,10 @@
<div class="d-flex"> <div class="d-flex">
<div class="p-vcentered"> <div class="p-vcentered">
<div class="mr-4"> <div class="mr-4">
<b>{{ t('word.size') }}</b>: {{ editingContent ? editingContent.length : 0 }} <b>{{ t('general.size') }}</b>: {{ editingContent ? editingContent.length : 0 }}
</div> </div>
<div v-if="editingType"> <div v-if="editingType">
<b>{{ t('word.type') }}</b>: {{ editingType.toUpperCase() }} <b>{{ t('database.type') }}</b>: {{ editingType.toUpperCase() }}
</div> </div>
</div> </div>
</div> </div>
@@ -138,14 +138,14 @@
</ConfirmModal> </ConfirmModal>
<ConfirmModal <ConfirmModal
v-if="isBlobEditor" v-if="isBlobEditor"
:confirm-text="t('word.update')" :confirm-text="t('application.update')"
@confirm="editOFF" @confirm="editOFF"
@hide="hideEditorModal" @hide="hideEditorModal"
> >
<template #header> <template #header>
<div class="d-flex"> <div class="d-flex">
<i class="mdi mdi-24px mdi-playlist-edit mr-1" /> <i class="mdi mdi-24px mdi-playlist-edit mr-1" />
<span class="cut-text">{{ t('word.edit') }} "{{ editingField }}"</span> <span class="cut-text">{{ t('general.edit') }} "{{ editingField }}"</span>
</div> </div>
</template> </template>
<template #body> <template #body>
@@ -162,11 +162,11 @@
</div> </div>
<div class="editor-buttons mt-2"> <div class="editor-buttons mt-2">
<button class="btn btn-link btn-sm" @click="downloadFile"> <button class="btn btn-link btn-sm" @click="downloadFile">
<span>{{ t('word.download') }}</span> <span>{{ t('general.download') }}</span>
<i class="mdi mdi-24px mdi-download ml-1" /> <i class="mdi mdi-24px mdi-download ml-1" />
</button> </button>
<button class="btn btn-link btn-sm" @click="prepareToDelete"> <button class="btn btn-link btn-sm" @click="prepareToDelete">
<span>{{ t('word.delete') }}</span> <span>{{ t('general.delete') }}</span>
<i class="mdi mdi-24px mdi-delete-forever ml-1" /> <i class="mdi mdi-24px mdi-delete-forever ml-1" />
</button> </button>
</div> </div>
@@ -174,15 +174,15 @@
</Transition> </Transition>
<div class="editor-field-info"> <div class="editor-field-info">
<div> <div>
<b>{{ t('word.size') }}</b>: {{ formatBytes(editingContent.length) }}<br> <b>{{ t('general.size') }}</b>: {{ formatBytes(editingContent.length) }}<br>
<b>{{ t('word.mimeType') }}</b>: {{ contentInfo.mime }} <b>{{ t('general.mimeType') }}</b>: {{ contentInfo.mime }}
</div> </div>
<div v-if="editingType"> <div v-if="editingType">
<b>{{ t('word.type') }}</b>: {{ editingType.toUpperCase() }} <b>{{ t('database.type') }}</b>: {{ editingType.toUpperCase() }}
</div> </div>
</div> </div>
<div class="mt-3"> <div class="mt-3">
<label>{{ t('message.uploadFile') }}</label> <label>{{ t('general.uploadFile') }}</label>
<input <input
class="form-input" class="form-input"
type="file" type="file"
@@ -293,7 +293,7 @@ const inputProps = computed(() => {
let timeMask = '##:##:##'; let timeMask = '##:##:##';
const precision = props.fields[editingField.value].length; const precision = props.fields[editingField.value].length;
for (let i = 0; i < precision; i++) for (let i = 0; i < Number(precision); i++)
timeMask += i === 0 ? '.#' : '#'; timeMask += i === 0 ? '.#' : '#';
if (HAS_TIMEZONE.includes(editingType.value)) if (HAS_TIMEZONE.includes(editingType.value))
@@ -309,7 +309,7 @@ const inputProps = computed(() => {
let datetimeMask = '####-##-## ##:##:##'; let datetimeMask = '####-##-## ##:##:##';
const precision = props.fields[editingField.value].length; const precision = props.fields[editingField.value].length;
for (let i = 0; i < precision; i++) for (let i = 0; i < Number(precision); i++)
datetimeMask += i === 0 ? '.#' : '#'; datetimeMask += i === 0 ? '.#' : '#';
if (HAS_TIMEZONE.includes(editingType.value)) if (HAS_TIMEZONE.includes(editingType.value))
@@ -582,14 +582,16 @@ const typeFormat = (val: string | number | Date | number[], type: string, precis
return val; return val;
let datePrecision = ''; let datePrecision = '';
for (let i = 0; i < precision; i++) for (let i = 0; i < Number(precision); i++)
datePrecision += i === 0 ? '.S' : 'S'; datePrecision += i === 0 ? '.S' : 'S';
return moment(val).isValid() ? moment(val).format(`YYYY-MM-DD HH:mm:ss${datePrecision}`) : val; return moment(val).isValid() ? moment(val).format(`YYYY-MM-DD HH:mm:ss${datePrecision}`) : val;
} }
if (BLOB.includes(type)) { if (BLOB.includes(type)) {
const buff = Buffer.from(val as string); if (typeof val === 'string') return val;
const buff = Buffer.from(val as unknown as ArrayBuffer);
if (!buff.length) return ''; if (!buff.length) return '';
const hex = buff.toString('hex').substring(0, 8).toUpperCase(); const hex = buff.toString('hex').substring(0, 8).toUpperCase();

View File

@@ -8,7 +8,7 @@
<button <button
class="btn btn-dark btn-sm mr-0 pr-1" class="btn btn-dark btn-sm mr-0 pr-1"
:class="{'loading':isQuering}" :class="{'loading':isQuering}"
:title="`${t('word.refresh')}`" :title="`${t('general.refresh')}`"
@click="reloadTable" @click="reloadTable"
> >
<i v-if="!+autorefreshTimer" class="mdi mdi-24px mdi-refresh mr-1" /> <i v-if="!+autorefreshTimer" class="mdi mdi-24px mdi-refresh mr-1" />
@@ -18,7 +18,7 @@
<i class="mdi mdi-24px mdi-menu-down" /> <i class="mdi mdi-24px mdi-menu-down" />
</div> </div>
<div class="menu px-3"> <div class="menu px-3">
<span>{{ t('word.autoRefresh') }}: <b>{{ +autorefreshTimer ? `${autorefreshTimer}s` : 'OFF' }}</b></span> <span>{{ t('general.autoRefresh') }}: <b>{{ +autorefreshTimer ? `${autorefreshTimer}s` : 'OFF' }}</b></span>
<input <input
v-model="autorefreshTimer" v-model="autorefreshTimer"
class="slider no-border" class="slider no-border"
@@ -35,7 +35,7 @@
<button <button
class="btn btn-dark btn-sm mr-0" class="btn btn-dark btn-sm mr-0"
:disabled="isQuering || page === 1" :disabled="isQuering || page === 1"
:title="t('message.previousResultsPage')" :title="t('application.previousResultsPage')"
@click="pageChange('prev')" @click="pageChange('prev')"
> >
<i class="mdi mdi-24px mdi-skip-previous" /> <i class="mdi mdi-24px mdi-skip-previous" />
@@ -46,7 +46,7 @@
{{ page }} {{ page }}
</div> </div>
<div class="menu px-3"> <div class="menu px-3">
<span>{{ t('message.pageNumber') }}</span> <span>{{ t('general.pageNumber') }}</span>
<input <input
ref="pageSelect" ref="pageSelect"
v-model="pageProxy" v-model="pageProxy"
@@ -61,7 +61,7 @@
<button <button
class="btn btn-dark btn-sm mr-0" class="btn btn-dark btn-sm mr-0"
:disabled="isQuering || (results.length && results[0].rows.length < limit)" :disabled="isQuering || (results.length && results[0].rows.length < limit)"
:title="t('message.nextResultsPage')" :title="t('application.nextResultsPage')"
@click="pageChange('next')" @click="pageChange('next')"
> >
<i class="mdi mdi-24px mdi-skip-next" /> <i class="mdi mdi-24px mdi-skip-next" />
@@ -72,7 +72,8 @@
<button <button
class="btn btn-sm" class="btn btn-sm"
:title="t('word.filter')" :title="t('general.filter')"
:disabled="isQuering"
:class="{'btn-primary': isSearch, 'btn-dark': !isSearch}" :class="{'btn-primary': isSearch, 'btn-dark': !isSearch}"
@click="isSearch = !isSearch" @click="isSearch = !isSearch"
> >
@@ -85,17 +86,17 @@
@click="showFakerModal()" @click="showFakerModal()"
> >
<i class="mdi mdi-24px mdi-playlist-plus mr-1" /> <i class="mdi mdi-24px mdi-playlist-plus mr-1" />
<span>{{ t('message.insertRow', 2) }}</span> <span>{{ t('database.insertRow', 2) }}</span>
</button> </button>
<div class="dropdown table-dropdown pr-2"> <div class="dropdown table-dropdown">
<button <button
:disabled="isQuering" :disabled="isQuering"
class="btn btn-dark btn-sm dropdown-toggle mr-0 pr-0" class="btn btn-dark btn-sm dropdown-toggle mr-0 pr-0"
tabindex="0" tabindex="0"
> >
<i class="mdi mdi-24px mdi-file-export mr-1" /> <i class="mdi mdi-24px mdi-file-export mr-1" />
<span>{{ t('word.export') }}</span> <span>{{ t('database.export') }}</span>
<i class="mdi mdi-24px mdi-menu-down" /> <i class="mdi mdi-24px mdi-menu-down" />
</button> </button>
<ul class="menu text-left"> <ul class="menu text-left">
@@ -106,34 +107,46 @@
<a class="c-hand" @click="downloadTable('csv')">CSV</a> <a class="c-hand" @click="downloadTable('csv')">CSV</a>
</li> </li>
<li class="menu-item"> <li class="menu-item">
<a class="c-hand" @click="downloadTable('php')">{{ t('message.phpArray') }}</a> <a class="c-hand" @click="downloadTable('php')">{{ t('application.phpArray') }}</a>
</li> </li>
<li class="menu-item"> <li class="menu-item">
<a class="c-hand" @click="downloadTable('sql')">SQL INSERT</a> <a class="c-hand" @click="downloadTable('sql')">SQL INSERT</a>
</li> </li>
</ul> </ul>
</div> </div>
<div class="divider-vert py-3" />
<button
class="btn btn-dark btn-sm"
:disabled="isQuering"
:title="t('application.settings')"
@click="openTableSettingTab()"
>
<i class="mdi mdi-24px mdi-cog" />
<!-- <span>{{ t('application.settings') }}</span> -->
</button>
</div> </div>
<div class="workspace-query-info"> <div class="workspace-query-info">
<div <div
v-if="results.length" v-if="results.length"
class="d-flex" class="d-flex"
:title="t('message.queryDuration')" :title="t('database.queryDuration')"
> >
<i class="mdi mdi-timer-sand mdi-rotate-180 pr-1" /> <b>{{ results[0].duration / 1000 }}s</b> <i class="mdi mdi-timer-sand mdi-rotate-180 pr-1" /> <b>{{ results[0].duration / 1000 }}s</b>
</div> </div>
<div v-if="results.length && results[0].rows"> <div v-if="results.length && results[0].rows">
{{ t('word.results') }}: <b>{{ localeString(results[0].rows.length) }}</b> {{ t('general.results') }}: <b>{{ localeString(results[0].rows.length) }}</b>
</div> </div>
<div v-if="hasApproximately || (page > 1 && approximateCount)"> <div v-if="hasApproximately || (page > 1 && approximateCount)">
{{ t('word.total') }}: <b {{ t('database.total') }}: <b
:title="!customizations.tableRealCount ? t('word.approximately') : ''" :title="!customizations.tableRealCount ? t('database.approximately') : ''"
> >
<span v-if="!customizations.tableRealCount"></span> <span v-if="!customizations.tableRealCount"></span>
{{ localeString(approximateCount) }} {{ localeString(approximateCount) }}
</b> </b>
</div> </div>
<div class="d-flex" :title="t('word.schema')"> <div class="d-flex" :title="t('database.schema')">
<i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b> <i class="mdi mdi-18px mdi-database mr-1" /><b>{{ schema }}</b>
</div> </div>
</div> </div>
@@ -153,7 +166,7 @@
<i class="mdi mdi-48px mdi-island" /> <i class="mdi mdi-48px mdi-island" />
</div> </div>
<p class="h4 empty-subtitle"> <p class="h4 empty-subtitle">
{{ t('message.noResultsPresent') }} {{ t('database.noResultsPresent') }}
</p> </p>
</div> </div>
<WorkspaceTabQueryTable <WorkspaceTabQueryTable
@@ -230,7 +243,7 @@ const workspacesStore = useWorkspacesStore();
const { dataTabLimit: limit } = storeToRefs(settingsStore); const { dataTabLimit: limit } = storeToRefs(settingsStore);
const { changeBreadcrumbs, getWorkspace } = workspacesStore; const { changeBreadcrumbs, getWorkspace, newTab } = workspacesStore;
const pageSelect: Ref<HTMLInputElement> = ref(null); const pageSelect: Ref<HTMLInputElement> = ref(null);
const tabUid = ref('data'); const tabUid = ref('data');
@@ -269,7 +282,7 @@ const keyUsage = computed(() => {
}); });
const getTableData = async () => { const getTableData = async () => {
if (!props.table || !props.isSelected) return; if (!props.table || !props.isSelected || isQuering.value) return;
isQuering.value = true; isQuering.value = true;
// if table changes clear cached values // if table changes clear cached values
@@ -427,6 +440,22 @@ const hasApproximately = computed(() => {
results.value[0].rows.length < approximateCount.value; results.value[0].rows.length < approximateCount.value;
}); });
const openTableSettingTab = () => {
newTab({
uid: workspace.value.uid,
elementName: props.table,
schema: props.schema,
type: isTable.value ? 'table-props' : 'view-props',
elementType: isTable.value ? 'table' : 'view'
});
changeBreadcrumbs({
schema: props.schema,
table: isTable.value ? props.table : null,
view: !isTable.value ? props.table : null
});
};
watch(() => props.schema, () => { watch(() => props.schema, () => {
if (props.isSelected) { if (props.isSelected) {
page.value = 1; page.value = 1;

View File

@@ -51,7 +51,7 @@
class="btn btn-sm btn-primary mr-0 ml-2" class="btn btn-sm btn-primary mr-0 ml-2"
type="submit" type="submit"
> >
{{ t('word.filter') }} {{ t('general.filter') }}
</button> </button>
<button <button
class="btn btn-sm btn-dark mr-0 ml-2" class="btn btn-sm btn-dark mr-0 ml-2"

View File

@@ -0,0 +1,66 @@
<template>
<BaseContextMenu
:context-event="props.contextEvent"
@close-context="closeContext"
>
<div class="context-element" @click.stop="closeAllTabs">
<span class="d-flex"><i class="mdi mdi-18px mdi-asterisk text-light pr-1" /> {{ t('application.closeAllTabs') }}</span>
</div>
<div class="context-element" @click.stop="closeOtherTabs">
<span class="d-flex"><i class="mdi mdi-18px mdi-not-equal text-light pr-1" /> {{ t('application.closeOtherTabs') }}</span>
</div>
<div class="context-element" @click.stop="closeLeftTabs">
<span class="d-flex"><i class="mdi mdi-18px mdi-less-than text-light pr-1" /> {{ t('application.closeTabsToLeft') }}</span>
</div>
<div class="context-element" @click.stop="closeRightTabs">
<span class="d-flex"><i class="mdi mdi-18px mdi-greater-than text-light pr-1" /> {{ t('application.closeTabsToRight') }}</span>
</div>
</BaseContextMenu>
</template>
<script setup lang="ts">
import BaseContextMenu from '@/components/BaseContextMenu.vue';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const props = defineProps({
contextEvent: MouseEvent,
selectedTab: Object
});
const emit = defineEmits([
'close-context',
'close-all-tabs',
'close-other-tabs',
'close-to-left',
'close-to-right'
]);
const closeContext = () => {
emit('close-context');
};
const closeAllTabs = () => {
emit('close-all-tabs');
closeContext();
};
const closeLeftTabs = () => {
emit('close-to-left');
closeContext();
};
const closeRightTabs = () => {
emit('close-to-right');
closeContext();
};
const closeOtherTabs = () => {
emit('close-other-tabs');
closeContext();
};
</script>

View File

@@ -1,5 +1,5 @@
export const arSA = { export const arSA = {
word: { general: {
edit: 'تعديل', edit: 'تعديل',
save: 'حفظ', save: 'حفظ',
close: 'إغلاق', close: 'إغلاق',
@@ -7,6 +7,23 @@ export const arSA = {
confirm: 'تأكيد', confirm: 'تأكيد',
cancel: 'إلغاء', cancel: 'إلغاء',
send: 'إرسال', send: 'إرسال',
refresh: 'تحديث',
version: 'النسخة',
donate: 'إدعم',
run: 'شغل',
results: 'النتائج',
size: 'الحجم',
mimeType: 'نوع الميديا',
download: 'تحميل',
add: 'أضف',
data: 'بيانات',
properties: 'خصائص',
insert: 'أدرج',
seconds: 'ثواني',
deleteConfirm: 'هل أنت متأكد من حذف الإتصال؟',
uploadFile: 'رفع ملف'
},
connection: {
connectionName: 'إسم الإتصال', connectionName: 'إسم الإتصال',
client: 'العميل', client: 'العميل',
hostName: 'إسم المستضيف', hostName: 'إسم المستضيف',
@@ -18,31 +35,6 @@ export const arSA = {
connected: 'متصل', connected: 'متصل',
disconnect: 'إلغاء الإتصال', disconnect: 'إلغاء الإتصال',
disconnected: 'غير متصل', disconnected: 'غير متصل',
refresh: 'تحديث',
settings: 'الإعدادات',
general: 'عام',
themes: 'الأنماط',
update: 'تحديث',
about: 'حول',
language: 'اللغة',
version: 'النسخة',
donate: 'إدعم',
run: 'شغل',
schema: 'Schema',
results: 'النتائج',
size: 'الحجم',
seconds: 'ثواني',
type: 'نوع',
mimeType: 'نوع الميديا',
download: 'تحميل',
add: 'أضف',
data: 'بيانات',
properties: 'خصائص',
insert: 'أدرج'
},
message: {
appWelcome: 'مرحبا بك في عميل الSQL انتاريس!',
appFirstStep: 'خطوتك الأولى قم بإنشاء إتصال جديد بقاعدة بيانات.',
addConnection: 'إضافة إتصال', addConnection: 'إضافة إتصال',
createConnection: 'إنشاء إتصال', createConnection: 'إنشاء إتصال',
createNewConnection: 'إنشاء إتصال جديد', createNewConnection: 'إنشاء إتصال جديد',
@@ -50,8 +42,25 @@ export const arSA = {
testConnection: 'إختبر الإتصال', testConnection: 'إختبر الإتصال',
editConnection: 'عدل الإتصال', editConnection: 'عدل الإتصال',
deleteConnection: 'إحذف الإتصال', deleteConnection: 'إحذف الإتصال',
deleteCorfirm: 'هل أنت متأكد من حذف الإتصال؟', connectionSuccessfullyMade: 'تم الإتصال بنجاح!'
connectionSuccessfullyMade: 'تم الإتصال بنجاح!', },
database: {
schema: 'Schema',
type: 'نوع',
unableEditFieldWithoutPrimary: 'لا يمكن تعديل الخانة بدون وجود مفتاح رئيسي في النتائج',
editCell: 'تعديل الخلية',
deleteRows: 'حذف صف | حذف {count} صفوف',
confirmToDeleteRows: 'هل أنت متأكد من حذف صف واحد؟? | هل أنت متأكد من حذف {count} صف?',
addNewRow: 'إضافة صف جديد',
numberOfInserts: 'عدد الإدراجات'
},
application: {
settings: 'الإعدادات',
general: 'عام',
themes: 'الأنماط',
update: 'تحديث',
about: 'حول',
language: 'اللغة',
madeWithJS: 'بني بـ 💛 و جافاسكربت!', madeWithJS: 'بني بـ 💛 و جافاسكربت!',
checkForUpdates: 'تأكد من التحديثات', checkForUpdates: 'تأكد من التحديثات',
noUpdatesAvailable: 'لا توجد تحديثات', noUpdatesAvailable: 'لا توجد تحديثات',
@@ -61,13 +70,6 @@ export const arSA = {
downloadingUpdate: 'جاري تحميل التحديث', downloadingUpdate: 'جاري تحميل التحديث',
updateDownloaded: 'تم تحميل التحديث', updateDownloaded: 'تم تحميل التحديث',
restartToInstall: 'قم بإعادة تشغيل انتاريس للتحديث', restartToInstall: 'قم بإعادة تشغيل انتاريس للتحديث',
unableEditFieldWithoutPrimary: 'لا يمكن تعديل الخانة بدون وجود مفتاح رئيسي في النتائج', notificationsTimeout: 'إنتهاء التنبيهات'
editCell: 'تعديل الخلية',
deleteRows: 'حذف صف | حذف {count} صفوف',
confirmToDeleteRows: 'هل أنت متأكد من حذف صف واحد؟? | هل أنت متأكد من حذف {count} صف?',
notificationsTimeout: 'إنتهاء التنبيهات',
uploadFile: 'رفع ملف',
addNewRow: 'إضافة صف جديد',
numberOfInserts: 'عدد الإدراجات'
} }
}; };

View File

@@ -1,5 +1,5 @@
export const deDE = { export const deDE = {
word: { general: {
edit: 'Bearbeiten', edit: 'Bearbeiten',
save: 'Speichern', save: 'Speichern',
close: 'Schließen', close: 'Schließen',
@@ -7,6 +7,40 @@ export const deDE = {
confirm: 'Bestätigen', confirm: 'Bestätigen',
cancel: 'Abbrechen', cancel: 'Abbrechen',
send: 'Senden', send: 'Senden',
refresh: 'Aktualisieren',
autoRefresh: 'Auto-Aktualisierung',
version: 'Version',
donate: 'Spenden',
run: 'Ausführen',
results: 'Ergebnisse',
size: 'Größe',
mimeType: 'Mime-Type',
download: 'Herunterladen',
add: 'Hinzufügen',
data: 'Daten',
properties: 'Eigenschaften',
insert: 'Einfügen',
name: 'Name',
clear: 'Leeren',
seconds: 'Sekunden',
options: 'Optionen',
discard: 'Verwerfen',
stay: 'Warten',
author: 'Autor',
upload: 'Hochladen',
browse: 'Suchen',
content: 'Inhalt',
cut: 'Ausschneiden',
copy: 'Kopieren',
paste: 'Einfügen',
tools: 'Tools',
format: 'Formatierung',
deleteConfirm: 'Bestätige den Abbruch von',
uploadFile: 'Datei hochladen',
manualValue: 'Manueller Wert',
selectAll: 'Alle auswählen'
},
connection: {
connectionName: 'Verbindungsname', connectionName: 'Verbindungsname',
client: 'Client', client: 'Client',
hostName: 'Hostname', hostName: 'Hostname',
@@ -18,39 +52,32 @@ export const deDE = {
connected: 'Verbunden', connected: 'Verbunden',
disconnect: 'Trennen', disconnect: 'Trennen',
disconnected: 'Getrennt', disconnected: 'Getrennt',
refresh: 'Aktualisieren', ssl: 'SSL',
settings: 'Einstellungen', privateKey: 'Privater Schlüssel',
general: 'Allgemein', certificate: 'Zertifikat',
themes: 'Designs', caCertificate: 'CA Zertifikat',
update: 'Aktualisierung', ciphers: 'Chiffren',
about: 'Über', sshTunnel: 'SSH Tunnel',
language: 'Sprache', addConnection: 'Verbindung hinzufügen',
version: 'Version', createConnection: 'Verbindung erstellen',
donate: 'Spenden', createNewConnection: 'Neue Verbindung erstellen',
run: 'Ausführen', askCredentials: 'Frage nach Zugangsdaten',
testConnection: 'Verbindung testen',
editConnection: 'Verbindung bearbeiten',
deleteConnection: 'Verbindung löschen',
connectionSuccessfullyMade: 'Verbindung erfolgreich erstellt!',
enableSsl: 'Aktiviere SSL',
enableSsh: 'Aktiviere SSH'
},
database: {
schema: 'Schema', schema: 'Schema',
results: 'Ergebnisse',
size: 'Größe',
seconds: 'Sekunden',
type: 'Typ', type: 'Typ',
mimeType: 'Mime-Type',
download: 'Herunterladen',
add: 'Hinzufügen',
data: 'Daten',
properties: 'Eigenschaften',
insert: 'Einfügen',
connecting: 'Verbinden',
name: 'Name',
collation: 'Kollation',
clear: 'Leeren',
options: 'Optionen',
autoRefresh: 'Auto-Aktualisierung',
indexes: 'Indizes',
foreignKeys: 'Fremdschlüssel', foreignKeys: 'Fremdschlüssel',
length: 'Länge', length: 'Länge',
unsigned: 'Unsigniert', unsigned: 'Unsigniert',
default: 'Standard', default: 'Standard',
comment: 'Kommentar', comment: 'Kommentar',
collation: 'Kollation',
key: 'Schlüssel', key: 'Schlüssel',
order: 'Sortierung', order: 'Sortierung',
expression: 'Ausdruck', expression: 'Ausdruck',
@@ -60,15 +87,8 @@ export const deDE = {
approximately: 'Ungefähr', approximately: 'Ungefähr',
total: 'Gesamt', total: 'Gesamt',
table: 'Tabelle', table: 'Tabelle',
discard: 'Verwerfen',
stay: 'Warten',
author: 'Autor',
light: 'Hell',
dark: 'Dunkel',
autoCompletion: 'Auto-Vervollständigung',
application: 'Anwendung',
editor: 'Editor',
view: 'Ansicht', view: 'Ansicht',
indexes: 'Indizes',
definer: 'Bestimmer', definer: 'Bestimmer',
algorithm: 'Algorithmus', algorithm: 'Algorithmus',
trigger: 'Auslöser', trigger: 'Auslöser',
@@ -86,57 +106,16 @@ export const deDE = {
execution: 'Ausführung', execution: 'Ausführung',
starts: 'Startet', starts: 'Startet',
ends: 'Endet', ends: 'Endet',
ssl: 'SSL',
privateKey: 'Privater Schlüssel',
certificate: 'Zertifikat',
caCertificate: 'CA Zertifikat',
ciphers: 'Chiffren',
upload: 'Hochladen',
browse: 'Suchen',
faker: 'Faker',
content: 'Inhalt',
cut: 'Ausschneiden',
copy: 'Kopieren',
paste: 'Einfügen',
tools: 'Tools',
variables: 'Variablen', variables: 'Variablen',
processes: 'Prozesse', processes: 'Prozesse',
database: 'Datenbank', database: 'Datenbank',
scratchpad: 'Scratchpad',
array: 'Array', array: 'Array',
format: 'Formatierung',
sshTunnel: 'SSH Tunnel'
},
message: {
appWelcome: 'Willkommen im Antares SQL Client!',
appFirstStep: 'Dein erster Schritt: Erstelle eine neue Datenbankverbindung.',
addConnection: 'Verbindung hinzufügen',
createConnection: 'Verbindung erstellen',
createNewConnection: 'Neue Verbindung erstellen',
askCredentials: 'Frage nach Zugangsdaten',
testConnection: 'Verbindung testen',
editConnection: 'Verbindung bearbeiten',
deleteConnection: 'Verbindung löschen',
deleteCorfirm: 'Bestätige den Abbruch von',
connectionSuccessfullyMade: 'Verbindung erfolgreich erstellt!',
madeWithJS: 'Mit 💛 und JavaScript gemacht!',
checkForUpdates: 'Suche nach Aktualisierungen',
noUpdatesAvailable: 'Keine Aktualisierungen verfügbar',
checkingForUpdate: 'Suche nach Aktualisierungen',
checkFailure: 'Suche fehlgeschlagen, bitte versuche es später noch einmal',
updateAvailable: 'Aktualisierung verfügbar',
downloadingUpdate: 'Aktualisierung wird heruntergeladen',
updateDownloaded: 'Aktualisierung heruntergeladen',
restartToInstall: 'Starte Antares neu für die Installation',
unableEditFieldWithoutPrimary: 'Feld kann ohne Primärschlüssel in Ergebnisliste nicht bearbeitet werden', unableEditFieldWithoutPrimary: 'Feld kann ohne Primärschlüssel in Ergebnisliste nicht bearbeitet werden',
editCell: 'Zelle bearbeiten', editCell: 'Zelle bearbeiten',
deleteRows: 'Zeile löschen | Lösche {count} Zeilen', deleteRows: 'Zeile löschen | Lösche {count} Zeilen',
confirmToDeleteRows: 'Eine Zeile wirklich löschen? | {count} Zeilen wirklich löschen?', confirmToDeleteRows: 'Eine Zeile wirklich löschen? | {count} Zeilen wirklich löschen?',
notificationsTimeout: 'Timeout für Benachrichtigungen',
uploadFile: 'Datei hochladen',
addNewRow: 'Neue Zeile hinzufügen', addNewRow: 'Neue Zeile hinzufügen',
numberOfInserts: 'Anzahl der eingefügten Zeilen', numberOfInserts: 'Anzahl der eingefügten Zeilen',
openNewTab: 'Öffne einen neuen Tab',
affectedRows: 'Betroffene Zeilen', affectedRows: 'Betroffene Zeilen',
createNewDatabase: 'Erstelle ein neue Datenbank', createNewDatabase: 'Erstelle ein neue Datenbank',
databaseName: 'Datenbankname', databaseName: 'Datenbankname',
@@ -157,9 +136,7 @@ export const deDE = {
createNewTable: 'Neue Tabelle erstellen', createNewTable: 'Neue Tabelle erstellen',
emptyTable: 'Tabelle leeren', emptyTable: 'Tabelle leeren',
deleteTable: 'Tabelle löschen', deleteTable: 'Tabelle löschen',
emptyCorfirm: 'Wirklich leeren?', emptyConfirm: 'Wirklich leeren?',
unsavedChanges: 'Ungespeicherte Änderungen',
discardUnsavedChanges: 'Du hast ungespeicherte Änderungen. Wenn du den Tab verlässt, werden diese Änderungen verworfen.',
thereAreNoIndexes: 'Es gibt keine Indizes', thereAreNoIndexes: 'Es gibt keine Indizes',
thereAreNoForeign: 'Es gibt keine Fremdschlüssel', thereAreNoForeign: 'Es gibt keine Fremdschlüssel',
createNewForeign: 'Neuen Fremdschlüssel erstellen', createNewForeign: 'Neuen Fremdschlüssel erstellen',
@@ -168,9 +145,6 @@ export const deDE = {
foreignFields: 'Fremdfelder', foreignFields: 'Fremdfelder',
invalidDefault: 'Ungültiger Standard', invalidDefault: 'Ungültiger Standard',
onDelete: 'Bei Löschung', onDelete: 'Bei Löschung',
applicationTheme: 'Anwendungsdesign',
editorTheme: 'Editordesign',
wrapLongLines: 'Lange Zeilen umbrechen',
selectStatement: 'Select-Anweisung', selectStatement: 'Select-Anweisung',
triggerStatement: 'Trigger-Anweisung', triggerStatement: 'Trigger-Anweisung',
sqlSecurity: 'SQL-Sicherheit', sqlSecurity: 'SQL-Sicherheit',
@@ -193,14 +167,9 @@ export const deDE = {
createNewScheduler: 'Neuen Zeitplaner erstellen', createNewScheduler: 'Neuen Zeitplaner erstellen',
deleteScheduler: 'Zeitplaner löschen', deleteScheduler: 'Zeitplaner löschen',
preserveOnCompletion: 'Bei Vervollständigung erhalten', preserveOnCompletion: 'Bei Vervollständigung erhalten',
enableSsl: 'Aktiviere SSL',
manualValue: 'Manueller Wert',
tableFiller: 'Tabellenfüller', tableFiller: 'Tabellenfüller',
fakeDataLanguage: 'Fingierte Datensprache', fakeDataLanguage: 'Fingierte Datensprache',
searchForElements: 'Suche nach Elemente',
selectAll: 'Alle auswählen',
queryDuration: 'Dauer der Abfrage', queryDuration: 'Dauer der Abfrage',
includeBetaUpdates: 'Beta-Aktualisierungen berücksichtigen',
setNull: 'Setze NULL', setNull: 'Setze NULL',
processesList: 'Prozessliste', processesList: 'Prozessliste',
processInfo: 'Prozessinformationen', processInfo: 'Prozessinformationen',
@@ -208,11 +177,42 @@ export const deDE = {
createNewSchema: 'Neues Schema erstellen', createNewSchema: 'Neues Schema erstellen',
schemaName: 'Schemaname', schemaName: 'Schemaname',
editSchema: 'Schema bearbeiten', editSchema: 'Schema bearbeiten',
deleteSchema: 'Schema löschen', deleteSchema: 'Schema löschen'
},
application: {
settings: 'Einstellungen',
general: 'Allgemein',
themes: 'Designs',
update: 'Aktualisierung',
about: 'Über',
language: 'Sprache',
light: 'Hell',
dark: 'Dunkel',
autoCompletion: 'Auto-Vervollständigung',
application: 'Anwendung',
editor: 'Editor',
scratchpad: 'Scratchpad',
madeWithJS: 'Mit 💛 und JavaScript gemacht!',
checkForUpdates: 'Suche nach Aktualisierungen',
noUpdatesAvailable: 'Keine Aktualisierungen verfügbar',
checkingForUpdate: 'Suche nach Aktualisierungen',
checkFailure: 'Suche fehlgeschlagen, bitte versuche es später noch einmal',
updateAvailable: 'Aktualisierung verfügbar',
downloadingUpdate: 'Aktualisierung wird heruntergeladen',
updateDownloaded: 'Aktualisierung heruntergeladen',
restartToInstall: 'Starte Antares neu für die Installation',
notificationsTimeout: 'Timeout für Benachrichtigungen',
openNewTab: 'Öffne einen neuen Tab',
unsavedChanges: 'Ungespeicherte Änderungen',
discardUnsavedChanges: 'Du hast ungespeicherte Änderungen. Wenn du den Tab verlässt, werden diese Änderungen verworfen.',
applicationTheme: 'Anwendungsdesign',
editorTheme: 'Editordesign',
wrapLongLines: 'Lange Zeilen umbrechen',
includeBetaUpdates: 'Beta-Aktualisierungen berücksichtigen',
markdownSupported: 'Unterstützt Markdown', markdownSupported: 'Unterstützt Markdown',
plantATree: 'Pflanze einen Baum', plantATree: 'Pflanze einen Baum',
dataTabPageSize: 'Einträge pro Tab / Seite', dataTabPageSize: 'Einträge pro Tab / Seite',
enableSsh: 'Aktiviere SSH' searchForElements: 'Suche nach Elemente'
}, },
faker: { faker: {
address: 'Adresse', address: 'Adresse',

View File

@@ -1,5 +1,5 @@
export const enUS = { export const enUS = {
word: { general: { // General purpose terms
edit: 'Edit', edit: 'Edit',
save: 'Save', save: 'Save',
close: 'Close', close: 'Close',
@@ -7,9 +7,69 @@ export const enUS = {
confirm: 'Confirm', confirm: 'Confirm',
cancel: 'Cancel', cancel: 'Cancel',
send: 'Send', send: 'Send',
refresh: 'Refresh',
autoRefresh: 'Auto-refresh',
version: 'Version',
donate: 'Donate',
run: 'Run',
results: 'Results',
size: 'Size',
mimeType: 'Mime-Type',
download: 'Download',
add: 'Add',
data: 'Data',
properties: 'Properties',
name: 'Name',
clear: 'Clear',
options: 'Options',
insert: 'Insert',
discard: 'Discard',
stay: 'Stay',
author: 'Author',
upload: 'Upload',
browse: 'Browse',
content: 'Content',
cut: 'Cut',
copy: 'Copy',
paste: 'Paste',
duplicate: 'Duplicate',
tools: 'Tools',
seconds: 'Seconds',
all: 'All',
new: 'New',
select: 'Select',
change: 'Change',
includes: 'Includes',
completed: 'Completed',
aborted: 'Aborted',
disabled: 'Disabled',
enable: 'Enable',
disable: 'Disable',
contributors: 'Contributors',
pin: 'Pin',
unpin: 'Unpin',
folder: 'Folder | Folders',
none: 'None',
singleQuote: 'Single quote',
doubleQuote: 'Double quote',
deleteConfirm: 'Do you confirm the cancellation of',
uploadFile: 'Upload file',
format: 'Format', // Format code
history: 'History',
filter: 'Filter',
manualValue: 'Manual value',
selectAll: 'Select all',
pageNumber: 'Page number',
directoryPath: 'Directory path',
actionSuccessful: '{action} successful',
outputFormat: 'Output format',
singleFile: 'Single {ext} file',
zipCompressedFile: 'ZIP compressed {ext} file'
},
connection: { // Database connection
connectionName: 'Connection name', connectionName: 'Connection name',
client: 'Client',
hostName: 'Host name', hostName: 'Host name',
client: 'Client',
port: 'Port', port: 'Port',
user: 'User', user: 'User',
password: 'Password', password: 'Password',
@@ -18,33 +78,33 @@ export const enUS = {
connected: 'Connected', connected: 'Connected',
disconnect: 'Disconnect', disconnect: 'Disconnect',
disconnected: 'Disconnected', disconnected: 'Disconnected',
refresh: 'Refresh', ssl: 'SSL',
settings: 'Settings', enableSsl: 'Enable SSL',
general: 'General', privateKey: 'Private key',
themes: 'Themes', certificate: 'Certificate',
update: 'Update', caCertificate: 'CA certificate',
about: 'About', ciphers: 'Ciphers',
language: 'Language', untrustedConnection: 'Untrusted connection',
version: 'Version', passphrase: 'Passphrase',
donate: 'Donate', sshTunnel: 'SSH tunnel',
run: 'Run', enableSsh: 'Enable SSH',
connectionString: 'Connection string',
addConnection: 'Add connection',
createConnection: 'Create connection',
createNewConnection: 'Create new connection',
askCredentials: 'Ask for credentials',
testConnection: 'Test connection',
editConnection: 'Edit connection',
deleteConnection: 'Delete connection',
connectionSuccessfullyMade: 'Connection successfully made!',
readOnlyMode: 'Read-only mode',
allConnections: 'All connections',
searchForConnections: 'Search for connections'
},
database: { // Database related terms
schema: 'Schema', schema: 'Schema',
results: 'Results',
size: 'Size',
seconds: 'Seconds',
type: 'Type', type: 'Type',
mimeType: 'Mime-Type',
download: 'Download',
add: 'Add',
data: 'Data',
properties: 'Properties',
insert: 'Insert', insert: 'Insert',
connecting: 'Connecting',
name: 'Name',
collation: 'Collation',
clear: 'Clear',
options: 'Options',
autoRefresh: 'Auto-refresh',
indexes: 'Indexes', indexes: 'Indexes',
foreignKeys: 'Foreign keys', foreignKeys: 'Foreign keys',
length: 'Length', length: 'Length',
@@ -59,16 +119,8 @@ export const enUS = {
field: 'Field | Fields', field: 'Field | Fields',
approximately: 'Approximately', approximately: 'Approximately',
total: 'Total', total: 'Total',
table: 'Table', table: 'Table | Tables',
discard: 'Discard', view: 'View | Views',
stay: 'Stay',
author: 'Author',
light: 'Light',
dark: 'Dark',
autoCompletion: 'Auto Completion',
application: 'Application',
editor: 'Editor',
view: 'View',
definer: 'Definer', definer: 'Definer',
algorithm: 'Algorithm', algorithm: 'Algorithm',
trigger: 'Trigger | Triggers', trigger: 'Trigger | Triggers',
@@ -87,101 +139,27 @@ export const enUS = {
execution: 'Execution', execution: 'Execution',
starts: 'Starts', starts: 'Starts',
ends: 'Ends', ends: 'Ends',
ssl: 'SSL',
privateKey: 'Private key',
certificate: 'Certificate',
caCertificate: 'CA certificate',
ciphers: 'Ciphers',
upload: 'Upload',
browse: 'Browse',
faker: 'Faker',
content: 'Content',
cut: 'Cut',
copy: 'Copy',
paste: 'Paste',
tools: 'Tools',
variables: 'Variables', variables: 'Variables',
processes: 'Processes', processes: 'Processes',
database: 'Database', database: 'Database',
scratchpad: 'Scratchpad',
array: 'Array', array: 'Array',
changelog: 'Changelog',
format: 'Format',
sshTunnel: 'SSH tunnel',
structure: 'Structure', structure: 'Structure',
small: 'Small',
medium: 'Medium',
large: 'Large',
row: 'Row | Rows', row: 'Row | Rows',
cell: 'Cell | Cells', cell: 'Cell | Cells',
triggerFunction: 'Trigger function | Trigger functions', triggerFunction: 'Trigger function | Trigger functions',
all: 'All', routine: 'Routine | Routines',
duplicate: 'Duplicate',
routine: 'Routine',
new: 'New',
history: 'History',
select: 'Select',
passphrase: 'Passphrase',
filter: 'Filter',
change: 'Change',
views: 'Views',
triggers: 'Triggers',
routines: 'Routines',
functions: 'Functions',
schedulers: 'Schedulers',
includes: 'Includes',
drop: 'Drop', drop: 'Drop',
completed: 'Completed',
aborted: 'Aborted',
disabled: 'Disabled',
enable: 'Enable',
disable: 'Disable',
commit: 'Commit', commit: 'Commit',
rollback: 'Rollback', rollback: 'Rollback',
connectionString: 'Connection string', ddl: 'DDL',
contributors: 'Contributors', collation: 'Collation',
pin: 'Pin',
unpin: 'Unpin',
console: 'Console',
shortcuts: 'Shortcuts',
folder: 'Folder | Folders',
appearence: 'Appearence',
color: 'Color',
label: 'Label',
icon: 'Icon',
resultsTable: 'Results table', resultsTable: 'Results table',
ddl: 'DDL'
},
message: {
appWelcome: 'Welcome to Antares SQL Client!',
appFirstStep: 'Your first step: create a new database connection.',
addConnection: 'Add connection',
createConnection: 'Create connection',
createNewConnection: 'Create new connection',
askCredentials: 'Ask for credentials',
testConnection: 'Test connection',
editConnection: 'Edit connection',
deleteConnection: 'Delete connection',
deleteCorfirm: 'Do you confirm the cancellation of',
connectionSuccessfullyMade: 'Connection successfully made!',
madeWithJS: 'Made with 💛 and JavaScript!',
checkForUpdates: 'Check for updates',
noUpdatesAvailable: 'No updates available',
checkingForUpdate: 'Checking for updates',
checkFailure: 'Check failed, please try later',
updateAvailable: 'Update available',
downloadingUpdate: 'Downloading update',
updateDownloaded: 'Update downloaded',
restartToInstall: 'Restart Antares to install',
unableEditFieldWithoutPrimary: 'Unable to edit a field without a primary key in resultset', unableEditFieldWithoutPrimary: 'Unable to edit a field without a primary key in resultset',
editCell: 'Edit cell', editCell: 'Edit cell',
deleteRows: 'Delete row | Delete {count} rows', deleteRows: 'Delete row | Delete {count} rows',
confirmToDeleteRows: 'Do you confirm to delete one row? | Do you confirm to delete {count} rows?', confirmToDeleteRows: 'Do you confirm to delete one row? | Do you confirm to delete {count} rows?',
notificationsTimeout: 'Notifications timeout',
uploadFile: 'Upload file',
addNewRow: 'Add new row', addNewRow: 'Add new row',
numberOfInserts: 'Number of inserts', numberOfInserts: 'Number of inserts',
openNewTab: 'Open a new tab',
affectedRows: 'Affected rows', affectedRows: 'Affected rows',
createNewDatabase: 'Create new Database', createNewDatabase: 'Create new Database',
databaseName: 'Database name', databaseName: 'Database name',
@@ -201,10 +179,10 @@ export const enUS = {
addToIndex: 'Add to index', addToIndex: 'Add to index',
createNewTable: 'Create new table', createNewTable: 'Create new table',
emptyTable: 'Empty table', emptyTable: 'Empty table',
duplicateTable: 'Duplicate table',
deleteTable: 'Delete table', deleteTable: 'Delete table',
emptyCorfirm: 'Do you confirm to empty', exportTable: 'Export table',
unsavedChanges: 'Unsaved changes', emptyConfirm: 'Do you confirm to empty',
discardUnsavedChanges: 'You have some unsaved changes. Closing this tab these changes will be discarded.',
thereAreNoIndexes: 'There are no indexes', thereAreNoIndexes: 'There are no indexes',
thereAreNoForeign: 'There are no foreign keys', thereAreNoForeign: 'There are no foreign keys',
createNewForeign: 'Create new foreign key', createNewForeign: 'Create new foreign key',
@@ -213,9 +191,6 @@ export const enUS = {
foreignFields: 'Foreign fields', foreignFields: 'Foreign fields',
invalidDefault: 'Invalid default', invalidDefault: 'Invalid default',
onDelete: 'On delete', onDelete: 'On delete',
applicationTheme: 'Application Theme',
editorTheme: 'Editor Theme',
wrapLongLines: 'Wrap long lines',
selectStatement: 'Select statement', selectStatement: 'Select statement',
triggerStatement: 'Trigger statement', triggerStatement: 'Trigger statement',
sqlSecurity: 'SQL security', sqlSecurity: 'SQL security',
@@ -238,14 +213,9 @@ export const enUS = {
createNewScheduler: 'Create new scheduler', createNewScheduler: 'Create new scheduler',
deleteScheduler: 'Delete scheduler', deleteScheduler: 'Delete scheduler',
preserveOnCompletion: 'Preserve on completion', preserveOnCompletion: 'Preserve on completion',
enableSsl: 'Enable SSL',
manualValue: 'Manual value',
tableFiller: 'Table Filler', tableFiller: 'Table Filler',
fakeDataLanguage: 'Fake data language', fakeDataLanguage: 'Fake data language',
searchForElements: 'Search for elements',
selectAll: 'Select all',
queryDuration: 'Query duration', queryDuration: 'Query duration',
includeBetaUpdates: 'Include beta updates',
setNull: 'Set NULL', setNull: 'Set NULL',
processesList: 'Processes list', processesList: 'Processes list',
processInfo: 'Process info', processInfo: 'Process info',
@@ -254,15 +224,7 @@ export const enUS = {
schemaName: 'Schema name', schemaName: 'Schema name',
editSchema: 'Edit schema', editSchema: 'Edit schema',
deleteSchema: 'Delete schema', deleteSchema: 'Delete schema',
markdownSupported: 'Markdown supported',
plantATree: 'Plant a Tree',
dataTabPageSize: 'DATA tab page size',
enableSsh: 'Enable SSH',
pageNumber: 'Page number',
duplicateTable: 'Duplicate table',
noOpenTabs: 'There are no open tabs, navigate on the left bar or:',
noSchema: 'No schema', noSchema: 'No schema',
restorePreviourSession: 'Restore previous session',
runQuery: 'Run query', runQuery: 'Run query',
thereAreNoTableFields: 'There are no table fields', thereAreNoTableFields: 'There are no table fields',
newTable: 'New table', newTable: 'New table',
@@ -275,37 +237,88 @@ export const enUS = {
thereIsNoQueriesYet: 'There is no queries yet', thereIsNoQueriesYet: 'There is no queries yet',
searchForQueries: 'Search for queries', searchForQueries: 'Search for queries',
killProcess: 'Kill process', killProcess: 'Kill process',
closeTab: 'Close tab',
exportSchema: 'Export schema', exportSchema: 'Export schema',
importSchema: 'Import schema', importSchema: 'Import schema',
directoryPath: 'Directory path', newInsertStmtEvery: 'New INSERT statement every',
newInserStmtEvery: 'New INSERT statement every',
processingTableExport: 'Processing {table}', processingTableExport: 'Processing {table}',
fechingTableExport: 'Fetching {table} data', fetchingTableExport: 'Fetching {table} data',
writingTableExport: 'Writing {table} data', writingTableExport: 'Writing {table} data',
checkAllTables: 'Check all tables', checkAllTables: 'Check all tables',
uncheckAllTables: 'Uncheck all tables', uncheckAllTables: 'Uncheck all tables',
goToDownloadPage: 'Go to download page',
readOnlyMode: 'Read-only mode',
killQuery: 'Kill query', killQuery: 'Kill query',
insertRow: 'Insert row | Insert rows', insertRow: 'Insert row | Insert rows',
commitMode: 'Commit mode', commitMode: 'Commit mode',
autoCommit: 'Auto commit', autoCommit: 'Auto commit',
manualCommit: 'Manual commit', manualCommit: 'Manual commit',
actionSuccessful: '{action} successful', importQueryErrors: 'Warning: {n} error has occurred | Warning: {n} errors occurred',
importQueryErrors: 'Warning: {n} error has occurrend | Warning: {n} errors occurred',
executedQueries: '{n} query executed | {n} queries executed', executedQueries: '{n} query executed | {n} queries executed',
ourputFormat: 'Output format', disableFKChecks: 'Disable foreign key checks',
singleFile: 'Single {ext} file', formatQuery: 'Format query',
zipCompressedFile: 'ZIP compressed {ext} file', queryHistory: 'Query history',
clearQuery: 'Clear query',
fillCell: 'Fill cell',
executeSelectedQuery: 'Execute selected query',
noResultsPresent: 'No results present',
sqlExportOptions: 'SQL export options',
targetTable: 'Target table',
switchDatabase: 'Switch the database',
searchForElements: 'Search for elements',
searchForSchemas: 'Search for schemas'
},
application: { // Application related terms
settings: 'Settings',
scratchpad: 'Scratchpad',
disableScratchpad: 'Disable scratchpad',
console: 'Console',
general: 'General',
themes: 'Themes',
update: 'Update',
about: 'About',
language: 'Language',
shortcuts: 'Shortcuts',
key: 'Key | Keys', // Keyboard key
event: 'Event',
light: 'Light',
dark: 'Dark',
autoCompletion: 'Auto Completion',
application: 'Application',
editor: 'Editor',
changelog: 'Changelog',
small: 'Small',
medium: 'Medium',
large: 'Large',
appearance: 'Appearance',
color: 'Color',
label: 'Label',
icon: 'Icon',
fileName: 'File name',
madeWithJS: 'Made with 💛 and JavaScript!',
checkForUpdates: 'Check for updates',
noUpdatesAvailable: 'No updates available',
checkingForUpdate: 'Checking for updates',
checkFailure: 'Check failed, please try later',
updateAvailable: 'Update available',
downloadingUpdate: 'Downloading update',
updateDownloaded: 'Update downloaded',
restartToInstall: 'Restart Antares to install',
includeBetaUpdates: 'Include beta updates',
notificationsTimeout: 'Notifications timeout',
openNewTab: 'Open a new tab',
unsavedChanges: 'Unsaved changes',
discardUnsavedChanges: 'You have some unsaved changes. Closing this tab these changes will be discarded.',
applicationTheme: 'Application Theme',
editorTheme: 'Editor Theme',
wrapLongLines: 'Wrap long lines',
markdownSupported: 'Markdown supported',
plantATree: 'Plant a Tree',
dataTabPageSize: 'DATA tab page size',
noOpenTabs: 'There are no open tabs, navigate on the left bar or:',
restorePreviousSession: 'Restore previous session',
closeTab: 'Close tab',
goToDownloadPage: 'Go to download page',
disableBlur: 'Disable blur', disableBlur: 'Disable blur',
untrustedConnection: 'Untrusted connection',
missingOrIncompleteTranslation: 'Missing or incomplete translation?', missingOrIncompleteTranslation: 'Missing or incomplete translation?',
findOutHowToContribute: 'Find out how to contribute', findOutHowToContribute: 'Find out how to contribute',
disableFKChecks: 'Disable foreigh key checks',
allConnections: 'All connections',
searchForConnections: 'Search for connections',
disableScratchpad: 'Disable scratchpad',
reportABug: 'Report a bug', reportABug: 'Report a bug',
nextTab: 'Next tab', nextTab: 'Next tab',
previousTab: 'Previous tab', previousTab: 'Previous tab',
@@ -324,29 +337,30 @@ export const enUS = {
openSettings: 'Open settings', openSettings: 'Open settings',
openScratchpad: 'Open scratchpad', openScratchpad: 'Open scratchpad',
runOrReload: 'Run or reload', runOrReload: 'Run or reload',
formatQuery: 'Format query',
queryHistory: 'Query history',
clearQuery: 'Clear query',
openFilter: 'Open filter', openFilter: 'Open filter',
nextResultsPage: 'Next results page', nextResultsPage: 'Next results page',
previousResultsPage: 'Previous results page', previousResultsPage: 'Previous results page',
fillCell: 'Fill cell',
editFolder: 'Edit folder', editFolder: 'Edit folder',
folderName: 'Folder name', folderName: 'Folder name',
deleteFolder: 'Delete folder', deleteFolder: 'Delete folder',
editConnectionAppearence: 'Edit connection appearence', editConnectionAppearance: 'Edit connection appearance',
executeSelectedQuery: 'Execute selected query',
defaultCopyType: 'Default copy type', defaultCopyType: 'Default copy type',
showTableSize: 'Show table size in sidebar', showTableSize: 'Show table size in sidebar',
showTableSizeDescription: 'MySQL/MariaDB only. Enable this option may affects performance on schema with many tables.', showTableSizeDescription: 'MySQL/MariaDB only. Enable this option may affects performance on schema with many tables.',
searchForSchemas: 'Search for schemas',
switchSearchMethod: 'Switch search method', switchSearchMethod: 'Switch search method',
noResultsPresent: 'No results present', phpArray: 'PHP array',
sqlExportOptions: 'SQL export options', closeAllTabs: 'Close all tabs',
targetTable: 'Target table', closeOtherTabs: 'Close other tabs',
phpArray: 'PHP array' closeTabsToLeft: 'Close tabs to the left',
closeTabsToRight: 'Close tabs to the right',
csvFieldDelimiter: 'Field delimiter',
csvLinesTerminator: 'Line terminator',
csvStringDelimiter: 'String delimiter',
csvIncludeHeader: 'Include header',
csvExportOptions: 'CSV export options',
scratchPadDefaultValue: '# HOW TO SUPPORT ANTARES\n\n- [ ] Leave a star to Antares [GitHub repo](https://github.com/antares-sql/antares)\n- [ ] Send feedbacks and advices\n- [ ] Report for bugs\n- [ ] If you enjoy, share Antares with friends\n\n# ABOUT SCRATCHPAD\n\nThis is a scratchpad where you can save your **personal notes**. It supports `markdown` format, but you are free to use plain text.\nThis content is just a placeholder, feel free to clear it to make space for your notes.\n'
}, },
faker: { faker: { // Faker.js methods, used in random generated content
address: 'Address', address: 'Address',
commerce: 'Commerce', commerce: 'Commerce',
company: 'Company', company: 'Company',

View File

@@ -1,5 +1,5 @@
export const esES = { export const esES = {
word: { general: {
edit: 'Editar', edit: 'Editar',
save: 'Guardar', save: 'Guardar',
close: 'Cerrar', close: 'Cerrar',
@@ -7,6 +7,23 @@ export const esES = {
confirm: 'Confirmar', confirm: 'Confirmar',
cancel: 'Cancelar', cancel: 'Cancelar',
send: 'Enviar', send: 'Enviar',
refresh: 'Refrescar',
version: 'Versión',
donate: 'Donar',
run: 'Ejecutar',
results: 'Resultados',
size: 'Tamaño',
mimeType: 'Mime-Type',
download: 'Descargar',
add: 'Añadir',
data: 'Datos',
properties: 'Propiedades',
insert: 'Insertar',
seconds: 'Segundos',
deleteConfirm: 'Confirmas la cancelación de',
uploadFile: 'Cargar fichero'
},
connection: {
connectionName: 'Nombre de la conexión', connectionName: 'Nombre de la conexión',
client: 'Cliente', client: 'Cliente',
hostName: 'Servidor', hostName: 'Servidor',
@@ -18,32 +35,6 @@ export const esES = {
connected: 'Conectado', connected: 'Conectado',
disconnect: 'Desconectar', disconnect: 'Desconectar',
disconnected: 'Desconectado', disconnected: 'Desconectado',
refresh: 'Refrescar',
settings: 'Configuración',
general: 'General',
themes: 'Temas',
update: 'Actualizar',
about: 'Sobre',
language: 'Idioma',
version: 'Versión',
donate: 'Donar',
run: 'Ejecutar',
schema: 'Esquema',
results: 'Resultados',
size: 'Tamaño',
seconds: 'Segundos',
type: 'Tipo',
mimeType: 'Mime-Type',
download: 'Descargar',
add: 'Añadir',
data: 'Datos',
properties: 'Propiedades',
insert: 'Insertar',
connecting: 'Conectando'
},
message: {
appWelcome: 'Bienvenido a Antares Cliente SQL!',
appFirstStep: 'Primer paso: Crear una conexión a una Base de Datos.',
addConnection: 'Añadir conexión', addConnection: 'Añadir conexión',
createConnection: 'Crear conexión', createConnection: 'Crear conexión',
createNewConnection: 'Crear nueva conexión', createNewConnection: 'Crear nueva conexión',
@@ -51,8 +42,26 @@ export const esES = {
testConnection: 'Comprobar conexión', testConnection: 'Comprobar conexión',
editConnection: 'Editar conexión', editConnection: 'Editar conexión',
deleteConnection: 'Eliminar conexión', deleteConnection: 'Eliminar conexión',
deleteCorfirm: 'Confirmas la cancelación de', connectionSuccessfullyMade: 'Conexión realizada correctamente!'
connectionSuccessfullyMade: 'Conexión realizada correctamente!', },
database: {
schema: 'Esquema',
type: 'Tipo',
unableEditFieldWithoutPrimary: 'No se puede editar una campo sin Llave Primaria en el registro',
editCell: 'Editar celda',
deleteRows: 'Eliminar fila | Eliminar {count} filas',
confirmToDeleteRows: '¿Quiere realmente eliminar una fila? | ¿Quiere realmente eliminar {count} filas?',
addNewRow: 'Añadir nueva fila',
numberOfInserts: 'Numero de inserciones',
affectedRows: 'Filas afectadas'
},
application: {
settings: 'Configuración',
general: 'General',
themes: 'Temas',
update: 'Actualizar',
about: 'Sobre',
language: 'Idioma',
madeWithJS: 'Hecho con 💛 y JavaScript!', madeWithJS: 'Hecho con 💛 y JavaScript!',
checkForUpdates: 'Comprobar actualizaciones', checkForUpdates: 'Comprobar actualizaciones',
noUpdatesAvailable: 'No hay actualizaciones', noUpdatesAvailable: 'No hay actualizaciones',
@@ -62,15 +71,7 @@ export const esES = {
downloadingUpdate: 'Descargando actualización', downloadingUpdate: 'Descargando actualización',
updateDownloaded: 'Descargada actualización', updateDownloaded: 'Descargada actualización',
restartToInstall: 'Reiniciar Antares para instalar', restartToInstall: 'Reiniciar Antares para instalar',
unableEditFieldWithoutPrimary: 'No se puede editar una campo sin Llave Primaria en el registro',
editCell: 'Editar celda',
deleteRows: 'Eliminar fila | Eliminar {count} filas',
confirmToDeleteRows: '¿Quiere realmente eliminar una fila? | ¿Quiere realmente eliminar {count} filas?',
notificationsTimeout: 'Tiempo de espera', notificationsTimeout: 'Tiempo de espera',
uploadFile: 'Cargar fichero', openNewTab: 'Abrir nueva pestaña'
addNewRow: 'Añadir nueva fila',
numberOfInserts: 'Numero de inserciones',
openNewTab: 'Abrir nueva pestaña',
affectedRows: 'Filas afectadas'
} }
}; };

View File

@@ -1,12 +1,71 @@
export const frFR = { export const frFR = {
word: { general: {
edit: 'Editer', edit: 'Editer',
save: 'Sauver', save: 'Sauvegarder',
close: 'Fermer', close: 'Fermer',
delete: 'Effacer', delete: 'Effacer',
confirm: 'Confirmer', confirm: 'Confirmer',
cancel: 'Annuler', cancel: 'Annuler',
send: 'Envoyer', send: 'Envoyer',
refresh: 'Rafraîchir',
autoRefresh: 'Auto-rafraîchissement',
version: 'Version',
donate: 'Faire une don',
run: 'Éxécuter',
results: 'Résultats',
size: 'Taille',
mimeType: 'Mime-Type',
download: 'Télécharger',
add: 'Ajouter',
data: 'Donnée',
properties: 'Propriétés',
insert: 'Insérer',
name: 'Nom',
clear: 'Effacer',
seconds: 'Secondes',
options: 'Options',
discard: 'Annuler',
stay: 'Rester',
author: 'Auteur',
upload: 'Téléverser',
browse: 'Naviguer',
content: 'Contenu',
cut: 'Couper',
copy: 'Copier',
paste: 'Coller',
tools: 'Outils',
all: 'Tout',
duplicate: 'Dupliquer',
new: 'Nouveau',
history: 'Historique',
select: 'Sélectionner',
filter: 'Filtre',
change: 'Changement',
includes: 'Inclut',
completed: 'Terminé',
aborted: 'Annulé',
disabled: 'Désactivé',
enable: 'activer',
disable: 'Désactiver',
contributors: 'Contributeurs',
pin: 'Épingler',
unpin: 'Désépingler',
folder: 'Dossier | Dossiers',
none: 'Aucun',
singleQuote: 'Simple guillemets',
doubleQuote: 'Double guillemets',
deleteConfirm: 'Confirmez-vous l\'annulation de',
uploadFile: 'Télécharger un fichier',
manualValue: 'Valeur manuelle',
selectAll: 'Tout sélectionner',
pageNumber: 'Numéro de la page',
directoryPath: 'chemin du répertoire',
actionSuccessful: '{action} réussie',
outputFormat: 'Format de sortie',
singleFile: 'Fichier seul avec l\'extension {ext}',
zipCompressedFile: 'Fichier compréssé avec l\'extension {ext}'
},
connection: {
connectionName: 'Nom de la connexion', connectionName: 'Nom de la connexion',
client: 'Client', client: 'Client',
hostName: 'Nom du host', hostName: 'Nom du host',
@@ -18,39 +77,38 @@ export const frFR = {
connected: 'Connecté', connected: 'Connecté',
disconnect: 'Déconnection', disconnect: 'Déconnection',
disconnected: 'Déconnecté', disconnected: 'Déconnecté',
refresh: 'Rafraîchir', ssl: 'SSL',
settings: 'Paramètres', privateKey: 'Clé privée',
general: 'Général', certificate: 'Certificat',
themes: 'Thèmes', caCertificate: 'Certificat CA',
update: 'Mise à jour', ciphers: 'Codes secrets',
about: 'À propos de', sshTunnel: 'Tunnel SSH',
language: 'Langage', passphrase: 'Phrase secrète',
version: 'Version', connectionString: 'Chaîne de connexion',
donate: 'Faire une donation', addConnection: 'Ajouter une connexion',
run: 'Éxécuter', createConnection: 'Créer une connexion',
createNewConnection: 'Créer une nouvelle connexion',
askCredentials: 'Demander les informations d\'identification',
testConnection: 'Tester la connexion',
editConnection: 'Modifier la connexion',
deleteConnection: 'Supprimer la connexion',
connectionSuccessfullyMade: 'Connexion établie avec succès !',
enableSsl: 'Activer le SSL',
enableSsh: 'Activer le SSH',
readOnlyMode: 'Mode lecture seule',
untrustedConnection: 'Connexion non approuvée',
allConnections: 'Toutes les connexions',
searchForConnections: 'Rechercher des connexions'
},
database: {
schema: 'Schéma', schema: 'Schéma',
results: 'Résultats',
size: 'Taille',
seconds: 'Secondes',
type: 'Type', type: 'Type',
mimeType: 'Mime-Type',
download: 'Télécharger',
add: 'Ajouter',
data: 'Donnée',
properties: 'Propriétés',
insert: 'Insérer',
connecting: 'Connexion en cours',
name: 'Nom',
collation: 'Langage',
clear: 'Effacer',
options: 'Options',
autoRefresh: 'Auto-rafraîchissemnt',
indexes: 'Indexs',
foreignKeys: 'Clés étrangères', foreignKeys: 'Clés étrangères',
length: 'Longueur', length: 'Longueur',
unsigned: 'non signé', unsigned: 'Non signé',
default: 'Par défaut', default: 'Par défaut',
comment: 'Commentaire', comment: 'Commentaire',
collation: 'Langage',
key: 'Clé | Clés', key: 'Clé | Clés',
order: 'Ordre', order: 'Ordre',
expression: 'Expression', expression: 'Expression',
@@ -60,17 +118,9 @@ export const frFR = {
approximately: 'Approximativement', approximately: 'Approximativement',
total: 'Total', total: 'Total',
table: 'Table', table: 'Table',
discard: 'Jeter',
stay: 'Rester',
author: 'Auteur',
light: 'Clair',
dark: 'Sombre',
autoCompletion: 'Prédiction Automatique',
application: 'Application',
editor: 'Éditeur',
view: 'Vue', view: 'Vue',
indexes: 'Indexs',
definer: 'Définisseur', definer: 'Définisseur',
algorithme: 'Algorithme',
trigger: 'Déclencheur | Déclencheurs', trigger: 'Déclencheur | Déclencheurs',
storedRoutine: 'Routine stockée | Routines stockées', storedRoutine: 'Routine stockée | Routines stockées',
scheduler: 'Planificateur | Planificateurs', scheduler: 'Planificateur | Planificateurs',
@@ -87,91 +137,25 @@ export const frFR = {
execution: 'Éxécution', execution: 'Éxécution',
starts: 'Commence', starts: 'Commence',
ends: 'Termine', ends: 'Termine',
ssl: 'SSL',
privateKey: 'Clé privée',
certificate: 'Certificat',
caCertificate: 'Certificat CA',
ciphers: 'Codes secrets',
upload: 'Téléverser',
browse: 'Naviguer',
faker: 'Imposteur',
sshTunnel: 'Tunnel SSH',
content: 'Contenu',
cut: 'Couper',
copy: 'Copier',
paste: 'Coller',
tools: 'Outils',
variables: 'Variables', variables: 'Variables',
processes: 'Processus', processes: 'Processus',
Database: 'Base de données',
scratchpad: 'Bloc-notes',
array: 'Tableau', array: 'Tableau',
changelog: 'Log de changement',
Format: 'Format',
structure: 'Structure', structure: 'Structure',
small: 'Petit',
medium: 'Moyen',
large: 'Grand',
row: 'Ligne | Lignes', row: 'Ligne | Lignes',
cell: 'Cellule | Cellules', cell: 'Cellule | Cellules',
triggerFunction: 'Fonction de déclenchement | Fonctions de déclenchement', triggerFunction: 'Fonction de déclenchement | Fonctions de déclenchement',
all: 'Tout',
duplicate: 'Dupliquer',
routine: 'Routine', routine: 'Routine',
new: 'Nouveau',
history: 'Passé',
select: 'Sélectionner',
passphrase: 'Phrase',
filter: 'Filtre',
change: 'Changement',
views: 'Vues',
triggers: 'Déclencheurs',
routines: 'Routines',
fonctions: 'Fonctions',
schedulers: 'Programmateurs',
includes: 'Inclut',
drop: 'Effacer',
completed: 'Terminé',
aborted: 'Annulé',
disabled: 'Désactivé',
enable: 'activer',
disable: 'Désactiver',
commit: 'Appliquer', commit: 'Appliquer',
rollback: 'Retour arrière', rollback: 'Retour arrière',
connectionString: 'Chaîne de connexion', resultsTable: 'Table des résultats',
contributors: 'Contributeurs', ddl: 'DDL',
shortcuts: 'Raccourcis' drop: 'Effacer',
},
message: {
appWelcome: 'Bienvenue dans le client SQL Antares!',
appFirstStep: 'Votre première étape : créer une nouvelle connexion à la base de données.',
addConnection: 'Ajouter une connexion',
createConnection: 'Créer une connexion',
createNewConnection: 'Créer une nouvelle connexion',
askCredentials: 'Demander des informations d\'identification',
testConnection: 'Tester la connexion',
editConnection: 'Modifier la connexion',
deleteConnection: 'Supprimer la connexion',
deleteCorfirm: 'Confirmez-vous l\'annulation de',
connectionSuccessfullyMade: 'Connexion établie avec succès !',
madeWithJS: 'Fait avec 💛 et JavaScript !',
checkForUpdates: 'Vérifier les mises à jour',
noUpdatesAvailable: 'Aucune mise à jour disponible',
checkingForUpdate: 'Vérification des mises à jour',
checkFailure: 'La vérification a échoué, veuillez essayer plus tard',
updateAvailable: 'Mise à jour disponible',
downloadingUpdate: 'Téléchargement de la mise à jour',
updateDownloaded: 'Mise à jour téléchargée',
restartToInstall: 'Redémarrer Antares pour installer',
unableEditFieldWithoutPrimary: 'Impossible de modifier un champ sans clé primaire dans le jeu de résultats', unableEditFieldWithoutPrimary: 'Impossible de modifier un champ sans clé primaire dans le jeu de résultats',
editCell: 'Editer la cellule', editCell: 'Éditer la cellule',
deleteRows: 'Effacer la ligne | Effacer {count} lignes', deleteRows: 'Effacer la ligne | Effacer {count} lignes',
confirmToDeleteRows: 'Confirmez-vous la suppression d\'une ligne ? | Confirmez-vous la suppression de {count} lignes ?', confirmToDeleteRows: 'Confirmez-vous la suppression d\'une ligne ? | Confirmez-vous la suppression de {count} lignes ?',
notificationsTimeout: 'Délai d\'attente pour les notifications',
uploadFile: 'Télécharger un fichier',
addNewRow: 'Ajouter une nouvelle ligne', addNewRow: 'Ajouter une nouvelle ligne',
numberOfInserts: 'Nombre d\'insertions', numberOfInserts: 'Nombre d\'insertions',
openNewTab: 'Ouvrir un nouvel onglet',
affectedRows: 'Lignes affectées', affectedRows: 'Lignes affectées',
createNewDatabase: 'Créer une nouvelle base de données', createNewDatabase: 'Créer une nouvelle base de données',
databaseName: 'Nom de la base de données', databaseName: 'Nom de la base de données',
@@ -192,9 +176,7 @@ export const frFR = {
createNewTable: 'Créer une nouvelle table', createNewTable: 'Créer une nouvelle table',
emptyTable: 'Vider la table', emptyTable: 'Vider la table',
deleteTable: 'Supprimer une table', deleteTable: 'Supprimer une table',
emptyCorfirm: 'Confirmez-vous que vous souhaitez vider la table ?', emptyConfirm: 'Confirmez-vous que vous souhaitez vider la table ?',
unsavedChanges: 'Modifications non sauvegardées',
discardUnsavedChanges: 'Vous avez des modifications non sauvegardées. En fermant cet onglet, ces modifications seront supprimées',
thereAreNoIndexes: 'Il n\'y a pas d\'index', thereAreNoIndexes: 'Il n\'y a pas d\'index',
thereAreNoForeign: 'Il n\'y a pas de clés étrangères', thereAreNoForeign: 'Il n\'y a pas de clés étrangères',
createNewForeign: 'Créer une nouvelle clé étrangère', createNewForeign: 'Créer une nouvelle clé étrangère',
@@ -203,9 +185,6 @@ export const frFR = {
foreignFields: 'Champs étrangers', foreignFields: 'Champs étrangers',
invalidDefault: 'Valeur par défaut invalide', invalidDefault: 'Valeur par défaut invalide',
onDelete: 'lors de l\'effacement', onDelete: 'lors de l\'effacement',
applicationTheme: 'Thème de l\'application',
editorTheme: 'Thème de l\'éditeur',
wrapLongLines: 'Retour à la ligne pour les lignes longues',
selectStatement: 'Sélectionner un état', selectStatement: 'Sélectionner un état',
triggerStatement: 'Déclencher un état', triggerStatement: 'Déclencher un état',
sqlSecurity: 'Sécurité SQL', sqlSecurity: 'Sécurité SQL',
@@ -214,7 +193,7 @@ export const frFR = {
createNewView: 'Créer une nouvelle vue', createNewView: 'Créer une nouvelle vue',
deleteTrigger: 'Effacer un déclencheur', deleteTrigger: 'Effacer un déclencheur',
createNewTrigger: 'Créer un nouveau déclencheur', createNewTrigger: 'Créer un nouveau déclencheur',
currentUser: 'utilisateur courant', currentUser: 'utilisateur actuel',
routineBody: 'Corps de la routine', routineBody: 'Corps de la routine',
dataAccess: 'Accès aux données', dataAccess: 'Accès aux données',
thereAreNoParameters: 'Il n\'y a pas de paramètre', thereAreNoParameters: 'Il n\'y a pas de paramètre',
@@ -228,31 +207,19 @@ export const frFR = {
createNewScheduler: 'Créer un nouveau programmateur', createNewScheduler: 'Créer un nouveau programmateur',
deleteScheduler: 'Effacer un programmateur', deleteScheduler: 'Effacer un programmateur',
preserveOnCompletion: 'Préserver à la terminaison', preserveOnCompletion: 'Préserver à la terminaison',
enableSsl: 'Activer le SSL',
manualValue: 'Valeur manuelle',
tableFiller: 'Remplisseur de table', tableFiller: 'Remplisseur de table',
fakeDataLanguage: 'Language de données fausses', fakeDataLanguage: 'Langue des fausses données',
searchForElements: 'Rechercher des éléments', queryDuration: 'Temps de requête',
selectAll: 'Tout sélectionner',
queryDuration: 'Temps de requêtage',
includeBetaUpdates: 'Inclure les mises à jour beta',
setNull: 'Définir comme NULL', setNull: 'Définir comme NULL',
processesList: 'List des processus', processesList: 'Liste des processus',
processInfo: 'Information sur le processus', processInfo: 'Information sur le processus',
manageUsers: 'Organisation des utilisateurs', manageUsers: 'Organisation des utilisateurs',
createNewSchema: 'Créer un nouveau schéma', createNewSchema: 'Créer un nouveau schéma',
schemaName: 'Nom du Schéma', schemaName: 'Nom du Schéma',
editSchema: 'Modifier le schéma', editSchema: 'Modifier le schéma',
deleteSchema: 'Effacer le schéma', deleteSchema: 'Effacer le schéma',
markdownSupported: 'Support du Markdown', duplicateTable: 'Dupliquer la table',
plantATree: 'Planter un arbre', noSchema: 'Aucun schéma',
dataTabPageSize: 'Taille de la page de l\'onglet données',
enableSsh: 'Activer le SSH',
pageNumber: 'Numéro de la page',
duplicateTable: 'Copier la table',
noOpenTabs: 'Il n\'y a pas d\'onglet ouvert, naviguer vers la barre gauche ou :',
noSchema: 'Pas de schéma',
restorePreviourSession: 'Restorer une session précédente',
runQuery: 'Lancer la requête', runQuery: 'Lancer la requête',
thereAreNoTableFields: 'Il n\'y a pas de champ table', thereAreNoTableFields: 'Il n\'y a pas de champ table',
newTable: 'Nouvelle table', newTable: 'Nouvelle table',
@@ -264,39 +231,131 @@ export const frFR = {
newTriggerFunction: 'Nouvelle fonction de déclencheur', newTriggerFunction: 'Nouvelle fonction de déclencheur',
thereIsNoQueriesYet: 'Il n\'y a pas encore de requête', thereIsNoQueriesYet: 'Il n\'y a pas encore de requête',
searchForQueries: 'Rechercher des requêtes', searchForQueries: 'Rechercher des requêtes',
killProcess: 'tuer un processus', killProcess: 'Terminer un processus',
closeTab: 'Fermer un onglet',
exportSchema: 'Exporter un schéma', exportSchema: 'Exporter un schéma',
importSchema: 'Importer un schéma', importSchema: 'Importer un schéma',
directoryPath: 'chemin du répertoire', newInsertStmtEvery: 'Nouvelle déclaration d\'insertion tous les',
newInserStmtEvery: 'Nouvelle déclaration d\'insertion tous les',
processingTableExport: 'Traitement {table}', processingTableExport: 'Traitement {table}',
fechingTableExport: 'Recherche des données de la table {table}', fetchingTableExport: 'Recherche des données de la table {table}',
writingTableExport: 'Ecriture des données de la table {table}', writingTableExport: 'Ecriture des données de la table {table}',
checkAllTables: 'Vérification de toutes les tables', checkAllTables: 'Vérification de toutes les tables',
uncheckAllTables: 'Désélectionner toutes les tables', uncheckAllTables: 'Désélectionner toutes les tables',
goToDownloadPage: 'Aller vers la page de téléchargement',
readOnlyMode: 'Mode lecture seule',
killQuery: 'Terminer une requête', killQuery: 'Terminer une requête',
insertRow: 'Insérer un ligne | Insérer des lignes', insertRow: 'Insérer une ligne | Insérer des lignes',
commitMode: 'Mode insertion directe', commitMode: 'Mode insertion directe',
autoCommit: 'Insertion directe automatique', autoCommit: 'Insertion directe automatique',
manualCommit: 'Insertion directe manuelle', manualCommit: 'Insertion directe manuelle',
actionSuccessful: '{action} réussie', disableFKChecks: 'Désactiver les vérifications de clé étrangère',
formatQuery: 'Formater la requête',
queryHistory: 'Historique de requête',
clearQuery: 'Effacer la requête',
fillCell: 'Remplir la cellule',
executeSelectedQuery: 'Exécuter la requête sélectionnée',
noResultsPresent: 'Aucun résultat présent',
sqlExportOptions: 'Options d\'export SQL',
targetTable: 'Table cible',
switchDatabase: 'Changer la base de données',
importQueryErrors: 'Attention : {n} erreurs se sont produites | Attention: {n} erreurs sont apparues', importQueryErrors: 'Attention : {n} erreurs se sont produites | Attention: {n} erreurs sont apparues',
executedQueries: '{n} requêtes ont été exécutées | {n} requêtes exécutées', executedQueries: '{n} requêtes ont été exécutées | {n} requêtes exécutées'
ourputFormat: 'Format de sortie', },
singleFile: 'Seul fichier avec l\'extension {ext}', application: {
zipCompressedFile: 'Fichier compréssé avec l\'extension {ext}', settings: 'Paramètres',
disableBlur: 'Désactiver le floue', general: 'Général',
themes: 'Thèmes',
update: 'Mise à jour',
about: 'À propos',
language: 'Langue',
light: 'Clair',
dark: 'Sombre',
autoCompletion: 'Prédiction Automatique',
application: 'Application',
editor: 'Éditeur',
scratchpad: 'Bloc-notes',
changelog: 'Journal des modifications',
small: 'Petit',
medium: 'Moyen',
large: 'Grand',
console: 'Console',
shortcuts: 'Raccourcis',
appearance: 'Apparence',
color: 'Couleur',
label: 'Libellé',
icon: 'Icône',
madeWithJS: 'Fait avec 💛 et JavaScript !',
checkForUpdates: 'Vérifier les mises à jour',
noUpdatesAvailable: 'Aucune mise à jour disponible',
checkingForUpdate: 'Vérification des mises à jour',
checkFailure: 'La vérification a échoué, veuillez essayer plus tard',
updateAvailable: 'Mise à jour disponible',
downloadingUpdate: 'Téléchargement de la mise à jour',
updateDownloaded: 'Mise à jour téléchargée',
restartToInstall: 'Redémarrer Antares pour installer',
notificationsTimeout: 'Délai d\'attente pour les notifications',
openNewTab: 'Ouvrir un nouvel onglet',
unsavedChanges: 'Modifications non sauvegardées',
discardUnsavedChanges: 'Vous avez des modifications non sauvegardées. En fermant cet onglet, ces modifications seront supprimées.',
applicationTheme: 'Thème de l\'application',
editorTheme: 'Thème de l\'éditeur',
wrapLongLines: 'Retour à la ligne pour les lignes longues',
includeBetaUpdates: 'Inclure les mises à jour beta',
markdownSupported: 'Support du Markdown',
plantATree: 'Planter un arbre',
dataTabPageSize: 'Taille de la page de l\'onglet données',
noOpenTabs: 'Il n\'y a pas d\'onglet ouvert, naviguer vers la barre gauche ou :',
restorePreviousSession: 'Restaurer la session précédente',
closeTab: 'Fermer un onglet',
goToDownloadPage: 'Aller vers la page de téléchargement',
disableBlur: 'Désactiver le flou',
missingOrIncompleteTranslation: 'Traduction manquante ou incomplète?', missingOrIncompleteTranslation: 'Traduction manquante ou incomplète?',
findOutHowToContribute: 'Trouver comment contribuer', findOutHowToContribute: 'Trouver comment contribuer',
disableScratchpad: 'Désactiver le bloc-notes' disableScratchpad: 'Désactiver le bloc-notes',
reportABug: 'Signaler un bug',
nextTab: 'Onglet suivant',
previousTab: 'Onglet précédent',
selectTabNumber: 'Sélectionner l\'onglet numéro {param}',
toggleConsole: 'Activer/Désactiver la console',
addShortcut: 'Ajouter un raccourci',
editShortcut: 'Modifier un raccourci',
deleteShortcut: 'Supprimer un raccourci',
restoreDefaults: 'Restaurer les valeurs par défaut',
restoreDefaultsQuestion: 'Voulez-vous vraiment restaurer les valeurs par défaut?',
registerAShortcut: 'Enregistrer un raccourci',
invalidShortcutMessage: 'Combinaison invalide, continuez l\'insertion',
shortcutAlreadyExists: 'Ce raccourci existe déjà',
saveContent: 'Sauvegarder le contenu',
openAllConnections: 'Ouvrir toutes les connexions',
openSettings: 'Ouvrir les paramètres',
openScratchpad: 'Ouvrir le bloc-notes',
runOrReload: 'Exécuter ou rafraîchir',
openFilter: 'Ouvrir le filtre',
nextResultsPage: 'Page de résultats suivante',
previousResultsPage: 'Page de résultats précédente',
editFolder: 'Editer le dossier',
folderName: 'Nom du dossier',
deleteFolder: 'Supprimer le dossier',
editConnectionAppearance: 'Editer l\'apparence de la connexion',
defaultCopyType: 'Type de copie par défaut',
showTableSize: 'Afficher la taille de la table dans la barre latérale',
showTableSizeDescription: 'MySQL/MariaDB seulement. Activer cette option peut affecter les performances du schéma sur plusieurs tables.',
searchForSchemas: 'Rechercher des shémas',
searchForElements: 'Rechercher des éléments',
switchSearchMethod: 'Changer la méthode de recherche',
closeAllTabs: 'Fermer tous les onglets',
closeOtherTabs: 'Fermer les autres onglets',
closeTabsToLeft: 'Fermer les onglets à gauche',
closeTabsToRight: 'Fermer les onglets à droite',
csvFieldDelimiter: 'Délimiteur de champ',
csvLinesTerminator: 'Fin de ligne',
csvStringDelimiter: 'Séparateur',
csvIncludeHeader: 'Inclure l\'en-tête',
csvExportOptions: 'Options d\'export CSV',
scratchPadDefaultValue: '# COMMENT SOUTENIR ANTARES\n\n- [ ] Laissez une etoile à Antares [GitHub repo](https://github.com/antares-sql/antares)\n- [ ] Envoyez vos avis et conseils\n- [ ] Signalez les bugs\n- [ ] Si vous l\'appréciez, partagez Antares avec des amis\n\n# A PROPOS DU BLOC-NOTES\n\nCeci est un bloc-notes où vous pouvez sauvegarder vos **notes personnelles**. Il supporte le format `markdown`, mais vous êtes libre d\'utiliser du texte standard.\nCe contenu est juste un modèle, vous pouvez a tout moment l\'effacer pour le remplacer par vos notes.\n',
phpArray: 'Tableau PHP'
}, },
faker: { faker: {
address: 'Adresse', address: 'Adresse',
commerce: 'Commerce', commerce: 'Commerce',
company: 'Companie', company: 'Entreprise',
database: 'Base de données', database: 'Base de données',
date: 'Date', date: 'Date',
finance: 'Finance', finance: 'Finance',
@@ -324,7 +383,7 @@ export const frFR = {
county: 'Département', county: 'Département',
country: 'Pays', country: 'Pays',
countryCode: 'Code du pays', countryCode: 'Code du pays',
state: 'Etat', state: 'État',
stateAbbr: 'Abréviation de l\'état', stateAbbr: 'Abréviation de l\'état',
latitude: 'Latitude', latitude: 'Latitude',
longitude: 'Longitude', longitude: 'Longitude',
@@ -344,11 +403,11 @@ export const frFR = {
suffixes: 'Suffixes', suffixes: 'Suffixes',
companyName: 'Nom de la société', companyName: 'Nom de la société',
companySuffix: 'Suffixe de la société', companySuffix: 'Suffixe de la société',
catchPhrase: 'Phrase de rappel', catchPhrase: 'Phrase d\'accroche',
bs: 'BS', bs: 'BS',
catchPhraseAdjective: 'Adjectif de la phrase de rappel', catchPhraseAdjective: 'Adjectif de la phrase d\'accroche',
catchPhraseDescriptor: 'Descripteur de la phrase de rappel', catchPhraseDescriptor: 'Descripteur de la phrase d\'accroche',
catchPhraseNoun: 'Nom de la phrase de rappel', catchPhraseNoun: 'Nom de la phrase d\'accroche',
bsAdjective: 'Adjectif BS', bsAdjective: 'Adjectif BS',
bsBuzz: 'BS buzz', bsBuzz: 'BS buzz',
bsNoun: 'Nom BS', bsNoun: 'Nom BS',
@@ -357,6 +416,7 @@ export const frFR = {
collation: 'Langue', collation: 'Langue',
engine: 'Moteur', engine: 'Moteur',
past: 'Passé', past: 'Passé',
now: 'Maintenant',
future: 'Future', future: 'Future',
between: 'Entre', between: 'Entre',
recent: 'Récent', recent: 'Récent',
@@ -364,7 +424,7 @@ export const frFR = {
month: 'Mois', month: 'Mois',
weekday: 'Jour de la semaine', weekday: 'Jour de la semaine',
account: 'compte', account: 'compte',
accountName: 'Nom du compte', accountName: 'Nom de compte',
routingNumber: 'Numéro de la routing', routingNumber: 'Numéro de la routing',
mask: 'Masque', mask: 'Masque',
amount: 'Montant', amount: 'Montant',
@@ -394,12 +454,12 @@ export const frFR = {
avatar: 'Avatar', avatar: 'Avatar',
email: 'mail', email: 'mail',
exampleEmail: 'Exemple de mail', exampleEmail: 'Exemple de mail',
userName: 'Nom utilisateur', userName: 'Nom d\'utilisateur',
protocol: 'Protocole', protocol: 'Protocole',
url: 'Url', url: 'Url',
domainName: 'Nom du domaine', domainName: 'Nom du domaine',
domainSuffix: 'Suffixe du domaine', domainSuffix: 'Suffixe du domaine',
domainWord: 'Mot domaine', domainWord: 'Mot de domaine',
ip: 'Ip', ip: 'Ip',
ipv6: 'Ipv6', ipv6: 'Ipv6',
userAgent: 'Agent utilisateur', userAgent: 'Agent utilisateur',
@@ -419,7 +479,7 @@ export const frFR = {
lastName: 'Nom de famille', lastName: 'Nom de famille',
middleName: 'Deuxième prénom', middleName: 'Deuxième prénom',
findName: 'Nom complet', findName: 'Nom complet',
jobTitle: 'Nom du poste', jobTitle: 'Nom du travail',
gender: 'Sexe', gender: 'Sexe',
prefix: 'Préfixe', prefix: 'Préfixe',
suffix: 'Suffixe', suffix: 'Suffixe',

View File

@@ -1,5 +1,5 @@
export const idID = { export const idID = {
word: { general: {
edit: 'Ubah', edit: 'Ubah',
save: 'Simpan', save: 'Simpan',
close: 'Tutup', close: 'Tutup',
@@ -7,6 +7,63 @@ export const idID = {
confirm: 'Iya', confirm: 'Iya',
cancel: 'Batal', cancel: 'Batal',
send: 'Kirim', send: 'Kirim',
refresh: 'Segarkan',
autoRefresh: 'Segarkan otomatis',
version: 'Versi',
donate: 'Donasi',
run: 'Jalankan',
results: 'Hasil',
size: 'Ukuran',
mimeType: 'Tipe Mime',
download: 'Unduh',
add: 'Tambahkan',
data: 'Data',
properties: 'Properti',
insert: 'Masukan',
name: 'Nama',
clear: 'Jernih',
seconds: 'Detik',
options: 'Pilihan',
discard: 'Membuang',
stay: 'Tinggal',
author: 'Pengarang',
upload: 'Mengunggah',
browse: 'Jelajahi',
content: 'Isi',
cut: 'Potong',
copy: 'Salin',
paste: 'Tempel',
tools: 'Peralatan',
format: 'Format',
all: 'Semua',
duplicate: 'Duplikat',
new: 'Baru',
history: 'Histori',
select: 'Pilih',
filter: 'Saring',
change: 'Mengubah',
includes: 'Termasuk',
completed: 'Selesai',
aborted: 'Dibatalkan',
disabled: 'Dinonaaktivkan',
enable: 'Aktifkan',
disable: 'Nonaktifkan',
contributors: 'Kontributor',
pin: 'Pin',
unpin: 'Unpin',
folder: 'Folder | Folder',
deleteConfirm: 'Apakah Anda mengkonfirmasi pembatalan',
uploadFile: 'Unggah data',
manualValue: 'Nilai manual',
selectAll: 'Pilih Semua',
pageNumber: 'Nomor halaman',
directoryPath: 'Jalur direktori',
actionSuccessful: '{aksi} berhasil',
outputFormat: 'Format keluaran',
singleFile: 'File {ext} tunggal',
zipCompressedFile: 'File {ext} terkompresi ZIP'
},
connection: {
connectionName: 'Nama Koneksi', connectionName: 'Nama Koneksi',
client: 'Klien', client: 'Klien',
hostName: 'Nama Host', hostName: 'Nama Host',
@@ -18,39 +75,38 @@ export const idID = {
connected: 'Tersambung', connected: 'Tersambung',
disconnect: 'Putuskan', disconnect: 'Putuskan',
disconnected: 'Terputus', disconnected: 'Terputus',
refresh: 'Segarkan', ssl: 'SSL',
settings: 'Pengaturan', privateKey: 'Kunci pribadi',
general: 'Umum', certificate: 'Sertifikat',
themes: 'Tema', caCertificate: 'Sertifikat CA',
update: 'Memperbarui', ciphers: 'Chipher',
about: 'Tentang', sshTunnel: 'Tunel SSH',
language: 'Bahasa', passphrase: 'Frasa sandi',
version: 'Versi', connectionString: 'Rangkaian sambungan',
donate: 'Donasi', addConnection: 'Tambahkan koneksi',
run: 'Jalankan', createConnection: 'Buat koneksi',
createNewConnection: 'Buat koneksi baru',
askCredentials: 'Mintalah kredensial',
testConnection: 'Tes koneksi',
editConnection: 'Mengedit koneksi',
deleteConnection: 'Hapus koneksi',
connectionSuccessfullyMade: 'Sambungan berhasil dibuat!',
enableSsl: 'Aktifkan SSL',
enableSsh: 'Aktifkan SSH',
readOnlyMode: 'Mode hanya baca',
untrustedConnection: 'Koneksi tidak tepercaya',
allConnections: 'Semua koneksi',
searchForConnections: 'Cari koneksi'
},
database: {
schema: 'Skema', schema: 'Skema',
results: 'Hasil',
size: 'Ukuran',
seconds: 'Detik',
type: 'Jenis', type: 'Jenis',
mimeType: 'Tipe Mime',
download: 'Unduh',
add: 'Tambahkan',
data: 'Data',
properties: 'Properti',
insert: 'Masukan',
connecting: 'Menghubungkan',
name: 'Nama',
collation: 'Kolasi',
clear: 'Jernih',
options: 'Pilihan',
autoRefresh: 'Segarkan otomatis',
indexes: 'Indeks',
foreignKeys: 'Foreign Key', foreignKeys: 'Foreign Key',
length: 'Panjangnya', length: 'Panjangnya',
unsigned: 'Unsigned', unsigned: 'Unsigned',
default: 'Bawaan', default: 'Bawaan',
comment: 'Komentar', comment: 'Komentar',
collation: 'Kolasi',
key: 'Key | Keys', key: 'Key | Keys',
order: 'Urutan', order: 'Urutan',
expression: 'Ekspresi', expression: 'Ekspresi',
@@ -60,15 +116,8 @@ export const idID = {
approximately: 'Sekitar', approximately: 'Sekitar',
total: 'Total', total: 'Total',
table: 'Tabel', table: 'Tabel',
discard: 'Membuang',
stay: 'Tinggal',
author: 'Pengarang',
light: 'Terang',
dark: 'Gelap',
autoCompletion: 'Penyelesaian Otomatis',
application: 'Aplikasi',
editor: 'Editor',
view: 'Melihat', view: 'Melihat',
indexes: 'Indeks',
definer: 'Definisi', definer: 'Definisi',
algorithm: 'Algoritma', algorithm: 'Algoritma',
trigger: 'Trigger | Trigger', trigger: 'Trigger | Trigger',
@@ -87,99 +136,24 @@ export const idID = {
execution: 'Eksekusi', execution: 'Eksekusi',
starts: 'Mulai', starts: 'Mulai',
ends: 'Berakhir', ends: 'Berakhir',
ssl: 'SSL',
privateKey: 'Kunci pribadi',
certificate: 'Sertifikat',
caCertificate: 'Sertifikat CA',
ciphers: 'Chipher',
upload: 'Mengunggah',
browse: 'Jelajahi',
faker: 'Pemalsu',
content: 'Isi',
cut: 'Potong',
copy: 'Salin',
paste: 'Tempel',
tools: 'Peralatan',
variables: 'Variabel', variables: 'Variabel',
processes: 'Proses', processes: 'Proses',
database: 'Basis data', database: 'Basis data',
scratchpad: 'Papan penggaris',
array: 'Array', array: 'Array',
changelog: 'Changelog',
format: 'Format',
sshTunnel: 'Tunel SSH',
structure: 'Struktur', structure: 'Struktur',
small: 'Kecil',
medium: 'Sedang',
large: 'Besar',
row: 'Baris | Baris', row: 'Baris | Baris',
cell: 'Sel | Sel', cell: 'Sel | Sel',
triggerFunction: 'Fungsi trigger | Fungsi trigger', triggerFunction: 'Fungsi trigger | Fungsi trigger',
all: 'Semua',
duplicate: 'Duplikat',
routine: 'Rutin', routine: 'Rutin',
new: 'Baru',
history: 'Histori',
select: 'Pilih',
passphrase: 'Frasa sandi',
filter: 'Saring',
change: 'Mengubah',
views: 'Tampilan',
triggers: 'Pemicu',
routines: 'Rutinitas',
functions: 'Fungsi',
schedulers: 'Penjadwal',
includes: 'Termasuk',
drop: 'Menjatuhkan',
completed: 'Selesai',
aborted: 'Dibatalkan',
disabled: 'Dinonaaktivkan',
enable: 'Aktifkan',
disable: 'Nonaktifkan',
commit: 'Komit', commit: 'Komit',
rollback: 'Kembalikan', rollback: 'Kembalikan',
connectionString: 'Rangkaian sambungan', drop: 'Menjatuhkan',
contributors: 'Kontributor',
pin: 'Pin',
unpin: 'Unpin',
console: 'Konsol',
shortcuts: 'Shortcut',
folder: 'Folder | Folder',
appearence: 'Appearence',
color: 'Color',
label: 'Label',
icon: 'Icon'
},
message: {
appWelcome: 'Selamat datang di Antares SQL Client!',
appFirstStep: 'Langkah pertama Anda: buat koneksi database baru.',
addConnection: 'Tambahkan koneksi',
createConnection: 'Buat koneksi',
createNewConnection: 'Buat koneksi baru',
askCredentials: 'Mintalah kredensial',
testConnection: 'Tes koneksi',
editConnection: 'Mengedit koneksi',
deleteConnection: 'Hapus koneksi',
deleteCorfirm: 'Apakah Anda mengkonfirmasi pembatalan',
connectionSuccessfullyMade: 'Sambungan berhasil dibuat!',
madeWithJS: 'Dibuat dengan 💛 dan JavaScript!',
checkForUpdates: 'Periksa pembaruan',
noUpdatesAvailable: 'Tidak ada pembaruan yang tersedia',
checkingForUpdate: 'Memeriksa pembaruan',
checkFailure: 'Pemeriksaan gagal, coba lagi nanti',
updateAvailable: 'Pembaruan tersedia',
downloadingUpdate: 'Mengunduh pembaruan',
updateDownloaded: 'Pembaruan diunduh',
restartToInstall: 'Mulai ulang Antares untuk menginstal',
unableEditFieldWithoutPrimary: 'Tidak dapat mengedit bidang tanpa kunci utama di kumpulan hasil', unableEditFieldWithoutPrimary: 'Tidak dapat mengedit bidang tanpa kunci utama di kumpulan hasil',
editCell: 'Mengedit sel', editCell: 'Mengedit sel',
deleteRows: 'Hapus baris | Hapus {count} baris', deleteRows: 'Hapus baris | Hapus {count} baris',
confirmToDeleteRows: 'Apakah Anda mengonfirmasi untuk menghapus satu baris? | Apakah Anda mengonfirmasi untuk menghapus {count} baris?', confirmToDeleteRows: 'Apakah Anda mengonfirmasi untuk menghapus satu baris? | Apakah Anda mengonfirmasi untuk menghapus {count} baris?',
notificationsTimeout: 'Batas waktu pemberitahuan',
uploadFile: 'Unggah data',
addNewRow: 'Tambahkan baris baru', addNewRow: 'Tambahkan baris baru',
numberOfInserts: 'Jumlah sisipan', numberOfInserts: 'Jumlah sisipan',
openNewTab: 'Buka tab baru',
affectedRows: 'Baris yang terpengaruh', affectedRows: 'Baris yang terpengaruh',
createNewDatabase: 'Buat Basis Data baru', createNewDatabase: 'Buat Basis Data baru',
databaseName: 'Nama basis data', databaseName: 'Nama basis data',
@@ -200,9 +174,7 @@ export const idID = {
createNewTable: 'Buat tabel baru', createNewTable: 'Buat tabel baru',
emptyTable: 'Kosongkan Tabel', emptyTable: 'Kosongkan Tabel',
deleteTable: 'Hapus tabel', deleteTable: 'Hapus tabel',
emptyCorfirm: 'Apakah Anda mengkonfirmasi untuk mengosongkan', emptyConfirm: 'Apakah Anda mengkonfirmasi untuk mengosongkan',
unsavedChanges: 'Perubahan belum disimpan',
discardUnsavedChanges: 'Anda memiliki beberapa perubahan yang belum disimpan. Dengan menutup tab ini akan membuang perubahan',
thereAreNoIndexes: 'Tidak ada indeks', thereAreNoIndexes: 'Tidak ada indeks',
thereAreNoForeign: 'Tidak ada kunci asing', thereAreNoForeign: 'Tidak ada kunci asing',
createNewForeign: 'Buat kunci asing baru', createNewForeign: 'Buat kunci asing baru',
@@ -211,9 +183,6 @@ export const idID = {
foreignFields: 'Bidang asing', foreignFields: 'Bidang asing',
invalidDefault: 'Standar tidak valid', invalidDefault: 'Standar tidak valid',
onDelete: 'Saat hapus', onDelete: 'Saat hapus',
applicationTheme: 'Tema Aplikasi',
editorTheme: 'Tema Editor',
wrapLongLines: 'Bungkus garis panjang',
selectStatement: 'Pilih pernyataan', selectStatement: 'Pilih pernyataan',
triggerStatement: 'Pernyataan pemicu', triggerStatement: 'Pernyataan pemicu',
sqlSecurity: 'keamanan SQL', sqlSecurity: 'keamanan SQL',
@@ -236,14 +205,9 @@ export const idID = {
createNewScheduler: 'Buat penjadwal baru', createNewScheduler: 'Buat penjadwal baru',
deleteScheduler: 'Hapus penjadwal', deleteScheduler: 'Hapus penjadwal',
preserveOnCompletion: 'Pertahankan saat selesai', preserveOnCompletion: 'Pertahankan saat selesai',
enableSsl: 'Aktifkan SSL',
manualValue: 'Nilai manual',
tableFiller: 'Pengisi Tabel', tableFiller: 'Pengisi Tabel',
fakeDataLanguage: 'Bahasa data palsu', fakeDataLanguage: 'Bahasa data palsu',
searchForElements: 'Cari elemen',
selectAll: 'Pilih Semua',
queryDuration: 'Durasi kueri', queryDuration: 'Durasi kueri',
includeBetaUpdates: 'Sertakan pembaruan beta',
setNull: 'Tetapkan NULL', setNull: 'Tetapkan NULL',
processesList: 'Daftar proses', processesList: 'Daftar proses',
processInfo: 'Info proses', processInfo: 'Info proses',
@@ -252,15 +216,8 @@ export const idID = {
schemaName: 'Nama skema', schemaName: 'Nama skema',
editSchema: 'Edit skema', editSchema: 'Edit skema',
deleteSchema: 'Hapus skema', deleteSchema: 'Hapus skema',
markdownSupported: 'Markdown didukung',
plantATree: 'Menanam pohon',
dataTabPageSize: 'Ukuran halaman tab DATA',
enableSsh: 'Aktifkan SSH',
pageNumber: 'Nomor halaman',
duplicateTable: 'Duplikat Tabel', duplicateTable: 'Duplikat Tabel',
noOpenTabs: 'Tidak ada tab terbuka, navigasikan di bilah kiri atau:',
noSchema: 'Tidak ada skema', noSchema: 'Tidak ada skema',
restorePreviourSession: 'Kembalikan sesi sebelumnya',
runQuery: 'Jalankan kueri', runQuery: 'Jalankan kueri',
thereAreNoTableFields: 'Tidak ada bidang tabel', thereAreNoTableFields: 'Tidak ada bidang tabel',
newTable: 'Tabel baru', newTable: 'Tabel baru',
@@ -273,36 +230,78 @@ export const idID = {
thereIsNoQueriesYet: 'Belum ada kueri', thereIsNoQueriesYet: 'Belum ada kueri',
searchForQueries: 'Telusuri kueri', searchForQueries: 'Telusuri kueri',
killProcess: 'Membunuh proses', killProcess: 'Membunuh proses',
closeTab: 'Tutup tab',
exportSchema: 'Skema ekspor', exportSchema: 'Skema ekspor',
importSchema: 'Skema impor', importSchema: 'Skema impor',
directoryPath: 'Jalur direktori', newInsertStmtEvery: 'Pernyataan INSERT baru setiap',
newInserStmtEvery: 'Pernyataan INSERT baru setiap',
processingTableExport: 'Memproses {table}', processingTableExport: 'Memproses {table}',
fechingTableExport: 'Mengambil data {table}', fetchingTableExport: 'Mengambil data {table}',
writingTableExport: 'Menulis data {table} ', writingTableExport: 'Menulis data {table} ',
checkAllTables: 'Periksa semua tabel', checkAllTables: 'Periksa semua tabel',
uncheckAllTables: 'Hapus centang semua tabel', uncheckAllTables: 'Hapus centang semua tabel',
goToDownloadPage: 'Buka halaman unduh',
readOnlyMode: 'Mode hanya baca',
killQuery: 'Bunuh kueri', killQuery: 'Bunuh kueri',
insertRow: 'Sisipkan baris | Sisipkan baris', insertRow: 'Sisipkan baris | Sisipkan baris',
commitMode: 'Mode komit', commitMode: 'Mode komit',
autoCommit: 'Komit otomatis', autoCommit: 'Komit otomatis',
manualCommit: 'Komit manual', manualCommit: 'Komit manual',
actionSuccessful: '{aksi} berhasil', disableFKChecks: 'Nonaktifkan pemeriksaan kunci asing',
formatQuery: 'Format query',
queryHistory: 'Histori query',
clearQuery: 'Bersihkan query',
fillCell: 'Isi sel',
executeSelectedQuery: 'Eksekusi query yang dipilih',
importQueryErrors: 'Peringatan: {n} kesalahan telah terjadi | Peringatan: {n} kesalahan telah terjadi', importQueryErrors: 'Peringatan: {n} kesalahan telah terjadi | Peringatan: {n} kesalahan telah terjadi',
executedQueries: '{n} permintaan dieksekusi | {n} permintaan dieksekusi', executedQueries: '{n} permintaan dieksekusi | {n} permintaan dieksekusi'
ourputFormat: 'Format keluaran', },
singleFile: 'File {ext} tunggal', application: {
zipCompressedFile: 'File {ext} terkompresi ZIP', settings: 'Pengaturan',
general: 'Umum',
themes: 'Tema',
update: 'Memperbarui',
about: 'Tentang',
language: 'Bahasa',
light: 'Terang',
dark: 'Gelap',
autoCompletion: 'Penyelesaian Otomatis',
application: 'Aplikasi',
editor: 'Editor',
scratchpad: 'Papan penggaris',
changelog: 'Changelog',
small: 'Kecil',
medium: 'Sedang',
large: 'Besar',
console: 'Konsol',
shortcuts: 'Shortcut',
appearance: 'Appearance',
color: 'Color',
label: 'Label',
icon: 'Icon',
madeWithJS: 'Dibuat dengan 💛 dan JavaScript!',
checkForUpdates: 'Periksa pembaruan',
noUpdatesAvailable: 'Tidak ada pembaruan yang tersedia',
checkingForUpdate: 'Memeriksa pembaruan',
checkFailure: 'Pemeriksaan gagal, coba lagi nanti',
updateAvailable: 'Pembaruan tersedia',
downloadingUpdate: 'Mengunduh pembaruan',
updateDownloaded: 'Pembaruan diunduh',
restartToInstall: 'Mulai ulang Antares untuk menginstal',
notificationsTimeout: 'Batas waktu pemberitahuan',
openNewTab: 'Buka tab baru',
unsavedChanges: 'Perubahan belum disimpan',
discardUnsavedChanges: 'Anda memiliki beberapa perubahan yang belum disimpan. Dengan menutup tab ini akan membuang perubahan',
applicationTheme: 'Tema Aplikasi',
editorTheme: 'Tema Editor',
wrapLongLines: 'Bungkus garis panjang',
includeBetaUpdates: 'Sertakan pembaruan beta',
markdownSupported: 'Markdown didukung',
plantATree: 'Menanam pohon',
dataTabPageSize: 'Ukuran halaman tab DATA',
noOpenTabs: 'Tidak ada tab terbuka, navigasikan di bilah kiri atau:',
restorePreviousSession: 'Kembalikan sesi sebelumnya',
closeTab: 'Tutup tab',
goToDownloadPage: 'Buka halaman unduh',
disableBlur: 'Nonaktifkan buram', disableBlur: 'Nonaktifkan buram',
untrustedConnection: 'Koneksi tidak tepercaya',
missingOrIncompleteTranslation: 'Terjemahan hilang atau tidak lengkap?', missingOrIncompleteTranslation: 'Terjemahan hilang atau tidak lengkap?',
findOutHowToContribute: 'Cari tahu cara berkontribusi', findOutHowToContribute: 'Cari tahu cara berkontribusi',
disableFKChecks: 'Nonaktifkan pemeriksaan kunci asing',
allConnections: 'Semua koneksi',
searchForConnections: 'Cari koneksi',
disableScratchpad: 'Nonaktifkan papan tulis', disableScratchpad: 'Nonaktifkan papan tulis',
reportABug: 'Laporkan bug', reportABug: 'Laporkan bug',
nextTab: 'Tab setelahnya', nextTab: 'Tab setelahnya',
@@ -322,19 +321,15 @@ export const idID = {
openSettings: 'Buka Pengaturan', openSettings: 'Buka Pengaturan',
openScratchpad: 'Buka scratchpad', openScratchpad: 'Buka scratchpad',
runOrReload: 'Jalankan atau reload', runOrReload: 'Jalankan atau reload',
formatQuery: 'Format query',
queryHistory: 'Histori query',
clearQuery: 'Bersihkan query',
openFilter: 'Buka filter', openFilter: 'Buka filter',
nextResultsPage: 'Next results page', nextResultsPage: 'Next results page',
previousResultsPage: 'Previous results page', previousResultsPage: 'Previous results page',
fillCell: 'Isi sel',
editFolder: 'Ubah folder', editFolder: 'Ubah folder',
folderName: 'Nama folder', folderName: 'Nama folder',
deleteFolder: 'Hapus folder', deleteFolder: 'Hapus folder',
editConnectionAppearence: 'Ubah connection appearence', editConnectionAppearance: 'Ubah connection appearance',
executeSelectedQuery: 'Eksekusi query yang dipilih', defaultCopyType: 'Jenis salin default',
defaultCopyType: 'Jenis salin default' searchForElements: 'Cari elemen'
}, },
faker: { faker: {
address: 'Alamat', address: 'Alamat',

View File

@@ -12,7 +12,7 @@ import { zhCN } from './zh-CN';
import { ruRU } from './ru-RU'; import { ruRU } from './ru-RU';
import { idID } from './id-ID'; import { idID } from './id-ID';
import { koKR } from './ko-KR'; import { koKR } from './ko-KR';
import { nlNL } from './nl-NL';
const messages = { const messages = {
'en-US': enUS, 'en-US': enUS,
'it-IT': itIT, 'it-IT': itIT,
@@ -26,7 +26,8 @@ const messages = {
'zh-CN': zhCN, 'zh-CN': zhCN,
'ru-RU': ruRU, 'ru-RU': ruRU,
'id-ID': idID, 'id-ID': idID,
'ko-KR': koKR 'ko-KR': koKR,
'nl-NL': nlNL
}; };
type NestedPartial<T> = { type NestedPartial<T> = {

View File

@@ -1,5 +1,5 @@
export const itIT = { export const itIT = {
word: { general: {
edit: 'Modifica', edit: 'Modifica',
save: 'Salva', save: 'Salva',
close: 'Chiudi', close: 'Chiudi',
@@ -7,6 +7,63 @@ export const itIT = {
confirm: 'Conferma', confirm: 'Conferma',
cancel: 'Annulla', cancel: 'Annulla',
send: 'Invia', send: 'Invia',
refresh: 'Aggiorna',
autoRefresh: 'Auto-aggiorna',
version: 'Versione',
donate: 'Dona',
run: 'Esegui',
results: 'Risultati',
size: 'Dimensioni',
mimeType: 'Mime-Type',
download: 'Scarica',
add: 'Aggiungi',
data: 'Dati',
properties: 'Proprietà',
insert: 'Inserisci',
name: 'Nome',
clear: 'Scarta',
seconds: 'Secondi',
options: 'Opzioni',
discard: 'Scarta',
stay: 'Resta',
author: 'Autore',
upload: 'Carica',
browse: 'Sfoglia',
content: 'Contenuto',
cut: 'Taglia',
copy: 'Copia',
paste: 'Incolla',
tools: 'Strumenti',
format: 'Formatta',
all: 'Tutto',
duplicate: 'Duplica',
new: 'Nuovo',
history: 'Cronologia',
select: 'Seleziona',
filter: 'Filtra',
change: 'Cambia',
includes: 'Includi',
completed: 'Completato',
aborted: 'Annullato',
disabled: 'Disabilitato',
enable: 'Abilita',
disable: 'Disabilita',
contributors: 'Contributori',
pin: 'Fissa',
unpin: 'Sgancia',
folder: 'Cartella | Cartelle',
deleteConfirm: 'Confermi l\'eliminazione di',
uploadFile: 'Carica file',
manualValue: 'Valore manuale',
selectAll: 'Seleziona tutto',
pageNumber: 'Numero pagina',
directoryPath: 'Percorso directory',
actionSuccessful: '{action} riuscito',
outputFormat: 'Formato output',
singleFile: 'Singolo file {ext}',
zipCompressedFile: 'File {ext} zippato'
},
connection: {
connectionName: 'Nome connessione', connectionName: 'Nome connessione',
client: 'Client', client: 'Client',
hostName: 'Nome host', hostName: 'Nome host',
@@ -18,39 +75,38 @@ export const itIT = {
connected: 'Connesso', connected: 'Connesso',
disconnect: 'Disconnetti', disconnect: 'Disconnetti',
disconnected: 'Disconnesso', disconnected: 'Disconnesso',
refresh: 'Aggiorna', ssl: 'SSL',
settings: 'Impostazioni', privateKey: 'Chiave privata',
general: 'Generale', certificate: 'Certificato',
themes: 'Temi', caCertificate: 'Certificato CA',
update: 'Aggiorna', ciphers: 'Ciphers',
about: 'Informazioni', sshTunnel: 'SSH tunnel',
language: 'Lingua', passphrase: 'Passphrase',
version: 'Versione', connectionString: 'Connection string',
donate: 'Dona', addConnection: 'Aggiungi connessione',
run: 'Esegui', createConnection: 'Crea connessione',
createNewConnection: 'Crea nuova connessione',
askCredentials: 'Chiedi credenziali',
testConnection: 'Testa connessione',
editConnection: 'Modifica connessione',
deleteConnection: 'Elimina connessione',
connectionSuccessfullyMade: 'Connessione avvenuta con successo!',
enableSsl: 'Abilita SSL',
enableSsh: 'Abilita SSH',
readOnlyMode: 'Modalità sola lettura',
untrustedConnection: 'Connessione non affidabile',
allConnections: 'Tutte le connessioni',
searchForConnections: 'Cerca una connessione'
},
database: {
schema: 'Schema', schema: 'Schema',
results: 'Risultati',
size: 'Dimensioni',
seconds: 'Secondi',
type: 'Tipo', type: 'Tipo',
mimeType: 'Mime-Type',
download: 'Scarica',
add: 'Aggiungi',
data: 'Dati',
properties: 'Proprietà',
insert: 'Inserisci',
connecting: 'Connessione in corso',
name: 'Nome',
collation: 'Confronto',
clear: 'Scarta',
options: 'Opzioni',
autoRefresh: 'Auto-aggiorna',
indexes: 'Indici',
foreignKeys: 'Chiavi esterne', foreignKeys: 'Chiavi esterne',
length: 'Lunghezza', length: 'Lunghezza',
unsigned: 'Senza segno', unsigned: 'Senza segno',
default: 'Default', default: 'Default',
comment: 'Commento', comment: 'Commento',
collation: 'Confronto',
key: 'Chiave | Chiavi', key: 'Chiave | Chiavi',
order: 'Ordine', order: 'Ordine',
expression: 'Espressione', expression: 'Espressione',
@@ -60,15 +116,8 @@ export const itIT = {
approximately: 'Approssimativamente', approximately: 'Approssimativamente',
total: 'Totali', total: 'Totali',
table: 'Tabella', table: 'Tabella',
discard: 'Scarta',
stay: 'Resta',
author: 'Autore',
light: 'Chiaro',
dark: 'Scuro',
autoCompletion: 'Auto Completamento',
application: 'Applicazione',
editor: 'Editor',
view: 'Vista', view: 'Vista',
indexes: 'Indici',
definer: 'Definer', definer: 'Definer',
algorithm: 'Algoritmo', algorithm: 'Algoritmo',
trigger: 'Trigger | Triggers', trigger: 'Trigger | Triggers',
@@ -87,100 +136,25 @@ export const itIT = {
execution: 'Esecuzione', execution: 'Esecuzione',
starts: 'Inizia', starts: 'Inizia',
ends: 'Finisce', ends: 'Finisce',
ssl: 'SSL',
privateKey: 'Chiave privata',
certificate: 'Certificato',
caCertificate: 'Certificato CA',
ciphers: 'Ciphers',
upload: 'Carica',
browse: 'Sfoglia',
faker: 'Faker',
content: 'Contenuto',
cut: 'Taglia',
copy: 'Copia',
paste: 'Incolla',
tools: 'Strumenti',
variables: 'Variabili', variables: 'Variabili',
processes: 'Processi', processes: 'Processi',
database: 'Database', database: 'Database',
scratchpad: 'Blocco appunti',
array: 'Array', array: 'Array',
changelog: 'Changelog',
format: 'Formatta',
sshTunnel: 'SSH tunnel',
structure: 'Structure', structure: 'Structure',
small: 'Piccolo',
medium: 'Medio',
large: 'Largo',
row: 'Riga | Righe', row: 'Riga | Righe',
cell: 'Cella | Celle', cell: 'Cella | Celle',
triggerFunction: 'Funzione di trigger | Funzioni di trigger', triggerFunction: 'Funzione di trigger | Funzioni di trigger',
all: 'Tutto',
duplicate: 'Duplica',
routine: 'Routine', routine: 'Routine',
new: 'Nuovo',
history: 'Cronologia',
select: 'Seleziona',
passphrase: 'Passphrase',
filter: 'Filtra',
change: 'Cambia',
views: 'Viste',
triggers: 'Trigger',
routines: 'Routine',
functions: 'Function',
schedulers: 'Scheduler',
includes: 'Includi',
drop: 'Drop',
completed: 'Completato',
aborted: 'Annullato',
disabled: 'Disabilitato',
enable: 'Abilita',
disable: 'Disabilita',
commit: 'Commit', commit: 'Commit',
rollback: 'Rollback', rollback: 'Rollback',
connectionString: 'Connection string', resultsTable: 'Tabella risultati',
contributors: 'Contributori', drop: 'Drop',
pin: 'Fissa',
unpin: 'Sgancia',
console: 'Console',
shortcuts: 'Scorciatoie',
folder: 'Cartella | Cartelle',
appearence: 'Aspetto',
color: 'Colore',
label: 'Etichetta',
icon: 'Icona',
resultsTable: 'Tabella risultati'
},
message: {
appWelcome: 'Benvenuto in Antares SQL Client!',
appFirstStep: 'Primo step: crea una nuova connessione.',
addConnection: 'Aggiungi connessione',
createConnection: 'Crea connessione',
createNewConnection: 'Crea nuova connessione',
askCredentials: 'Chiedi credenziali',
testConnection: 'Testa connessione',
editConnection: 'Modifica connessione',
deleteConnection: 'Elimina connessione',
deleteCorfirm: 'Confermi l\'eliminazione di',
connectionSuccessfullyMade: 'Connessione avvenuta con successo!',
madeWithJS: 'Fatto con 💛 e JavaScript!',
checkForUpdates: 'Cerca aggiornamenti',
noUpdatesAvailable: 'Nessun aggiornamento disponibile',
checkingForUpdate: 'Controllo aggiornamenti in corso',
checkFailure: 'Controllo fallito, riprova più tardi',
updateAvailable: 'Aggiornamento disponibile',
downloadingUpdate: 'Download dell\'aggiornamento',
updateDownloaded: 'Aggiornamento scaricato',
restartToInstall: 'Riavvia Antares per installare l\'aggiornamento',
unableEditFieldWithoutPrimary: 'Impossibile modificare il campo senza una primary key nel resultset', unableEditFieldWithoutPrimary: 'Impossibile modificare il campo senza una primary key nel resultset',
editCell: 'Modifica cella', editCell: 'Modifica cella',
deleteRows: 'Elimina riga | Elimina {count} righe', deleteRows: 'Elimina riga | Elimina {count} righe',
confirmToDeleteRows: 'Confermi di voler cancellare una riga? | Confermi di voler cancellare {count} righe?', confirmToDeleteRows: 'Confermi di voler cancellare una riga? | Confermi di voler cancellare {count} righe?',
notificationsTimeout: 'Timeout Notifiche',
uploadFile: 'Carica file',
addNewRow: 'Aggiungi nuova riga', addNewRow: 'Aggiungi nuova riga',
numberOfInserts: 'Numero di insert', numberOfInserts: 'Numero di insert',
openNewTab: 'Apri nuova scheda',
affectedRows: 'Righe interessate', affectedRows: 'Righe interessate',
createNewDatabase: 'Crea nuovo database', createNewDatabase: 'Crea nuovo database',
databaseName: 'Nome database', databaseName: 'Nome database',
@@ -201,9 +175,7 @@ export const itIT = {
createNewTable: 'Crea nuova tabella', createNewTable: 'Crea nuova tabella',
emptyTable: 'Svuota tabella', emptyTable: 'Svuota tabella',
deleteTable: 'Cancella tabella', deleteTable: 'Cancella tabella',
emptyCorfirm: 'Confermi di voler svuotare', emptyConfirm: 'Confermi di voler svuotare',
unsavedChanges: 'Modifiche non salvate',
discardUnsavedChanges: 'Hai modifiche non salvate. Lasciando questa scheda le modifiche saranno scartate.',
thereAreNoIndexes: 'Non ci sono indici', thereAreNoIndexes: 'Non ci sono indici',
thereAreNoForeign: 'Non ci sono chiavi esterne', thereAreNoForeign: 'Non ci sono chiavi esterne',
createNewForeign: 'Crea nuova chiave esterna', createNewForeign: 'Crea nuova chiave esterna',
@@ -212,9 +184,6 @@ export const itIT = {
foreignFields: 'Campi esterni', foreignFields: 'Campi esterni',
invalidDefault: 'Default non valido', invalidDefault: 'Default non valido',
onDelete: 'All\'eliminazione', onDelete: 'All\'eliminazione',
applicationTheme: 'Tema applicazione',
editorTheme: 'Tema editor',
wrapLongLines: 'A capo righe lunghe',
selectStatement: 'Dichiarazione select', selectStatement: 'Dichiarazione select',
triggerStatement: 'Dichiarazione trigger', triggerStatement: 'Dichiarazione trigger',
sqlSecurity: 'Sicurezza SQL', sqlSecurity: 'Sicurezza SQL',
@@ -237,14 +206,9 @@ export const itIT = {
createNewScheduler: 'Crea nuovo scheduler', createNewScheduler: 'Crea nuovo scheduler',
deleteScheduler: 'Elimina scheduler', deleteScheduler: 'Elimina scheduler',
preserveOnCompletion: 'Preserva al completamento', preserveOnCompletion: 'Preserva al completamento',
enableSsl: 'Abilita SSL',
manualValue: 'Valore manuale',
tableFiller: 'Riempitore Tabella', tableFiller: 'Riempitore Tabella',
fakeDataLanguage: 'Lingua dati falsi', fakeDataLanguage: 'Lingua dati falsi',
searchForElements: 'Cerca elementi',
selectAll: 'Seleziona tutto',
queryDuration: 'Durata query', queryDuration: 'Durata query',
includeBetaUpdates: 'Includi aggiornamenti beta',
setNull: 'Imposta NULL', setNull: 'Imposta NULL',
processesList: 'Lista processi', processesList: 'Lista processi',
processInfo: 'Info processo', processInfo: 'Info processo',
@@ -253,15 +217,8 @@ export const itIT = {
schemaName: 'Nome schema', schemaName: 'Nome schema',
editSchema: 'Modifica schema', editSchema: 'Modifica schema',
deleteSchema: 'Elimina schema', deleteSchema: 'Elimina schema',
markdownSupported: 'Markdown supportato',
plantATree: 'Pianta un albero',
dataTabPageSize: 'Grandezza pagina tab DATI',
enableSsh: 'Abilita SSH',
pageNumber: 'Numero pagina',
duplicateTable: 'Duplica tabella', duplicateTable: 'Duplica tabella',
noOpenTabs: 'Non ci sono tab aperte, naviga nella barra sinistra o:',
noSchema: 'Nessuno schema', noSchema: 'Nessuno schema',
restorePreviourSession: 'Ripristina sessione precedente',
runQuery: 'Esegui query', runQuery: 'Esegui query',
thereAreNoTableFields: 'Non ci sono campi della tabella', thereAreNoTableFields: 'Non ci sono campi della tabella',
newTable: 'Nuova tabella', newTable: 'Nuova tabella',
@@ -274,36 +231,79 @@ export const itIT = {
thereIsNoQueriesYet: 'Non ci sono ancora query', thereIsNoQueriesYet: 'Non ci sono ancora query',
searchForQueries: 'Cerca query', searchForQueries: 'Cerca query',
killProcess: 'Uccidi processo', killProcess: 'Uccidi processo',
closeTab: 'Chiudi tab',
exportSchema: 'Esporta schema', exportSchema: 'Esporta schema',
importSchema: 'Importa schema', importSchema: 'Importa schema',
directoryPath: 'Percorso directory', newInsertStmtEvery: 'Nuova istruzione INSERT ogni',
newInserStmtEvery: 'Nuova istruzione INSERT ogni',
processingTableExport: 'Processo {table}', processingTableExport: 'Processo {table}',
fechingTableExport: 'Ricavo i dati {table}', fetchingTableExport: 'Ricavo i dati {table}',
writingTableExport: 'Scrittura dati {table}', writingTableExport: 'Scrittura dati {table}',
checkAllTables: 'Seleziona tutte le tabelle', checkAllTables: 'Seleziona tutte le tabelle',
uncheckAllTables: 'Deseleziona tutte le tabelle', uncheckAllTables: 'Deseleziona tutte le tabelle',
goToDownloadPage: 'Vai alla pagina di download',
readOnlyMode: 'Modalità sola lettura',
killQuery: 'Interrompi query', killQuery: 'Interrompi query',
insertRow: 'Inserisci riga | Inserisci righe', insertRow: 'Inserisci riga | Inserisci righe',
commitMode: 'Modalità commit', commitMode: 'Modalità commit',
autoCommit: 'Auto commit', autoCommit: 'Auto commit',
manualCommit: 'Commit manuale', manualCommit: 'Commit manuale',
actionSuccessful: '{action} riuscito', disableFKChecks: 'DIsabilita controllo foreigh key',
formatQuery: 'Formatta query',
queryHistory: 'Cronologia query',
clearQuery: 'Pulisci query',
fillCell: 'Riempi cella',
executeSelectedQuery: 'Esegui la query selezionata',
noResultsPresent: 'Nessun risultato presente',
importQueryErrors: 'Attenzione: si è verificato un errore | Attenzione si sono verificati {n} errori', importQueryErrors: 'Attenzione: si è verificato un errore | Attenzione si sono verificati {n} errori',
executedQueries: '{n} query eseguite | {n} query eseguite', executedQueries: '{n} query eseguite | {n} query eseguite'
ourputFormat: 'Formato output', },
singleFile: 'Singolo file {ext}', application: {
zipCompressedFile: 'File {ext} zippato', settings: 'Impostazioni',
general: 'Generale',
themes: 'Temi',
update: 'Aggiorna',
about: 'Informazioni',
language: 'Lingua',
light: 'Chiaro',
dark: 'Scuro',
autoCompletion: 'Auto Completamento',
application: 'Applicazione',
editor: 'Editor',
scratchpad: 'Blocco appunti',
changelog: 'Changelog',
small: 'Piccolo',
medium: 'Medio',
large: 'Largo',
console: 'Console',
shortcuts: 'Scorciatoie',
appearance: 'Aspetto',
color: 'Colore',
label: 'Etichetta',
icon: 'Icona',
madeWithJS: 'Fatto con 💛 e JavaScript!',
checkForUpdates: 'Cerca aggiornamenti',
noUpdatesAvailable: 'Nessun aggiornamento disponibile',
checkingForUpdate: 'Controllo aggiornamenti in corso',
checkFailure: 'Controllo fallito, riprova più tardi',
updateAvailable: 'Aggiornamento disponibile',
downloadingUpdate: 'Download dell\'aggiornamento',
updateDownloaded: 'Aggiornamento scaricato',
restartToInstall: 'Riavvia Antares per installare l\'aggiornamento',
notificationsTimeout: 'Timeout Notifiche',
openNewTab: 'Apri nuova scheda',
unsavedChanges: 'Modifiche non salvate',
discardUnsavedChanges: 'Hai modifiche non salvate. Lasciando questa scheda le modifiche saranno scartate.',
applicationTheme: 'Tema applicazione',
editorTheme: 'Tema editor',
wrapLongLines: 'A capo righe lunghe',
includeBetaUpdates: 'Includi aggiornamenti beta',
markdownSupported: 'Markdown supportato',
plantATree: 'Pianta un albero',
dataTabPageSize: 'Grandezza pagina tab DATI',
noOpenTabs: 'Non ci sono tab aperte, naviga nella barra sinistra o:',
restorePreviousSession: 'Ripristina sessione precedente',
closeTab: 'Chiudi tab',
goToDownloadPage: 'Vai alla pagina di download',
disableBlur: 'Disabilita sfocatura', disableBlur: 'Disabilita sfocatura',
untrustedConnection: 'Connessione non affidabile',
missingOrIncompleteTranslation: 'Traduzione mancante o incompleta?', missingOrIncompleteTranslation: 'Traduzione mancante o incompleta?',
findOutHowToContribute: 'Scopri come contribuire', findOutHowToContribute: 'Scopri come contribuire',
disableFKChecks: 'DIsabilita controllo foreigh key',
allConnections: 'Tutte le connessioni',
searchForConnections: 'Cerca una connessione',
disableScratchpad: 'Disabilita scratchpad', disableScratchpad: 'Disabilita scratchpad',
reportABug: 'Segnala un bug', reportABug: 'Segnala un bug',
nextTab: 'Prossima tab', nextTab: 'Prossima tab',
@@ -323,24 +323,19 @@ export const itIT = {
openSettings: 'Apri le impostazioni', openSettings: 'Apri le impostazioni',
openScratchpad: 'Apri lo scratchpad', openScratchpad: 'Apri lo scratchpad',
runOrReload: 'Esegui o ricarica', runOrReload: 'Esegui o ricarica',
formatQuery: 'Formatta query',
queryHistory: 'Cronologia query',
clearQuery: 'Pulisci query',
openFilter: 'Apri il filtro', openFilter: 'Apri il filtro',
nextResultsPage: 'Prossima pagina risultati', nextResultsPage: 'Prossima pagina risultati',
previousResultsPage: 'Pagina risultati precedente', previousResultsPage: 'Pagina risultati precedente',
fillCell: 'Riempi cella',
editFolder: 'Modifica cartella', editFolder: 'Modifica cartella',
folderName: 'Nome cartella', folderName: 'Nome cartella',
deleteFolder: 'Cancella cartella', deleteFolder: 'Cancella cartella',
editConnectionAppearence: 'Modifica aspetto connessione', editConnectionAppearance: 'Modifica aspetto connessione',
executeSelectedQuery: 'Esegui la query selezionata',
defaultCopyType: 'Tipo di copia default', defaultCopyType: 'Tipo di copia default',
showTableSize: 'Mostra dimensioni tabella nella sidebar', showTableSize: 'Mostra dimensioni tabella nella sidebar',
showTableSizeDescription: 'Solo MySQL/MariaDB. Abilitare questa opzione può compromettere le performance in schemi con molte tabelle.', showTableSizeDescription: 'Solo MySQL/MariaDB. Abilitare questa opzione può compromettere le performance in schemi con molte tabelle.',
searchForSchemas: 'Cerca schemi', searchForSchemas: 'Cerca schemi',
switchSearchMethod: 'Cambia metodo di ricerca', searchForElements: 'Cerca elementi',
noResultsPresent: 'Nessun risultato presente' switchSearchMethod: 'Cambia metodo di ricerca'
}, },
faker: { faker: {
address: 'Indirizzo', address: 'Indirizzo',

Some files were not shown because too many files have changed in this diff Show More