mirror of
https://github.com/Fabio286/antares.git
synced 2025-06-05 21:59:22 +02:00
Compare commits
29 Commits
v0.7.22-be
...
v0.7.23-be
Author | SHA1 | Date | |
---|---|---|---|
1875e895ae | |||
2064294119 | |||
62e3115860 | |||
9aef287a98 | |||
65ec4c5da6 | |||
e19118982b | |||
11f130d91c | |||
|
0bb5cedda6 | ||
de9dac3e8a | |||
dd5b41716a | |||
86acb390ac | |||
2884ec3dd6 | |||
b542a09c01 | |||
6d94a04b67 | |||
8500fc40a1 | |||
586f901bae | |||
04e4d21e20 | |||
fd3dd03eb2 | |||
d3f71e65ce | |||
90b9b87b1d | |||
e9b42c3edb | |||
259d051a21 | |||
876d5ea481 | |||
6d002efaf5 | |||
58be1abf5f | |||
da56905572 | |||
d698f2798a | |||
9a41511c42 | |||
|
30ada13663 |
4
.github/FUNDING.yml
vendored
4
.github/FUNDING.yml
vendored
@@ -1,6 +1,6 @@
|
|||||||
# These are supported funding model platforms
|
# These are supported funding model platforms
|
||||||
|
|
||||||
github: [fabio286]
|
github: [antares-sql,fabio286]
|
||||||
patreon: #fabio286
|
patreon: #fabio286
|
||||||
open_collective: # Replace with a single Open Collective username
|
open_collective: # Replace with a single Open Collective username
|
||||||
ko_fi: # Replace with a single Ko-fi username
|
ko_fi: # Replace with a single Ko-fi username
|
||||||
@@ -9,4 +9,4 @@ community_bridge: # Replace with a single Community Bridge project-name e.g., cl
|
|||||||
liberapay: # Replace with a single Liberapay username
|
liberapay: # Replace with a single Liberapay username
|
||||||
issuehunt: # Replace with a single IssueHunt username
|
issuehunt: # Replace with a single IssueHunt username
|
||||||
otechie: # Replace with a single Otechie username
|
otechie: # Replace with a single Otechie username
|
||||||
custom: ['https://paypal.me/fabiodistasio']
|
custom: ['https://paypal.me/fabiodistasio']
|
||||||
|
1
.husky/commit-msg
Normal file
1
.husky/commit-msg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
npx --no -- commitlint --edit $1
|
1
.husky/pre-commit
Normal file
1
.husky/pre-commit
Normal file
@@ -0,0 +1 @@
|
|||||||
|
npm run lint
|
@@ -5,14 +5,14 @@
|
|||||||
],
|
],
|
||||||
"fix": true,
|
"fix": true,
|
||||||
"formatter": "verbose",
|
"formatter": "verbose",
|
||||||
|
"customSyntax": "postcss-html",
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"stylelint-scss"
|
"stylelint-scss"
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
"at-rule-no-unknown": null,
|
"at-rule-no-unknown": null,
|
||||||
"no-descending-specificity": null,
|
"no-descending-specificity": null,
|
||||||
"font-family-no-missing-generic-family-keyword": null,
|
"font-family-no-missing-generic-family-keyword": null
|
||||||
"declaration-colon-newline-after": "always-multi-line"
|
|
||||||
},
|
},
|
||||||
"syntax": "scss"
|
"syntax": "scss"
|
||||||
}
|
}
|
55
CHANGELOG.md
55
CHANGELOG.md
@@ -2,6 +2,61 @@
|
|||||||
|
|
||||||
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.23-beta.1](https://github.com/antares-sql/antares/compare/v0.7.23-beta.0...v0.7.23-beta.1) (2024-04-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add the page reference in the export file name, closes [#772](https://github.com/antares-sql/antares/issues/772) ([2064294](https://github.com/antares-sql/antares/commit/2064294119ed9dfab2a9968dfb5b35d52e2ae03b))
|
||||||
|
* move connections out of folder from context menu, related to [#773](https://github.com/antares-sql/antares/issues/773) ([62e3115](https://github.com/antares-sql/antares/commit/62e311586073ae7ee4896305198c7168f637c1af))
|
||||||
|
* move connections to folders from context menu, related to [#773](https://github.com/antares-sql/antares/issues/773) ([9aef287](https://github.com/antares-sql/antares/commit/9aef287a983754158cdbdc9b2a72db9ab82f76c8))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* bad format of timestamp fields on CSV export, fixes 776 ([65ec4c5](https://github.com/antares-sql/antares/commit/65ec4c5da6187a7ab2dfff59326cd12bfa788c3b))
|
||||||
|
|
||||||
|
### [0.7.23-beta.0](https://github.com/antares-sql/antares/compare/v0.7.22...v0.7.23-beta.0) (2024-03-21)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* CSV export does not escape strings when needed, fixes [#770](https://github.com/antares-sql/antares/issues/770) ([dd5b417](https://github.com/antares-sql/antares/commit/dd5b41716a10cf9500f2c611b232f5b5b0756a68))
|
||||||
|
* query result sort not working with aliased tables, fixes [#765](https://github.com/antares-sql/antares/issues/765) ([de9dac3](https://github.com/antares-sql/antares/commit/de9dac3e8abf3b3261f8c54c88cf2386a5be2207))
|
||||||
|
* shortcut not working on mac os ([0bb5ced](https://github.com/antares-sql/antares/commit/0bb5cedda6a67ccbeea8c127b799f533395101a2))
|
||||||
|
|
||||||
|
### [0.7.22](https://github.com/antares-sql/antares/compare/v0.7.22-beta.2...v0.7.22) (2024-02-26)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* delete record modal pressing del when editing a field, fixes [#767](https://github.com/antares-sql/antares/issues/767) ([586f901](https://github.com/antares-sql/antares/commit/586f901bae9a80c0e53ac1d804cbae3f05e26d8e))
|
||||||
|
|
||||||
|
### [0.7.22-beta.2](https://github.com/antares-sql/antares/compare/v0.7.22-beta.1...v0.7.22-beta.2) (2024-02-18)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **MySQL:** option to enable single connection mode ([d3f71e6](https://github.com/antares-sql/antares/commit/d3f71e65cef88838f03f95a4b34e197fb61878f8))
|
||||||
|
|
||||||
|
### [0.7.22-beta.1](https://github.com/antares-sql/antares/compare/v0.7.22-beta.0...v0.7.22-beta.1) (2024-02-12)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* update dutch translation + fix spelling mistake ([30ada13](https://github.com/antares-sql/antares/commit/30ada13663e88f89beb3dd7291010837059585d5))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* some issues related to previous commit ([259d051](https://github.com/antares-sql/antares/commit/259d051a21e334496d3a52b662f1855ba9a9046d))
|
||||||
|
* unable to edit tables containing SET fields, fixes [#755](https://github.com/antares-sql/antares/issues/755) ([d698f27](https://github.com/antares-sql/antares/commit/d698f2798a2423f86e6d786dd3ab80439b372a08))
|
||||||
|
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
|
||||||
|
* **MySQL:** improvements in connection handling ([876d5ea](https://github.com/antares-sql/antares/commit/876d5ea48185334e9e2fc981c4282a9c42d22b10))
|
||||||
|
|
||||||
### [0.7.22-beta.0](https://github.com/antares-sql/antares/compare/v0.7.21...v0.7.22-beta.0) (2024-02-04)
|
### [0.7.22-beta.0](https://github.com/antares-sql/antares/compare/v0.7.21...v0.7.22-beta.0) (2024-02-04)
|
||||||
|
|
||||||
|
|
||||||
|
@@ -101,7 +101,7 @@ On macOS you can run `.dmg` distribution following [this guide](https://support.
|
|||||||
|
|
||||||
- 🌍 [Translate Antares](https://github.com/Fabio286/antares/wiki/Translate-Antares)
|
- 🌍 [Translate Antares](https://github.com/Fabio286/antares/wiki/Translate-Antares)
|
||||||
- 📖 [Contributors Guide](https://github.com/Fabio286/antares/wiki/Contributors-Guide)
|
- 📖 [Contributors Guide](https://github.com/Fabio286/antares/wiki/Contributors-Guide)
|
||||||
- 🚧 [Project Board](https://github.com/antares-sql/antares/projects/1)
|
- 🚧 [Project Board](https://github.com/orgs/antares-sql/projects/3/views/2)
|
||||||
|
|
||||||
## Contributors ✨
|
## Contributors ✨
|
||||||
|
|
||||||
|
33
commitlint.config.js
Normal file
33
commitlint.config.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
module.exports = {
|
||||||
|
extends: ['@commitlint/config-conventional'],
|
||||||
|
rules: {
|
||||||
|
// TODO Add Scope Enum Here
|
||||||
|
// 'scope-enum': [2, 'always', ['yourscope', 'yourscope']],
|
||||||
|
'type-enum': [
|
||||||
|
2,
|
||||||
|
'always',
|
||||||
|
[
|
||||||
|
'feat',
|
||||||
|
'fix',
|
||||||
|
'docs',
|
||||||
|
'chore',
|
||||||
|
'style',
|
||||||
|
'refactor',
|
||||||
|
'build',
|
||||||
|
'ci',
|
||||||
|
'test',
|
||||||
|
'revert',
|
||||||
|
'perf'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'subject-case': [
|
||||||
|
2,
|
||||||
|
'never',
|
||||||
|
[
|
||||||
|
'upper-case',
|
||||||
|
'pascal-case',
|
||||||
|
'start-case'
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
3389
package-lock.json
generated
3389
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
70
package.json
70
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "antares",
|
"name": "antares",
|
||||||
"productName": "Antares",
|
"productName": "Antares",
|
||||||
"version": "0.7.22-beta.0",
|
"version": "0.7.23-beta.1",
|
||||||
"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",
|
||||||
@@ -25,7 +25,8 @@
|
|||||||
"lint": "eslint . --ext .js,.ts,.vue && stylelint \"./src/**/*.{css,scss,sass,vue}\"",
|
"lint": "eslint . --ext .js,.ts,.vue && stylelint \"./src/**/*.{css,scss,sass,vue}\"",
|
||||||
"lint:fix": "eslint . --ext .js,.ts,.vue --fix && stylelint \"./src/**/*.{css,scss,sass,vue}\" --fix",
|
"lint:fix": "eslint . --ext .js,.ts,.vue --fix && stylelint \"./src/**/*.{css,scss,sass,vue}\" --fix",
|
||||||
"contributors:add": "all-contributors add",
|
"contributors:add": "all-contributors add",
|
||||||
"contributors:generate": "all-contributors generate"
|
"contributors:generate": "all-contributors generate",
|
||||||
|
"prepare": "husky"
|
||||||
},
|
},
|
||||||
"author": "Fabio Di Stasio <info@fabiodistasio.it>",
|
"author": "Fabio Di Stasio <info@fabiodistasio.it>",
|
||||||
"main": "./dist/main.js",
|
"main": "./dist/main.js",
|
||||||
@@ -124,39 +125,63 @@
|
|||||||
"@jamescoyle/vue-icon": "~0.1.2",
|
"@jamescoyle/vue-icon": "~0.1.2",
|
||||||
"@mdi/js": "~7.2.96",
|
"@mdi/js": "~7.2.96",
|
||||||
"@turf/helpers": "~6.5.0",
|
"@turf/helpers": "~6.5.0",
|
||||||
|
"@vue/compiler-sfc": "~3.2.33",
|
||||||
"@vueuse/core": "~10.4.1",
|
"@vueuse/core": "~10.4.1",
|
||||||
"ace-builds": "~1.24.1",
|
"ace-builds": "~1.24.1",
|
||||||
"better-sqlite3": "^8.0.1",
|
"babel-loader": "~8.2.3",
|
||||||
|
"better-sqlite3": "~9.4.1",
|
||||||
|
"chalk": "~4.1.2",
|
||||||
|
"cross-env": "~7.0.2",
|
||||||
|
"css-loader": "~6.5.0",
|
||||||
"electron-log": "~5.0.1",
|
"electron-log": "~5.0.1",
|
||||||
"electron-store": "~8.1.0",
|
"electron-store": "~8.1.0",
|
||||||
"electron-updater": "~4.6.5",
|
"electron-updater": "~4.6.5",
|
||||||
"electron-window-state": "~5.0.3",
|
"electron-window-state": "~5.0.3",
|
||||||
"encoding": "~0.1.13",
|
"encoding": "~0.1.13",
|
||||||
|
"file-loader": "~6.2.0",
|
||||||
"floating-vue": "~2.0.0-beta.20",
|
"floating-vue": "~2.0.0-beta.20",
|
||||||
|
"html-webpack-plugin": "~5.5.0",
|
||||||
"json2php": "~0.0.7",
|
"json2php": "~0.0.7",
|
||||||
"leaflet": "~1.7.1",
|
"leaflet": "~1.7.1",
|
||||||
"marked": "~4.0.19",
|
"marked": "~12.0.0",
|
||||||
"moment": "~2.29.4",
|
"mini-css-extract-plugin": "~2.4.5",
|
||||||
"mysql2": "~3.5.2",
|
"moment": "~2.30.1",
|
||||||
|
"mysql2": "~3.9.1",
|
||||||
"node-firebird": "~1.1.4",
|
"node-firebird": "~1.1.4",
|
||||||
"pg": "~8.11.1",
|
"node-loader": "~2.0.0",
|
||||||
|
"pg": "~8.11.3",
|
||||||
"pg-connection-string": "~2.5.0",
|
"pg-connection-string": "~2.5.0",
|
||||||
"pg-query-stream": "~4.2.3",
|
"pg-query-stream": "~4.2.3",
|
||||||
"pgsql-ast-parser": "~7.2.1",
|
"pgsql-ast-parser": "~7.2.1",
|
||||||
"pinia": "~2.1.6",
|
"pinia": "~2.1.7",
|
||||||
|
"postcss-html": "~1.5.0",
|
||||||
|
"progress-webpack-plugin": "~1.0.12",
|
||||||
|
"rimraf": "~3.0.2",
|
||||||
|
"sass": "~1.42.1",
|
||||||
|
"sass-loader": "~12.3.0",
|
||||||
"source-map-support": "~0.5.20",
|
"source-map-support": "~0.5.20",
|
||||||
"spectre.css": "~0.5.9",
|
"spectre.css": "~0.5.9",
|
||||||
"sql-formatter": "~13.0.0",
|
"sql-formatter": "~13.0.0",
|
||||||
"sql-highlight": "~4.4.0",
|
"sql-highlight": "~4.4.0",
|
||||||
|
"style-loader": "~3.3.1",
|
||||||
|
"tree-kill": "~1.2.2",
|
||||||
|
"ts-loader": "~9.2.8",
|
||||||
|
"typescript": "~4.6.3",
|
||||||
|
"unzip-crx-3": "~0.2.0",
|
||||||
"v-mask": "~2.3.0",
|
"v-mask": "~2.3.0",
|
||||||
"vue": "~3.3.4",
|
"vue": "~3.4.19",
|
||||||
"vue-i18n": "~9.2.2",
|
"vue-i18n": "~9.2.2",
|
||||||
"vuedraggable": "~4.1.0"
|
"vue-loader": "~16.8.3",
|
||||||
|
"vuedraggable": "~4.1.0",
|
||||||
|
"webpack": "~5.72.0",
|
||||||
|
"webpack-cli": "~4.9.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/eslint-parser": "~7.15.7",
|
"@babel/eslint-parser": "~7.15.7",
|
||||||
"@babel/preset-env": "~7.15.8",
|
"@babel/preset-env": "~7.15.8",
|
||||||
"@babel/preset-typescript": "~7.16.7",
|
"@babel/preset-typescript": "~7.16.7",
|
||||||
|
"@commitlint/cli": "~19.0.3",
|
||||||
|
"@commitlint/config-conventional": "~19.0.3",
|
||||||
"@playwright/test": "~1.28.1",
|
"@playwright/test": "~1.28.1",
|
||||||
"@types/better-sqlite3": "~7.5.0",
|
"@types/better-sqlite3": "~7.5.0",
|
||||||
"@types/leaflet": "~1.7.9",
|
"@types/leaflet": "~1.7.9",
|
||||||
@@ -166,13 +191,8 @@
|
|||||||
"@types/ssh2": "~1.11.6",
|
"@types/ssh2": "~1.11.6",
|
||||||
"@typescript-eslint/eslint-plugin": "~5.18.0",
|
"@typescript-eslint/eslint-plugin": "~5.18.0",
|
||||||
"@typescript-eslint/parser": "~5.18.0",
|
"@typescript-eslint/parser": "~5.18.0",
|
||||||
"@vue/compiler-sfc": "~3.2.33",
|
|
||||||
"all-contributors-cli": "~6.20.0",
|
"all-contributors-cli": "~6.20.0",
|
||||||
"babel-loader": "~8.2.3",
|
"electron": "~26.6.9",
|
||||||
"chalk": "~4.1.2",
|
|
||||||
"cross-env": "~7.0.2",
|
|
||||||
"css-loader": "~6.5.0",
|
|
||||||
"electron": "~22.3.27",
|
|
||||||
"electron-builder": "~24.6.4",
|
"electron-builder": "~24.6.4",
|
||||||
"eslint": "~7.32.0",
|
"eslint": "~7.32.0",
|
||||||
"eslint-config-standard": "~16.0.3",
|
"eslint-config-standard": "~16.0.3",
|
||||||
@@ -181,32 +201,16 @@
|
|||||||
"eslint-plugin-promise": "~5.2.0",
|
"eslint-plugin-promise": "~5.2.0",
|
||||||
"eslint-plugin-simple-import-sort": "~10.0.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",
|
"husky": "~9.0.11",
|
||||||
"html-webpack-plugin": "~5.5.0",
|
|
||||||
"mini-css-extract-plugin": "~2.4.5",
|
|
||||||
"node-loader": "~2.0.0",
|
|
||||||
"playwright": "~1.28.1",
|
"playwright": "~1.28.1",
|
||||||
"playwright-core": "~1.28.1",
|
"playwright-core": "~1.28.1",
|
||||||
"postcss-html": "~1.5.0",
|
|
||||||
"progress-webpack-plugin": "~1.0.12",
|
|
||||||
"rimraf": "~3.0.2",
|
|
||||||
"sass": "~1.42.1",
|
|
||||||
"sass-loader": "~12.3.0",
|
|
||||||
"standard-version": "~9.3.1",
|
"standard-version": "~9.3.1",
|
||||||
"style-loader": "~3.3.1",
|
|
||||||
"stylelint": "^15.11.0",
|
"stylelint": "^15.11.0",
|
||||||
"stylelint-config-recommended-vue": "~1.5.0",
|
"stylelint-config-recommended-vue": "~1.5.0",
|
||||||
"stylelint-config-standard": "~34.0.0",
|
"stylelint-config-standard": "~34.0.0",
|
||||||
"stylelint-scss": "~5.3.0",
|
"stylelint-scss": "~5.3.0",
|
||||||
"tree-kill": "~1.2.2",
|
|
||||||
"ts-loader": "~9.2.8",
|
|
||||||
"ts-node": "~10.9.1",
|
"ts-node": "~10.9.1",
|
||||||
"typescript": "~4.6.3",
|
|
||||||
"unzip-crx-3": "~0.2.0",
|
|
||||||
"vue-eslint-parser": "~8.3.0",
|
"vue-eslint-parser": "~8.3.0",
|
||||||
"vue-loader": "~16.8.3",
|
|
||||||
"webpack": "~5.72.0",
|
|
||||||
"webpack-cli": "~4.9.1",
|
|
||||||
"webpack-dev-server": "~4.11.1",
|
"webpack-dev-server": "~4.11.1",
|
||||||
"xvfb-maybe": "~0.2.1"
|
"xvfb-maybe": "~0.2.1"
|
||||||
}
|
}
|
||||||
|
@@ -19,6 +19,7 @@ export const defaults: Customizations = {
|
|||||||
sshConnection: false,
|
sshConnection: false,
|
||||||
fileConnection: false,
|
fileConnection: false,
|
||||||
cancelQueries: false,
|
cancelQueries: false,
|
||||||
|
singleConnectionMode: false,
|
||||||
// Tools
|
// Tools
|
||||||
processesList: false,
|
processesList: false,
|
||||||
usersManagement: false,
|
usersManagement: false,
|
||||||
|
@@ -29,6 +29,7 @@ export const customizations: Customizations = {
|
|||||||
sslConnection: true,
|
sslConnection: true,
|
||||||
sshConnection: true,
|
sshConnection: true,
|
||||||
cancelQueries: true,
|
cancelQueries: true,
|
||||||
|
singleConnectionMode: true,
|
||||||
// Tools
|
// Tools
|
||||||
processesList: true,
|
processesList: true,
|
||||||
// Structure
|
// Structure
|
||||||
|
@@ -52,6 +52,7 @@ export interface ConnectionParams {
|
|||||||
password: string;
|
password: string;
|
||||||
ask: boolean;
|
ask: boolean;
|
||||||
readonly: boolean;
|
readonly: boolean;
|
||||||
|
singleConnectionMode: boolean;
|
||||||
ssl: boolean;
|
ssl: boolean;
|
||||||
cert?: string;
|
cert?: string;
|
||||||
key?: string;
|
key?: string;
|
||||||
|
@@ -19,6 +19,7 @@ export interface Customizations {
|
|||||||
sshConnection?: boolean;
|
sshConnection?: boolean;
|
||||||
fileConnection?: boolean;
|
fileConnection?: boolean;
|
||||||
cancelQueries?: boolean;
|
cancelQueries?: boolean;
|
||||||
|
singleConnectionMode?: boolean;
|
||||||
// Tools
|
// Tools
|
||||||
processesList?: boolean;
|
processesList?: boolean;
|
||||||
usersManagement?: boolean;
|
usersManagement?: boolean;
|
||||||
|
@@ -146,7 +146,7 @@ export default (connections: Record<string, antares.Client>) => {
|
|||||||
uid: conn.uid,
|
uid: conn.uid,
|
||||||
client: conn.client,
|
client: conn.client,
|
||||||
params,
|
params,
|
||||||
poolSize: 5
|
poolSize: conn.singleConnectionMode ? 0 : 5
|
||||||
});
|
});
|
||||||
|
|
||||||
await connection.connect();
|
await connection.connect();
|
||||||
|
@@ -70,23 +70,21 @@ export class ShortcutRegister {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private setLocalShortcuts () {
|
private setLocalShortcuts () {
|
||||||
|
const isMenuVisible = process.platform === 'darwin';
|
||||||
|
const submenu = [];
|
||||||
for (const shortcut of this.shortcuts) {
|
for (const shortcut of this.shortcuts) {
|
||||||
if (shortcut.os.includes(process.platform)) {
|
if (shortcut.os.includes(process.platform)) {
|
||||||
for (const key of shortcut.keys) {
|
for (const key of shortcut.keys) {
|
||||||
try {
|
try {
|
||||||
this._menu.append(new MenuItem({
|
submenu.push({
|
||||||
label: '.',
|
label: String(shortcut.event),
|
||||||
visible: false,
|
accelerator: key,
|
||||||
submenu: [{
|
visible: isMenuVisible,
|
||||||
label: String(key),
|
click: () => {
|
||||||
accelerator: key,
|
this._mainWindow.webContents.send(shortcut.event);
|
||||||
visible: false,
|
if (isDevelopment) console.log('LOCAL EVENT:', shortcut);
|
||||||
click: () => {
|
}
|
||||||
this._mainWindow.webContents.send(shortcut.event);
|
});
|
||||||
if (isDevelopment) console.log('LOCAL EVENT:', shortcut);
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
if (isDevelopment) console.log(error);
|
if (isDevelopment) console.log(error);
|
||||||
@@ -96,6 +94,11 @@ export class ShortcutRegister {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this._menu.append(new MenuItem({
|
||||||
|
label: 'Shortcut',
|
||||||
|
visible: isMenuVisible,
|
||||||
|
submenu
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
private setGlobalShortcuts () {
|
private setGlobalShortcuts () {
|
||||||
|
@@ -12,6 +12,7 @@ export class MySQLClient extends BaseClient {
|
|||||||
private _connectionsToCommit: Map<string, mysql.Connection | mysql.PoolConnection>;
|
private _connectionsToCommit: Map<string, mysql.Connection | mysql.PoolConnection>;
|
||||||
private _keepaliveTimer: NodeJS.Timer;
|
private _keepaliveTimer: NodeJS.Timer;
|
||||||
private _keepaliveMs: number;
|
private _keepaliveMs: number;
|
||||||
|
private sqlMode?: string[];
|
||||||
_connection?: mysql.Connection | mysql.Pool;
|
_connection?: mysql.Connection | mysql.Pool;
|
||||||
_params: mysql.ConnectionOptions & {schema: string; ssl?: mysql.SslOptions; ssh?: SSHConfig; readonly: boolean};
|
_params: mysql.ConnectionOptions & {schema: string; ssl?: mysql.SslOptions; ssh?: SSHConfig; readonly: boolean};
|
||||||
|
|
||||||
@@ -58,6 +59,10 @@ export class MySQLClient extends BaseClient {
|
|||||||
this._keepaliveMs = 10*60*1000;
|
this._keepaliveMs = 10*60*1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private get isPool () {
|
||||||
|
return 'getConnection' in this._connection;
|
||||||
|
}
|
||||||
|
|
||||||
private _getType (field: mysql.FieldPacket & { columnType?: number; columnLength?: number }) {
|
private _getType (field: mysql.FieldPacket & { columnType?: number; columnLength?: number }) {
|
||||||
let name = this.types[field.columnType];
|
let name = this.types[field.columnType];
|
||||||
let length = field.columnLength;
|
let length = field.columnLength;
|
||||||
@@ -181,9 +186,32 @@ export class MySQLClient extends BaseClient {
|
|||||||
|
|
||||||
async connect () {
|
async connect () {
|
||||||
if (!this._poolSize)
|
if (!this._poolSize)
|
||||||
this._connection = await this.getConnection();
|
this._connection = await this.getSingleConnection();
|
||||||
else
|
else
|
||||||
this._connection = await this.getConnectionPool();
|
this._connection = await this.getConnectionPool();
|
||||||
|
|
||||||
|
// ANSI_QUOTES check
|
||||||
|
const [response] = await this._connection.query<mysql.RowDataPacket[]>('SHOW GLOBAL VARIABLES LIKE \'%sql_mode%\'');
|
||||||
|
this.sqlMode = response[0]?.Value?.split(',');
|
||||||
|
const hasAnsiQuotes = this.sqlMode.includes('ANSI') || this.sqlMode.includes('ANSI_QUOTES');
|
||||||
|
|
||||||
|
if (hasAnsiQuotes)
|
||||||
|
await this._connection.query(`SET SESSION sql_mode = '${this.sqlMode.filter((m: string) => !['ANSI', 'ANSI_QUOTES'].includes(m)).join(',')}'`);
|
||||||
|
|
||||||
|
if (this._params.readonly)
|
||||||
|
await this._connection.query('SET SESSION TRANSACTION READ ONLY');
|
||||||
|
|
||||||
|
if (this._poolSize) {
|
||||||
|
const hasAnsiQuotes = this.sqlMode.includes('ANSI') || this.sqlMode.includes('ANSI_QUOTES');
|
||||||
|
|
||||||
|
this._connection.on('connection', conn => {
|
||||||
|
if (this._params.readonly)
|
||||||
|
conn.query('SET SESSION TRANSACTION READ ONLY');
|
||||||
|
|
||||||
|
if (hasAnsiQuotes)
|
||||||
|
conn.query(`SET SESSION sql_mode = '${this.sqlMode.filter((m: string) => !['ANSI', 'ANSI_QUOTES'].includes(m)).join(',')}'`);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
destroy () {
|
destroy () {
|
||||||
@@ -196,7 +224,7 @@ export class MySQLClient extends BaseClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async getConnection () {
|
async getSingleConnection () {
|
||||||
const dbConfig = await this.getDbConfig();
|
const dbConfig = await this.getDbConfig();
|
||||||
const connection = await mysql.createConnection({
|
const connection = await mysql.createConnection({
|
||||||
...dbConfig,
|
...dbConfig,
|
||||||
@@ -208,17 +236,6 @@ export class MySQLClient extends BaseClient {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// ANSI_QUOTES check
|
|
||||||
const [response] = await connection.query<mysql.RowDataPacket[]>('SHOW GLOBAL VARIABLES LIKE \'%sql_mode%\'');
|
|
||||||
const sqlMode: string[] = response[0]?.Value?.split(',');
|
|
||||||
const hasAnsiQuotes = sqlMode.includes('ANSI') || sqlMode.includes('ANSI_QUOTES');
|
|
||||||
|
|
||||||
if (this._params.readonly)
|
|
||||||
await connection.query('SET SESSION TRANSACTION READ ONLY');
|
|
||||||
|
|
||||||
if (hasAnsiQuotes)
|
|
||||||
await connection.query(`SET SESSION sql_mode = '${sqlMode.filter((m: string) => !['ANSI', 'ANSI_QUOTES'].includes(m)).join(',')}'`);
|
|
||||||
|
|
||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,6 +244,7 @@ export class MySQLClient extends BaseClient {
|
|||||||
const connection = mysql.createPool({
|
const connection = mysql.createPool({
|
||||||
...dbConfig,
|
...dbConfig,
|
||||||
connectionLimit: this._poolSize,
|
connectionLimit: this._poolSize,
|
||||||
|
enableKeepAlive: true,
|
||||||
typeCast: (field, next) => {
|
typeCast: (field, next) => {
|
||||||
if (field.type === 'DATETIME')
|
if (field.type === 'DATETIME')
|
||||||
return field.string();
|
return field.string();
|
||||||
@@ -235,25 +253,6 @@ export class MySQLClient extends BaseClient {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// ANSI_QUOTES check
|
|
||||||
const [res] = await connection.query<mysql.RowDataPacket[]>('SHOW GLOBAL VARIABLES LIKE \'%sql_mode%\'');
|
|
||||||
const sqlMode: string[] = res[0]?.Value?.split(',');
|
|
||||||
const hasAnsiQuotes = sqlMode.includes('ANSI') || sqlMode.includes('ANSI_QUOTES');
|
|
||||||
|
|
||||||
if (hasAnsiQuotes)
|
|
||||||
await connection.query(`SET SESSION sql_mode = '${sqlMode.filter((m: string) => !['ANSI', 'ANSI_QUOTES'].includes(m)).join(',')}'`);
|
|
||||||
|
|
||||||
if (this._params.readonly)
|
|
||||||
await connection.query('SET SESSION TRANSACTION READ ONLY');
|
|
||||||
|
|
||||||
connection.on('connection', conn => {
|
|
||||||
if (this._params.readonly)
|
|
||||||
conn.query('SET SESSION TRANSACTION READ ONLY');
|
|
||||||
|
|
||||||
if (hasAnsiQuotes)
|
|
||||||
conn.query(`SET SESSION sql_mode = '${sqlMode.filter((m: string) => !['ANSI', 'ANSI_QUOTES'].includes(m)).join(',')}'`);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._keepaliveTimer = setInterval(async () => {
|
this._keepaliveTimer = setInterval(async () => {
|
||||||
await this.keepAlive();
|
await this.keepAlive();
|
||||||
}, this._keepaliveMs);
|
}, this._keepaliveMs);
|
||||||
@@ -261,6 +260,43 @@ export class MySQLClient extends BaseClient {
|
|||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getConnection (args?: antares.QueryParams, retry?: boolean): Promise<mysql.Pool | mysql.PoolConnection | mysql.Connection> {
|
||||||
|
let connection;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (args && !args.autocommit && args.tabUid) { // autocommit OFF
|
||||||
|
if (this._connectionsToCommit.has(args.tabUid))
|
||||||
|
connection = this._connectionsToCommit.get(args.tabUid);
|
||||||
|
else {
|
||||||
|
connection = await this.getSingleConnection();
|
||||||
|
await connection.query('SET SESSION autocommit=0');
|
||||||
|
this._connectionsToCommit.set(args.tabUid, connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else// autocommit ON
|
||||||
|
connection = this.isPool ? await (this._connection as mysql.Pool).getConnection() : this._connection;
|
||||||
|
|
||||||
|
if (args && args.tabUid && this.isPool) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
this._runningConnections.set(args.tabUid, (connection as any).connection.connectionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args && args.schema)
|
||||||
|
await connection.query(`USE \`${args.schema}\``);
|
||||||
|
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
if (error.code === 'ECONNRESET' && !retry) {
|
||||||
|
this.destroy();
|
||||||
|
await this.connect();
|
||||||
|
return this.getConnection(args, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw new Error(error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async keepAlive () {
|
private async keepAlive () {
|
||||||
try {
|
try {
|
||||||
const connection = await (this._connection as mysql.Pool).getConnection();
|
const connection = await (this._connection as mysql.Pool).getConnection();
|
||||||
@@ -591,7 +627,7 @@ export class MySQLClient extends BaseClient {
|
|||||||
return rows.map((field) => {
|
return rows.map((field) => {
|
||||||
const numLengthMatch = field.COLUMN_TYPE.match(/int\(([^)]+)\)/);
|
const numLengthMatch = field.COLUMN_TYPE.match(/int\(([^)]+)\)/);
|
||||||
const numLength = numLengthMatch ? +numLengthMatch.pop() : field.NUMERIC_PRECISION || null;
|
const numLength = numLengthMatch ? +numLengthMatch.pop() : field.NUMERIC_PRECISION || null;
|
||||||
const enumValues = /(enum)/.test(field.COLUMN_TYPE)
|
const enumValues = /(enum|set)/.test(field.COLUMN_TYPE)
|
||||||
? field.COLUMN_TYPE.match(/\(([^)]+)\)/)[0].slice(1, -1)
|
? field.COLUMN_TYPE.match(/\(([^)]+)\)/)[0].slice(1, -1)
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
@@ -1648,28 +1684,7 @@ export class MySQLClient extends BaseClient {
|
|||||||
.map(q => q.trim())
|
.map(q => q.trim())
|
||||||
: [sql];
|
: [sql];
|
||||||
|
|
||||||
let connection: mysql.Connection | mysql.Pool | mysql.PoolConnection;
|
const connection = await this.getConnection(args);
|
||||||
const isPool = 'getConnection' in this._connection;
|
|
||||||
|
|
||||||
if (!args.autocommit && args.tabUid) { // autocommit OFF
|
|
||||||
if (this._connectionsToCommit.has(args.tabUid))
|
|
||||||
connection = this._connectionsToCommit.get(args.tabUid);
|
|
||||||
else {
|
|
||||||
connection = await this.getConnection();
|
|
||||||
await connection.query('SET SESSION autocommit=0');
|
|
||||||
this._connectionsToCommit.set(args.tabUid, connection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else// autocommit ON
|
|
||||||
connection = isPool ? await (this._connection as mysql.Pool).getConnection() : this._connection;
|
|
||||||
|
|
||||||
if (args.tabUid && isPool) {
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
||||||
this._runningConnections.set(args.tabUid, (connection as any).connection.connectionId);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.schema)
|
|
||||||
await connection.query(`USE \`${args.schema}\``);
|
|
||||||
|
|
||||||
for (const query of queries) {
|
for (const query of queries) {
|
||||||
if (!query) continue;
|
if (!query) continue;
|
||||||
@@ -1729,7 +1744,7 @@ export class MySQLClient extends BaseClient {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
if (isPool && args.autocommit) {
|
if (this.isPool && args.autocommit) {
|
||||||
(connection as mysql.PoolConnection).release();
|
(connection as mysql.PoolConnection).release();
|
||||||
this._runningConnections.delete(args.tabUid);
|
this._runningConnections.delete(args.tabUid);
|
||||||
}
|
}
|
||||||
@@ -1741,7 +1756,7 @@ export class MySQLClient extends BaseClient {
|
|||||||
keysArr = keysArr ? [...keysArr, ...response] : response;
|
keysArr = keysArr ? [...keysArr, ...response] : response;
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
if (isPool && args.autocommit) {
|
if (this.isPool && args.autocommit) {
|
||||||
(connection as mysql.PoolConnection).release();
|
(connection as mysql.PoolConnection).release();
|
||||||
this._runningConnections.delete(args.tabUid);
|
this._runningConnections.delete(args.tabUid);
|
||||||
}
|
}
|
||||||
@@ -1759,7 +1774,7 @@ export class MySQLClient extends BaseClient {
|
|||||||
keys: keysArr
|
keys: keysArr
|
||||||
});
|
});
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
if (isPool && args.autocommit) {
|
if (this.isPool && args.autocommit) {
|
||||||
(connection as mysql.PoolConnection).release();
|
(connection as mysql.PoolConnection).release();
|
||||||
this._runningConnections.delete(args.tabUid);
|
this._runningConnections.delete(args.tabUid);
|
||||||
}
|
}
|
||||||
@@ -1776,7 +1791,7 @@ export class MySQLClient extends BaseClient {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPool && args.autocommit) {
|
if (this.isPool && args.autocommit) {
|
||||||
(connection as mysql.PoolConnection).release();
|
(connection as mysql.PoolConnection).release();
|
||||||
this._runningConnections.delete(args.tabUid);
|
this._runningConnections.delete(args.tabUid);
|
||||||
}
|
}
|
||||||
|
@@ -127,8 +127,8 @@ app.on('ready', async () => {
|
|||||||
if (isWindows)
|
if (isWindows)
|
||||||
mainWindow.show();
|
mainWindow.show();
|
||||||
|
|
||||||
// if (isDevelopment)
|
if (isDevelopment && !isWindows)// Because on Windows you can open devtools from title-bar
|
||||||
// mainWindow.webContents.openDevTools();
|
mainWindow.webContents.openDevTools();
|
||||||
|
|
||||||
process.on('uncaughtException', error => {
|
process.on('uncaughtException', error => {
|
||||||
mainWindow.webContents.send('unhandled-exception', error);
|
mainWindow.webContents.send('unhandled-exception', error);
|
||||||
|
@@ -115,7 +115,7 @@
|
|||||||
<BaseIcon icon-name="mdiHistory" :size="48" />
|
<BaseIcon icon-name="mdiHistory" :size="48" />
|
||||||
</div>
|
</div>
|
||||||
<p class="empty-title h5">
|
<p class="empty-title h5">
|
||||||
{{ t('database.thereIsNoQueriesYet') }}
|
{{ t('database.thereAreNoQueriesYet') }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -15,6 +15,56 @@
|
|||||||
:size="18"
|
:size="18"
|
||||||
/> {{ t('connection.disconnect') }}</span>
|
/> {{ t('connection.disconnect') }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-if="!contextConnection.isFolder" class="context-element">
|
||||||
|
<span class="d-flex">
|
||||||
|
<BaseIcon
|
||||||
|
class="text-light mt-1 mr-1"
|
||||||
|
icon-name="mdiFolderMove"
|
||||||
|
:size="18"
|
||||||
|
/> {{ t('general.moveTo') }}</span>
|
||||||
|
<BaseIcon
|
||||||
|
class="text-light ml-1"
|
||||||
|
icon-name="mdiChevronRight"
|
||||||
|
:size="18"
|
||||||
|
/>
|
||||||
|
<div class="context-submenu">
|
||||||
|
<div class="context-element" @click.stop="moveToFolder(null)">
|
||||||
|
<span class="d-flex">
|
||||||
|
<BaseIcon
|
||||||
|
class="text-light mt-1 mr-1"
|
||||||
|
icon-name="mdiFolderPlus"
|
||||||
|
:size="18"
|
||||||
|
/> {{ t('application.newFolder') }}</span>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-for="folder in filteredFolders"
|
||||||
|
:key="folder.uid"
|
||||||
|
class="context-element"
|
||||||
|
@click.stop="moveToFolder(folder.uid)"
|
||||||
|
>
|
||||||
|
<span class="d-flex">
|
||||||
|
<BaseIcon
|
||||||
|
class="text-light mt-1 mr-1"
|
||||||
|
icon-name="mdiFolder"
|
||||||
|
:size="18"
|
||||||
|
:style="`color: ${folder.color}!important`"
|
||||||
|
/> {{ folder.name || t('general.folder') }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
v-if="isInFolder"
|
||||||
|
class="context-element"
|
||||||
|
@click="outOfFolder"
|
||||||
|
>
|
||||||
|
<span class="d-flex">
|
||||||
|
<BaseIcon
|
||||||
|
class="text-light mt-1 mr-1"
|
||||||
|
icon-name="mdiFolderOff"
|
||||||
|
:size="18"
|
||||||
|
/> {{ t('application.outOfFolder') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="context-element" @click.stop="showAppearanceModal">
|
<div class="context-element" @click.stop="showAppearanceModal">
|
||||||
<span class="d-flex">
|
<span class="d-flex">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
@@ -79,6 +129,7 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { uidGen } from 'common/libs/uidGen';
|
import { uidGen } from 'common/libs/uidGen';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
import { computed, Prop, ref } from 'vue';
|
import { computed, Prop, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
@@ -98,9 +149,14 @@ const {
|
|||||||
getConnectionByUid,
|
getConnectionByUid,
|
||||||
getConnectionName,
|
getConnectionName,
|
||||||
addConnection,
|
addConnection,
|
||||||
deleteConnection
|
deleteConnection,
|
||||||
|
addFolder,
|
||||||
|
addToFolder,
|
||||||
|
removeFromFolders
|
||||||
} = connectionsStore;
|
} = connectionsStore;
|
||||||
|
|
||||||
|
const { getFolders: folders } = storeToRefs(connectionsStore);
|
||||||
|
|
||||||
const workspacesStore = useWorkspacesStore();
|
const workspacesStore = useWorkspacesStore();
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@@ -121,6 +177,8 @@ const isConnectionEdit = ref(false);
|
|||||||
|
|
||||||
const connectionName = computed(() => props.contextConnection.name || getConnectionName(props.contextConnection.uid) || t('general.folder', 1));
|
const connectionName = computed(() => props.contextConnection.name || getConnectionName(props.contextConnection.uid) || t('general.folder', 1));
|
||||||
const isConnected = computed(() => getWorkspace(props.contextConnection.uid)?.connectionStatus === 'connected');
|
const isConnected = computed(() => getWorkspace(props.contextConnection.uid)?.connectionStatus === 'connected');
|
||||||
|
const filteredFolders = computed(() => folders.value.filter(f => !f.connections.includes(props.contextConnection.uid)));
|
||||||
|
const isInFolder = computed(() => folders.value.some(f => f.connections.includes(props.contextConnection.uid)));
|
||||||
|
|
||||||
const confirmDeleteConnection = () => {
|
const confirmDeleteConnection = () => {
|
||||||
if (isConnected.value)
|
if (isConnected.value)
|
||||||
@@ -129,6 +187,27 @@ const confirmDeleteConnection = () => {
|
|||||||
closeContext();
|
closeContext();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const moveToFolder = (folderUid?: string) => {
|
||||||
|
if (!folderUid) {
|
||||||
|
addFolder({
|
||||||
|
connections: [props.contextConnection.uid]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
addToFolder({
|
||||||
|
folder: folderUid,
|
||||||
|
connection: props.contextConnection.uid
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
closeContext();
|
||||||
|
};
|
||||||
|
|
||||||
|
const outOfFolder = () => {
|
||||||
|
removeFromFolders(props.contextConnection.uid);
|
||||||
|
closeContext();
|
||||||
|
};
|
||||||
|
|
||||||
const duplicateConnection = () => {
|
const duplicateConnection = () => {
|
||||||
let connectionCopy = getConnectionByUid(props.contextConnection.uid);
|
let connectionCopy = getConnectionByUid(props.contextConnection.uid);
|
||||||
connectionCopy = {
|
connectionCopy = {
|
||||||
|
@@ -186,7 +186,7 @@ if (!connectionsArr.value.length)
|
|||||||
.settingbar-top-elements {
|
.settingbar-top-elements {
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
overflow-y: overlay;
|
overflow-y: overlay;
|
||||||
// max-height: calc((100vh - 3.5rem) - #{$excluding-size});
|
width: 100%;
|
||||||
|
|
||||||
&::-webkit-scrollbar {
|
&::-webkit-scrollbar {
|
||||||
width: 3px;
|
width: 3px;
|
||||||
|
@@ -163,22 +163,30 @@
|
|||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="clientCustomizations.readOnlyMode" class="form-group columns">
|
<div v-if="clientCustomizations.readOnlyMode" class="form-group columns mb-0">
|
||||||
<div class="column col-5 col-sm-12" />
|
<div class="column col-5 col-sm-12" />
|
||||||
<div class="column col-7 col-sm-12">
|
<div class="column col-7 col-sm-12">
|
||||||
<label class="form-checkbox form-inline">
|
<label class="form-checkbox form-inline my-0">
|
||||||
<input v-model="connection.readonly" type="checkbox"><i class="form-icon" /> {{ t('connection.readOnlyMode') }}
|
<input v-model="connection.readonly" type="checkbox"><i class="form-icon" /> {{ t('connection.readOnlyMode') }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!clientCustomizations.fileConnection" class="form-group columns">
|
<div v-if="!clientCustomizations.fileConnection" class="form-group columns mb-0">
|
||||||
<div class="column col-5 col-sm-12" />
|
<div class="column col-5 col-sm-12" />
|
||||||
<div class="column col-7 col-sm-12">
|
<div class="column col-7 col-sm-12">
|
||||||
<label class="form-checkbox form-inline">
|
<label class="form-checkbox form-inline my-0">
|
||||||
<input v-model="connection.ask" type="checkbox"><i class="form-icon" /> {{ t('connection.askCredentials') }}
|
<input v-model="connection.ask" type="checkbox"><i class="form-icon" /> {{ t('connection.askCredentials') }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-if="clientCustomizations.singleConnectionMode" class="form-group columns mb-0">
|
||||||
|
<div class="column col-5 col-sm-12" />
|
||||||
|
<div class="column col-7 col-sm-12">
|
||||||
|
<label class="form-checkbox form-inline my-0">
|
||||||
|
<input v-model="connection.singleConnectionMode" type="checkbox"><i class="form-icon" /> {{ t('connection.singleConnection') }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -165,22 +165,30 @@
|
|||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="clientCustomizations.readOnlyMode" class="form-group columns">
|
<div v-if="clientCustomizations.readOnlyMode" class="form-group columns mb-0">
|
||||||
<div class="column col-5 col-sm-12" />
|
<div class="column col-5 col-sm-12" />
|
||||||
<div class="column col-7 col-sm-12">
|
<div class="column col-7 col-sm-12">
|
||||||
<label class="form-checkbox form-inline">
|
<label class="form-checkbox form-inline my-0">
|
||||||
<input v-model="localConnection.readonly" type="checkbox"><i class="form-icon" /> {{ t('connection.readOnlyMode') }}
|
<input v-model="localConnection.readonly" type="checkbox"><i class="form-icon" /> {{ t('connection.readOnlyMode') }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!clientCustomizations.fileConnection" class="form-group columns">
|
<div v-if="!clientCustomizations.fileConnection" class="form-group columns mb-0">
|
||||||
<div class="column col-5 col-sm-12" />
|
<div class="column col-5 col-sm-12" />
|
||||||
<div class="column col-7 col-sm-12">
|
<div class="column col-7 col-sm-12">
|
||||||
<label class="form-checkbox form-inline">
|
<label class="form-checkbox form-inline my-0">
|
||||||
<input v-model="localConnection.ask" type="checkbox"><i class="form-icon" /> {{ t('connection.askCredentials') }}
|
<input v-model="localConnection.ask" type="checkbox"><i class="form-icon" /> {{ t('connection.askCredentials') }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-if="clientCustomizations.singleConnectionMode" class="form-group columns mb-0">
|
||||||
|
<div class="column col-5 col-sm-12" />
|
||||||
|
<div class="column col-7 col-sm-12">
|
||||||
|
<label class="form-checkbox form-inline my-0">
|
||||||
|
<input v-model="localConnection.singleConnectionMode" type="checkbox"><i class="form-icon" /> {{ t('connection.singleConnection') }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -101,7 +101,13 @@ const props = defineProps({
|
|||||||
selectedField: Object
|
selectedField: Object
|
||||||
});
|
});
|
||||||
|
|
||||||
const emit = defineEmits(['close-context', 'duplicate-selected', 'delete-selected', 'add-new-index', 'add-to-index']);
|
const emit = defineEmits([
|
||||||
|
'close-context',
|
||||||
|
'duplicate-selected',
|
||||||
|
'delete-selected',
|
||||||
|
'add-new-index',
|
||||||
|
'add-to-index'
|
||||||
|
]);
|
||||||
|
|
||||||
const hasPrimary = computed(() => props.indexes.some(index => index.type === 'PRIMARY'));
|
const hasPrimary = computed(() => props.indexes.some(index => index.type === 'PRIMARY'));
|
||||||
|
|
||||||
|
@@ -150,7 +150,13 @@ const props = defineProps({
|
|||||||
mode: String
|
mode: String
|
||||||
});
|
});
|
||||||
|
|
||||||
const emit = defineEmits(['add-new-index', 'add-to-index', 'rename-field', 'duplicate-field', 'remove-field']);
|
const emit = defineEmits([
|
||||||
|
'add-new-index',
|
||||||
|
'add-to-index',
|
||||||
|
'rename-field',
|
||||||
|
'duplicate-field',
|
||||||
|
'remove-field'
|
||||||
|
]);
|
||||||
|
|
||||||
const workspacesStore = useWorkspacesStore();
|
const workspacesStore = useWorkspacesStore();
|
||||||
const consoleStore = useConsoleStore();
|
const consoleStore = useConsoleStore();
|
||||||
|
@@ -31,7 +31,7 @@
|
|||||||
:class="{ 'active': resultsetIndex === index }"
|
:class="{ 'active': resultsetIndex === index }"
|
||||||
@click="selectResultset(index)"
|
@click="selectResultset(index)"
|
||||||
>
|
>
|
||||||
<a>{{ result.fields ? result.fields[0]?.table : '' }} ({{ result.rows.length }})</a>
|
<a>{{ result.fields ? result.fields[0]?.tableAlias ?? result.fields[0]?.table : `${t('general.results')} #${index}` }} ({{ result.rows.length }})</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div ref="table" class="table table-hover">
|
<div ref="table" class="table table-hover">
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
:title="`${field.type} ${fieldLength(field) ? `(${fieldLength(field)})` : ''}`"
|
:title="`${field.type} ${fieldLength(field) ? `(${fieldLength(field)})` : ''}`"
|
||||||
>
|
>
|
||||||
<div ref="columnResize" class="column-resizable">
|
<div ref="columnResize" class="column-resizable">
|
||||||
<div class="table-column-title" @click="sort(field.name)">
|
<div class="table-column-title" @click="sort(field)">
|
||||||
<div v-if="field.key" :title="keyName(field.key)">
|
<div v-if="field.key" :title="keyName(field.key)">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
icon-name="mdiKey"
|
icon-name="mdiKey"
|
||||||
@@ -56,8 +56,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<span>{{ field.alias || field.name }}</span>
|
<span>{{ field.alias || field.name }}</span>
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
v-if="isSortable && currentSort === field.name || currentSort === `${field.table}.${field.name}`"
|
v-if="isSortable && currentSort[resultsetIndex]?.field === field.name || currentSort[resultsetIndex]?.field === `${field.tableAlias || field.table}.${field.name}`"
|
||||||
:icon-name="currentSortDir === 'asc' ? 'mdiSortAscending' : 'mdiSortDescending'"
|
:icon-name="currentSort[resultsetIndex].dir === 'asc' ? 'mdiSortAscending' : 'mdiSortDescending'"
|
||||||
:size="18"
|
:size="18"
|
||||||
class="sort-icon ml-1"
|
class="sort-icon ml-1"
|
||||||
/>
|
/>
|
||||||
@@ -292,6 +292,10 @@ const props = defineProps({
|
|||||||
results: Array as Prop<QueryResult[]>,
|
results: Array as Prop<QueryResult[]>,
|
||||||
connUid: String,
|
connUid: String,
|
||||||
mode: String as Prop<'table' | 'query'>,
|
mode: String as Prop<'table' | 'query'>,
|
||||||
|
page: {
|
||||||
|
type: Number,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
isSelected: Boolean,
|
isSelected: Boolean,
|
||||||
elementType: { type: String, default: 'table' }
|
elementType: { type: String, default: 'table' }
|
||||||
});
|
});
|
||||||
@@ -314,8 +318,7 @@ const hasFocus = ref(false);
|
|||||||
const contextEvent = ref(null);
|
const contextEvent = ref(null);
|
||||||
const selectedCell = ref(null);
|
const selectedCell = ref(null);
|
||||||
const selectedRows = ref([]);
|
const selectedRows = ref([]);
|
||||||
const currentSort = ref('');
|
const currentSort: Ref<{field: string; dir: 'asc' | 'desc'}[]> = ref([]);
|
||||||
const currentSortDir = ref('asc');
|
|
||||||
const resultsetIndex = ref(0);
|
const resultsetIndex = ref(0);
|
||||||
const scrollElement = ref(null);
|
const scrollElement = ref(null);
|
||||||
const rowHeight = ref(23);
|
const rowHeight = ref(23);
|
||||||
@@ -358,14 +361,16 @@ const isHardSort = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const sortedResults = computed(() => {
|
const sortedResults = computed(() => {
|
||||||
if (currentSort.value && !isHardSort.value) {
|
if (currentSort.value[resultsetIndex.value] && !isHardSort.value) {
|
||||||
|
const sortObj = currentSort.value[resultsetIndex.value];
|
||||||
|
|
||||||
return [...localResults.value].sort((a: any, b: any) => {
|
return [...localResults.value].sort((a: any, b: any) => {
|
||||||
let modifier = 1;
|
let modifier = 1;
|
||||||
let valA = typeof a[currentSort.value] === 'string' ? a[currentSort.value].toLowerCase() : a[currentSort.value];
|
let valA = typeof a[sortObj.field] === 'string' ? a[sortObj.field].toLowerCase() : a[sortObj.field];
|
||||||
if (!isNaN(valA)) valA = Number(valA);
|
if (!isNaN(valA)) valA = Number(valA);
|
||||||
let valB = typeof b[currentSort.value] === 'string' ? b[currentSort.value].toLowerCase() : b[currentSort.value];
|
let valB = typeof b[sortObj.field] === 'string' ? b[sortObj.field].toLowerCase() : b[sortObj.field];
|
||||||
if (!isNaN(valB)) valB = Number(valB);
|
if (!isNaN(valB)) valB = Number(valB);
|
||||||
if (currentSortDir.value === 'desc') modifier = -1;
|
if (sortObj.dir === 'desc') modifier = -1;
|
||||||
if (valA < valB) return -1 * modifier;
|
if (valA < valB) return -1 * modifier;
|
||||||
if (valA > valB) return 1 * modifier;
|
if (valA > valB) return 1 * modifier;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -784,32 +789,42 @@ const contextMenu = (event: MouseEvent, cell: any) => {
|
|||||||
isContext.value = true;
|
isContext.value = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
const sort = (field: string) => {
|
const sort = (field: TableField) => {
|
||||||
if (!isSortable.value) return;
|
if (!isSortable.value) return;
|
||||||
|
|
||||||
selectedRows.value = [];
|
selectedRows.value = [];
|
||||||
|
let fieldName = field.name;
|
||||||
|
const hasTableInFieldname = Object.keys(localResults.value[0]).find(k => k !== '_antares_id').includes('.');
|
||||||
|
|
||||||
if (props.mode === 'query')
|
if (props.mode === 'query' && hasTableInFieldname)
|
||||||
field = `${getTable(resultsetIndex.value)}.${field}`;
|
fieldName = `${field.tableAlias || field.table}.${field.name}`;
|
||||||
|
|
||||||
if (field === currentSort.value) {
|
if (fieldName === currentSort.value[resultsetIndex.value]?.field) {
|
||||||
if (currentSortDir.value === 'asc')
|
if (currentSort.value[resultsetIndex.value].dir === 'asc')
|
||||||
currentSortDir.value = 'desc';
|
currentSort.value[resultsetIndex.value].dir = 'desc';
|
||||||
else
|
else
|
||||||
resetSort();
|
resetSort();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
currentSortDir.value = 'asc';
|
currentSort.value[resultsetIndex.value] = {
|
||||||
currentSort.value = field;
|
field: fieldName,
|
||||||
|
dir: 'asc'
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isHardSort.value)
|
if (isHardSort.value) {
|
||||||
emit('hard-sort', { field: currentSort.value, dir: currentSortDir.value });
|
emit('hard-sort', {
|
||||||
|
field: currentSort.value[resultsetIndex.value].field,
|
||||||
|
dir: currentSort.value[resultsetIndex.value].dir
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const resetSort = () => {
|
const resetSort = () => {
|
||||||
currentSort.value = '';
|
currentSort.value[resultsetIndex.value] = {
|
||||||
currentSortDir.value = 'asc';
|
field: null,
|
||||||
|
dir: 'asc'
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const selectResultset = (index: number) => {
|
const selectResultset = (index: number) => {
|
||||||
@@ -857,6 +872,7 @@ const downloadTable = (format: 'csv' | 'json' | 'sql' | 'php', table: string, po
|
|||||||
},
|
},
|
||||||
client: workspaceClient.value,
|
client: workspaceClient.value,
|
||||||
table,
|
table,
|
||||||
|
page: props.page,
|
||||||
sqlOptions: popup ? { ...sqlExportOptions.value } : null,
|
sqlOptions: popup ? { ...sqlExportOptions.value } : null,
|
||||||
csvOptions: popup ? { ...csvExportOptions.value } : null
|
csvOptions: popup ? { ...csvExportOptions.value } : null
|
||||||
});
|
});
|
||||||
|
@@ -43,6 +43,7 @@
|
|||||||
autofocus
|
autofocus
|
||||||
class="editable-field form-input input-sm px-1"
|
class="editable-field form-input input-sm px-1"
|
||||||
@blur="editOFF"
|
@blur="editOFF"
|
||||||
|
@keyup.delete.stop
|
||||||
>
|
>
|
||||||
<BaseSelect
|
<BaseSelect
|
||||||
v-else-if="inputProps.type === 'boolean'"
|
v-else-if="inputProps.type === 'boolean'"
|
||||||
@@ -50,6 +51,7 @@
|
|||||||
:options="['true', 'false']"
|
:options="['true', 'false']"
|
||||||
class="form-select small-select editable-field"
|
class="form-select small-select editable-field"
|
||||||
@blur="editOFF"
|
@blur="editOFF"
|
||||||
|
@keyup.delete.stop
|
||||||
/>
|
/>
|
||||||
<BaseSelect
|
<BaseSelect
|
||||||
v-else-if="enumArray"
|
v-else-if="enumArray"
|
||||||
@@ -58,6 +60,7 @@
|
|||||||
class="form-select small-select editable-field"
|
class="form-select small-select editable-field"
|
||||||
dropdown-class="small-select"
|
dropdown-class="small-select"
|
||||||
@blur="editOFF"
|
@blur="editOFF"
|
||||||
|
@keyup.delete.stop
|
||||||
/>
|
/>
|
||||||
<input
|
<input
|
||||||
v-else
|
v-else
|
||||||
@@ -67,6 +70,7 @@
|
|||||||
autofocus
|
autofocus
|
||||||
class="editable-field form-input input-sm px-1"
|
class="editable-field form-input input-sm px-1"
|
||||||
@blur="editOFF"
|
@blur="editOFF"
|
||||||
|
@keyup.delete.stop
|
||||||
>
|
>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
@@ -382,7 +386,7 @@ const isBaseSelectField = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const enumArray = computed(() => {
|
const enumArray = computed(() => {
|
||||||
if (props.fields[editingField.value] && props.fields[editingField.value].enumValues)
|
if (props.fields[editingField.value] && props.fields[editingField.value].enumValues && props.fields[editingField.value].type !== 'SET')
|
||||||
return props.fields[editingField.value].enumValues.replaceAll('\'', '').split(',');
|
return props.fields[editingField.value].enumValues.replaceAll('\'', '').split(',');
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
@@ -202,6 +202,7 @@
|
|||||||
v-if="results"
|
v-if="results"
|
||||||
ref="queryTable"
|
ref="queryTable"
|
||||||
:results="results"
|
:results="results"
|
||||||
|
:page="page"
|
||||||
:tab-uid="tabUid"
|
:tab-uid="tabUid"
|
||||||
:conn-uid="connection.uid"
|
:conn-uid="connection.uid"
|
||||||
:is-selected="isSelected"
|
:is-selected="isSelected"
|
||||||
|
@@ -232,7 +232,7 @@ export const caES = {
|
|||||||
newFunction: 'Nova funció',
|
newFunction: 'Nova funció',
|
||||||
newScheduler: 'Nou planificador',
|
newScheduler: 'Nou planificador',
|
||||||
newTriggerFunction: 'Nova funció de disparador',
|
newTriggerFunction: 'Nova funció de disparador',
|
||||||
thereIsNoQueriesYet: 'Encara no hi ha consultes',
|
thereAreNoQueriesYet: 'Encara no hi ha consultes',
|
||||||
searchForQueries: 'Cerca consultes',
|
searchForQueries: 'Cerca consultes',
|
||||||
killProcess: 'Mata procés',
|
killProcess: 'Mata procés',
|
||||||
exportSchema: 'Exporta esquema',
|
exportSchema: 'Exporta esquema',
|
||||||
|
@@ -233,7 +233,7 @@ export const csCZ = {
|
|||||||
newFunction: 'Nová funkce',
|
newFunction: 'Nová funkce',
|
||||||
newScheduler: 'Nový scheduler',
|
newScheduler: 'Nový scheduler',
|
||||||
newTriggerFunction: 'Nová trigger funkce',
|
newTriggerFunction: 'Nová trigger funkce',
|
||||||
thereIsNoQueriesYet: 'Nejsou tu žádné dotazy',
|
thereAreNoQueriesYet: 'Nejsou tu žádné dotazy',
|
||||||
searchForQueries: 'Hledání dotazů',
|
searchForQueries: 'Hledání dotazů',
|
||||||
killProcess: 'Zabít proces',
|
killProcess: 'Zabít proces',
|
||||||
exportSchema: 'Exportovat schéma',
|
exportSchema: 'Exportovat schéma',
|
||||||
|
@@ -79,7 +79,8 @@ export const enUS = {
|
|||||||
search: 'Search',
|
search: 'Search',
|
||||||
title: 'Title',
|
title: 'Title',
|
||||||
archive: 'Archive', // verb
|
archive: 'Archive', // verb
|
||||||
undo: 'Undo'
|
undo: 'Undo',
|
||||||
|
moveTo: 'Move to'
|
||||||
},
|
},
|
||||||
connection: { // Database connection
|
connection: { // Database connection
|
||||||
connection: 'Connection',
|
connection: 'Connection',
|
||||||
@@ -116,7 +117,8 @@ export const enUS = {
|
|||||||
readOnlyMode: 'Read-only mode',
|
readOnlyMode: 'Read-only mode',
|
||||||
allConnections: 'All connections',
|
allConnections: 'All connections',
|
||||||
searchForConnections: 'Search for connections',
|
searchForConnections: 'Search for connections',
|
||||||
keepAliveInterval: 'Keep alive interval'
|
keepAliveInterval: 'Keep alive interval',
|
||||||
|
singleConnection: 'Single connection'
|
||||||
},
|
},
|
||||||
database: { // Database related terms
|
database: { // Database related terms
|
||||||
schema: 'Schema',
|
schema: 'Schema',
|
||||||
@@ -251,7 +253,7 @@ export const enUS = {
|
|||||||
newFunction: 'New function',
|
newFunction: 'New function',
|
||||||
newScheduler: 'New scheduler',
|
newScheduler: 'New scheduler',
|
||||||
newTriggerFunction: 'New trigger function',
|
newTriggerFunction: 'New trigger function',
|
||||||
thereIsNoQueriesYet: 'There is no queries yet',
|
thereAreNoQueriesYet: 'There are no queries yet',
|
||||||
searchForQueries: 'Search for queries',
|
searchForQueries: 'Search for queries',
|
||||||
killProcess: 'Kill process',
|
killProcess: 'Kill process',
|
||||||
exportSchema: 'Export schema',
|
exportSchema: 'Export schema',
|
||||||
@@ -331,7 +333,7 @@ export const enUS = {
|
|||||||
wrapLongLines: 'Wrap long lines',
|
wrapLongLines: 'Wrap long lines',
|
||||||
markdownSupported: 'Markdown supported',
|
markdownSupported: 'Markdown supported',
|
||||||
plantATree: 'Plant a Tree',
|
plantATree: 'Plant a Tree',
|
||||||
dataTabPageSize: 'DATA tab page size',
|
dataTabPageSize: 'Results per page',
|
||||||
noOpenTabs: 'There are no open tabs, navigate on the left bar or:',
|
noOpenTabs: 'There are no open tabs, navigate on the left bar or:',
|
||||||
restorePreviousSession: 'Restore previous session',
|
restorePreviousSession: 'Restore previous session',
|
||||||
closeTab: 'Close tab',
|
closeTab: 'Close tab',
|
||||||
@@ -362,6 +364,8 @@ export const enUS = {
|
|||||||
editFolder: 'Edit folder',
|
editFolder: 'Edit folder',
|
||||||
folderName: 'Folder name',
|
folderName: 'Folder name',
|
||||||
deleteFolder: 'Delete folder',
|
deleteFolder: 'Delete folder',
|
||||||
|
newFolder: 'New folder',
|
||||||
|
outOfFolder: 'Out of folder',
|
||||||
editConnectionAppearance: 'Edit connection appearance',
|
editConnectionAppearance: 'Edit connection appearance',
|
||||||
defaultCopyType: 'Default copy type',
|
defaultCopyType: 'Default copy type',
|
||||||
showTableSize: 'Show table size in sidebar',
|
showTableSize: 'Show table size in sidebar',
|
||||||
|
@@ -229,7 +229,7 @@ export const frFR = {
|
|||||||
newFunction: 'Nouvelle function',
|
newFunction: 'Nouvelle function',
|
||||||
newScheduler: 'Nouveau déclencheur',
|
newScheduler: 'Nouveau déclencheur',
|
||||||
newTriggerFunction: 'Nouvelle fonction de déclencheur',
|
newTriggerFunction: 'Nouvelle fonction de déclencheur',
|
||||||
thereIsNoQueriesYet: 'Il n\'y a pas encore de requête',
|
thereAreNoQueriesYet: 'Il n\'y a pas encore de requête',
|
||||||
searchForQueries: 'Rechercher des requêtes',
|
searchForQueries: 'Rechercher des requêtes',
|
||||||
killProcess: 'Terminer un processus',
|
killProcess: 'Terminer un processus',
|
||||||
exportSchema: 'Exporter un schéma',
|
exportSchema: 'Exporter un schéma',
|
||||||
|
@@ -227,7 +227,7 @@ export const idID = {
|
|||||||
newFunction: 'Fungsi baru',
|
newFunction: 'Fungsi baru',
|
||||||
newScheduler: 'Penjadwal baru',
|
newScheduler: 'Penjadwal baru',
|
||||||
newTriggerFunction: 'Fungsi pemicu baru',
|
newTriggerFunction: 'Fungsi pemicu baru',
|
||||||
thereIsNoQueriesYet: 'Belum ada kueri',
|
thereAreNoQueriesYet: 'Belum ada kueri',
|
||||||
searchForQueries: 'Telusuri kueri',
|
searchForQueries: 'Telusuri kueri',
|
||||||
killProcess: 'Membunuh proses',
|
killProcess: 'Membunuh proses',
|
||||||
exportSchema: 'Skema ekspor',
|
exportSchema: 'Skema ekspor',
|
||||||
|
@@ -228,7 +228,7 @@ export const itIT = {
|
|||||||
newFunction: 'Nuova funzione',
|
newFunction: 'Nuova funzione',
|
||||||
newScheduler: 'Nuovo scheduler',
|
newScheduler: 'Nuovo scheduler',
|
||||||
newTriggerFunction: 'Nuova funzione di trigger',
|
newTriggerFunction: 'Nuova funzione di trigger',
|
||||||
thereIsNoQueriesYet: 'Non ci sono ancora query',
|
thereAreNoQueriesYet: 'Non ci sono ancora query',
|
||||||
searchForQueries: 'Cerca query',
|
searchForQueries: 'Cerca query',
|
||||||
killProcess: 'Uccidi processo',
|
killProcess: 'Uccidi processo',
|
||||||
exportSchema: 'Esporta schema',
|
exportSchema: 'Esporta schema',
|
||||||
|
@@ -198,7 +198,7 @@ export const jaJP = {
|
|||||||
newFunction: '新しい関数',
|
newFunction: '新しい関数',
|
||||||
newScheduler: '新規スケジューラ',
|
newScheduler: '新規スケジューラ',
|
||||||
newTriggerFunction: '新しいトリガー機能',
|
newTriggerFunction: '新しいトリガー機能',
|
||||||
thereIsNoQueriesYet: 'まだ問い合わせはありません',
|
thereAreNoQueriesYet: 'まだ問い合わせはありません',
|
||||||
searchForQueries: 'クエリの検索',
|
searchForQueries: 'クエリの検索',
|
||||||
killProcess: 'プロセスの停止'
|
killProcess: 'プロセスの停止'
|
||||||
},
|
},
|
||||||
|
@@ -228,7 +228,7 @@ export const koKR = {
|
|||||||
newFunction: '새 함수',
|
newFunction: '새 함수',
|
||||||
newScheduler: '새 스케줄러',
|
newScheduler: '새 스케줄러',
|
||||||
newTriggerFunction: '새 트리거 함수',
|
newTriggerFunction: '새 트리거 함수',
|
||||||
thereIsNoQueriesYet: '아직 쿼리가 없습니다',
|
thereAreNoQueriesYet: '아직 쿼리가 없습니다',
|
||||||
searchForQueries: '쿼리 검색',
|
searchForQueries: '쿼리 검색',
|
||||||
killProcess: '프로세스 종료',
|
killProcess: '프로세스 종료',
|
||||||
exportSchema: '스키마 내보내기',
|
exportSchema: '스키마 내보내기',
|
||||||
|
@@ -100,7 +100,7 @@ export const nlNL = {
|
|||||||
readOnlyMode: 'Alleen lezen modus',
|
readOnlyMode: 'Alleen lezen modus',
|
||||||
untrustedConnection: 'Niet vertrouwde verbinding',
|
untrustedConnection: 'Niet vertrouwde verbinding',
|
||||||
allConnections: 'Alle verbindingen',
|
allConnections: 'Alle verbindingen',
|
||||||
searchForConnections: 'Search for connections'
|
searchForConnections: 'Zoek naar verbindingen'
|
||||||
},
|
},
|
||||||
database: {
|
database: {
|
||||||
schema: 'Schema',
|
schema: 'Schema',
|
||||||
@@ -233,8 +233,8 @@ export const nlNL = {
|
|||||||
newFunction: 'Nieuwe function',
|
newFunction: 'Nieuwe function',
|
||||||
newScheduler: 'Nieuwe scheduler',
|
newScheduler: 'Nieuwe scheduler',
|
||||||
newTriggerFunction: 'Nieuwe trigger function',
|
newTriggerFunction: 'Nieuwe trigger function',
|
||||||
thereIsNoQueriesYet: 'There is no queries yet',
|
thereAreNoQueriesYet: 'Er zijn nog geen queries',
|
||||||
searchForQueries: 'Search for queries',
|
searchForQueries: 'Zoek naar queries',
|
||||||
killProcess: 'Sluit proces af',
|
killProcess: 'Sluit proces af',
|
||||||
exportSchema: 'Exporteer schema',
|
exportSchema: 'Exporteer schema',
|
||||||
importSchema: 'Importeer schema',
|
importSchema: 'Importeer schema',
|
||||||
|
@@ -231,7 +231,7 @@ export const ptBR = {
|
|||||||
newFunction: 'Nova função',
|
newFunction: 'Nova função',
|
||||||
newScheduler: 'Novo agendento',
|
newScheduler: 'Novo agendento',
|
||||||
newTriggerFunction: 'Novo gatinho de função',
|
newTriggerFunction: 'Novo gatinho de função',
|
||||||
thereIsNoQueriesYet: 'Nenhuma consulta ainda',
|
thereAreNoQueriesYet: 'Nenhuma consulta ainda',
|
||||||
searchForQueries: 'Pesquisar por consultas',
|
searchForQueries: 'Pesquisar por consultas',
|
||||||
killProcess: 'Matar processo',
|
killProcess: 'Matar processo',
|
||||||
exportSchema: 'Exportar banco de dados',
|
exportSchema: 'Exportar banco de dados',
|
||||||
|
@@ -229,7 +229,7 @@ export const ruRU = {
|
|||||||
newFunction: 'Новая функция',
|
newFunction: 'Новая функция',
|
||||||
newScheduler: 'Новый планировщик',
|
newScheduler: 'Новый планировщик',
|
||||||
newTriggerFunction: 'Новая функция триггера',
|
newTriggerFunction: 'Новая функция триггера',
|
||||||
thereIsNoQueriesYet: 'Запросы пока отсутствуют',
|
thereAreNoQueriesYet: 'Запросы пока отсутствуют',
|
||||||
searchForQueries: 'Поиск по запросам',
|
searchForQueries: 'Поиск по запросам',
|
||||||
killProcess: 'Убить процесс',
|
killProcess: 'Убить процесс',
|
||||||
exportSchema: 'Экспорт схемы',
|
exportSchema: 'Экспорт схемы',
|
||||||
|
@@ -238,7 +238,7 @@ export const ukUA = {
|
|||||||
newFunction: 'Нова функція',
|
newFunction: 'Нова функція',
|
||||||
newScheduler: 'Новий планувальник',
|
newScheduler: 'Новий планувальник',
|
||||||
newTriggerFunction: 'Нова функція тригера',
|
newTriggerFunction: 'Нова функція тригера',
|
||||||
thereIsNoQueriesYet: 'Поки що немає запитів',
|
thereAreNoQueriesYet: 'Поки що немає запитів',
|
||||||
searchForQueries: 'Пошук запитів',
|
searchForQueries: 'Пошук запитів',
|
||||||
killProcess: 'Завершити процес',
|
killProcess: 'Завершити процес',
|
||||||
exportSchema: 'Експорт схеми',
|
exportSchema: 'Експорт схеми',
|
||||||
|
@@ -222,7 +222,7 @@ export const viVN = {
|
|||||||
newFunction: 'Chức năng mới',
|
newFunction: 'Chức năng mới',
|
||||||
newScheduler: 'Bộ lập lịch mới',
|
newScheduler: 'Bộ lập lịch mới',
|
||||||
newTriggerFunction: 'Chức năng kích hoạt mới',
|
newTriggerFunction: 'Chức năng kích hoạt mới',
|
||||||
thereIsNoQueriesYet: 'Không có truy vấn nào',
|
thereAreNoQueriesYet: 'Không có truy vấn nào',
|
||||||
searchForQueries: 'Tìm kiếm truy vấn',
|
searchForQueries: 'Tìm kiếm truy vấn',
|
||||||
killProcess: 'Huỷ quá trình',
|
killProcess: 'Huỷ quá trình',
|
||||||
exportSchema: 'Xuất lược đồ',
|
exportSchema: 'Xuất lược đồ',
|
||||||
|
@@ -236,7 +236,7 @@ export const zhCN = {
|
|||||||
newFunction: '新函数',
|
newFunction: '新函数',
|
||||||
newScheduler: '新调度器',
|
newScheduler: '新调度器',
|
||||||
newTriggerFunction: '新触发器函数',
|
newTriggerFunction: '新触发器函数',
|
||||||
thereIsNoQueriesYet: '目前还没有任何查询',
|
thereAreNoQueriesYet: '目前还没有任何查询',
|
||||||
searchForQueries: '搜索查询',
|
searchForQueries: '搜索查询',
|
||||||
killProcess: '终止进程',
|
killProcess: '终止进程',
|
||||||
exportSchema: '导出模式(schema)',
|
exportSchema: '导出模式(schema)',
|
||||||
|
@@ -1,11 +1,13 @@
|
|||||||
import { ClientCode } from 'common/interfaces/antares';
|
import { ClientCode } from 'common/interfaces/antares';
|
||||||
import { jsonToSqlInsert } from 'common/libs/sqlUtils';
|
import { jsonToSqlInsert } from 'common/libs/sqlUtils';
|
||||||
import * as json2php from 'json2php';
|
import * as json2php from 'json2php';
|
||||||
|
import * as moment from 'moment';
|
||||||
|
|
||||||
export const exportRows = (args: {
|
export const exportRows = (args: {
|
||||||
type: 'csv' | 'json'| 'sql' | 'php';
|
type: 'csv' | 'json'| 'sql' | 'php';
|
||||||
content: object[];
|
content: object[];
|
||||||
table: string;
|
table: string;
|
||||||
|
page?: number;
|
||||||
client?: ClientCode;
|
client?: ClientCode;
|
||||||
fields?: {
|
fields?: {
|
||||||
[key: string]: {type: string; datePrecision: number};
|
[key: string]: {type: string; datePrecision: number};
|
||||||
@@ -31,7 +33,7 @@ export const exportRows = (args: {
|
|||||||
const csv = [];
|
const csv = [];
|
||||||
const sd = args.csvOptions.stringDelimiter === 'single'
|
const sd = args.csvOptions.stringDelimiter === 'single'
|
||||||
? '\''
|
? '\''
|
||||||
: args.csvOptions.stringDelimiter === 'single'
|
: args.csvOptions.stringDelimiter === 'double'
|
||||||
? '"'
|
? '"'
|
||||||
: '';
|
: '';
|
||||||
|
|
||||||
@@ -41,6 +43,7 @@ export const exportRows = (args: {
|
|||||||
for (const row of args.content) {
|
for (const row of args.content) {
|
||||||
csv.push(Object.values(row).map(col => {
|
csv.push(Object.values(row).map(col => {
|
||||||
if (typeof col === 'string') return `${sd}${col}${sd}`;
|
if (typeof col === 'string') return `${sd}${col}${sd}`;
|
||||||
|
if (col instanceof Date) return `${sd}${moment(col).format('YYYY-MM-DD HH:mm:ss')}${sd}`;
|
||||||
if (col instanceof Buffer) return col.toString('base64');
|
if (col instanceof Buffer) return col.toString('base64');
|
||||||
if (col instanceof Uint8Array) return Buffer.from(col).toString('base64');
|
if (col instanceof Uint8Array) return Buffer.from(col).toString('base64');
|
||||||
return col;
|
return col;
|
||||||
@@ -81,7 +84,7 @@ export const exportRows = (args: {
|
|||||||
|
|
||||||
const file = new Blob([content], { type: mime });
|
const file = new Blob([content], { type: mime });
|
||||||
const downloadLink = document.createElement('a');
|
const downloadLink = document.createElement('a');
|
||||||
downloadLink.download = `${args.sqlOptions?.targetTable || args.table}.${args.type}`;
|
downloadLink.download = `${args.sqlOptions?.targetTable || args.table}${args.page ? `-${args.page}` : ''}.${args.type}`;
|
||||||
downloadLink.href = window.URL.createObjectURL(file);
|
downloadLink.href = window.URL.createObjectURL(file);
|
||||||
downloadLink.style.display = 'none';
|
downloadLink.style.display = 'none';
|
||||||
document.body.appendChild(downloadLink);
|
document.body.appendChild(downloadLink);
|
||||||
|
@@ -415,8 +415,7 @@
|
|||||||
box-shadow: 0 0 1px 0 #000;
|
box-shadow: 0 0 1px 0 #000;
|
||||||
|
|
||||||
.settingbar-top-elements {
|
.settingbar-top-elements {
|
||||||
overflow-x: hidden;
|
overflow: hidden overlay;
|
||||||
overflow-y: overlay;
|
|
||||||
max-height: calc((100vh - 3.5rem) - #{$excluding-size});
|
max-height: calc((100vh - 3.5rem) - #{$excluding-size});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -164,8 +164,7 @@
|
|||||||
box-shadow: 0 0 1px 0 #000;
|
box-shadow: 0 0 1px 0 #000;
|
||||||
|
|
||||||
.settingbar-top-elements {
|
.settingbar-top-elements {
|
||||||
overflow-x: hidden;
|
overflow: hidden overlay;
|
||||||
overflow-y: overlay;
|
|
||||||
max-height: calc((100vh - 3.5rem) - #{$excluding-size});
|
max-height: calc((100vh - 3.5rem) - #{$excluding-size});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -55,10 +55,9 @@ export const useApplicationStore = defineStore('application', {
|
|||||||
},
|
},
|
||||||
showScratchpad (tag?: string) {
|
showScratchpad (tag?: string) {
|
||||||
this.isScratchpad = true;
|
this.isScratchpad = true;
|
||||||
if (tag) {
|
if (!tag) tag = 'all';
|
||||||
const { selectedTag } = storeToRefs(useScratchpadStore());
|
const { selectedTag } = storeToRefs(useScratchpadStore());
|
||||||
selectedTag.value = tag;
|
selectedTag.value = tag;
|
||||||
}
|
|
||||||
},
|
},
|
||||||
hideScratchpad () {
|
hideScratchpad () {
|
||||||
this.isScratchpad = false;
|
this.isScratchpad = false;
|
||||||
|
@@ -90,8 +90,12 @@ export const useConnectionsStore = defineStore('connections', {
|
|||||||
});
|
});
|
||||||
persistentStore.set('connectionsOrder', this.connectionsOrder);
|
persistentStore.set('connectionsOrder', this.connectionsOrder);
|
||||||
},
|
},
|
||||||
addFolder (params: {after: string; connections: [string, string]}) {
|
addFolder (params: {after?: string; connections: [string, string?]}) {
|
||||||
const index = this.connectionsOrder.findIndex((conn: SidebarElement) => conn.uid === params.after);
|
const index = params.after
|
||||||
|
? this.connectionsOrder.findIndex((conn: SidebarElement) => conn.uid === params.after)
|
||||||
|
: this.connectionsOrder.length;
|
||||||
|
|
||||||
|
this.removeFromFolders(...params.connections);
|
||||||
|
|
||||||
this.connectionsOrder.splice(index, 0, {
|
this.connectionsOrder.splice(index, 0, {
|
||||||
isFolder: true,
|
isFolder: true,
|
||||||
@@ -102,7 +106,18 @@ export const useConnectionsStore = defineStore('connections', {
|
|||||||
});
|
});
|
||||||
persistentStore.set('connectionsOrder', this.connectionsOrder);
|
persistentStore.set('connectionsOrder', this.connectionsOrder);
|
||||||
},
|
},
|
||||||
|
removeFromFolders (...connections: string[]) { // Removes connections from folders
|
||||||
|
this.connectionsOrder = (this.connectionsOrder as SidebarElement[]).map(el => {
|
||||||
|
if (el.isFolder)
|
||||||
|
el.connections = el.connections.filter(uid => !connections.includes(uid));
|
||||||
|
return el;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.clearEmptyFolders();
|
||||||
|
},
|
||||||
addToFolder (params: {folder: string; connection: string}) {
|
addToFolder (params: {folder: string; connection: string}) {
|
||||||
|
this.removeFromFolders(params.connection);
|
||||||
|
|
||||||
this.connectionsOrder = this.connectionsOrder.map((conn: SidebarElement) => {
|
this.connectionsOrder = this.connectionsOrder.map((conn: SidebarElement) => {
|
||||||
if (conn.uid === params.folder)
|
if (conn.uid === params.folder)
|
||||||
conn.connections.push(params.connection);
|
conn.connections.push(params.connection);
|
||||||
@@ -113,11 +128,7 @@ export const useConnectionsStore = defineStore('connections', {
|
|||||||
this.clearEmptyFolders();
|
this.clearEmptyFolders();
|
||||||
},
|
},
|
||||||
deleteConnection (connection: SidebarElement | ConnectionParams) {
|
deleteConnection (connection: SidebarElement | ConnectionParams) {
|
||||||
this.connectionsOrder = (this.connectionsOrder as SidebarElement[]).map(el => { // Removes connection from folders
|
this.removeFromFolders(connection.uid);
|
||||||
if (el.isFolder && el.connections.includes(connection.uid))
|
|
||||||
el.connections = el.connections.filter(uid => uid !== connection.uid);
|
|
||||||
return el;
|
|
||||||
});
|
|
||||||
this.connectionsOrder = (this.connectionsOrder as SidebarElement[]).filter(el => el.uid !== connection.uid);
|
this.connectionsOrder = (this.connectionsOrder as SidebarElement[]).filter(el => el.uid !== connection.uid);
|
||||||
this.lastConnections = (this.lastConnections as SidebarElement[]).filter(el => el.uid !== connection.uid);
|
this.lastConnections = (this.lastConnections as SidebarElement[]).filter(el => el.uid !== connection.uid);
|
||||||
|
|
||||||
|
@@ -66,7 +66,7 @@ export interface Workspace {
|
|||||||
uid: string;
|
uid: string;
|
||||||
client?: ClientCode;
|
client?: ClientCode;
|
||||||
database?: string;
|
database?: string;
|
||||||
connectionStatus: 'connected' | 'disconnected' | 'failed';
|
connectionStatus: 'connected' | 'connecting' | 'disconnected' | 'failed';
|
||||||
selectedTab: string;
|
selectedTab: string;
|
||||||
searchTerm: string;
|
searchTerm: string;
|
||||||
tabs: WorkspaceTab[];
|
tabs: WorkspaceTab[];
|
||||||
|
Reference in New Issue
Block a user