mirror of https://github.com/Fabio286/antares.git
Merge branch 'develop' of https://github.com/antares-sql/antares into pr/digitalgopnik/633
This commit is contained in:
commit
b838916937
|
@ -239,6 +239,24 @@
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"platform"
|
"platform"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "markusand",
|
||||||
|
"name": "Marc Vilella",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/12972543?v=4",
|
||||||
|
"profile": "https://github.com/markusand",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Lawondyss",
|
||||||
|
"name": "Ladislav Vondráček",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/272130?v=4",
|
||||||
|
"profile": "https://github.com/Lawondyss",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"contributorsPerLine": 7,
|
"contributorsPerLine": 7,
|
||||||
|
|
|
@ -18,7 +18,8 @@
|
||||||
},
|
},
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"vue",
|
"vue",
|
||||||
"@typescript-eslint"
|
"@typescript-eslint",
|
||||||
|
"simple-import-sort"
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
"space-infix-ops": "off",
|
"space-infix-ops": "off",
|
||||||
|
@ -91,6 +92,8 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@typescript-eslint/no-var-requires": "off"
|
"@typescript-eslint/no-var-requires": "off",
|
||||||
|
"simple-import-sort/imports": "error",
|
||||||
|
"simple-import-sort/exports": "error"
|
||||||
}
|
}
|
||||||
}
|
}
|
14
CHANGELOG.md
14
CHANGELOG.md
|
@ -2,6 +2,20 @@
|
||||||
|
|
||||||
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)
|
### [0.7.15](https://github.com/antares-sql/antares/compare/v0.7.14...v0.7.15) (2023-07-31)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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,7 +18,7 @@ However, there are all the features necessary to have a pleasant database manage
|
||||||
We are actively working on it, hoping to provide new cool features, improvements and fixes as soon as possible.
|
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.
|
||||||
|
|
||||||
🗳️ Polls:
|
🗳️ Polls:
|
||||||
|
@ -152,6 +153,8 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||||
<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://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>
|
<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>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/markusand"><img src="https://avatars.githubusercontent.com/u/12972543?v=4?s=100" width="100px;" alt="Marc Vilella"/><br /><sub><b>Marc Vilella</b></sub></a><br /><a href="#translation-markusand" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Lawondyss"><img src="https://avatars.githubusercontent.com/u/272130?v=4?s=100" width="100px;" alt="Ladislav Vondráček"/><br /><sub><b>Ladislav Vondráček</b></sub></a><br /><a href="#translation-Lawondyss" title="Translation">🌍</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
{
|
{
|
||||||
"name": "antares",
|
"name": "antares",
|
||||||
"version": "0.7.15",
|
"version": "0.7.16-beta.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "antares",
|
"name": "antares",
|
||||||
"version": "0.7.15",
|
"version": "0.7.16-beta.0",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/remote": "~2.0.1",
|
"@electron/remote": "~2.0.1",
|
||||||
"@faker-js/faker": "~6.1.2",
|
"@faker-js/faker": "~6.1.2",
|
||||||
"@mdi/font": "~7.1.96",
|
"@mdi/font": "~7.2.96",
|
||||||
"@turf/helpers": "~6.5.0",
|
"@turf/helpers": "~6.5.0",
|
||||||
"@vueuse/core": "~8.7.5",
|
"@vueuse/core": "~10.4.1",
|
||||||
"ace-builds": "~1.14.0",
|
"ace-builds": "~1.24.1",
|
||||||
"better-sqlite3": "~8.0.0",
|
"better-sqlite3": "~8.0.0",
|
||||||
"electron-log": "~4.4.1",
|
"electron-log": "~4.4.1",
|
||||||
"electron-store": "~8.1.0",
|
"electron-store": "~8.1.0",
|
||||||
|
@ -36,7 +36,7 @@
|
||||||
"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.2.0",
|
"sql-formatter": "~13.0.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",
|
||||||
|
@ -69,6 +69,7 @@
|
||||||
"eslint-plugin-import": "~2.24.2",
|
"eslint-plugin-import": "~2.24.2",
|
||||||
"eslint-plugin-node": "~11.1.0",
|
"eslint-plugin-node": "~11.1.0",
|
||||||
"eslint-plugin-promise": "~5.2.0",
|
"eslint-plugin-promise": "~5.2.0",
|
||||||
|
"eslint-plugin-simple-import-sort": "~10.0.0",
|
||||||
"eslint-plugin-vue": "~8.0.3",
|
"eslint-plugin-vue": "~8.0.3",
|
||||||
"file-loader": "~6.2.0",
|
"file-loader": "~6.2.0",
|
||||||
"html-webpack-plugin": "~5.5.0",
|
"html-webpack-plugin": "~5.5.0",
|
||||||
|
@ -89,6 +90,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",
|
||||||
|
@ -1697,6 +1699,28 @@
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@cspotcode/source-map-support": {
|
||||||
|
"version": "0.8.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
|
||||||
|
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@jridgewell/trace-mapping": "0.3.9"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": {
|
||||||
|
"version": "0.3.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
|
||||||
|
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@jridgewell/resolve-uri": "^3.0.3",
|
||||||
|
"@jridgewell/sourcemap-codec": "^1.4.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@csstools/selector-specificity": {
|
"node_modules/@csstools/selector-specificity": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
@ -2078,8 +2102,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@mdi/font": {
|
"node_modules/@mdi/font": {
|
||||||
"version": "7.1.96",
|
"version": "7.2.96",
|
||||||
"license": "Apache-2.0"
|
"resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.2.96.tgz",
|
||||||
|
"integrity": "sha512-e//lmkmpFUMZKhmCY9zdjRe4zNXfbOIJnn6xveHbaV2kSw5aJ5dLXUxcRt1Gxfi7ZYpFLUWlkG2MGSFAiqAu7w=="
|
||||||
},
|
},
|
||||||
"node_modules/@nodelib/fs.scandir": {
|
"node_modules/@nodelib/fs.scandir": {
|
||||||
"version": "2.1.5",
|
"version": "2.1.5",
|
||||||
|
@ -2148,6 +2173,30 @@
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@tsconfig/node10": {
|
||||||
|
"version": "1.0.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
|
||||||
|
"integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"node_modules/@tsconfig/node12": {
|
||||||
|
"version": "1.0.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
|
||||||
|
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"node_modules/@tsconfig/node14": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"node_modules/@tsconfig/node16": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
|
||||||
|
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/@turf/helpers": {
|
"node_modules/@turf/helpers": {
|
||||||
"version": "6.5.0",
|
"version": "6.5.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
@ -2449,8 +2498,9 @@
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/web-bluetooth": {
|
"node_modules/@types/web-bluetooth": {
|
||||||
"version": "0.0.14",
|
"version": "0.0.17",
|
||||||
"license": "MIT"
|
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz",
|
||||||
|
"integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA=="
|
||||||
},
|
},
|
||||||
"node_modules/@types/ws": {
|
"node_modules/@types/ws": {
|
||||||
"version": "8.5.4",
|
"version": "8.5.4",
|
||||||
|
@ -2825,56 +2875,24 @@
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@vueuse/core": {
|
"node_modules/@vueuse/core": {
|
||||||
"version": "8.7.5",
|
"version": "10.4.1",
|
||||||
"license": "MIT",
|
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.4.1.tgz",
|
||||||
|
"integrity": "sha512-DkHIfMIoSIBjMgRRvdIvxsyboRZQmImofLyOHADqiVbQVilP8VVHDhBX2ZqoItOgu7dWa8oXiNnScOdPLhdEXg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/web-bluetooth": "^0.0.14",
|
"@types/web-bluetooth": "^0.0.17",
|
||||||
"@vueuse/metadata": "8.7.5",
|
"@vueuse/metadata": "10.4.1",
|
||||||
"@vueuse/shared": "8.7.5",
|
"@vueuse/shared": "10.4.1",
|
||||||
"vue-demi": "*"
|
"vue-demi": ">=0.14.5"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/antfu"
|
"url": "https://github.com/sponsors/antfu"
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@vue/composition-api": "^1.1.0",
|
|
||||||
"vue": "^2.6.0 || ^3.2.0"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"@vue/composition-api": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"vue": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@vueuse/core/node_modules/@vueuse/shared": {
|
|
||||||
"version": "8.7.5",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"vue-demi": "*"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/antfu"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@vue/composition-api": "^1.1.0",
|
|
||||||
"vue": "^2.6.0 || ^3.2.0"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"@vue/composition-api": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"vue": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vueuse/core/node_modules/vue-demi": {
|
"node_modules/@vueuse/core/node_modules/vue-demi": {
|
||||||
"version": "0.14.5",
|
"version": "0.14.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
|
||||||
|
"integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"vue-demi-fix": "bin/vue-demi-fix.js",
|
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||||
"vue-demi-switch": "bin/vue-demi-switch.js"
|
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||||
|
@ -2896,12 +2914,49 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vueuse/metadata": {
|
"node_modules/@vueuse/metadata": {
|
||||||
"version": "8.7.5",
|
"version": "10.4.1",
|
||||||
"license": "MIT",
|
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.4.1.tgz",
|
||||||
|
"integrity": "sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg==",
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/antfu"
|
"url": "https://github.com/sponsors/antfu"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@vueuse/shared": {
|
||||||
|
"version": "10.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.4.1.tgz",
|
||||||
|
"integrity": "sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg==",
|
||||||
|
"dependencies": {
|
||||||
|
"vue-demi": ">=0.14.5"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/antfu"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@vueuse/shared/node_modules/vue-demi": {
|
||||||
|
"version": "0.14.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
|
||||||
|
"integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"bin": {
|
||||||
|
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||||
|
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/antfu"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@vue/composition-api": "^1.0.0-rc.1",
|
||||||
|
"vue": "^3.0.0-0 || ^2.6.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@vue/composition-api": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@webassemblyjs/ast": {
|
"node_modules/@webassemblyjs/ast": {
|
||||||
"version": "1.11.1",
|
"version": "1.11.1",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
@ -3094,8 +3149,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ace-builds": {
|
"node_modules/ace-builds": {
|
||||||
"version": "1.14.0",
|
"version": "1.24.1",
|
||||||
"license": "BSD-3-Clause"
|
"resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.24.1.tgz",
|
||||||
|
"integrity": "sha512-TLcxMxiTRX5Eq9bBVSd/bTJlanCBULiv/IULLohJDDaCAfcpZKJBVSd4OWfN/j2c2jCLc+jhpNWGELiJZw3wPw=="
|
||||||
},
|
},
|
||||||
"node_modules/acorn": {
|
"node_modules/acorn": {
|
||||||
"version": "7.4.1",
|
"version": "7.4.1",
|
||||||
|
@ -3116,6 +3172,15 @@
|
||||||
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
|
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/acorn-walk": {
|
||||||
|
"version": "8.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
|
||||||
|
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/add-stream": {
|
"node_modules/add-stream": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
@ -3387,6 +3452,12 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
|
"node_modules/arg": {
|
||||||
|
"version": "4.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
|
||||||
|
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/argparse": {
|
"node_modules/argparse": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"license": "Python-2.0"
|
"license": "Python-2.0"
|
||||||
|
@ -4881,6 +4952,12 @@
|
||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/create-require": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/cross-env": {
|
"node_modules/cross-env": {
|
||||||
"version": "7.0.3",
|
"version": "7.0.3",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
@ -5279,6 +5356,15 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
|
"node_modules/diff": {
|
||||||
|
"version": "4.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
||||||
|
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/dir-compare": {
|
"node_modules/dir-compare": {
|
||||||
"version": "2.4.0",
|
"version": "2.4.0",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
@ -6383,6 +6469,15 @@
|
||||||
"eslint": "^7.0.0"
|
"eslint": "^7.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/eslint-plugin-simple-import-sort": {
|
||||||
|
"version": "10.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz",
|
||||||
|
"integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==",
|
||||||
|
"dev": true,
|
||||||
|
"peerDependencies": {
|
||||||
|
"eslint": ">=5.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/eslint-plugin-vue": {
|
"node_modules/eslint-plugin-vue": {
|
||||||
"version": "8.0.3",
|
"version": "8.0.3",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
@ -7394,7 +7489,6 @@
|
||||||
},
|
},
|
||||||
"node_modules/get-stdin": {
|
"node_modules/get-stdin": {
|
||||||
"version": "8.0.0",
|
"version": "8.0.0",
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
|
@ -9170,6 +9264,12 @@
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/make-error": {
|
||||||
|
"version": "1.3.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
|
||||||
|
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/map-obj": {
|
"node_modules/map-obj": {
|
||||||
"version": "4.3.0",
|
"version": "4.3.0",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
@ -12389,11 +12489,12 @@
|
||||||
"license": "BSD-3-Clause"
|
"license": "BSD-3-Clause"
|
||||||
},
|
},
|
||||||
"node_modules/sql-formatter": {
|
"node_modules/sql-formatter": {
|
||||||
"version": "12.2.2",
|
"version": "13.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/sql-formatter/-/sql-formatter-12.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/sql-formatter/-/sql-formatter-13.0.0.tgz",
|
||||||
"integrity": "sha512-UBChSI2X6hd4GhmO+c7BmSFtc792FwogVaVqc9Y22/OqybvVfgl2OeAShc9fjivWVshXbm4UEK8WTM3tt+2Mvw==",
|
"integrity": "sha512-V21cVvge4rhn9Fa7K/fTKcmPM+x1yee6Vhq8ZwgaWh3VPBqApgsaoFB5kLAhiqRo5AmSaRyLU7LIdgnNwH01/w==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"argparse": "^2.0.1",
|
"argparse": "^2.0.1",
|
||||||
|
"get-stdin": "=8.0.0",
|
||||||
"nearley": "^2.20.1"
|
"nearley": "^2.20.1"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
|
@ -13635,6 +13736,61 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
|
"node_modules/ts-node": {
|
||||||
|
"version": "10.9.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
|
||||||
|
"integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@cspotcode/source-map-support": "^0.8.0",
|
||||||
|
"@tsconfig/node10": "^1.0.7",
|
||||||
|
"@tsconfig/node12": "^1.0.7",
|
||||||
|
"@tsconfig/node14": "^1.0.0",
|
||||||
|
"@tsconfig/node16": "^1.0.2",
|
||||||
|
"acorn": "^8.4.1",
|
||||||
|
"acorn-walk": "^8.1.1",
|
||||||
|
"arg": "^4.1.0",
|
||||||
|
"create-require": "^1.1.0",
|
||||||
|
"diff": "^4.0.1",
|
||||||
|
"make-error": "^1.1.1",
|
||||||
|
"v8-compile-cache-lib": "^3.0.1",
|
||||||
|
"yn": "3.1.1"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"ts-node": "dist/bin.js",
|
||||||
|
"ts-node-cwd": "dist/bin-cwd.js",
|
||||||
|
"ts-node-esm": "dist/bin-esm.js",
|
||||||
|
"ts-node-script": "dist/bin-script.js",
|
||||||
|
"ts-node-transpile-only": "dist/bin-transpile.js",
|
||||||
|
"ts-script": "dist/bin-script-deprecated.js"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@swc/core": ">=1.2.50",
|
||||||
|
"@swc/wasm": ">=1.2.50",
|
||||||
|
"@types/node": "*",
|
||||||
|
"typescript": ">=2.7"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@swc/core": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"@swc/wasm": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/ts-node/node_modules/acorn": {
|
||||||
|
"version": "8.10.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
|
||||||
|
"integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
|
||||||
|
"dev": true,
|
||||||
|
"bin": {
|
||||||
|
"acorn": "bin/acorn"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/tsconfig-paths": {
|
"node_modules/tsconfig-paths": {
|
||||||
"version": "3.14.2",
|
"version": "3.14.2",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
@ -14015,6 +14171,12 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/v8-compile-cache-lib": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/validate-npm-package-license": {
|
"node_modules/validate-npm-package-license": {
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
@ -14940,6 +15102,15 @@
|
||||||
"fd-slicer": "~1.1.0"
|
"fd-slicer": "~1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/yn": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/yocto-queue": {
|
"node_modules/yocto-queue": {
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
|
13
package.json
13
package.json
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "antares",
|
"name": "antares",
|
||||||
"productName": "Antares",
|
"productName": "Antares",
|
||||||
"version": "0.7.15",
|
"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",
|
||||||
|
@ -19,6 +19,7 @@
|
||||||
"release:beta": "npm run release -- --prerelease beta",
|
"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}\"",
|
||||||
|
@ -121,10 +122,10 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/remote": "~2.0.1",
|
"@electron/remote": "~2.0.1",
|
||||||
"@faker-js/faker": "~6.1.2",
|
"@faker-js/faker": "~6.1.2",
|
||||||
"@mdi/font": "~7.1.96",
|
"@mdi/font": "~7.2.96",
|
||||||
"@turf/helpers": "~6.5.0",
|
"@turf/helpers": "~6.5.0",
|
||||||
"@vueuse/core": "~8.7.5",
|
"@vueuse/core": "~10.4.1",
|
||||||
"ace-builds": "~1.14.0",
|
"ace-builds": "~1.24.1",
|
||||||
"better-sqlite3": "~8.0.0",
|
"better-sqlite3": "~8.0.0",
|
||||||
"electron-log": "~4.4.1",
|
"electron-log": "~4.4.1",
|
||||||
"electron-store": "~8.1.0",
|
"electron-store": "~8.1.0",
|
||||||
|
@ -145,7 +146,7 @@
|
||||||
"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.2.0",
|
"sql-formatter": "~13.0.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",
|
||||||
|
@ -178,6 +179,7 @@
|
||||||
"eslint-plugin-import": "~2.24.2",
|
"eslint-plugin-import": "~2.24.2",
|
||||||
"eslint-plugin-node": "~11.1.0",
|
"eslint-plugin-node": "~11.1.0",
|
||||||
"eslint-plugin-promise": "~5.2.0",
|
"eslint-plugin-promise": "~5.2.0",
|
||||||
|
"eslint-plugin-simple-import-sort": "~10.0.0",
|
||||||
"eslint-plugin-vue": "~8.0.3",
|
"eslint-plugin-vue": "~8.0.3",
|
||||||
"file-loader": "~6.2.0",
|
"file-loader": "~6.2.0",
|
||||||
"html-webpack-plugin": "~5.5.0",
|
"html-webpack-plugin": "~5.5.0",
|
||||||
|
@ -198,6 +200,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",
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
||||||
|
import { enUS } from '../src/renderer/i18n/en-US';
|
||||||
|
import { localesNames } from '../src/renderer/i18n/supported-locales';
|
||||||
|
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)`);
|
|
@ -31,10 +31,10 @@ parts:
|
||||||
fi
|
fi
|
||||||
# Get the latest releases json
|
# Get the latest releases json
|
||||||
echo "Get GitHub releases..."
|
echo "Get GitHub releases..."
|
||||||
wget --quiet https://api.github.com/repos/fabio286/antares/releases/latest -O releases.json
|
wget --quiet https://api.github.com/repos/fabio286/antares/releases -O releases.json
|
||||||
# Get the version from the tag_name and the download URL.
|
# Get the version from the tag_name and the download URL.
|
||||||
VERSION=$(jq . releases.json | grep tag_name | cut -d'"' -f4 | sed s'/release-//')
|
VERSION=$(jq . releases.json | grep tag_name | head -1 | cut -d'"' -f4 | sed s'/release-//')
|
||||||
DEB_URL=$(cat releases.json | jq -r ".assets[] | select(.name | test(\"${FILTER}\")) | .browser_download_url")
|
DEB_URL=$(cat releases.json | jq -r ".[0].assets[] | select(.name | test(\"${FILTER}\")) | .browser_download_url")
|
||||||
DEB=$(basename "${DEB_URL}")
|
DEB=$(basename "${DEB_URL}")
|
||||||
echo "Downloading ${DEB_URL}..."
|
echo "Downloading ${DEB_URL}..."
|
||||||
wget --quiet "${DEB_URL}" -O "${SNAPCRAFT_PART_INSTALL}/${DEB}"
|
wget --quiet "${DEB_URL}" -O "${SNAPCRAFT_PART_INSTALL}/${DEB}"
|
||||||
|
@ -79,7 +79,7 @@ parts:
|
||||||
- libdb5.3
|
- libdb5.3
|
||||||
- libdbus-1-3
|
- libdbus-1-3
|
||||||
- libexpat1
|
- libexpat1
|
||||||
- libffi7
|
- libffi8
|
||||||
- libgcc-s1
|
- libgcc-s1
|
||||||
- libgcrypt20
|
- libgcrypt20
|
||||||
- libglib2.0-0
|
- libglib2.0-0
|
||||||
|
@ -87,9 +87,9 @@ parts:
|
||||||
- libgnutls30
|
- libgnutls30
|
||||||
- libgpg-error0
|
- libgpg-error0
|
||||||
- libgssapi-krb5-2
|
- libgssapi-krb5-2
|
||||||
- libhogweed5
|
- libhogweed6
|
||||||
- libidn2-0
|
- libidn2-0
|
||||||
- libjson-c4
|
- libjson-c5
|
||||||
- libk5crypto3
|
- libk5crypto3
|
||||||
- libkeyutils1
|
- libkeyutils1
|
||||||
- libkrb5-3
|
- libkrb5-3
|
||||||
|
@ -97,12 +97,12 @@ parts:
|
||||||
- liblz4-1
|
- liblz4-1
|
||||||
- liblzma5
|
- liblzma5
|
||||||
- libmount1
|
- libmount1
|
||||||
- libnettle7
|
- libnettle8
|
||||||
- libp11-kit0
|
- libp11-kit0
|
||||||
- libpcre2-8-0
|
- libpcre2-8-0
|
||||||
- libselinux1
|
- libselinux1
|
||||||
- libsqlite3-0
|
- libsqlite3-0
|
||||||
- libssl1.1
|
- libssl3
|
||||||
- libstdc++6
|
- libstdc++6
|
||||||
- libsystemd0
|
- libsystemd0
|
||||||
- libtasn1-6
|
- libtasn1-6
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import firebirdTypes from '../data-types/firebird';
|
||||||
import { Customizations } from '../interfaces/customizations';
|
import { Customizations } from '../interfaces/customizations';
|
||||||
import { defaults } from './defaults';
|
import { defaults } from './defaults';
|
||||||
import firebirdTypes from '../data-types/firebird';
|
|
||||||
|
|
||||||
export const customizations: Customizations = {
|
export const customizations: Customizations = {
|
||||||
...defaults,
|
...defaults,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
import * as firebird from 'common/customizations/firebird';
|
||||||
import * as mysql from 'common/customizations/mysql';
|
import * as mysql from 'common/customizations/mysql';
|
||||||
import * as postgresql from 'common/customizations/postgresql';
|
import * as postgresql from 'common/customizations/postgresql';
|
||||||
import * as sqlite from 'common/customizations/sqlite';
|
import * as sqlite from 'common/customizations/sqlite';
|
||||||
import * as firebird from 'common/customizations/firebird';
|
|
||||||
import { Customizations } from 'common/interfaces/customizations';
|
import { Customizations } from 'common/interfaces/customizations';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import mysqlTypes from '../data-types/mysql';
|
||||||
import { Customizations } from '../interfaces/customizations';
|
import { Customizations } from '../interfaces/customizations';
|
||||||
import { defaults } from './defaults';
|
import { defaults } from './defaults';
|
||||||
import mysqlTypes from '../data-types/mysql';
|
|
||||||
|
|
||||||
export const customizations: Customizations = {
|
export const customizations: Customizations = {
|
||||||
...defaults,
|
...defaults,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import postgresqlTypes from '../data-types/postgresql';
|
||||||
import { Customizations } from '../interfaces/customizations';
|
import { Customizations } from '../interfaces/customizations';
|
||||||
import { defaults } from './defaults';
|
import { defaults } from './defaults';
|
||||||
import postgresqlTypes from '../data-types/postgresql';
|
|
||||||
|
|
||||||
export const customizations: Customizations = {
|
export const customizations: Customizations = {
|
||||||
...defaults,
|
...defaults,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import sqliteTypes from '../data-types/sqlite';
|
||||||
import { Customizations } from '../interfaces/customizations';
|
import { Customizations } from '../interfaces/customizations';
|
||||||
import { defaults } from './defaults';
|
import { defaults } from './defaults';
|
||||||
import sqliteTypes from '../data-types/sqlite';
|
|
||||||
|
|
||||||
export const customizations: Customizations = {
|
export const customizations: Customizations = {
|
||||||
...defaults,
|
...defaults,
|
||||||
|
|
|
@ -1,14 +1,15 @@
|
||||||
import * as mysql from 'mysql2/promise';
|
import * as mysql from 'mysql2/promise';
|
||||||
import * as pg from 'pg';
|
import * as pg from 'pg';
|
||||||
|
import { FirebirdSQLClient } from 'src/main/libs/clients/FirebirdSQLClient';
|
||||||
import MysqlExporter from 'src/main/libs/exporters/sql/MysqlExporter';
|
import MysqlExporter from 'src/main/libs/exporters/sql/MysqlExporter';
|
||||||
import PostgreSQLExporter from 'src/main/libs/exporters/sql/PostgreSQLExporter';
|
import PostgreSQLExporter from 'src/main/libs/exporters/sql/PostgreSQLExporter';
|
||||||
import MySQLImporter from 'src/main/libs/importers/sql/MySQLlImporter';
|
import MySQLImporter from 'src/main/libs/importers/sql/MySQLlImporter';
|
||||||
import PostgreSQLImporter from 'src/main/libs/importers/sql/PostgreSQLImporter';
|
import PostgreSQLImporter from 'src/main/libs/importers/sql/PostgreSQLImporter';
|
||||||
import SSHConfig from 'ssh2-promise/lib/sshConfig';
|
import SSHConfig from 'ssh2-promise/lib/sshConfig';
|
||||||
|
|
||||||
import { MySQLClient } from '../../main/libs/clients/MySQLClient';
|
import { MySQLClient } from '../../main/libs/clients/MySQLClient';
|
||||||
import { PostgreSQLClient } from '../../main/libs/clients/PostgreSQLClient';
|
import { PostgreSQLClient } from '../../main/libs/clients/PostgreSQLClient';
|
||||||
import { SQLiteClient } from '../../main/libs/clients/SQLiteClient';
|
import { SQLiteClient } from '../../main/libs/clients/SQLiteClient';
|
||||||
import { FirebirdSQLClient } from 'src/main/libs/clients/FirebirdSQLClient';
|
|
||||||
|
|
||||||
export type Client = MySQLClient | PostgreSQLClient | SQLiteClient | FirebirdSQLClient
|
export type Client = MySQLClient | PostgreSQLClient | SQLiteClient | FirebirdSQLClient
|
||||||
export type ClientCode = 'mysql' | 'maria' | 'pg' | 'sqlite' | 'firebird'
|
export type ClientCode = 'mysql' | 'maria' | 'pg' | 'sqlite' | 'firebird'
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
import * as crypto from 'crypto';
|
||||||
|
|
||||||
|
const algorithm = 'aes-256-gcm';
|
||||||
|
|
||||||
|
function encrypt (text: string, password: string) {
|
||||||
|
const iv = crypto.randomBytes(16);
|
||||||
|
const key = crypto.scryptSync(password, 'antares', 32);
|
||||||
|
const cipher = crypto.createCipheriv(algorithm, key, iv);
|
||||||
|
const encrypted = Buffer.concat([cipher.update(text), cipher.final()]);
|
||||||
|
const authTag = cipher.getAuthTag();
|
||||||
|
|
||||||
|
return {
|
||||||
|
iv: iv.toString('hex'),
|
||||||
|
authTag: authTag.toString('hex'),
|
||||||
|
content: encrypted.toString('hex')
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function decrypt (hash: { iv: string; content: string; authTag: string }, password: string) {
|
||||||
|
const key = crypto.scryptSync(password, 'antares', 32);
|
||||||
|
const decipher = crypto.createDecipheriv(algorithm, key, Buffer.from(hash.iv, 'hex'));
|
||||||
|
decipher.setAuthTag(Buffer.from(hash.authTag, 'hex'));
|
||||||
|
const decrpyted = decipher.update(hash.content, 'hex', 'utf8') + decipher.final('utf8');
|
||||||
|
|
||||||
|
return decrpyted;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { decrypt, encrypt };
|
|
@ -1,12 +1,13 @@
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable no-useless-escape */
|
/* eslint-disable no-useless-escape */
|
||||||
import * as moment from 'moment';
|
|
||||||
import { lineString, point, polygon } from '@turf/helpers';
|
import { lineString, point, polygon } from '@turf/helpers';
|
||||||
|
import { BIT, BLOB, DATE, DATETIME, FLOAT, IS_MULTI_SPATIAL, NUMBER, SPATIAL, TEXT_SEARCH } from 'common/fieldTypes';
|
||||||
|
import * as moment from 'moment';
|
||||||
|
|
||||||
import customizations from '../customizations';
|
import customizations from '../customizations';
|
||||||
import { ClientCode } from '../interfaces/antares';
|
import { ClientCode } from '../interfaces/antares';
|
||||||
import { BLOB, BIT, DATE, DATETIME, FLOAT, SPATIAL, IS_MULTI_SPATIAL, NUMBER, TEXT_SEARCH } from 'common/fieldTypes';
|
|
||||||
import hexToBinary, { HexChar } from './hexToBinary';
|
|
||||||
import { getArrayDepth } from './getArrayDepth';
|
import { getArrayDepth } from './getArrayDepth';
|
||||||
|
import hexToBinary, { HexChar } from './hexToBinary';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Escapes a string fo SQL use
|
* Escapes a string fo SQL use
|
||||||
|
|
|
@ -135,4 +135,4 @@ for (let i = 1; i <= 9; i++) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export { shortcuts, ShortcutRecord };
|
export { ShortcutRecord, shortcuts };
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { app, ipcMain, dialog } from 'electron';
|
import { app, dialog, ipcMain } from 'electron';
|
||||||
|
|
||||||
import { ShortcutRegister } from '../libs/ShortcutRegister';
|
import { ShortcutRegister } from '../libs/ShortcutRegister';
|
||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import * as antares from 'common/interfaces/antares';
|
import * as antares from 'common/interfaces/antares';
|
||||||
import * as fs from 'fs';
|
|
||||||
import { ipcMain } from 'electron';
|
import { ipcMain } from 'electron';
|
||||||
import { ClientsFactory } from '../libs/ClientsFactory';
|
import * as fs from 'fs';
|
||||||
import { SslOptions } from 'mysql2';
|
import { SslOptions } from 'mysql2';
|
||||||
|
|
||||||
|
import { ClientsFactory } from '../libs/ClientsFactory';
|
||||||
|
|
||||||
export default (connections: {[key: string]: antares.Client}) => {
|
export default (connections: {[key: string]: antares.Client}) => {
|
||||||
ipcMain.handle('test-connection', async (event, conn: antares.ConnectionParams) => {
|
ipcMain.handle('test-connection', async (event, conn: antares.ConnectionParams) => {
|
||||||
const params = {
|
const params = {
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
import * as antares from 'common/interfaces/antares';
|
import * as antares from 'common/interfaces/antares';
|
||||||
|
|
||||||
import connection from './connection';
|
|
||||||
import tables from './tables';
|
|
||||||
import views from './views';
|
|
||||||
import triggers from './triggers';
|
|
||||||
import routines from './routines';
|
|
||||||
import functions from './functions';
|
|
||||||
import schedulers from './schedulers';
|
|
||||||
import updates from './updates';
|
|
||||||
import application from './application';
|
import application from './application';
|
||||||
|
import connection from './connection';
|
||||||
import database from './database';
|
import database from './database';
|
||||||
|
import functions from './functions';
|
||||||
|
import routines from './routines';
|
||||||
|
import schedulers from './schedulers';
|
||||||
import schema from './schema';
|
import schema from './schema';
|
||||||
|
import tables from './tables';
|
||||||
|
import triggers from './triggers';
|
||||||
|
import updates from './updates';
|
||||||
import users from './users';
|
import users from './users';
|
||||||
|
import views from './views';
|
||||||
|
|
||||||
const connections: {[key: string]: antares.Client} = {};
|
const connections: {[key: string]: antares.Client} = {};
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
|
import { ChildProcess, fork } from 'child_process';
|
||||||
import * as antares from 'common/interfaces/antares';
|
import * as antares from 'common/interfaces/antares';
|
||||||
import * as workers from 'common/interfaces/workers';
|
import * as workers from 'common/interfaces/workers';
|
||||||
|
import { dialog, ipcMain } from 'electron';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import { ChildProcess, fork } from 'child_process';
|
|
||||||
import { ipcMain, dialog } from 'electron';
|
|
||||||
|
|
||||||
const isDevelopment = process.env.NODE_ENV !== 'production';
|
const isDevelopment = process.env.NODE_ENV !== 'production';
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import * as fs from 'fs';
|
import { faker } from '@faker-js/faker';
|
||||||
|
import customizations from 'common/customizations';
|
||||||
|
import { ARRAY, BIT, BLOB, BOOLEAN, DATE, DATETIME, FLOAT, LONG_TEXT, NUMBER, TEXT, TEXT_SEARCH } from 'common/fieldTypes';
|
||||||
import * as antares from 'common/interfaces/antares';
|
import * as antares from 'common/interfaces/antares';
|
||||||
import { InsertRowsParams } from 'common/interfaces/tableApis';
|
import { InsertRowsParams } from 'common/interfaces/tableApis';
|
||||||
import { ipcMain } from 'electron';
|
|
||||||
import { faker } from '@faker-js/faker';
|
|
||||||
import * as moment from 'moment';
|
|
||||||
import { sqlEscaper } from 'common/libs/sqlUtils';
|
import { sqlEscaper } from 'common/libs/sqlUtils';
|
||||||
import { TEXT, LONG_TEXT, ARRAY, TEXT_SEARCH, NUMBER, FLOAT, BLOB, BIT, DATE, DATETIME, BOOLEAN } from 'common/fieldTypes';
|
import { ipcMain } from 'electron';
|
||||||
import customizations from 'common/customizations';
|
import * as fs from 'fs';
|
||||||
|
import * as moment from 'moment';
|
||||||
|
|
||||||
export default (connections: {[key: string]: antares.Client}) => {
|
export default (connections: {[key: string]: antares.Client}) => {
|
||||||
ipcMain.handle('get-table-columns', async (event, params) => {
|
ipcMain.handle('get-table-columns', async (event, params) => {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { ipcMain } from 'electron';
|
import { ipcMain } from 'electron';
|
||||||
import { autoUpdater } from 'electron-updater';
|
|
||||||
import * as Store from 'electron-store';
|
import * as Store from 'electron-store';
|
||||||
|
import { autoUpdater } from 'electron-updater';
|
||||||
|
|
||||||
const persistentStore = new Store({
|
const persistentStore = new Store({
|
||||||
name: 'settings',
|
name: 'settings',
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import * as antares from 'common/interfaces/antares';
|
import * as antares from 'common/interfaces/antares';
|
||||||
|
|
||||||
|
import { FirebirdSQLClient } from './clients/FirebirdSQLClient';
|
||||||
import { MySQLClient } from './clients/MySQLClient';
|
import { MySQLClient } from './clients/MySQLClient';
|
||||||
import { PostgreSQLClient } from './clients/PostgreSQLClient';
|
import { PostgreSQLClient } from './clients/PostgreSQLClient';
|
||||||
import { SQLiteClient } from './clients/SQLiteClient';
|
import { SQLiteClient } from './clients/SQLiteClient';
|
||||||
import { FirebirdSQLClient } from './clients/FirebirdSQLClient';
|
|
||||||
|
|
||||||
export class ClientsFactory {
|
export class ClientsFactory {
|
||||||
static getClient (args: antares.ClientParams) {
|
static getClient (args: antares.ClientParams) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { ShortcutRecord, shortcuts } from 'common/shortcuts';
|
||||||
import { BrowserWindow, globalShortcut, Menu, MenuItem, MenuItemConstructorOptions } from 'electron';
|
import { BrowserWindow, globalShortcut, Menu, MenuItem, MenuItemConstructorOptions } from 'electron';
|
||||||
import * as Store from 'electron-store';
|
import * as Store from 'electron-store';
|
||||||
import { ShortcutRecord, shortcuts } from 'common/shortcuts';
|
|
||||||
|
|
||||||
const shortcutsStore = new Store({ name: 'shortcuts' });
|
const shortcutsStore = new Store({ name: 'shortcuts' });
|
||||||
const isDevelopment = process.env.NODE_ENV !== 'production';
|
const isDevelopment = process.env.NODE_ENV !== 'production';
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import * as path from 'path';
|
|
||||||
import * as antares from 'common/interfaces/antares';
|
|
||||||
import * as firebird from 'node-firebird';
|
|
||||||
import { AntaresCore } from '../AntaresCore';
|
|
||||||
import dataTypes from 'common/data-types/firebird';
|
import dataTypes from 'common/data-types/firebird';
|
||||||
import { FLOAT, NUMBER } from 'common/fieldTypes';
|
import { FLOAT, NUMBER } from 'common/fieldTypes';
|
||||||
|
import * as antares from 'common/interfaces/antares';
|
||||||
|
import * as firebird from 'node-firebird';
|
||||||
|
import * as path from 'path';
|
||||||
|
|
||||||
|
import { AntaresCore } from '../AntaresCore';
|
||||||
|
|
||||||
export class FirebirdSQLClient extends AntaresCore {
|
export class FirebirdSQLClient extends AntaresCore {
|
||||||
private _schema?: string;
|
private _schema?: string;
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
import dataTypes from 'common/data-types/mysql';
|
||||||
import * as antares from 'common/interfaces/antares';
|
import * as antares from 'common/interfaces/antares';
|
||||||
import * as mysql from 'mysql2/promise';
|
import * as mysql from 'mysql2/promise';
|
||||||
|
|
||||||
import { AntaresCore } from '../AntaresCore';
|
import { AntaresCore } from '../AntaresCore';
|
||||||
import dataTypes from 'common/data-types/mysql';
|
|
||||||
import SSH2Promise = require('ssh2-promise');
|
import SSH2Promise = require('ssh2-promise');
|
||||||
import SSHConfig from 'ssh2-promise/lib/sshConfig';
|
import SSHConfig from 'ssh2-promise/lib/sshConfig';
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
|
import dataTypes from 'common/data-types/postgresql';
|
||||||
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 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 +99,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);
|
||||||
|
@ -156,7 +157,7 @@ export class PostgreSQLClient extends AntaresCore {
|
||||||
user: this._params.user,
|
user: this._params.user,
|
||||||
database: 'postgres' as string,
|
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;
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import * as antares from 'common/interfaces/antares';
|
|
||||||
import * as sqlite from 'better-sqlite3';
|
import * as sqlite from 'better-sqlite3';
|
||||||
import { AntaresCore } from '../AntaresCore';
|
|
||||||
import dataTypes from 'common/data-types/sqlite';
|
import dataTypes from 'common/data-types/sqlite';
|
||||||
import { NUMBER, FLOAT, TIME, DATETIME } from 'common/fieldTypes';
|
import { DATETIME, FLOAT, NUMBER, TIME } from 'common/fieldTypes';
|
||||||
|
import * as antares from 'common/interfaces/antares';
|
||||||
|
|
||||||
|
import { AntaresCore } from '../AntaresCore';
|
||||||
|
|
||||||
export class SQLiteClient extends AntaresCore {
|
export class SQLiteClient extends AntaresCore {
|
||||||
private _schema?: string;
|
private _schema?: string;
|
||||||
|
@ -425,7 +426,7 @@ export class SQLiteClient extends AntaresCore {
|
||||||
|
|
||||||
return results.rows.map(row => {
|
return results.rows.map(row => {
|
||||||
return {
|
return {
|
||||||
sql: row.sql.match(/(?<=AS ).*?$/gs)[0],
|
sql: row.sql.match(/(?<=(AS|as)( |\n)).*?$/gs)[0],
|
||||||
name: view
|
name: view
|
||||||
};
|
};
|
||||||
})[0];
|
})[0];
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import * as exporter from 'common/interfaces/exporter';
|
import * as exporter from 'common/interfaces/exporter';
|
||||||
import * as fs from 'fs';
|
|
||||||
import { createGzip, Gzip } from 'zlib';
|
|
||||||
import * as path from 'path';
|
|
||||||
import * as EventEmitter from 'events';
|
import * as EventEmitter from 'events';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { createGzip, Gzip } from 'zlib';
|
||||||
|
|
||||||
export class BaseExporter extends EventEmitter {
|
export class BaseExporter extends EventEmitter {
|
||||||
protected _tables;
|
protected _tables;
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import * as exporter from 'common/interfaces/exporter';
|
import * as exporter from 'common/interfaces/exporter';
|
||||||
import * as mysql from 'mysql2/promise';
|
|
||||||
import { SqlExporter } from './SqlExporter';
|
|
||||||
import { MySQLClient } from '../../clients/MySQLClient';
|
|
||||||
import { valueToSqlString } from 'common/libs/sqlUtils';
|
import { valueToSqlString } from 'common/libs/sqlUtils';
|
||||||
|
import * as mysql from 'mysql2/promise';
|
||||||
|
|
||||||
|
import { MySQLClient } from '../../clients/MySQLClient';
|
||||||
|
import { SqlExporter } from './SqlExporter';
|
||||||
|
|
||||||
export default class MysqlExporter extends SqlExporter {
|
export default class MysqlExporter extends SqlExporter {
|
||||||
protected _client: MySQLClient;
|
protected _client: MySQLClient;
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
import * as antares from 'common/interfaces/antares';
|
import * as antares from 'common/interfaces/antares';
|
||||||
import * as exporter from 'common/interfaces/exporter';
|
import * as exporter from 'common/interfaces/exporter';
|
||||||
import { SqlExporter } from './SqlExporter';
|
import { valueToSqlString } from 'common/libs/sqlUtils';
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import * as QueryStream from 'pg-query-stream';
|
import * as QueryStream from 'pg-query-stream';
|
||||||
|
|
||||||
import { PostgreSQLClient } from '../../clients/PostgreSQLClient';
|
import { PostgreSQLClient } from '../../clients/PostgreSQLClient';
|
||||||
import { valueToSqlString } from 'common/libs/sqlUtils';
|
import { SqlExporter } from './SqlExporter';
|
||||||
|
|
||||||
export default class PostgreSQLExporter extends SqlExporter {
|
export default class PostgreSQLExporter extends SqlExporter {
|
||||||
constructor (client: PostgreSQLClient, tables: exporter.TableParams[], options: exporter.ExportOptions) {
|
constructor (client: PostgreSQLClient, tables: exporter.TableParams[], options: exporter.ExportOptions) {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import * as moment from 'moment';
|
import * as moment from 'moment';
|
||||||
|
|
||||||
import { MySQLClient } from '../../clients/MySQLClient';
|
import { MySQLClient } from '../../clients/MySQLClient';
|
||||||
import { PostgreSQLClient } from '../../clients/PostgreSQLClient';
|
import { PostgreSQLClient } from '../../clients/PostgreSQLClient';
|
||||||
import { BaseExporter } from '../BaseExporter';
|
import { BaseExporter } from '../BaseExporter';
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import * as importer from 'common/interfaces/importer';
|
import * as importer from 'common/interfaces/importer';
|
||||||
import * as fs from 'fs';
|
|
||||||
import * as EventEmitter from 'events';
|
import * as EventEmitter from 'events';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
|
||||||
export class BaseImporter extends EventEmitter {
|
export class BaseImporter extends EventEmitter {
|
||||||
protected _options;
|
protected _options;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import * as mysql from 'mysql2';
|
|
||||||
import * as importer from 'common/interfaces/importer';
|
import * as importer from 'common/interfaces/importer';
|
||||||
import * as fs from 'fs/promises';
|
import * as fs from 'fs/promises';
|
||||||
|
import * as mysql from 'mysql2';
|
||||||
|
|
||||||
import MySQLParser from '../../parsers/MySQLParser';
|
import MySQLParser from '../../parsers/MySQLParser';
|
||||||
import { BaseImporter } from '../BaseImporter';
|
import { BaseImporter } from '../BaseImporter';
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import * as pg from 'pg';
|
|
||||||
import * as importer from 'common/interfaces/importer';
|
import * as importer from 'common/interfaces/importer';
|
||||||
import * as fs from 'fs/promises';
|
import * as fs from 'fs/promises';
|
||||||
|
import * as pg from 'pg';
|
||||||
|
|
||||||
import PostgreSQLParser from '../../parsers/PostgreSQLParser';
|
import PostgreSQLParser from '../../parsers/PostgreSQLParser';
|
||||||
import { BaseImporter } from '../BaseImporter';
|
import { BaseImporter } from '../BaseImporter';
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { app, BrowserWindow, nativeImage, ipcMain } from 'electron';
|
import * as remoteMain from '@electron/remote/main';
|
||||||
import * as path from 'path';
|
import { app, BrowserWindow, ipcMain, nativeImage } from 'electron';
|
||||||
import * as Store from 'electron-store';
|
import * as Store from 'electron-store';
|
||||||
import * as windowStateKeeper from 'electron-window-state';
|
import * as windowStateKeeper from 'electron-window-state';
|
||||||
import * as remoteMain from '@electron/remote/main';
|
import * as path from 'path';
|
||||||
|
|
||||||
import ipcHandlers from './ipc-handlers';
|
import ipcHandlers from './ipc-handlers';
|
||||||
import { OsMenu, ShortcutRegister } from './libs/ShortcutRegister';
|
import { OsMenu, ShortcutRegister } from './libs/ShortcutRegister';
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import * as antares from 'common/interfaces/antares';
|
import * as antares from 'common/interfaces/antares';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
|
|
||||||
import { MySQLClient } from '../libs/clients/MySQLClient';
|
import { MySQLClient } from '../libs/clients/MySQLClient';
|
||||||
import { PostgreSQLClient } from '../libs/clients/PostgreSQLClient';
|
import { PostgreSQLClient } from '../libs/clients/PostgreSQLClient';
|
||||||
import { ClientsFactory } from '../libs/ClientsFactory';
|
import { ClientsFactory } from '../libs/ClientsFactory';
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
import * as antares from 'common/interfaces/antares';
|
import * as antares from 'common/interfaces/antares';
|
||||||
import * as pg from 'pg';
|
import { ImportOptions } from 'common/interfaces/importer';
|
||||||
import * as mysql from 'mysql2';
|
import * as mysql from 'mysql2';
|
||||||
|
import * as pg from 'pg';
|
||||||
|
import SSHConfig from 'ssh2-promise/lib/sshConfig';
|
||||||
|
|
||||||
import { MySQLClient } from '../libs/clients/MySQLClient';
|
import { MySQLClient } from '../libs/clients/MySQLClient';
|
||||||
import { PostgreSQLClient } from '../libs/clients/PostgreSQLClient';
|
import { PostgreSQLClient } from '../libs/clients/PostgreSQLClient';
|
||||||
import { ClientsFactory } from '../libs/ClientsFactory';
|
import { ClientsFactory } from '../libs/ClientsFactory';
|
||||||
import MySQLImporter from '../libs/importers/sql/MySQLlImporter';
|
import MySQLImporter from '../libs/importers/sql/MySQLlImporter';
|
||||||
import PostgreSQLImporter from '../libs/importers/sql/PostgreSQLImporter';
|
import PostgreSQLImporter from '../libs/importers/sql/PostgreSQLImporter';
|
||||||
import SSHConfig from 'ssh2-promise/lib/sshConfig';
|
|
||||||
import { ImportOptions } from 'common/interfaces/importer';
|
|
||||||
let importer: antares.Importer;
|
let importer: antares.Importer;
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
|
|
@ -21,21 +21,32 @@
|
||||||
<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>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { defineAsyncComponent, onMounted, Ref, ref } from 'vue';
|
import { getCurrentWindow, Menu } from '@electron/remote';
|
||||||
import { storeToRefs } from 'pinia';
|
|
||||||
import { ipcRenderer } from 'electron';
|
import { ipcRenderer } from 'electron';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { defineAsyncComponent, onMounted, Ref, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { Menu, getCurrentWindow } from '@electron/remote';
|
|
||||||
|
import ModalExportSchema from '@/components/ModalExportSchema.vue';
|
||||||
|
import TheSettingBar from '@/components/TheSettingBar.vue';
|
||||||
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';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
@ -65,6 +76,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', () => {
|
||||||
|
|
|
@ -47,10 +47,11 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
|
||||||
import { computed, onBeforeUnmount, PropType, useSlots } from 'vue';
|
import { computed, onBeforeUnmount, PropType, useSlots } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
|
|
@ -3,15 +3,15 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { onMounted, PropType, Ref, ref } from 'vue';
|
|
||||||
import * as L from 'leaflet';
|
|
||||||
import {
|
import {
|
||||||
point,
|
|
||||||
lineString,
|
lineString,
|
||||||
|
point,
|
||||||
polygon
|
polygon
|
||||||
} from '@turf/helpers';
|
} from '@turf/helpers';
|
||||||
import { GeoJsonObject } from 'geojson';
|
|
||||||
import { getArrayDepth } from 'common/libs/getArrayDepth';
|
import { getArrayDepth } from 'common/libs/getArrayDepth';
|
||||||
|
import { GeoJsonObject } from 'geojson';
|
||||||
|
import * as L from 'leaflet';
|
||||||
|
import { onMounted, PropType, Ref, ref } from 'vue';
|
||||||
|
|
||||||
interface Coordinates { x: number; y: number }
|
interface Coordinates { x: number; y: number }
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { defineComponent, computed, ref, watch, nextTick, onMounted, onUnmounted } from 'vue';
|
import { computed, defineComponent, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'BaseSelect',
|
name: 'BaseSelect',
|
||||||
|
|
|
@ -10,12 +10,16 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { onMounted, watch } from 'vue';
|
/* eslint-disable simple-import-sort/imports */
|
||||||
import * as ace from 'ace-builds';
|
import * as ace from 'ace-builds';
|
||||||
import 'ace-builds/webpack-resolver';
|
import 'ace-builds/webpack-resolver';
|
||||||
import { storeToRefs } from 'pinia';
|
/* eslint-enable simple-import-sort/imports */
|
||||||
import { useSettingsStore } from '@/stores/settings';
|
|
||||||
import { uidGen } from 'common/libs/uidGen';
|
import { uidGen } from 'common/libs/uidGen';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { onMounted, watch } from 'vue';
|
||||||
|
|
||||||
|
import { useSettingsStore } from '@/stores/settings';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: String,
|
modelValue: String,
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
:id="`id_${id}`"
|
:id="`id_${id}`"
|
||||||
class="file-uploader-input"
|
class="file-uploader-input"
|
||||||
type="file"
|
type="file"
|
||||||
|
:accept="accept"
|
||||||
@change="$emit('change', $event)"
|
@change="$emit('change', $event)"
|
||||||
>
|
>
|
||||||
</form>
|
</form>
|
||||||
|
@ -24,6 +25,7 @@
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { uidGen } from 'common/libs/uidGen';
|
import { uidGen } from 'common/libs/uidGen';
|
||||||
|
|
||||||
import { useFilters } from '@/composables/useFilters';
|
import { useFilters } from '@/composables/useFilters';
|
||||||
|
|
||||||
const { lastPart } = useFilters();
|
const { lastPart } = useFilters();
|
||||||
|
@ -33,6 +35,10 @@ defineProps({
|
||||||
default: 'Browse',
|
default: 'Browse',
|
||||||
type: String
|
type: String
|
||||||
},
|
},
|
||||||
|
accept: {
|
||||||
|
default: '',
|
||||||
|
type: String
|
||||||
|
},
|
||||||
modelValue: {
|
modelValue: {
|
||||||
default: '',
|
default: '',
|
||||||
type: String
|
type: String
|
||||||
|
|
|
@ -86,13 +86,14 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import FakerMethods from 'common/FakerMethods';
|
||||||
|
import { BIT, BLOB, DATE, DATETIME, FLOAT, IS_BIGINT, LONG_TEXT, NUMBER, TEXT, TIME, UUID } from 'common/fieldTypes';
|
||||||
import { computed, PropType, Ref, ref, watch } from 'vue';
|
import { computed, PropType, Ref, ref, watch } from 'vue';
|
||||||
import { TEXT, LONG_TEXT, NUMBER, FLOAT, DATE, TIME, DATETIME, BLOB, BIT, UUID, IS_BIGINT } from 'common/fieldTypes';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
import BaseUploadInput from '@/components/BaseUploadInput.vue';
|
import BaseUploadInput from '@/components/BaseUploadInput.vue';
|
||||||
import ForeignKeySelect from '@/components/ForeignKeySelect.vue';
|
import ForeignKeySelect from '@/components/ForeignKeySelect.vue';
|
||||||
import FakerMethods from 'common/FakerMethods';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -13,15 +13,16 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, Ref, ref, watch } from 'vue';
|
import { LONG_TEXT, TEXT } from 'common/fieldTypes';
|
||||||
|
import { TableField } from 'common/interfaces/antares';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, Ref, ref, watch } from 'vue';
|
||||||
|
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import { useFilters } from '@/composables/useFilters';
|
||||||
import Tables from '@/ipc-api/Tables';
|
import Tables from '@/ipc-api/Tables';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import { TEXT, LONG_TEXT } from 'common/fieldTypes';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { TableField } from 'common/interfaces/antares';
|
|
||||||
import { useFilters } from '@/composables/useFilters';
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
modelValue: [String, Number],
|
modelValue: [String, Number],
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, PropType, Ref, ref, watch } from 'vue';
|
import { computed, PropType, Ref, ref, watch } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import Application from '@/ipc-api/Application';
|
import Application from '@/ipc-api/Application';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
|
@ -143,14 +143,15 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
import { ConnectionParams } from 'common/interfaces/antares';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
import { useConnectionsStore } from '@/stores/connections';
|
import { useConnectionsStore } from '@/stores/connections';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
|
||||||
import { ConnectionParams } from 'common/interfaces/antares';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -57,9 +57,10 @@
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Ref, ref } from 'vue';
|
import { Ref, ref } from 'vue';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const { trapRef } = useFocusTrap();
|
const { trapRef } = useFocusTrap();
|
||||||
|
|
|
@ -48,12 +48,13 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, PropType, Ref, ref } from 'vue';
|
import { FLOAT, NUMBER } from 'common/fieldTypes';
|
||||||
import { NUMBER, FLOAT } from 'common/fieldTypes';
|
|
||||||
import { FunctionInfos, RoutineInfos } from 'common/interfaces/antares';
|
import { FunctionInfos, RoutineInfos } from 'common/interfaces/antares';
|
||||||
|
import { computed, PropType, Ref, ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
import { useFilters } from '@/composables/useFilters';
|
import { useFilters } from '@/composables/useFilters';
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -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('connection.editConnectionAppearance') }}</span>
|
<span class="cut-text">{{ t('application.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" />
|
||||||
|
@ -62,10 +62,11 @@
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { onBeforeUnmount, PropType, Ref, ref } from 'vue';
|
import { onBeforeUnmount, PropType, Ref, ref } from 'vue';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
|
||||||
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
import { unproxify } from '@/libs/unproxify';
|
import { unproxify } from '@/libs/unproxify';
|
||||||
|
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
||||||
|
|
||||||
const connectionsStore = useConnectionsStore();
|
const connectionsStore = useConnectionsStore();
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,11 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
|
||||||
import { onBeforeUnmount } from 'vue';
|
import { onBeforeUnmount } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const emit = defineEmits(['confirm', 'close']);
|
const emit = defineEmits(['confirm', 'close']);
|
||||||
|
|
|
@ -64,14 +64,15 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
import Schema from '@/ipc-api/Schema';
|
import Schema from '@/ipc-api/Schema';
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
type="text"
|
type="text"
|
||||||
required
|
required
|
||||||
readonly
|
readonly
|
||||||
:placeholder="t('database.schemaName')"
|
@click.prevent="openPathDialog"
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
|
@ -42,10 +42,16 @@
|
||||||
|
|
||||||
<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 ">
|
||||||
|
@ -54,7 +60,7 @@
|
||||||
:title="t('general.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"
|
||||||
|
@ -62,7 +68,7 @@
|
||||||
: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"
|
||||||
|
@ -70,7 +76,7 @@
|
||||||
: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>
|
||||||
|
@ -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 }}
|
||||||
|
@ -244,7 +251,7 @@
|
||||||
</div>
|
</div>
|
||||||
</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 mr-2" @click.stop="closeModal">
|
||||||
{{ t('general.close') }}
|
{{ t('general.close') }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
|
@ -264,30 +271,29 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
|
||||||
import * as moment from 'moment';
|
|
||||||
import { ipcRenderer } from 'electron';
|
|
||||||
import { storeToRefs } from 'pinia';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import { ClientCode, SchemaInfos } from 'common/interfaces/antares';
|
import { ClientCode, SchemaInfos } from 'common/interfaces/antares';
|
||||||
|
import { Customizations } from 'common/interfaces/customizations';
|
||||||
import { ExportOptions, ExportState } from 'common/interfaces/exporter';
|
import { ExportOptions, ExportState } from 'common/interfaces/exporter';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { ipcRenderer } from 'electron';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import * as moment from 'moment';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
import Application from '@/ipc-api/Application';
|
import Application from '@/ipc-api/Application';
|
||||||
import Schema from '@/ipc-api/Schema';
|
import Schema from '@/ipc-api/Schema';
|
||||||
import { Customizations } from 'common/interfaces/customizations';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
import { useSchemaExportStore } from '@/stores/schemaExport';
|
||||||
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
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 +304,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,18 +317,19 @@ 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');
|
||||||
|
|
||||||
|
@ -328,9 +337,9 @@ const schemaItems = computed(() => {
|
||||||
});
|
});
|
||||||
const filename = computed(() => {
|
const filename = computed(() => {
|
||||||
const date = moment().format('YYYY-MM-DD_HH-mm-ss');
|
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 +362,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
|
||||||
|
@ -431,7 +440,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 +455,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 +487,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);
|
||||||
|
|
|
@ -98,19 +98,20 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onBeforeMount, onMounted, Prop, Ref, ref, watch } from 'vue';
|
import { BIT, BLOB, DATE, DATETIME, FLOAT, LONG_TEXT, NUMBER, TEXT, TIME } from 'common/fieldTypes';
|
||||||
import * as moment from 'moment';
|
|
||||||
import { TableField, TableForeign } from 'common/interfaces/antares';
|
import { TableField, TableForeign } from 'common/interfaces/antares';
|
||||||
|
import * as moment from 'moment';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { TEXT, LONG_TEXT, NUMBER, FLOAT, DATE, TIME, DATETIME, BLOB, BIT } from 'common/fieldTypes';
|
import { computed, onBeforeMount, onMounted, Prop, Ref, ref, watch } from 'vue';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import FakerSelect from '@/components/FakerSelect.vue';
|
||||||
|
import { useFilters } from '@/composables/useFilters';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
import Tables from '@/ipc-api/Tables';
|
import Tables from '@/ipc-api/Tables';
|
||||||
import FakerSelect from '@/components/FakerSelect.vue';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import { useFilters } from '@/composables/useFilters';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -65,10 +65,11 @@
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { onBeforeUnmount, PropType, Ref, ref } from 'vue';
|
import { onBeforeUnmount, PropType, Ref, ref } from 'vue';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
|
||||||
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
import { unproxify } from '@/libs/unproxify';
|
import { unproxify } from '@/libs/unproxify';
|
||||||
|
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
||||||
|
|
||||||
const connectionsStore = useConnectionsStore();
|
const connectionsStore = useConnectionsStore();
|
||||||
|
|
||||||
|
|
|
@ -98,14 +98,15 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { ConnectionParams } from 'common/interfaces/antares';
|
||||||
import { Component, computed, ComputedRef, onBeforeUnmount, onMounted, onUpdated, Prop, Ref, ref, watch } from 'vue';
|
import { Component, computed, ComputedRef, onBeforeUnmount, onMounted, onUpdated, Prop, Ref, ref, watch } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { ConnectionParams } from 'common/interfaces/antares';
|
|
||||||
import { HistoryRecord, useHistoryStore } from '@/stores/history';
|
|
||||||
import { useConnectionsStore } from '@/stores/connections';
|
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
|
||||||
import { useFilters } from '@/composables/useFilters';
|
|
||||||
import BaseVirtualScroll from '@/components/BaseVirtualScroll.vue';
|
import BaseVirtualScroll from '@/components/BaseVirtualScroll.vue';
|
||||||
|
import { useFilters } from '@/composables/useFilters';
|
||||||
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
|
import { useConnectionsStore } from '@/stores/connections';
|
||||||
|
import { HistoryRecord, useHistoryStore } from '@/stores/history';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const { formatDate } = useFilters();
|
const { formatDate } = useFilters();
|
||||||
|
|
|
@ -50,15 +50,16 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
import { ImportState } from 'common/interfaces/importer';
|
||||||
import { ipcRenderer } from 'electron';
|
import { ipcRenderer } from 'electron';
|
||||||
import * as moment from 'moment';
|
import * as moment from 'moment';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import Schema from '@/ipc-api/Schema';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import Schema from '@/ipc-api/Schema';
|
|
||||||
import { ImportState } from 'common/interfaces/importer';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -67,14 +67,15 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
import Schema from '@/ipc-api/Schema';
|
import Schema from '@/ipc-api/Schema';
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -134,18 +134,20 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Component, computed, onBeforeUnmount, onMounted, onUpdated, Prop, Ref, ref } from 'vue';
|
|
||||||
import { ipcRenderer } from 'electron';
|
|
||||||
import { ConnectionParams } from 'common/interfaces/antares';
|
import { ConnectionParams } from 'common/interfaces/antares';
|
||||||
import { exportRows } from '../libs/exportRows';
|
import { ipcRenderer } from 'electron';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { Component, computed, onBeforeUnmount, onMounted, onUpdated, Prop, Ref, ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseVirtualScroll from '@/components/BaseVirtualScroll.vue';
|
||||||
|
import ModalProcessesListContext from '@/components/ModalProcessesListContext.vue';
|
||||||
|
import ModalProcessesListRow from '@/components/ModalProcessesListRow.vue';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
import Schema from '@/ipc-api/Schema';
|
import Schema from '@/ipc-api/Schema';
|
||||||
import { useConnectionsStore } from '@/stores/connections';
|
import { useConnectionsStore } from '@/stores/connections';
|
||||||
import BaseVirtualScroll from '@/components/BaseVirtualScroll.vue';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import ModalProcessesListRow from '@/components/ModalProcessesListRow.vue';
|
|
||||||
import ModalProcessesListContext from '@/components/ModalProcessesListContext.vue';
|
import { exportRows } from '../libs/exportRows';
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -40,9 +40,10 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
|
|
@ -46,10 +46,11 @@
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Ref, ref } from 'vue';
|
import { Ref, ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
import TextEditor from '@/components/BaseTextEditor.vue';
|
import TextEditor from '@/components/BaseTextEditor.vue';
|
||||||
import { useFilters } from '@/composables/useFilters';
|
import { useFilters } from '@/composables/useFilters';
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,13 @@
|
||||||
>
|
>
|
||||||
<a class="tab-link">{{ t('application.shortcuts') }}</a>
|
<a class="tab-link">{{ t('application.shortcuts') }}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li
|
||||||
|
class="tab-item c-hand"
|
||||||
|
:class="{'active': selectedTab === 'data'}"
|
||||||
|
@click="selectTab('data')"
|
||||||
|
>
|
||||||
|
<a class="tab-link">{{ t('application.data') }}</a>
|
||||||
|
</li>
|
||||||
<li
|
<li
|
||||||
v-if="updateStatus !== 'disabled'"
|
v-if="updateStatus !== 'disabled'"
|
||||||
class="tab-item c-hand"
|
class="tab-item c-hand"
|
||||||
|
@ -366,6 +373,9 @@
|
||||||
<div v-show="selectedTab === 'shortcuts'" class="panel-body py-4">
|
<div v-show="selectedTab === 'shortcuts'" class="panel-body py-4">
|
||||||
<ModalSettingsShortcuts />
|
<ModalSettingsShortcuts />
|
||||||
</div>
|
</div>
|
||||||
|
<div v-show="selectedTab === 'data'" class="panel-body py-4">
|
||||||
|
<ModalSettingsData />
|
||||||
|
</div>
|
||||||
<div v-show="selectedTab === 'update'" class="panel-body py-4">
|
<div v-show="selectedTab === 'update'" class="panel-body py-4">
|
||||||
<ModalSettingsUpdate />
|
<ModalSettingsUpdate />
|
||||||
</div>
|
</div>
|
||||||
|
@ -379,7 +389,7 @@
|
||||||
<h4>{{ appName }}</h4>
|
<h4>{{ appName }}</h4>
|
||||||
<p class="mb-2">
|
<p class="mb-2">
|
||||||
{{ t('general.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://fosstodon.org/@AntaresSQL')"><i class="mdi mdi-mastodon d-inline" /> Mastodon</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('general.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">
|
||||||
|
@ -399,21 +409,23 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { onBeforeUnmount, Ref, ref, computed } from 'vue';
|
|
||||||
import { shell } from 'electron';
|
import { shell } from 'electron';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import BaseTextEditor from '@/components/BaseTextEditor.vue';
|
||||||
|
import ModalSettingsChangelog from '@/components/ModalSettingsChangelog.vue';
|
||||||
|
import ModalSettingsData from '@/components/ModalSettingsData.vue';
|
||||||
|
import ModalSettingsShortcuts from '@/components/ModalSettingsShortcuts.vue';
|
||||||
|
import ModalSettingsUpdate from '@/components/ModalSettingsUpdate.vue';
|
||||||
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
|
import { AvailableLocale } from '@/i18n';
|
||||||
|
import { localesNames } from '@/i18n/supported-locales';
|
||||||
import { useApplicationStore } from '@/stores/application';
|
import { useApplicationStore } from '@/stores/application';
|
||||||
import { useSettingsStore } from '@/stores/settings';
|
import { useSettingsStore } from '@/stores/settings';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
|
||||||
import { localesNames } from '@/i18n/supported-locales';
|
|
||||||
import ModalSettingsUpdate from '@/components/ModalSettingsUpdate.vue';
|
|
||||||
import ModalSettingsChangelog from '@/components/ModalSettingsChangelog.vue';
|
|
||||||
import ModalSettingsShortcuts from '@/components/ModalSettingsShortcuts.vue';
|
|
||||||
import BaseTextEditor from '@/components/BaseTextEditor.vue';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { AvailableLocale } from '@/i18n';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
@ -648,10 +660,14 @@ onBeforeUnmount(() => {
|
||||||
.modal-body {
|
.modal-body {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
.tab-link {
|
.tab-item {
|
||||||
overflow: hidden;
|
max-width: 20%;
|
||||||
white-space: nowrap;
|
|
||||||
text-overflow: ellipsis;
|
.tab-link {
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.panel-body {
|
.panel-body {
|
||||||
|
|
|
@ -14,10 +14,12 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { shell } from 'electron';
|
||||||
import { marked } from 'marked';
|
import { marked } from 'marked';
|
||||||
|
import { ref } from 'vue';
|
||||||
|
|
||||||
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';
|
|
||||||
|
|
||||||
const { appVersion } = useApplicationStore();
|
const { appVersion } = useApplicationStore();
|
||||||
|
|
||||||
|
@ -26,6 +28,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 +46,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 +63,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();
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
<template>
|
||||||
|
<div class="container">
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column col-12 h6 text-uppercase mb-2">
|
||||||
|
{{ t('application.exportData') }}
|
||||||
|
</div>
|
||||||
|
<div class="column col-12">
|
||||||
|
{{ t('application.exportDataExplanation') }}
|
||||||
|
</div>
|
||||||
|
<div class="column col-12 text-right">
|
||||||
|
<button
|
||||||
|
class="btn btn-primary d-inline-flex"
|
||||||
|
@click="isExportModal=true"
|
||||||
|
>
|
||||||
|
<i class="mdi mdi-tray-arrow-up mdi-24px pr-2" />
|
||||||
|
<span>{{ t('application.exportData') }}</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="columns mt-4 mb-2">
|
||||||
|
<div class="column col-12 h6 text-uppercase mb-2 mt-4">
|
||||||
|
{{ t('application.importData') }}
|
||||||
|
</div>
|
||||||
|
<div class="column col-12">
|
||||||
|
{{ t('application.importDataExplanation') }}
|
||||||
|
</div>
|
||||||
|
<div class="column col-12 text-right">
|
||||||
|
<button
|
||||||
|
class="btn btn-dark d-inline-flex ml-auto"
|
||||||
|
@click="isImportModal=true"
|
||||||
|
>
|
||||||
|
<i class="mdi mdi-tray-arrow-down mdi-24px pr-2" />
|
||||||
|
<span>{{ t('application.importData') }}</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ModalSettingsDataExport
|
||||||
|
v-if="isExportModal"
|
||||||
|
@close="isExportModal = false"
|
||||||
|
/>
|
||||||
|
<ModalSettingsDataImport
|
||||||
|
v-if="isImportModal"
|
||||||
|
@close="isImportModal = false"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
// import { useApplicationStore } from '@/stores/application';
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import ModalSettingsDataExport from '@/components/ModalSettingsDataExport.vue';
|
||||||
|
import ModalSettingsDataImport from '@/components/ModalSettingsDataImport.vue';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
const isExportModal = ref(false);
|
||||||
|
const isImportModal = ref(false);
|
||||||
|
|
||||||
|
</script>
|
|
@ -0,0 +1,332 @@
|
||||||
|
<template>
|
||||||
|
<Teleport to="#window-content">
|
||||||
|
<div class="modal active">
|
||||||
|
<a class="modal-overlay" @click.stop="closeModal" />
|
||||||
|
<div ref="trapRef" class="modal-container p-0">
|
||||||
|
<div class="modal-header pl-2">
|
||||||
|
<div class="modal-title h6">
|
||||||
|
<div class="d-flex">
|
||||||
|
<i class="mdi mdi-24px mdi-tray-arrow-up mr-1" /> {{ t('application.exportData') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
|
||||||
|
</div>
|
||||||
|
<div class="modal-body pb-0">
|
||||||
|
<div class="columns export-options">
|
||||||
|
<div class="column col-8 left">
|
||||||
|
<div class="workspace-query-results" :style="'min-height: 300px;'">
|
||||||
|
<div ref="table" class="table table-hover">
|
||||||
|
<div class="thead">
|
||||||
|
<div class="tr text-center">
|
||||||
|
<div class="th no-border" :style="'width:50%'" />
|
||||||
|
<div class="th no-border" />
|
||||||
|
<div class="th no-border">
|
||||||
|
<label
|
||||||
|
class="form-checkbox m-0 px-2 form-inline"
|
||||||
|
@click.prevent="toggleAllConnections()"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
:indeterminate="includeConnectionStatus === 2"
|
||||||
|
:checked="!!includeConnectionStatus"
|
||||||
|
>
|
||||||
|
<i class="form-icon" />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tr">
|
||||||
|
<div class="th">
|
||||||
|
<div class="table-column-title">
|
||||||
|
<span>{{ t('connection.connectionName') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="th">
|
||||||
|
<div class="table-column-title">
|
||||||
|
<span>{{ t('connection.client') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="th text-center">
|
||||||
|
<div class="table-column-title">
|
||||||
|
<span>{{ t('general.include') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tbody">
|
||||||
|
<div
|
||||||
|
v-for="(item, i) in connections"
|
||||||
|
:key="i"
|
||||||
|
class="tr"
|
||||||
|
>
|
||||||
|
<div class="td">
|
||||||
|
{{ getConnectionName(item.uid) }}
|
||||||
|
</div>
|
||||||
|
<div class="td">
|
||||||
|
{{ item.client }}
|
||||||
|
</div>
|
||||||
|
<div class="td text-center">
|
||||||
|
<label class="form-checkbox m-0 px-2 form-inline">
|
||||||
|
<input v-model="connectionToggles[item.uid]" type="checkbox">
|
||||||
|
<i class="form-icon" />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="column col-4">
|
||||||
|
<h5 class="h5">
|
||||||
|
{{ t('general.options') }}
|
||||||
|
</h5>
|
||||||
|
<label class="form-checkbox">
|
||||||
|
<input v-model="options.includes.passwords" type="checkbox">
|
||||||
|
<i class="form-icon" />
|
||||||
|
{{ t(`application.includeConnectionPasswords`) }}
|
||||||
|
</label>
|
||||||
|
<label class="form-checkbox">
|
||||||
|
<input v-model="options.includes.folders" type="checkbox">
|
||||||
|
<i class="form-icon" />
|
||||||
|
{{ t(`application.includeFolders`) }}
|
||||||
|
</label>
|
||||||
|
<div class="h6 mt-4 mb-2">
|
||||||
|
{{ t('application.encryptionPassword') }}
|
||||||
|
</div>
|
||||||
|
<fieldset class="form-group" :class="{'has-error': isPasswordError}">
|
||||||
|
<div class="input-group">
|
||||||
|
<input
|
||||||
|
ref="passkey"
|
||||||
|
v-model="options.passkey"
|
||||||
|
:type="isPasswordVisible ? 'text' : 'password'"
|
||||||
|
class="form-input"
|
||||||
|
:placeholder="t('application.required')"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-link input-group-addon"
|
||||||
|
@click="isPasswordVisible = !isPasswordVisible"
|
||||||
|
>
|
||||||
|
<i v-if="isPasswordVisible" class="mdi mdi-eye px-1" />
|
||||||
|
<i v-else class="mdi mdi-eye-off px-1" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<span v-if="isPasswordError" class="form-input-hint">
|
||||||
|
{{ t('application.encryptionPasswordError') }}
|
||||||
|
</span>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button class="btn btn-link mr-2" @click.stop="closeModal">
|
||||||
|
{{ t('general.close') }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
class="btn btn-primary mr-2"
|
||||||
|
autofocus
|
||||||
|
@click.prevent="exportData()"
|
||||||
|
>
|
||||||
|
{{ t('database.export') }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Teleport>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ConnectionParams } from 'common/interfaces/antares';
|
||||||
|
import { encrypt } from 'common/libs/encrypter';
|
||||||
|
import { uidGen } from 'common/libs/uidGen';
|
||||||
|
import * as moment from 'moment';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
|
import { unproxify } from '@/libs/unproxify';
|
||||||
|
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const emit = defineEmits(['close']);
|
||||||
|
|
||||||
|
const { trapRef } = useFocusTrap();
|
||||||
|
|
||||||
|
const { getConnectionName } = useConnectionsStore();
|
||||||
|
const { connectionsOrder, connections } = storeToRefs(useConnectionsStore());
|
||||||
|
const localConnections = unproxify<ConnectionParams[]>(connections.value);
|
||||||
|
const localConnectionsOrder = unproxify<SidebarElement[]>(connectionsOrder.value);
|
||||||
|
|
||||||
|
const isPasswordVisible = ref(false);
|
||||||
|
const isPasswordError = ref(false);
|
||||||
|
const connectionToggles: Ref<{[k:string]: boolean}> = ref({});
|
||||||
|
const options = ref({
|
||||||
|
passkey: '',
|
||||||
|
includes: {
|
||||||
|
passwords: true,
|
||||||
|
folders: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const filename = computed(() => {
|
||||||
|
const date = moment().format('YYYY-MM-DD');
|
||||||
|
return `backup_${date}`;
|
||||||
|
});
|
||||||
|
const includeConnectionStatus = computed(() => {
|
||||||
|
if (Object.values(connectionToggles.value).every(item => item)) return 1;
|
||||||
|
else if (Object.values(connectionToggles.value).some(item => item)) return 2;
|
||||||
|
else return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
const exportData = () => {
|
||||||
|
if (options.value.passkey.length < 8)
|
||||||
|
isPasswordError.value = true;
|
||||||
|
else {
|
||||||
|
isPasswordError.value = false;
|
||||||
|
const connectionsToInclude: string[] = [];
|
||||||
|
const connectionsUidMap = new Map<string, string>();
|
||||||
|
for (const cUid in connectionToggles.value)
|
||||||
|
if (connectionToggles.value[cUid]) connectionsToInclude.push(cUid);
|
||||||
|
|
||||||
|
let filteredConnections = unproxify<typeof localConnections>(localConnections.filter(conn => connectionsToInclude.includes(conn.uid)));
|
||||||
|
filteredConnections = filteredConnections.map(c => {
|
||||||
|
const newUid = uidGen('C');
|
||||||
|
connectionsUidMap.set(c.uid, newUid);
|
||||||
|
c.uid = newUid;
|
||||||
|
return c;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!options.value.includes.passwords) { // Remove passwords and set ask:true
|
||||||
|
filteredConnections.map(c => {
|
||||||
|
if (c.password) {
|
||||||
|
c.password = '';
|
||||||
|
c.ask = true;
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let filteredOrders = [];
|
||||||
|
for (const [oldVal, newVal] of connectionsUidMap) {
|
||||||
|
const connOrder = unproxify(localConnectionsOrder.find(c => c.uid === oldVal));
|
||||||
|
connOrder.uid = newVal;
|
||||||
|
filteredOrders.push(connOrder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.value.includes.folders) { // Includes folders
|
||||||
|
const oldConnUids = Array.from(connectionsUidMap.keys());
|
||||||
|
const newConnUids = Array.from(connectionsUidMap.values());
|
||||||
|
const foldersToInclude = unproxify(localConnectionsOrder).filter(f => (
|
||||||
|
f.isFolder && oldConnUids.some(uid => f.connections.includes(uid))
|
||||||
|
)).map(f => {
|
||||||
|
f.uid = uidGen('F');
|
||||||
|
f.connections = f.connections
|
||||||
|
.map(fc => connectionsUidMap.get(fc))
|
||||||
|
.filter(fc => newConnUids.includes(fc));
|
||||||
|
return f;
|
||||||
|
});
|
||||||
|
|
||||||
|
filteredOrders = [...filteredOrders, ...foldersToInclude];
|
||||||
|
}
|
||||||
|
|
||||||
|
const exportObj = encrypt(JSON.stringify({
|
||||||
|
connections: filteredConnections,
|
||||||
|
connectionsOrder: filteredOrders
|
||||||
|
}), options.value.passkey);
|
||||||
|
|
||||||
|
// console.log(exportObj, JSON.parse(decrypt(exportObj, options.value.passkey)));
|
||||||
|
|
||||||
|
const blobContent = Buffer.from(JSON.stringify(exportObj), 'utf-8').toString('hex');
|
||||||
|
const file = new Blob([blobContent], { type: 'application/octet-stream' });
|
||||||
|
const downloadLink = document.createElement('a');
|
||||||
|
downloadLink.download = `${filename.value}.antares`;
|
||||||
|
downloadLink.href = window.URL.createObjectURL(file);
|
||||||
|
downloadLink.style.display = 'none';
|
||||||
|
document.body.appendChild(downloadLink);
|
||||||
|
downloadLink.click();
|
||||||
|
downloadLink.remove();
|
||||||
|
|
||||||
|
closeModal();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const closeModal = () => {
|
||||||
|
emit('close');
|
||||||
|
};
|
||||||
|
|
||||||
|
const onKey = (e: KeyboardEvent) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
if (e.key === 'Escape')
|
||||||
|
closeModal();
|
||||||
|
};
|
||||||
|
|
||||||
|
const toggleAllConnections = () => {
|
||||||
|
if (includeConnectionStatus.value !== 1) {
|
||||||
|
connectionToggles.value = localConnections.reduce((acc, curr) => {
|
||||||
|
acc[curr.uid] = true;
|
||||||
|
return acc;
|
||||||
|
}, {} as {[k:string]: boolean});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
connectionToggles.value = localConnections.reduce((acc, curr) => {
|
||||||
|
acc[curr.uid] = false;
|
||||||
|
return acc;
|
||||||
|
}, {} as {[k:string]: boolean});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
connectionToggles.value = localConnections.reduce((acc, curr) => {
|
||||||
|
acc[curr.uid] = true;
|
||||||
|
return acc;
|
||||||
|
}, {} as {[k:string]: boolean});
|
||||||
|
|
||||||
|
window.addEventListener('keydown', onKey);
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
window.removeEventListener('keydown', onKey);
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.export-options {
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.left {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-query-results {
|
||||||
|
flex: 1 0 1px;
|
||||||
|
|
||||||
|
.table {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-checkbox {
|
||||||
|
min-height: 0.8rem;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
.form-icon {
|
||||||
|
top: 0.1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal {
|
||||||
|
.modal-container {
|
||||||
|
max-width: 800px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-body {
|
||||||
|
max-height: 60vh;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
|
@ -0,0 +1,264 @@
|
||||||
|
<template>
|
||||||
|
<Teleport to="#window-content">
|
||||||
|
<div class="modal modal-sm active">
|
||||||
|
<a class="modal-overlay" @click.stop="closeModal" />
|
||||||
|
<div ref="trapRef" class="modal-container p-0">
|
||||||
|
<div class="modal-header pl-2">
|
||||||
|
<div class="modal-title h6">
|
||||||
|
<div class="d-flex">
|
||||||
|
<i class="mdi mdi-24px mdi-tray-arrow-down mr-1" /> {{ t('application.importData') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
|
||||||
|
</div>
|
||||||
|
<div class="modal-body pb-0">
|
||||||
|
<div class="mb-2">
|
||||||
|
<div class="h6 mb-2">
|
||||||
|
{{ t('application.choseFile') }}
|
||||||
|
</div>
|
||||||
|
<BaseUploadInput
|
||||||
|
:model-value="filePath"
|
||||||
|
:message="t('general.browse')"
|
||||||
|
accept=".antares"
|
||||||
|
@clear="filePath = ''"
|
||||||
|
@change="filesChange($event)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-2">
|
||||||
|
<div class="h6 mb-2">
|
||||||
|
{{ t('application.password') }}
|
||||||
|
</div>
|
||||||
|
<fieldset class="form-group" :class="{'has-error': isPasswordError}">
|
||||||
|
<div class="input-group">
|
||||||
|
<input
|
||||||
|
ref="passkey"
|
||||||
|
v-model="options.passkey"
|
||||||
|
:type="isPasswordVisible ? 'text' : 'password'"
|
||||||
|
class="form-input"
|
||||||
|
:placeholder="t('application.required')"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-link input-group-addon"
|
||||||
|
@click="isPasswordVisible = !isPasswordVisible"
|
||||||
|
>
|
||||||
|
<i v-if="isPasswordVisible" class="mdi mdi-eye px-1" />
|
||||||
|
<i v-else class="mdi mdi-eye-off px-1" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<span v-if="isPasswordError" class="form-input-hint">
|
||||||
|
{{ t('application.encryptionPasswordError') }}
|
||||||
|
</span>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
<div class="mb-2">
|
||||||
|
<label class="form-checkbox">
|
||||||
|
<input v-model="options.ignoreDuplicates" type="checkbox">
|
||||||
|
<i class="form-icon" />
|
||||||
|
{{ t(`application.ignoreDuplicates`) }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button
|
||||||
|
class="btn btn-link mr-2"
|
||||||
|
@click.stop="closeModal"
|
||||||
|
>
|
||||||
|
{{ t('general.close') }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
class="btn btn-primary mr-2"
|
||||||
|
:disabled="!filePath"
|
||||||
|
@click.prevent="importData()"
|
||||||
|
>
|
||||||
|
{{ t('database.import') }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Teleport>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ConnectionParams } from 'common/interfaces/antares';
|
||||||
|
import { decrypt } from 'common/libs/encrypter';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { onBeforeUnmount, ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseUploadInput from '@/components/BaseUploadInput.vue';
|
||||||
|
import { unproxify } from '@/libs/unproxify';
|
||||||
|
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
||||||
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const emit = defineEmits(['close']);
|
||||||
|
|
||||||
|
const { addNotification } = useNotificationsStore();
|
||||||
|
|
||||||
|
const connectionsStore = useConnectionsStore();
|
||||||
|
const { importConnections } = connectionsStore;
|
||||||
|
const { connections } = storeToRefs(connectionsStore);
|
||||||
|
|
||||||
|
const filePath = ref('');
|
||||||
|
const fileContent = ref(null);
|
||||||
|
const isPasswordVisible = ref(false);
|
||||||
|
const isPasswordError = ref(false);
|
||||||
|
const options = ref({
|
||||||
|
passkey: '',
|
||||||
|
ignoreDuplicates: true
|
||||||
|
});
|
||||||
|
|
||||||
|
const closeModal = () => {
|
||||||
|
emit('close');
|
||||||
|
};
|
||||||
|
|
||||||
|
const filesChange = ({ target } : {target: HTMLInputElement }) => {
|
||||||
|
const { files } = target;
|
||||||
|
if (!files.length) return;
|
||||||
|
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.readAsText(files[0]);
|
||||||
|
reader.onload = () => {
|
||||||
|
fileContent.value = reader.result;
|
||||||
|
filePath.value = files[0].path;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const importData = () => {
|
||||||
|
if (options.value.passkey.length < 8)
|
||||||
|
isPasswordError.value = true;
|
||||||
|
else {
|
||||||
|
try {
|
||||||
|
const hash = JSON.parse(Buffer.from(fileContent.value, 'hex').toString('utf-8'));
|
||||||
|
|
||||||
|
try {
|
||||||
|
const importObj: {
|
||||||
|
connections: ConnectionParams[];
|
||||||
|
connectionsOrder: SidebarElement[];
|
||||||
|
} = JSON.parse(decrypt(hash, options.value.passkey));
|
||||||
|
|
||||||
|
if (options.value.ignoreDuplicates) {
|
||||||
|
const actualConnections = unproxify(connections.value).map(c => {
|
||||||
|
delete c.uid;
|
||||||
|
|
||||||
|
delete c.name;
|
||||||
|
delete c.password;
|
||||||
|
delete c.ask;
|
||||||
|
|
||||||
|
delete c.key;
|
||||||
|
delete c.cert;
|
||||||
|
delete c.ca;
|
||||||
|
|
||||||
|
delete c.sshKey;
|
||||||
|
|
||||||
|
return JSON.stringify(c);
|
||||||
|
});
|
||||||
|
|
||||||
|
const incomingConnections = unproxify<ConnectionParams[]>(importObj.connections).map(c => {
|
||||||
|
const uid = c.uid;
|
||||||
|
delete c.uid;
|
||||||
|
|
||||||
|
delete c.name;
|
||||||
|
delete c.password;
|
||||||
|
delete c.ask;
|
||||||
|
|
||||||
|
delete c.key;
|
||||||
|
delete c.cert;
|
||||||
|
delete c.ca;
|
||||||
|
|
||||||
|
delete c.sshKey;
|
||||||
|
|
||||||
|
return { uid, jsonString: JSON.stringify(c) };
|
||||||
|
});
|
||||||
|
|
||||||
|
const newConnectionsUid = incomingConnections
|
||||||
|
.filter(c => !actualConnections.includes(c.jsonString))
|
||||||
|
.reduce((acc, cur) => {
|
||||||
|
acc.push(cur.uid);
|
||||||
|
return acc;
|
||||||
|
}, [] as string[]);
|
||||||
|
|
||||||
|
importObj.connections = importObj.connections.filter(c => newConnectionsUid.includes(c.uid));
|
||||||
|
importObj.connectionsOrder = importObj.connectionsOrder
|
||||||
|
.filter(c => newConnectionsUid
|
||||||
|
.includes(c.uid) ||
|
||||||
|
(c.isFolder && c.connections.every(c => newConnectionsUid.includes(c))));
|
||||||
|
}
|
||||||
|
|
||||||
|
importConnections(importObj);
|
||||||
|
|
||||||
|
addNotification({
|
||||||
|
status: 'success',
|
||||||
|
message: t('application.dataImportSuccess')
|
||||||
|
});
|
||||||
|
closeModal();
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
addNotification({
|
||||||
|
status: 'error',
|
||||||
|
message: t('application.wrongImportPassword')
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
addNotification({
|
||||||
|
status: 'error',
|
||||||
|
message: t('application.wrongFileFormat')
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const onKey = (e: KeyboardEvent) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
if (e.key === 'Escape')
|
||||||
|
closeModal();
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener('keydown', onKey);
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
window.removeEventListener('keydown', onKey);
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.export-options {
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.left {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-query-results {
|
||||||
|
flex: 1 0 1px;
|
||||||
|
|
||||||
|
.table {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-checkbox {
|
||||||
|
min-height: 0.8rem;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
.form-icon {
|
||||||
|
top: 0.1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal {
|
||||||
|
.modal-body {
|
||||||
|
max-height: 60vh;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
|
@ -162,17 +162,19 @@
|
||||||
</Teleport>
|
</Teleport>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Ref, ref, watch } from 'vue';
|
import { computed } from '@vue/reactivity';
|
||||||
import { storeToRefs } from 'pinia';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import { useSettingsStore } from '@/stores/settings';
|
|
||||||
import KeyPressDetector from './KeyPressDetector.vue';
|
|
||||||
import Application from '@/ipc-api/Application';
|
|
||||||
import { shortcutEvents, ShortcutRecord } from 'common/shortcuts';
|
import { shortcutEvents, ShortcutRecord } from 'common/shortcuts';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { Ref, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
import { computed } from '@vue/reactivity';
|
|
||||||
import { useFilters } from '@/composables/useFilters';
|
import { useFilters } from '@/composables/useFilters';
|
||||||
|
import Application from '@/ipc-api/Application';
|
||||||
|
import { useSettingsStore } from '@/stores/settings';
|
||||||
|
|
||||||
|
import KeyPressDetector from './KeyPressDetector.vue';
|
||||||
|
|
||||||
const { parseKeys } = useFilters();
|
const { parseKeys } = useFilters();
|
||||||
|
|
||||||
|
|
|
@ -53,10 +53,11 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed } from 'vue';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import { ipcRenderer, shell } from 'electron';
|
import { ipcRenderer, shell } from 'electron';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import { useApplicationStore } from '@/stores/application';
|
import { useApplicationStore } from '@/stores/application';
|
||||||
import { useSettingsStore } from '@/stores/settings';
|
import { useSettingsStore } from '@/stores/settings';
|
||||||
|
|
||||||
|
|
|
@ -9,16 +9,20 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onMounted, Prop, Ref, ref, toRef, watch } from 'vue';
|
/* eslint-disable simple-import-sort/imports */
|
||||||
import * as ace from 'ace-builds';
|
import * as ace from 'ace-builds';
|
||||||
import 'ace-builds/webpack-resolver';
|
|
||||||
import '../libs/ext-language_tools';
|
import '../libs/ext-language_tools';
|
||||||
import { storeToRefs } from 'pinia';
|
import 'ace-builds/webpack-resolver';
|
||||||
|
/* eslint-enable simple-import-sort/imports */
|
||||||
|
|
||||||
import { uidGen } from 'common/libs/uidGen';
|
import { uidGen } from 'common/libs/uidGen';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, onMounted, Prop, Ref, ref, toRef, watch } from 'vue';
|
||||||
|
|
||||||
|
import Tables from '@/ipc-api/Tables';
|
||||||
import { useApplicationStore } from '@/stores/application';
|
import { useApplicationStore } from '@/stores/application';
|
||||||
import { useSettingsStore } from '@/stores/settings';
|
import { useSettingsStore } from '@/stores/settings';
|
||||||
import { Workspace } from '@/stores/workspaces';
|
import { Workspace } from '@/stores/workspaces';
|
||||||
import Tables from '@/ipc-api/Tables';
|
|
||||||
|
|
||||||
const editor: Ref<ace.Ace.Editor> = ref(null);
|
const editor: Ref<ace.Ace.Editor> = ref(null);
|
||||||
const applicationStore = useApplicationStore();
|
const applicationStore = useApplicationStore();
|
||||||
|
|
|
@ -71,12 +71,13 @@
|
||||||
</Draggable>
|
</Draggable>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, PropType, Ref, ref, watch } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, PropType, Ref, ref, watch } from 'vue';
|
||||||
import * as Draggable from 'vuedraggable';
|
import * as Draggable from 'vuedraggable';
|
||||||
|
|
||||||
|
import SettingBarConnectionsFolder from '@/components/SettingBarConnectionsFolder.vue';
|
||||||
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import SettingBarConnectionsFolder from '@/components/SettingBarConnectionsFolder.vue';
|
|
||||||
|
|
||||||
const workspacesStore = useWorkspacesStore();
|
const workspacesStore = useWorkspacesStore();
|
||||||
const connectionsStore = useConnectionsStore();
|
const connectionsStore = useConnectionsStore();
|
||||||
|
|
|
@ -76,12 +76,13 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, PropType, ref, watch } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, PropType, ref, watch } from 'vue';
|
||||||
import * as Draggable from 'vuedraggable';
|
import * as Draggable from 'vuedraggable';
|
||||||
|
|
||||||
|
import SettingBarConnections from '@/components/SettingBarConnections.vue';
|
||||||
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import SettingBarConnections from '@/components/SettingBarConnections.vue';
|
|
||||||
|
|
||||||
const workspacesStore = useWorkspacesStore();
|
const workspacesStore = useWorkspacesStore();
|
||||||
const connectionsStore = useConnectionsStore();
|
const connectionsStore = useConnectionsStore();
|
||||||
|
|
|
@ -54,16 +54,17 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, Prop, ref } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
|
||||||
import { uidGen } from 'common/libs/uidGen';
|
import { uidGen } from 'common/libs/uidGen';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, Prop, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
|
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
||||||
|
import ModalConnectionAppearance from '@/components/ModalConnectionAppearance.vue';
|
||||||
|
import ModalFolderAppearance from '@/components/ModalFolderAppearance.vue';
|
||||||
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
|
||||||
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
|
||||||
import ModalFolderAppearance from '@/components/ModalFolderAppearance.vue';
|
|
||||||
import ModalConnectionAppearance from '@/components/ModalConnectionAppearance.vue';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -61,12 +61,13 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { shell } from 'electron';
|
import { shell } from 'electron';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import { useApplicationStore } from '@/stores/application';
|
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
|
||||||
import { computed, ComputedRef } from 'vue';
|
import { computed, ComputedRef } from 'vue';
|
||||||
import { useConsoleStore } from '@/stores/console';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import { useApplicationStore } from '@/stores/application';
|
||||||
import { useConnectionsStore } from '@/stores/connections';
|
import { useConnectionsStore } from '@/stores/connections';
|
||||||
|
import { useConsoleStore } from '@/stores/console';
|
||||||
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,12 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, Ref, ref, watch } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, Ref, ref, watch } from 'vue';
|
||||||
|
|
||||||
|
import BaseNotification from '@/components/BaseNotification.vue';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useSettingsStore } from '@/stores/settings';
|
import { useSettingsStore } from '@/stores/settings';
|
||||||
import BaseNotification from '@/components/BaseNotification.vue';
|
|
||||||
|
|
||||||
const notificationsStore = useNotificationsStore();
|
const notificationsStore = useNotificationsStore();
|
||||||
const settingsStore = useSettingsStore();
|
const settingsStore = useSettingsStore();
|
||||||
|
|
|
@ -29,13 +29,14 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, Ref, watch } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useApplicationStore } from '@/stores/application';
|
import { Ref, ref, watch } from 'vue';
|
||||||
import { useScratchpadStore } from '@/stores/scratchpad';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
import TextEditor from '@/components/BaseTextEditor.vue';
|
import TextEditor from '@/components/BaseTextEditor.vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useApplicationStore } from '@/stores/application';
|
||||||
|
import { useScratchpadStore } from '@/stores/scratchpad';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -71,10 +71,12 @@
|
||||||
class="settingbar-element btn btn-link"
|
class="settingbar-element btn btn-link"
|
||||||
@click="showSettingModal('general')"
|
@click="showSettingModal('general')"
|
||||||
>
|
>
|
||||||
<i
|
<div class="settingbar-element-icon-wrapper">
|
||||||
class="settingbar-element-icon mdi mdi-24px mdi-cog text-light"
|
<i
|
||||||
:class="{ ' badge badge-update': hasUpdates }"
|
class="settingbar-element-icon mdi mdi-24px mdi-cog text-light"
|
||||||
/>
|
:class="{ ' badge badge-update': hasUpdates }"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -82,17 +84,18 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, Ref, computed, watch } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
|
||||||
import { useApplicationStore } from '@/stores/application';
|
|
||||||
import { useConnectionsStore, SidebarElement } from '@/stores/connections';
|
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
|
||||||
import { useSettingsStore } from '@/stores/settings';
|
|
||||||
import SettingBarContext from '@/components/SettingBarContext.vue';
|
|
||||||
import SettingBarConnections from '@/components/SettingBarConnections.vue';
|
|
||||||
import { useElementBounding } from '@vueuse/core';
|
import { useElementBounding } from '@vueuse/core';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, Ref, ref, watch } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import SettingBarConnections from '@/components/SettingBarConnections.vue';
|
||||||
|
import SettingBarContext from '@/components/SettingBarContext.vue';
|
||||||
|
import { useApplicationStore } from '@/stores/application';
|
||||||
|
import { SidebarElement, useConnectionsStore } from '@/stores/connections';
|
||||||
|
import { useSettingsStore } from '@/stores/settings';
|
||||||
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
localStorage.setItem('opened-folders', '[]');
|
localStorage.setItem('opened-folders', '[]');
|
||||||
|
|
||||||
|
@ -238,7 +241,7 @@ if (!connectionsArr.value.length)
|
||||||
border-radius: $border-radius;
|
border-radius: $border-radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settingbar-element-icon-wrapper{
|
.settingbar-element-icon-wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
|
@ -36,13 +36,14 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onUnmounted, ref, watch } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
|
||||||
import { getCurrentWindow } from '@electron/remote';
|
import { getCurrentWindow } from '@electron/remote';
|
||||||
|
import { ipcRenderer } from 'electron';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, onUnmounted, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import { useConnectionsStore } from '@/stores/connections';
|
import { useConnectionsStore } from '@/stores/connections';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import { ipcRenderer } from 'electron';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -488,42 +488,40 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ipcRenderer } from 'electron';
|
|
||||||
import { computed, onMounted, Prop, ref, watch } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
|
||||||
import * as Draggable from 'vuedraggable';
|
|
||||||
import Connection from '@/ipc-api/Connection';
|
|
||||||
import { useWorkspacesStore, WorkspaceTab } from '@/stores/workspaces';
|
|
||||||
import { useConsoleStore } from '@/stores/console';
|
|
||||||
import { ConnectionParams } from 'common/interfaces/antares';
|
import { ConnectionParams } from 'common/interfaces/antares';
|
||||||
import { useFilters } from '@/composables/useFilters';
|
import { ipcRenderer } from 'electron';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, onMounted, Prop, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
import * as Draggable from 'vuedraggable';
|
||||||
|
|
||||||
|
import ModalDiscardChanges from '@/components/ModalDiscardChanges.vue';
|
||||||
|
import ModalProcessesList from '@/components/ModalProcessesList.vue';
|
||||||
|
import WorkspaceEditConnectionPanel from '@/components/WorkspaceEditConnectionPanel.vue';
|
||||||
import WorkspaceEmptyState from '@/components/WorkspaceEmptyState.vue';
|
import WorkspaceEmptyState from '@/components/WorkspaceEmptyState.vue';
|
||||||
import WorkspaceExploreBar from '@/components/WorkspaceExploreBar.vue';
|
import WorkspaceExploreBar from '@/components/WorkspaceExploreBar.vue';
|
||||||
import WorkspaceEditConnectionPanel from '@/components/WorkspaceEditConnectionPanel.vue';
|
|
||||||
import WorkspaceTabQuery from '@/components/WorkspaceTabQuery.vue';
|
|
||||||
import WorkspaceTabTable from '@/components/WorkspaceTabTable.vue';
|
|
||||||
import WorkspaceQueryConsole from '@/components/WorkspaceQueryConsole.vue';
|
import WorkspaceQueryConsole from '@/components/WorkspaceQueryConsole.vue';
|
||||||
|
|
||||||
import WorkspaceTabNewTable from '@/components/WorkspaceTabNewTable.vue';
|
|
||||||
import WorkspaceTabNewView from '@/components/WorkspaceTabNewView.vue';
|
|
||||||
import WorkspaceTabNewTrigger from '@/components/WorkspaceTabNewTrigger.vue';
|
|
||||||
import WorkspaceTabNewRoutine from '@/components/WorkspaceTabNewRoutine.vue';
|
|
||||||
import WorkspaceTabNewFunction from '@/components/WorkspaceTabNewFunction.vue';
|
import WorkspaceTabNewFunction from '@/components/WorkspaceTabNewFunction.vue';
|
||||||
|
import WorkspaceTabNewRoutine from '@/components/WorkspaceTabNewRoutine.vue';
|
||||||
import WorkspaceTabNewScheduler from '@/components/WorkspaceTabNewScheduler.vue';
|
import WorkspaceTabNewScheduler from '@/components/WorkspaceTabNewScheduler.vue';
|
||||||
|
import WorkspaceTabNewTable from '@/components/WorkspaceTabNewTable.vue';
|
||||||
|
import WorkspaceTabNewTrigger from '@/components/WorkspaceTabNewTrigger.vue';
|
||||||
import WorkspaceTabNewTriggerFunction from '@/components/WorkspaceTabNewTriggerFunction.vue';
|
import WorkspaceTabNewTriggerFunction from '@/components/WorkspaceTabNewTriggerFunction.vue';
|
||||||
import WorkspaceTabsContext from '@/components/WorkspaceTabsContext.vue';
|
import WorkspaceTabNewView from '@/components/WorkspaceTabNewView.vue';
|
||||||
|
import WorkspaceTabPropsFunction from '@/components/WorkspaceTabPropsFunction.vue';
|
||||||
|
import WorkspaceTabPropsRoutine from '@/components/WorkspaceTabPropsRoutine.vue';
|
||||||
|
import WorkspaceTabPropsScheduler from '@/components/WorkspaceTabPropsScheduler.vue';
|
||||||
import WorkspaceTabPropsTable from '@/components/WorkspaceTabPropsTable.vue';
|
import WorkspaceTabPropsTable from '@/components/WorkspaceTabPropsTable.vue';
|
||||||
import WorkspaceTabPropsView from '@/components/WorkspaceTabPropsView.vue';
|
|
||||||
import WorkspaceTabPropsTrigger from '@/components/WorkspaceTabPropsTrigger.vue';
|
import WorkspaceTabPropsTrigger from '@/components/WorkspaceTabPropsTrigger.vue';
|
||||||
import WorkspaceTabPropsTriggerFunction from '@/components/WorkspaceTabPropsTriggerFunction.vue';
|
import WorkspaceTabPropsTriggerFunction from '@/components/WorkspaceTabPropsTriggerFunction.vue';
|
||||||
import WorkspaceTabPropsRoutine from '@/components/WorkspaceTabPropsRoutine.vue';
|
import WorkspaceTabPropsView from '@/components/WorkspaceTabPropsView.vue';
|
||||||
import WorkspaceTabPropsFunction from '@/components/WorkspaceTabPropsFunction.vue';
|
import WorkspaceTabQuery from '@/components/WorkspaceTabQuery.vue';
|
||||||
import WorkspaceTabPropsScheduler from '@/components/WorkspaceTabPropsScheduler.vue';
|
import WorkspaceTabsContext from '@/components/WorkspaceTabsContext.vue';
|
||||||
import ModalProcessesList from '@/components/ModalProcessesList.vue';
|
import WorkspaceTabTable from '@/components/WorkspaceTabTable.vue';
|
||||||
import ModalDiscardChanges from '@/components/ModalDiscardChanges.vue';
|
import { useFilters } from '@/composables/useFilters';
|
||||||
import { useI18n } from 'vue-i18n';
|
import Connection from '@/ipc-api/Connection';
|
||||||
|
import { useConsoleStore } from '@/stores/console';
|
||||||
|
import { useWorkspacesStore, WorkspaceTab } from '@/stores/workspaces';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -404,18 +404,19 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, Ref, ref, watch } from 'vue';
|
|
||||||
import customizations from 'common/customizations';
|
import customizations from 'common/customizations';
|
||||||
import Connection from '@/ipc-api/Connection';
|
import { ConnectionParams } from 'common/interfaces/antares';
|
||||||
import { uidGen } from 'common/libs/uidGen';
|
import { uidGen } from 'common/libs/uidGen';
|
||||||
|
import { computed, Ref, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import BaseUploadInput from '@/components/BaseUploadInput.vue';
|
||||||
|
import ModalAskCredentials from '@/components/ModalAskCredentials.vue';
|
||||||
|
import Connection from '@/ipc-api/Connection';
|
||||||
import { useConnectionsStore } from '@/stores/connections';
|
import { useConnectionsStore } from '@/stores/connections';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import ModalAskCredentials from '@/components/ModalAskCredentials.vue';
|
|
||||||
import BaseUploadInput from '@/components/BaseUploadInput.vue';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { ConnectionParams } from 'common/interfaces/antares';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -416,17 +416,18 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, Prop, Ref, ref, watch } from 'vue';
|
|
||||||
import customizations from 'common/customizations';
|
import customizations from 'common/customizations';
|
||||||
|
import { ConnectionParams } from 'common/interfaces/antares';
|
||||||
|
import { computed, Prop, Ref, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import BaseUploadInput from '@/components/BaseUploadInput.vue';
|
||||||
|
import ModalAskCredentials from '@/components/ModalAskCredentials.vue';
|
||||||
|
import Connection from '@/ipc-api/Connection';
|
||||||
import { useConnectionsStore } from '@/stores/connections';
|
import { useConnectionsStore } from '@/stores/connections';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import Connection from '@/ipc-api/Connection';
|
|
||||||
import ModalAskCredentials from '@/components/ModalAskCredentials.vue';
|
|
||||||
import BaseUploadInput from '@/components/BaseUploadInput.vue';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { ConnectionParams } from 'common/interfaces/antares';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,12 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import { useSettingsStore } from '@/stores/settings';
|
import { useSettingsStore } from '@/stores/settings';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -135,27 +135,25 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Component, computed, onMounted, Prop, Ref, ref, watch } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
|
||||||
|
|
||||||
import { useConnectionsStore } from '@/stores/connections';
|
|
||||||
import { ConnectionParams } from 'common/interfaces/antares';
|
import { ConnectionParams } from 'common/interfaces/antares';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useSettingsStore } from '@/stores/settings';
|
import { Component, computed, onMounted, Prop, Ref, ref, watch } from 'vue';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import Tables from '@/ipc-api/Tables';
|
|
||||||
import Views from '@/ipc-api/Views';
|
|
||||||
|
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import ModalNewSchema from '@/components/ModalNewSchema.vue';
|
||||||
|
import MiscContext from '@/components/WorkspaceExploreBarMiscContext.vue';
|
||||||
|
import MiscFolderContext from '@/components/WorkspaceExploreBarMiscFolderContext.vue';
|
||||||
import WorkspaceExploreBarSchema from '@/components/WorkspaceExploreBarSchema.vue';
|
import WorkspaceExploreBarSchema from '@/components/WorkspaceExploreBarSchema.vue';
|
||||||
import DatabaseContext from '@/components/WorkspaceExploreBarSchemaContext.vue';
|
import DatabaseContext from '@/components/WorkspaceExploreBarSchemaContext.vue';
|
||||||
import TableContext from '@/components/WorkspaceExploreBarTableContext.vue';
|
import TableContext from '@/components/WorkspaceExploreBarTableContext.vue';
|
||||||
import MiscContext from '@/components/WorkspaceExploreBarMiscContext.vue';
|
|
||||||
import MiscFolderContext from '@/components/WorkspaceExploreBarMiscFolderContext.vue';
|
|
||||||
import ModalNewSchema from '@/components/ModalNewSchema.vue';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import Databases from '@/ipc-api/Databases';
|
import Databases from '@/ipc-api/Databases';
|
||||||
|
import Tables from '@/ipc-api/Tables';
|
||||||
|
import Views from '@/ipc-api/Views';
|
||||||
|
import { useConnectionsStore } from '@/stores/connections';
|
||||||
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
|
import { useSettingsStore } from '@/stores/settings';
|
||||||
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -65,19 +65,20 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, Prop, Ref, ref } from 'vue';
|
import { EventInfos, FunctionInfos, IpcResponse, RoutineInfos, TriggerInfos } from 'common/interfaces/antares';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, Prop, Ref, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
|
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
||||||
|
import ModalAskParameters from '@/components/ModalAskParameters.vue';
|
||||||
|
import Functions from '@/ipc-api/Functions';
|
||||||
|
import Routines from '@/ipc-api/Routines';
|
||||||
|
import Schedulers from '@/ipc-api/Schedulers';
|
||||||
|
import Triggers from '@/ipc-api/Triggers';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
|
||||||
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
|
||||||
import ModalAskParameters from '@/components/ModalAskParameters.vue';
|
|
||||||
import Triggers from '@/ipc-api/Triggers';
|
|
||||||
import Routines from '@/ipc-api/Routines';
|
|
||||||
import Functions from '@/ipc-api/Functions';
|
|
||||||
import Schedulers from '@/ipc-api/Schedulers';
|
|
||||||
import { EventInfos, FunctionInfos, IpcResponse, RoutineInfos, TriggerInfos } from 'common/interfaces/antares';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
|
@ -237,13 +237,14 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, Prop, Ref, ref, watch } from 'vue';
|
import { EventInfos, FunctionInfos, RoutineInfos, TableInfos, TriggerFunctionInfos, TriggerInfos } from 'common/interfaces/antares';
|
||||||
|
import { formatBytes } from 'common/libs/formatBytes';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, Prop, Ref, ref, watch } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import { useSettingsStore } from '@/stores/settings';
|
import { useSettingsStore } from '@/stores/settings';
|
||||||
import { Breadcrumb, useWorkspacesStore, WorkspaceStructure } from '@/stores/workspaces';
|
import { Breadcrumb, useWorkspacesStore, WorkspaceStructure } from '@/stores/workspaces';
|
||||||
import { formatBytes } from 'common/libs/formatBytes';
|
|
||||||
import { EventInfos, FunctionInfos, RoutineInfos, TableInfos, TriggerFunctionInfos, TriggerInfos } from 'common/interfaces/antares';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
@ -124,19 +119,20 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Component, computed, nextTick, Ref, ref } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { Component, computed, nextTick, Ref, ref } from 'vue';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
|
||||||
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
|
||||||
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
|
||||||
import ModalEditSchema from '@/components/ModalEditSchema.vue';
|
|
||||||
import ModalExportSchema from '@/components/ModalExportSchema.vue';
|
|
||||||
import ModalImportSchema from '@/components/ModalImportSchema.vue';
|
|
||||||
import Schema from '@/ipc-api/Schema';
|
|
||||||
import Application from '@/ipc-api/Application';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
|
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
||||||
|
import ModalEditSchema from '@/components/ModalEditSchema.vue';
|
||||||
|
import ModalImportSchema from '@/components/ModalImportSchema.vue';
|
||||||
|
import Application from '@/ipc-api/Application';
|
||||||
|
import Schema from '@/ipc-api/Schema';
|
||||||
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
|
import { useSchemaExportStore } from '@/stores/schemaExport';
|
||||||
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
@ -158,6 +154,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 +167,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 +217,7 @@ const hideEditModal = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const showExportSchemaModal = () => {
|
const showExportSchemaModal = () => {
|
||||||
isExportSchemaModal.value = true;
|
showExportModal(props.selectedSchema);
|
||||||
};
|
|
||||||
|
|
||||||
const hideExportSchemaModal = () => {
|
|
||||||
isExportSchemaModal.value = false;
|
|
||||||
closeContext();
|
closeContext();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,13 @@
|
||||||
>
|
>
|
||||||
<span class="d-flex"><i class="mdi mdi-18px mdi-wrench-cog text-light pr-1" /> {{ t('application.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
|
||||||
|
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
|
||||||
v-if="selectedTable && selectedTable.type === 'view' && customizations.viewSettings"
|
v-if="selectedTable && selectedTable.type === 'view' && customizations.viewSettings"
|
||||||
class="context-element"
|
class="context-element"
|
||||||
|
@ -77,15 +84,17 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, ref } from 'vue';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { computed, ref } from 'vue';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
|
||||||
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
|
||||||
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
|
||||||
import Tables from '@/ipc-api/Tables';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
|
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
||||||
|
import Tables from '@/ipc-api/Tables';
|
||||||
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
|
import { useSchemaExportStore } from '@/stores/schemaExport';
|
||||||
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
@ -98,6 +107,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 +126,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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -40,12 +40,13 @@
|
||||||
</BaseContextMenu>
|
</BaseContextMenu>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, nextTick, onMounted, ref, Ref, watch } from 'vue';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import * as moment from 'moment';
|
import * as moment from 'moment';
|
||||||
import { useConsoleStore } from '@/stores/console';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { computed, nextTick, onMounted, Ref, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
||||||
|
import { useConsoleStore } from '@/stores/console';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -175,20 +175,21 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
|
||||||
import { Ace } from 'ace-builds';
|
import { Ace } from 'ace-builds';
|
||||||
import Functions from '@/ipc-api/Functions';
|
import { FunctionInfos, FunctionParam } from 'common/interfaces/antares';
|
||||||
|
import { ipcRenderer } from 'electron';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseLoader from '@/components/BaseLoader.vue';
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import QueryEditor from '@/components/QueryEditor.vue';
|
||||||
|
import WorkspaceTabPropsFunctionParamsModal from '@/components/WorkspaceTabPropsFunctionParamsModal.vue';
|
||||||
|
import Functions from '@/ipc-api/Functions';
|
||||||
import { useConsoleStore } from '@/stores/console';
|
import { useConsoleStore } from '@/stores/console';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import BaseLoader from '@/components/BaseLoader.vue';
|
|
||||||
import QueryEditor from '@/components/QueryEditor.vue';
|
|
||||||
import WorkspaceTabPropsFunctionParamsModal from '@/components/WorkspaceTabPropsFunctionParamsModal.vue';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { FunctionInfos, FunctionParam } from 'common/interfaces/antares';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import { ipcRenderer } from 'electron';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -147,20 +147,21 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
|
||||||
import { Ace } from 'ace-builds';
|
import { Ace } from 'ace-builds';
|
||||||
import Routines from '@/ipc-api/Routines';
|
import { FunctionParam } from 'common/interfaces/antares';
|
||||||
|
import { ipcRenderer } from 'electron';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseLoader from '@/components/BaseLoader.vue';
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import QueryEditor from '@/components/QueryEditor.vue';
|
||||||
|
import WorkspaceTabPropsRoutineParamsModal from '@/components/WorkspaceTabPropsRoutineParamsModal.vue';
|
||||||
|
import Routines from '@/ipc-api/Routines';
|
||||||
import { useConsoleStore } from '@/stores/console';
|
import { useConsoleStore } from '@/stores/console';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import QueryEditor from '@/components/QueryEditor.vue';
|
|
||||||
import BaseLoader from '@/components/BaseLoader.vue';
|
|
||||||
import WorkspaceTabPropsRoutineParamsModal from '@/components/WorkspaceTabPropsRoutineParamsModal.vue';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { FunctionParam } from 'common/interfaces/antares';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import { ipcRenderer } from 'electron';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -124,20 +124,21 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Prop, Ref, ref, watch } from 'vue';
|
|
||||||
import { Ace } from 'ace-builds';
|
import { Ace } from 'ace-builds';
|
||||||
import { ConnectionParams, EventInfos } from 'common/interfaces/antares';
|
import { ConnectionParams, EventInfos } from 'common/interfaces/antares';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { ipcRenderer } from 'electron';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useConsoleStore } from '@/stores/console';
|
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Prop, Ref, ref, watch } from 'vue';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
|
||||||
import BaseLoader from '@/components/BaseLoader.vue';
|
import BaseLoader from '@/components/BaseLoader.vue';
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
import QueryEditor from '@/components/QueryEditor.vue';
|
import QueryEditor from '@/components/QueryEditor.vue';
|
||||||
import WorkspaceTabPropsSchedulerTimingModal from '@/components/WorkspaceTabPropsSchedulerTimingModal.vue';
|
import WorkspaceTabPropsSchedulerTimingModal from '@/components/WorkspaceTabPropsSchedulerTimingModal.vue';
|
||||||
import Schedulers from '@/ipc-api/Schedulers';
|
import Schedulers from '@/ipc-api/Schedulers';
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
import { useConsoleStore } from '@/stores/console';
|
||||||
import { ipcRenderer } from 'electron';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
<button
|
<button
|
||||||
class="btn btn-dark btn-sm"
|
class="btn btn-dark btn-sm"
|
||||||
:disabled="isSaving || !localFields.length"
|
:disabled="isSaving || !localFields.length"
|
||||||
|
:title="t('database.manageForeignKeys')"
|
||||||
@click="showForeignModal"
|
@click="showForeignModal"
|
||||||
>
|
>
|
||||||
<i class="mdi mdi-24px mdi-key-link mr-1" />
|
<i class="mdi mdi-24px mdi-key-link mr-1" />
|
||||||
|
@ -161,21 +162,22 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { ConnectionParams, TableField, TableForeign, TableIndex, TableOptions } from 'common/interfaces/antares';
|
||||||
|
import { uidGen } from 'common/libs/uidGen';
|
||||||
|
import { ipcRenderer } from 'electron';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
import { Component, computed, onBeforeUnmount, onMounted, Prop, Ref, ref, watch } from 'vue';
|
import { Component, computed, onBeforeUnmount, onMounted, Prop, Ref, ref, watch } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { storeToRefs } from 'pinia';
|
|
||||||
|
import BaseLoader from '@/components/BaseLoader.vue';
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import WorkspaceTabNewTableEmptyState from '@/components/WorkspaceTabNewTableEmptyState.vue';
|
||||||
|
import WorkspaceTabPropsTableFields from '@/components/WorkspaceTabPropsTableFields.vue';
|
||||||
|
import WorkspaceTabPropsTableForeignModal from '@/components/WorkspaceTabPropsTableForeignModal.vue';
|
||||||
|
import WorkspaceTabPropsTableIndexesModal from '@/components/WorkspaceTabPropsTableIndexesModal.vue';
|
||||||
|
import Tables from '@/ipc-api/Tables';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import { uidGen } from 'common/libs/uidGen';
|
|
||||||
import Tables from '@/ipc-api/Tables';
|
|
||||||
import BaseLoader from '@/components/BaseLoader.vue';
|
|
||||||
import WorkspaceTabPropsTableFields from '@/components/WorkspaceTabPropsTableFields.vue';
|
|
||||||
import WorkspaceTabPropsTableIndexesModal from '@/components/WorkspaceTabPropsTableIndexesModal.vue';
|
|
||||||
import WorkspaceTabPropsTableForeignModal from '@/components/WorkspaceTabPropsTableForeignModal.vue';
|
|
||||||
import WorkspaceTabNewTableEmptyState from '@/components/WorkspaceTabNewTableEmptyState.vue';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { ConnectionParams, TableField, TableForeign, TableIndex, TableOptions } from 'common/interfaces/antares';
|
|
||||||
import { ipcRenderer } from 'electron';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -114,18 +114,19 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
|
||||||
import { Ace } from 'ace-builds';
|
import { Ace } from 'ace-builds';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { ipcRenderer } from 'electron';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseLoader from '@/components/BaseLoader.vue';
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import QueryEditor from '@/components/QueryEditor.vue';
|
||||||
|
import Triggers from '@/ipc-api/Triggers';
|
||||||
|
import { useConsoleStore } from '@/stores/console';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import { useConsoleStore } from '@/stores/console';
|
|
||||||
import QueryEditor from '@/components/QueryEditor.vue';
|
|
||||||
import BaseLoader from '@/components/BaseLoader.vue';
|
|
||||||
import Triggers from '@/ipc-api/Triggers';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { ipcRenderer } from 'electron';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -93,18 +93,19 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
|
||||||
import { Ace } from 'ace-builds';
|
import { Ace } from 'ace-builds';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { ipcRenderer } from 'electron';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
import { useConsoleStore } from '@/stores/console';
|
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import BaseLoader from '@/components/BaseLoader.vue';
|
import BaseLoader from '@/components/BaseLoader.vue';
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
import QueryEditor from '@/components/QueryEditor.vue';
|
import QueryEditor from '@/components/QueryEditor.vue';
|
||||||
import Functions from '@/ipc-api/Functions';
|
import Functions from '@/ipc-api/Functions';
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
import { useConsoleStore } from '@/stores/console';
|
||||||
import { ipcRenderer } from 'electron';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -103,18 +103,19 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
|
||||||
import { Ace } from 'ace-builds';
|
import { Ace } from 'ace-builds';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { ipcRenderer } from 'electron';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseLoader from '@/components/BaseLoader.vue';
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import QueryEditor from '@/components/QueryEditor.vue';
|
||||||
|
import Views from '@/ipc-api/Views';
|
||||||
import { useConsoleStore } from '@/stores/console';
|
import { useConsoleStore } from '@/stores/console';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import BaseLoader from '@/components/BaseLoader.vue';
|
|
||||||
import QueryEditor from '@/components/QueryEditor.vue';
|
|
||||||
import Views from '@/ipc-api/Views';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { ipcRenderer } from 'electron';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -191,22 +191,23 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
|
||||||
import { Ace } from 'ace-builds';
|
import { Ace } from 'ace-builds';
|
||||||
|
import { AlterFunctionParams, FunctionInfos, FunctionParam } from 'common/interfaces/antares';
|
||||||
|
import { uidGen } from 'common/libs/uidGen';
|
||||||
|
import { ipcRenderer } from 'electron';
|
||||||
import { storeToRefs } from 'pinia';
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { Component, computed, onBeforeUnmount, onMounted, onUnmounted, Ref, ref, watch } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import BaseLoader from '@/components/BaseLoader.vue';
|
||||||
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
import ModalAskParameters from '@/components/ModalAskParameters.vue';
|
||||||
|
import QueryEditor from '@/components/QueryEditor.vue';
|
||||||
|
import WorkspaceTabPropsFunctionParamsModal from '@/components/WorkspaceTabPropsFunctionParamsModal.vue';
|
||||||
|
import Functions from '@/ipc-api/Functions';
|
||||||
import { useConsoleStore } from '@/stores/console';
|
import { useConsoleStore } from '@/stores/console';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
import { uidGen } from 'common/libs/uidGen';
|
|
||||||
import BaseLoader from '@/components/BaseLoader.vue';
|
|
||||||
import QueryEditor from '@/components/QueryEditor.vue';
|
|
||||||
import WorkspaceTabPropsFunctionParamsModal from '@/components/WorkspaceTabPropsFunctionParamsModal.vue';
|
|
||||||
import ModalAskParameters from '@/components/ModalAskParameters.vue';
|
|
||||||
import Functions from '@/ipc-api/Functions';
|
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import { AlterFunctionParams, FunctionInfos, FunctionParam } from 'common/interfaces/antares';
|
|
||||||
import { ipcRenderer } from 'electron';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
|
|
@ -165,9 +165,10 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { uidGen } from 'common/libs/uidGen';
|
||||||
import { computed, onMounted, onUnmounted, Ref, ref } from 'vue';
|
import { computed, onMounted, onUnmounted, Ref, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { uidGen } from 'common/libs/uidGen';
|
|
||||||
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
import BaseSelect from '@/components/BaseSelect.vue';
|
import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue