mirror of
https://github.com/Fabio286/antares.git
synced 2025-06-05 21:59:22 +02:00
Compare commits
40 Commits
Author | SHA1 | Date | |
---|---|---|---|
71910ca5c8 | |||
cce5adbac7 | |||
e6d67fcb0c | |||
e83b80afc9 | |||
8742fa10f0 | |||
ab54eb086f | |||
308f69f12e | |||
2f30bafa33 | |||
|
1716077182 | ||
5562e73e75 | |||
8a7cc2a14f | |||
9ca059d979 | |||
c9ccf786cd | |||
5e9c88a7fd | |||
e0e6483d1f | |||
66227569f4 | |||
faa799c8ea | |||
acc1eeb094 | |||
865dad80df | |||
f502620779 | |||
f61d7eeaf4 | |||
e71c7568c0 | |||
79f033e524 | |||
310cfaa3c2 | |||
6f93e1f9ab | |||
04bdd085a5 | |||
c568acae14 | |||
7a46a119d8 | |||
f1636f1528 | |||
f839d5cd3c | |||
8f4f1d393c | |||
ab17c6d4bf | |||
b4b2f3d0cf | |||
7a766f04e6 | |||
f6b77d1243 | |||
840241c3cc | |||
0f10c9e824 | |||
1e37f2a96f | |||
0d6137195d | |||
d26f168250 |
61
CHANGELOG.md
61
CHANGELOG.md
@@ -2,6 +2,67 @@
|
|||||||
|
|
||||||
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.1.12](https://github.com/Fabio286/antares/compare/v0.1.11...v0.1.12) (2021-06-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **PostgreSQL:** trigger rename and delete ([cce5adb](https://github.com/Fabio286/antares/commit/cce5adbac75170186956211b54f4db5be25aba07))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* internal exceptions ([8742fa1](https://github.com/Fabio286/antares/commit/8742fa10f08c92a98325df50be9a7df8e36b0f2c))
|
||||||
|
* page offset not reset when selected table changes ([5562e73](https://github.com/Fabio286/antares/commit/5562e73e75c659051a49d61041d1eee9d66ff6e2))
|
||||||
|
* **MySQL:** view's data tab doesn't work with some views, closes [#71](https://github.com/Fabio286/antares/issues/71) ([9ca059d](https://github.com/Fabio286/antares/commit/9ca059d979161c0132f64db372b4ed7ecc844b2d))
|
||||||
|
* **UI:** unable to browse view's result pages ([8a7cc2a](https://github.com/Fabio286/antares/commit/8a7cc2a14fa289c2f3d9e9eb1a5435ffbbaab006))
|
||||||
|
|
||||||
|
### [0.1.11](https://github.com/Fabio286/antares/compare/v0.1.10...v0.1.11) (2021-06-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **UI:** prevent canc key to trigger delete modal when editing a row ([5e9c88a](https://github.com/Fabio286/antares/commit/5e9c88a7fd656dd69b92ba4384ca81f4e8cdd422))
|
||||||
|
* table row loses internal id after cell update ([6622756](https://github.com/Fabio286/antares/commit/66227569f4c032298e20d44c253d30109ffde0b2))
|
||||||
|
* **MySQL:** missing schema altering tables in some conditions ([faa799c](https://github.com/Fabio286/antares/commit/faa799c8ea2329e7ca1b54c9414a060bc8a2a840))
|
||||||
|
* empty offset in cell update queries ([acc1eeb](https://github.com/Fabio286/antares/commit/acc1eeb0948db35f2c9a4d85d70fb654b41b15e5))
|
||||||
|
|
||||||
|
### [0.1.10](https://github.com/Fabio286/antares/compare/v0.1.9...v0.1.10) (2021-05-29)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* key shortcuts to change DATA tab page ([f61d7ee](https://github.com/Fabio286/antares/commit/f61d7eeaf42406eb88b3285ac4606794f56e88d3))
|
||||||
|
* option to set DATA tab page size ([e71c756](https://github.com/Fabio286/antares/commit/e71c7568c09bf8ad184753d3d0f14046f1e386d0))
|
||||||
|
* prev/next buttons to browse the results pages of data tab ([79f033e](https://github.com/Fabio286/antares/commit/79f033e5245e0e744c35540d25a30b1eadc4d603))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **MySQL:** wrong schema in view data tab select, closes [#71](https://github.com/Fabio286/antares/issues/71) ([310cfaa](https://github.com/Fabio286/antares/commit/310cfaa3c2324b1159a46be566b6af2555dc9732))
|
||||||
|
* wrong detection of field default expressions in some cases ([04bdd08](https://github.com/Fabio286/antares/commit/04bdd085a56240273133586d23196e52341d5f27))
|
||||||
|
|
||||||
|
### [0.1.9](https://github.com/Fabio286/antares/compare/v0.1.8...v0.1.9) (2021-05-23)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **MySQL:** can't access tables having UNIQUE KEY, closes [#69](https://github.com/Fabio286/antares/issues/69) ([f1636f1](https://github.com/Fabio286/antares/commit/f1636f1528b5765423535f84027fdc853c58ce80))
|
||||||
|
|
||||||
|
### [0.1.8](https://github.com/Fabio286/antares/compare/v0.1.7...v0.1.8) (2021-05-22)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* internal id not removed before row update ([0f10c9e](https://github.com/Fabio286/antares/commit/0f10c9e824b679cfebd8a31085236da3d38a7953))
|
||||||
|
* unable to add new ENUM fields ([1e37f2a](https://github.com/Fabio286/antares/commit/1e37f2a96f660a36f2739fea57ca298059e9c31a))
|
||||||
|
* unable to delete table rows ([0d61371](https://github.com/Fabio286/antares/commit/0d6137195da9e0e9afe68f6d3ebcd50e913a888e))
|
||||||
|
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
|
||||||
|
* improved the way how field default value are handled ([7a766f0](https://github.com/Fabio286/antares/commit/7a766f04e668868e8844aac1d7d445bc2da21558))
|
||||||
|
|
||||||
### [0.1.7](https://github.com/Fabio286/antares/compare/v0.1.6...v0.1.7) (2021-05-16)
|
### [0.1.7](https://github.com/Fabio286/antares/compare/v0.1.6...v0.1.7) (2021-05-16)
|
||||||
|
|
||||||
|
|
||||||
|
15
README.md
15
README.md
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
# Antares SQL Client
|
# Antares SQL Client
|
||||||
|
|
||||||
   [](https://snapcraft.io/antares) [](https://snapcraft.io/antares) [](https://www.treedom.net/en/user/fabio-di-stasio/event/antares-for-the-planet)
|
 [](https://actions-badge.atrox.dev/fabio286/antares/goto)   [](https://snapcraft.io/antares) [](https://snapcraft.io/antares) [](https://twitter.com/AntaresSQL) [](https://www.treedom.net/en/user/fabio-di-stasio/event/antares-for-the-planet)
|
||||||
|
|
||||||
Antares is an SQL client based on [Electron.js](https://github.com/electron/electron) and [Vue.js](https://github.com/vuejs/vue) that aims to become a useful tool, especially for developers.
|
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.
|
||||||
My target is to support as many databases as possible, and all major operating systems, including the ARM versions.
|
My target is to support as many databases as possible, and all major operating systems, including the ARM versions.
|
||||||
@@ -14,7 +14,7 @@ Many of its current features are enough to have a pleasant user experience with
|
|||||||
I'm actively working on it, hoping to provide cool features and fixes as soon as possible.
|
I'm actively working on it, hoping to provide cool features 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 watch this repo on **Release only** channel.
|
👁 To stay tuned for new releases [follow Antares SQL](https://twitter.com/AntaresSQL) on Twitter.
|
||||||
🌟 Don't forget to **leave a star** if you appreciate this project.
|
🌟 Don't forget to **leave a star** if you appreciate this project.
|
||||||
|
|
||||||
## Philosophy
|
## Philosophy
|
||||||
@@ -25,12 +25,14 @@ A modern application created with minimalism and semplicity in mind, with featur
|
|||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
[](https://snapcraft.io/antares) [](https://www.microsoft.com/p/antares-sql-client/9nhtb9sq51r1?cid=storebadge&ocid=badge&rtc=1&activetab=pivot:overviewtab)
|
[](https://snapcraft.io/antares) [](https://aur.archlinux.org/packages/antares-sql/) [](https://www.microsoft.com/p/antares-sql-client/9nhtb9sq51r1?cid=storebadge&ocid=badge&rtc=1&activetab=pivot:overviewtab)
|
||||||
🚀 **[Other Downloads](https://github.com/Fabio286/antares/releases/latest)**
|
🚀 **[Other Downloads](https://github.com/Fabio286/antares/releases/latest)**
|
||||||
|
|
||||||
## How to contribute
|
## How to contribute
|
||||||
|
|
||||||
- [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)
|
||||||
|
- 🚧 [Project Board](https://github.com/users/Fabio286/projects/1)
|
||||||
|
|
||||||
## Current main features
|
## Current main features
|
||||||
|
|
||||||
@@ -84,7 +86,7 @@ This is a roadmap with major features will come in near future.
|
|||||||
|
|
||||||
- [ ] Windows
|
- [ ] Windows
|
||||||
- [x] Linux
|
- [x] Linux
|
||||||
- [x] MacOS
|
- [ ] MacOS
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
|
|
||||||
@@ -92,7 +94,8 @@ This is a roadmap with major features will come in near future.
|
|||||||
**Arabic Translation** / [Mohd-PH](https://github.com/Mohd-PH) [[#29](https://github.com/Fabio286/antares/pull/29)]
|
**Arabic Translation** / [Mohd-PH](https://github.com/Mohd-PH) [[#29](https://github.com/Fabio286/antares/pull/29)]
|
||||||
**Spanish Translation** / [hongkfui](https://github.com/hongkfui) [[#32](https://github.com/Fabio286/antares/pull/32)]
|
**Spanish Translation** / [hongkfui](https://github.com/hongkfui) [[#32](https://github.com/Fabio286/antares/pull/32)]
|
||||||
**French Translation** / [MrAnyx](https://github.com/MrAnyx) [[#44](https://github.com/Fabio286/antares/pull/44)]
|
**French Translation** / [MrAnyx](https://github.com/MrAnyx) [[#44](https://github.com/Fabio286/antares/pull/44)]
|
||||||
**Portugues (Brasil)** / [Daniel Eduardo](https://github.com/daeleduardo) [[#54](https://github.com/Fabio286/antares/pull/54)]
|
**Portugues (Brasil)** / [Daniel Eduardo](https://github.com/daeleduardo) [[#54](https://github.com/Fabio286/antares/pull/54)]
|
||||||
|
**Deutsch (Deutschland)** / [Christian Ratz](https://github.com/digitalgopnik) [[#74](https://github.com/Fabio286/antares/pull/74)]
|
||||||
|
|
||||||
## Reviews
|
## Reviews
|
||||||
|
|
||||||
|
77
docs/aur-badge.svg
Normal file
77
docs/aur-badge.svg
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
style="isolation:isolate" viewBox="0 0 182 56" width="182px" height="56px">
|
||||||
|
<defs>
|
||||||
|
<clipPath id="_clipPath_tR1uglJ1Zei76xP861DY1TsjAiQWS9qF">
|
||||||
|
<rect width="182" height="56" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g clip-path="url(#_clipPath_tR1uglJ1Zei76xP861DY1TsjAiQWS9qF)">
|
||||||
|
<path
|
||||||
|
d="M 2.5 0.5 L 180.5 0.5 C 181.604 0.5 182.5 1.396 182.5 2.5 L 182.5 54.5 C 182.5 55.604 181.604 56.5 180.5 56.5 L 2.5 56.5 C 1.396 56.5 0.5 55.604 0.5 54.5 L 0.5 2.5 C 0.5 1.396 1.396 0.5 2.5 0.5 Z"
|
||||||
|
style="stroke:none;fill:#252525;stroke-miterlimit:10;" />
|
||||||
|
<path
|
||||||
|
d="M 2.5 0.5 L 180.5 0.5 C 181.604 0.5 182.5 1.396 182.5 2.5 L 182.5 54.5 C 182.5 55.604 181.604 56.5 180.5 56.5 L 2.5 56.5 C 1.396 56.5 0.5 55.604 0.5 54.5 L 0.5 2.5 C 0.5 1.396 1.396 0.5 2.5 0.5 Z"
|
||||||
|
style="fill:none;stroke:#CDCDCD;stroke-width:1;stroke-miterlimit:2;" />
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path
|
||||||
|
d=" M 60.898 13.777 C 58.555 13.774 56.61 14.254 55.858 14.516 L 55.083 18.697 C 55.081 18.712 58.937 17.669 60.635 17.73 C 63.447 17.831 63.706 18.805 63.656 20.119 C 63.704 20.196 62.931 18.931 60.498 18.889 C 57.43 18.836 53.098 19.976 53.104 24.608 C 53.022 29.818 56.997 31.351 59.704 31.379 C 62.138 31.335 63.279 30.458 63.904 29.988 C 64.726 29.129 65.665 28.265 66.561 27.229 C 65.714 28.77 64.978 29.835 64.213 30.651 L 64.213 31.339 L 67.913 30.716 L 67.938 20.66 C 67.901 19.237 68.754 13.791 60.898 13.777 Z M 60.367 22.533 C 61.9 22.554 63.659 23.31 63.662 25.129 C 63.669 26.784 61.589 27.674 60.235 27.66 C 58.881 27.646 57.085 26.596 57.077 24.982 C 57.103 23.54 58.771 22.496 60.367 22.533 Z "
|
||||||
|
fill-rule="evenodd" fill="rgb(255,255,255)" />
|
||||||
|
<path
|
||||||
|
d=" M 70.378 14.707 L 70.352 31.36 L 74.662 30.529 L 74.67 21.087 C 74.671 19.681 76.679 18.039 79.198 18.065 C 79.733 17.097 80.738 14.625 80.983 14.062 C 75.354 14.049 75.282 15.68 74.303 16.483 C 74.293 14.952 74.3 14.033 74.3 14.033 L 70.378 14.707 L 70.378 14.707 Z "
|
||||||
|
fill-rule="evenodd" fill="rgb(255,255,255)" />
|
||||||
|
<path
|
||||||
|
d=" M 94.632 16.893 C 94.591 16.873 92.385 14.312 87.949 14.292 C 83.795 14.223 79.135 15.834 79.061 22.8 C 79.097 28.925 83.537 31.318 87.973 31.365 C 92.72 31.414 94.609 28.396 94.722 28.322 C 94.156 27.83 92.034 25.728 92.034 25.728 C 92.034 25.728 90.709 27.615 88.138 27.639 C 85.566 27.664 83.331 25.651 83.299 22.844 C 83.266 20.036 85.354 18.515 88.157 18.392 C 90.584 18.392 91.984 19.959 91.984 19.959 L 94.632 16.893 L 94.632 16.893 Z "
|
||||||
|
fill-rule="evenodd" fill="rgb(255,255,255)" />
|
||||||
|
<path
|
||||||
|
d=" M 100.065 8.879 L 95.996 9.835 L 96.026 31.526 L 100.034 30.802 L 100.08 20.595 C 100.089 19.524 101.628 17.88 104.2 17.933 C 106.658 17.958 107.207 19.571 107.201 19.775 L 107.272 31.592 L 111.224 30.894 L 111.239 18.363 C 111.265 17.157 108.598 14.61 104.311 14.592 C 102.273 14.596 101.145 15.057 100.571 15.397 C 99.588 16.156 98.466 16.883 97.362 17.811 C 98.382 16.501 99.239 15.595 100.075 14.921 L 100.065 8.879 L 100.065 8.879 Z "
|
||||||
|
fill-rule="evenodd" fill="rgb(255,255,255)" />
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path
|
||||||
|
d=" M 114.673 9.441 L 116.508 8.982 L 116.595 30.85 L 114.73 31.168 L 114.673 9.441 L 114.673 9.441 Z "
|
||||||
|
fill-rule="evenodd" fill="rgb(23,147,209)" />
|
||||||
|
<path
|
||||||
|
d=" M 119.663 15.968 L 121.271 15.252 L 121.285 30.932 L 119.731 31.253 L 119.663 15.968 L 119.663 15.968 Z M 119.28 10.314 L 120.577 9.255 L 121.655 10.454 L 120.357 11.54 L 119.28 10.314 L 119.28 10.314 Z "
|
||||||
|
fill-rule="evenodd" fill="rgb(23,147,209)" />
|
||||||
|
<path
|
||||||
|
d=" M 124.296 15.682 L 126.131 15.308 L 126.14 18.586 C 126.14 18.727 127.148 14.924 132.008 15.009 C 136.727 15.035 137.499 18.688 137.473 19.507 L 137.531 31.034 L 135.922 31.384 L 135.913 19.998 C 135.932 19.665 135.178 16.853 131.843 16.843 C 128.509 16.833 126.199 19.265 126.203 20.818 L 126.229 30.848 L 124.365 31.335 L 124.296 15.682 L 124.296 15.682 Z "
|
||||||
|
fill-rule="evenodd" fill="rgb(23,147,209)" />
|
||||||
|
<path
|
||||||
|
d=" M 153.547 31.117 L 151.711 31.492 L 151.703 28.214 C 151.703 28.073 150.694 31.876 145.835 31.791 C 141.116 31.765 140.344 28.112 140.37 27.293 L 140.311 15.765 L 142.261 15.372 L 142.292 26.758 C 142.292 27.069 142.665 29.947 145.999 29.957 C 149.334 29.967 151.669 27.949 151.686 24.911 L 151.662 15.928 L 153.477 15.464 L 153.547 31.117 L 153.547 31.117 Z "
|
||||||
|
fill-rule="evenodd" fill="rgb(23,147,209)" />
|
||||||
|
<path
|
||||||
|
d=" M 157.144 15.553 L 155.857 16.56 L 160.792 23.018 L 155.529 30.478 L 156.894 31.492 L 161.841 24.563 L 166.948 31.656 L 168.211 30.649 L 162.738 23.065 L 167.104 16.933 L 165.762 15.797 L 161.785 21.472 L 157.144 15.553 L 157.144 15.553 Z "
|
||||||
|
fill-rule="evenodd" fill="rgb(23,147,209)" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
d=" M 33.112 3.879 C 30.965 9.143 29.67 12.587 27.279 17.695 C 28.745 19.248 30.544 21.058 33.466 23.101 C 30.325 21.809 28.182 20.511 26.581 19.164 C 23.521 25.549 18.728 34.643 9 52.121 C 16.645 47.707 22.572 44.986 28.095 43.948 C 27.858 42.928 27.723 41.824 27.733 40.673 L 27.742 40.428 C 27.863 35.53 30.411 31.763 33.43 32.019 C 36.448 32.274 38.794 36.455 38.673 41.353 C 38.65 42.275 38.546 43.162 38.364 43.984 C 43.828 45.053 49.691 47.767 57.233 52.121 C 55.746 49.383 54.419 46.915 53.151 44.565 C 51.154 43.017 49.072 41.003 44.823 38.822 C 47.743 39.581 49.834 40.456 51.464 41.435 C 38.575 17.439 37.532 14.251 33.112 3.879 Z "
|
||||||
|
fill-rule="evenodd" fill="rgb(23,147,209)" />
|
||||||
|
<g>
|
||||||
|
<path
|
||||||
|
d=" M 170.614 30.156 L 170.614 28.802 L 170.109 28.802 L 170.109 28.621 L 171.325 28.621 L 171.325 28.802 L 170.817 28.802 L 170.817 30.156 L 170.614 30.156 Z "
|
||||||
|
fill="rgb(23,147,209)" />
|
||||||
|
<path
|
||||||
|
d=" M 171.536 30.156 L 171.536 28.621 L 171.842 28.621 L 172.205 29.708 C 172.238 29.809 172.263 29.884 172.278 29.935 C 172.295 29.879 172.323 29.797 172.36 29.689 L 172.727 28.621 L 173 28.621 L 173 30.156 L 172.804 30.156 L 172.804 28.871 L 172.358 30.156 L 172.175 30.156 L 171.732 28.849 L 171.732 30.156 L 171.536 30.156 Z "
|
||||||
|
fill="rgb(23,147,209)" />
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path
|
||||||
|
d=" M 57.471 47.815 L 57.471 46.493 L 56.977 46.493 L 56.977 46.316 L 58.166 46.316 L 58.166 46.493 L 57.67 46.493 L 57.67 47.815 L 57.471 47.815 Z "
|
||||||
|
fill="rgb(23,147,209)" />
|
||||||
|
<path
|
||||||
|
d=" M 58.372 47.815 L 58.372 46.316 L 58.671 46.316 L 59.026 47.377 C 59.059 47.476 59.083 47.55 59.098 47.599 C 59.115 47.545 59.141 47.465 59.177 47.359 L 59.536 46.316 L 59.803 46.316 L 59.803 47.815 L 59.612 47.815 L 59.612 46.56 L 59.176 47.815 L 58.997 47.815 L 58.564 46.539 L 58.564 47.815 L 58.372 47.815"
|
||||||
|
fill="rgb(23,147,209)" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g clip-path="url(#_clipPath_NvFIpNfWUS6M4fZAtfyVzggsKR3URDoi)"><text transform="matrix(1,0,0,1,87.023,43.899)"
|
||||||
|
style="font-family:'Open Sans';font-weight:700;font-size:11px;font-style:normal;fill:#ffffff;stroke:none;">user
|
||||||
|
repository</text></g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="_clipPath_NvFIpNfWUS6M4fZAtfyVzggsKR3URDoi">
|
||||||
|
<rect x="0" y="0" width="86" height="14.98" transform="matrix(1,0,0,1,87,32.142)" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 7.5 KiB |
37
package.json
37
package.json
@@ -1,15 +1,16 @@
|
|||||||
{
|
{
|
||||||
"name": "antares",
|
"name": "antares",
|
||||||
"productName": "Antares",
|
"productName": "Antares",
|
||||||
"version": "0.1.7",
|
"version": "0.1.12",
|
||||||
"description": "A cross-platform easy to use SQL client.",
|
"description": "A cross-platform easy to use SQL client.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "https://github.com/Fabio286/antares.git",
|
"repository": "https://github.com/Fabio286/antares.git",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "cross-env NODE_ENV=development electron-webpack dev",
|
"dev": "cross-env NODE_ENV=development electron-webpack dev",
|
||||||
"compile": "electron-webpack",
|
"compile": "electron-webpack",
|
||||||
"build": "cross-env NODE_ENV=production npm run compile && electron-builder",
|
"build": "cross-env NODE_ENV=production npm run compile",
|
||||||
"build:appx": "npm run build -- --win appx",
|
"build:local": "npm run build && electron-builder",
|
||||||
|
"build:appx": "npm run build:local -- --win appx",
|
||||||
"release": "standard-version",
|
"release": "standard-version",
|
||||||
"release:pre": "npm run release -- --prerelease alpha",
|
"release:pre": "npm run release -- --prerelease alpha",
|
||||||
"test": "npm run lint",
|
"test": "npm run lint",
|
||||||
@@ -31,8 +32,7 @@
|
|||||||
"target": {
|
"target": {
|
||||||
"target": "default",
|
"target": "default",
|
||||||
"arch": [
|
"arch": [
|
||||||
"x64",
|
"x64"
|
||||||
"arm64"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -46,7 +46,8 @@
|
|||||||
"target": "AppImage",
|
"target": "AppImage",
|
||||||
"arch": [
|
"arch": [
|
||||||
"x64",
|
"x64",
|
||||||
"armv7l"
|
"armv7l",
|
||||||
|
"arm64"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -92,8 +93,8 @@
|
|||||||
"electron-log": "^4.3.5",
|
"electron-log": "^4.3.5",
|
||||||
"electron-store": "^8.0.0",
|
"electron-store": "^8.0.0",
|
||||||
"electron-updater": "^4.3.9",
|
"electron-updater": "^4.3.9",
|
||||||
"faker": "^5.3.1",
|
"faker": "^5.5.3",
|
||||||
"marked": "^2.0.2",
|
"marked": "^2.0.7",
|
||||||
"moment": "^2.29.1",
|
"moment": "^2.29.1",
|
||||||
"mysql2": "^2.2.5",
|
"mysql2": "^2.2.5",
|
||||||
"pg": "^8.5.1",
|
"pg": "^8.5.1",
|
||||||
@@ -104,30 +105,30 @@
|
|||||||
"v-mask": "^2.2.4",
|
"v-mask": "^2.2.4",
|
||||||
"vue-i18n": "^8.24.4",
|
"vue-i18n": "^8.24.4",
|
||||||
"vuedraggable": "^2.24.3",
|
"vuedraggable": "^2.24.3",
|
||||||
"vuex": "^3.6.0"
|
"vuex": "^3.6.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/eslint-parser": "^7.13.14",
|
"@babel/eslint-parser": "^7.14.4",
|
||||||
"cross-env": "^7.0.2",
|
"cross-env": "^7.0.2",
|
||||||
"electron": "^12.0.7",
|
"electron": "^13.1.1",
|
||||||
"electron-builder": "22.10.5",
|
"electron-builder": "22.10.5",
|
||||||
"electron-devtools-installer": "^3.2.0",
|
"electron-devtools-installer": "^3.2.0",
|
||||||
"electron-webpack": "^2.8.2",
|
"electron-webpack": "^2.8.2",
|
||||||
"electron-webpack-vue": "^2.4.0",
|
"electron-webpack-vue": "^2.4.0",
|
||||||
"eslint": "^7.26.0",
|
"eslint": "^7.28.0",
|
||||||
"eslint-config-standard": "^16.0.2",
|
"eslint-config-standard": "^16.0.3",
|
||||||
"eslint-plugin-import": "^2.22.1",
|
"eslint-plugin-import": "^2.23.4",
|
||||||
"eslint-plugin-node": "^11.1.0",
|
"eslint-plugin-node": "^11.1.0",
|
||||||
"eslint-plugin-promise": "^5.1.0",
|
"eslint-plugin-promise": "^5.1.0",
|
||||||
"eslint-plugin-vue": "^7.9.0",
|
"eslint-plugin-vue": "^7.10.0",
|
||||||
"sass": "^1.32.13",
|
"sass": "^1.34.1",
|
||||||
"sass-loader": "^10.2.0",
|
"sass-loader": "^10.2.0",
|
||||||
"standard-version": "^9.3.0",
|
"standard-version": "^9.3.0",
|
||||||
"stylelint": "^13.13.1",
|
"stylelint": "^13.13.1",
|
||||||
"stylelint-config-standard": "^22.0.0",
|
"stylelint-config-standard": "^22.0.0",
|
||||||
"stylelint-scss": "^3.19.0",
|
"stylelint-scss": "^3.19.0",
|
||||||
"vue": "^2.6.12",
|
"vue": "^2.6.14",
|
||||||
"vue-template-compiler": "^2.6.12",
|
"vue-template-compiler": "^2.6.14",
|
||||||
"webpack": "^4.46.0"
|
"webpack": "^4.46.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -63,7 +63,9 @@ module.exports = {
|
|||||||
functionContext: false,
|
functionContext: false,
|
||||||
functionLanguage: false,
|
functionLanguage: false,
|
||||||
triggerMiltipleEvents: false,
|
triggerMiltipleEvents: false,
|
||||||
|
triggerTableInName: false,
|
||||||
triggerUpdateColumns: false,
|
triggerUpdateColumns: false,
|
||||||
|
triggerOnlyRename: false,
|
||||||
parametersLength: false,
|
parametersLength: false,
|
||||||
languages: false
|
languages: false
|
||||||
};
|
};
|
||||||
|
@@ -13,7 +13,7 @@ module.exports = {
|
|||||||
// Structure
|
// Structure
|
||||||
tables: true,
|
tables: true,
|
||||||
views: true,
|
views: true,
|
||||||
triggers: false,
|
triggers: true,
|
||||||
routines: true,
|
routines: true,
|
||||||
functions: true,
|
functions: true,
|
||||||
// Settings
|
// Settings
|
||||||
@@ -25,7 +25,7 @@ module.exports = {
|
|||||||
databaseEdit: false,
|
databaseEdit: false,
|
||||||
tableSettings: true,
|
tableSettings: true,
|
||||||
viewSettings: true,
|
viewSettings: true,
|
||||||
triggerSettings: false,
|
triggerSettings: true,
|
||||||
routineSettings: true,
|
routineSettings: true,
|
||||||
functionSettings: true,
|
functionSettings: true,
|
||||||
indexes: true,
|
indexes: true,
|
||||||
@@ -38,5 +38,8 @@ module.exports = {
|
|||||||
functionSql: '$BODY$\r\n\r\n$BODY$',
|
functionSql: '$BODY$\r\n\r\n$BODY$',
|
||||||
functionContext: true,
|
functionContext: true,
|
||||||
functionLanguage: true,
|
functionLanguage: true,
|
||||||
|
triggerMultipleEvents: true,
|
||||||
|
triggerTableInName: true,
|
||||||
|
triggerOnlyRename: true,
|
||||||
languages: ['sql', 'plpgsql', 'c', 'internal']
|
languages: ['sql', 'plpgsql', 'c', 'internal']
|
||||||
};
|
};
|
||||||
|
@@ -16,13 +16,15 @@ export default (connections) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.handle('get-table-data', async (event, { uid, schema, table, sortParams }) => {
|
ipcMain.handle('get-table-data', async (event, { uid, schema, table, limit, page, sortParams }) => {
|
||||||
try {
|
try {
|
||||||
|
const offset = (page - 1) * limit;
|
||||||
const query = connections[uid]
|
const query = connections[uid]
|
||||||
.select('*')
|
.select('*')
|
||||||
.schema(schema)
|
.schema(schema)
|
||||||
.from(table)
|
.from(table)
|
||||||
.limit(1000);
|
.limit(limit)
|
||||||
|
.offset(offset);
|
||||||
|
|
||||||
if (sortParams && sortParams.field && sortParams.dir)
|
if (sortParams && sortParams.field && sortParams.dir)
|
||||||
query.orderBy({ [sortParams.field]: sortParams.dir.toUpperCase() });
|
query.orderBy({ [sortParams.field]: sortParams.dir.toUpperCase() });
|
||||||
@@ -59,6 +61,8 @@ export default (connections) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.handle('update-table-cell', async (event, params) => {
|
ipcMain.handle('update-table-cell', async (event, params) => {
|
||||||
|
delete params.row._id;
|
||||||
|
|
||||||
try { // TODO: move to client classes
|
try { // TODO: move to client classes
|
||||||
let escapedParam;
|
let escapedParam;
|
||||||
let reload = false;
|
let reload = false;
|
||||||
|
@@ -26,6 +26,7 @@ export class AntaresCore {
|
|||||||
groupBy: [],
|
groupBy: [],
|
||||||
orderBy: [],
|
orderBy: [],
|
||||||
limit: [],
|
limit: [],
|
||||||
|
offset: [],
|
||||||
join: [],
|
join: [],
|
||||||
update: [],
|
update: [],
|
||||||
insert: [],
|
insert: [],
|
||||||
@@ -109,6 +110,11 @@ export class AntaresCore {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
offset (...args) {
|
||||||
|
this._query.offset = args;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {String | Array} args field = value
|
* @param {String | Array} args field = value
|
||||||
* @returns
|
* @returns
|
||||||
@@ -134,7 +140,7 @@ export class AntaresCore {
|
|||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
* @memberof AntaresCore
|
* @memberof AntaresCore
|
||||||
*/
|
*/
|
||||||
async run (args) {
|
run (args) {
|
||||||
const rawQuery = this.getSQL();
|
const rawQuery = this.getSQL();
|
||||||
this._resetQuery();
|
this._resetQuery();
|
||||||
return this.raw(rawQuery, args);
|
return this.raw(rawQuery, args);
|
||||||
|
@@ -305,10 +305,57 @@ export class MySQLClient extends AntaresCore {
|
|||||||
.select('*')
|
.select('*')
|
||||||
.schema('information_schema')
|
.schema('information_schema')
|
||||||
.from('COLUMNS')
|
.from('COLUMNS')
|
||||||
.where({ TABLE_SCHEMA: `= '${schema}'`, TABLE_NAME: `= '${table}'` })
|
.where({ TABLE_SCHEMA: `= '${this._schema || schema}'`, TABLE_NAME: `= '${table}'` })
|
||||||
.orderBy({ ORDINAL_POSITION: 'ASC' })
|
.orderBy({ ORDINAL_POSITION: 'ASC' })
|
||||||
.run();
|
.run();
|
||||||
|
|
||||||
|
const { rows: fields } = await this.raw(`SHOW CREATE TABLE \`${this._schema || schema}\`.\`${table}\``);
|
||||||
|
|
||||||
|
const remappedFields = fields.map(row => {
|
||||||
|
if (!row['Create Table']) return false;
|
||||||
|
|
||||||
|
let n = 0;
|
||||||
|
return row['Create Table']
|
||||||
|
.split('')
|
||||||
|
.reduce((acc, curr) => {
|
||||||
|
if (curr === ')') n--;
|
||||||
|
if (n !== 0) acc += curr;
|
||||||
|
if (curr === '(') n++;
|
||||||
|
return acc;
|
||||||
|
}, '')
|
||||||
|
.replaceAll('\n', '')
|
||||||
|
.split(',')
|
||||||
|
.map(f => {
|
||||||
|
try {
|
||||||
|
const fieldArr = f.trim().split(' ');
|
||||||
|
const nameAndType = fieldArr.slice(0, 2);
|
||||||
|
if (nameAndType[0].charAt(0) !== '`') return false;
|
||||||
|
|
||||||
|
const details = fieldArr.slice(2).join(' ');
|
||||||
|
let defaultValue = null;
|
||||||
|
if (details.includes('DEFAULT'))
|
||||||
|
defaultValue = details.match(/(?<=DEFAULT ).*?$/gs)[0].split(' COMMENT')[0];
|
||||||
|
|
||||||
|
const typeAndLength = nameAndType[1].replace(')', '').split('(');
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: nameAndType[0].replaceAll('`', ''),
|
||||||
|
type: typeAndLength[0].toUpperCase(),
|
||||||
|
length: typeAndLength[1] ? typeAndLength[1] : null,
|
||||||
|
default: defaultValue
|
||||||
|
};
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.filter(Boolean)
|
||||||
|
.reduce((acc, curr) => {
|
||||||
|
acc[curr.name] = curr;
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
})[0];
|
||||||
|
|
||||||
return rows.map(field => {
|
return rows.map(field => {
|
||||||
let numLength = field.COLUMN_TYPE.match(/int\(([^)]+)\)/);
|
let numLength = field.COLUMN_TYPE.match(/int\(([^)]+)\)/);
|
||||||
numLength = numLength ? +numLength.pop() : null;
|
numLength = numLength ? +numLength.pop() : null;
|
||||||
@@ -319,7 +366,7 @@ export class MySQLClient extends AntaresCore {
|
|||||||
return {
|
return {
|
||||||
name: field.COLUMN_NAME,
|
name: field.COLUMN_NAME,
|
||||||
key: field.COLUMN_KEY.toLowerCase(),
|
key: field.COLUMN_KEY.toLowerCase(),
|
||||||
type: field.DATA_TYPE.toUpperCase(),
|
type: remappedFields ? remappedFields[field.COLUMN_NAME].type : field.DATA_TYPE,
|
||||||
schema: field.TABLE_SCHEMA,
|
schema: field.TABLE_SCHEMA,
|
||||||
table: field.TABLE_NAME,
|
table: field.TABLE_NAME,
|
||||||
numPrecision: field.NUMERIC_PRECISION,
|
numPrecision: field.NUMERIC_PRECISION,
|
||||||
@@ -331,7 +378,7 @@ export class MySQLClient extends AntaresCore {
|
|||||||
unsigned: field.COLUMN_TYPE.includes('unsigned'),
|
unsigned: field.COLUMN_TYPE.includes('unsigned'),
|
||||||
zerofill: field.COLUMN_TYPE.includes('zerofill'),
|
zerofill: field.COLUMN_TYPE.includes('zerofill'),
|
||||||
order: field.ORDINAL_POSITION,
|
order: field.ORDINAL_POSITION,
|
||||||
default: field.COLUMN_DEFAULT, // TODO: get from show create table
|
default: remappedFields ? remappedFields[field.COLUMN_NAME].default : field.COLUMN_DEFAULT,
|
||||||
charset: field.CHARACTER_SET_NAME,
|
charset: field.CHARACTER_SET_NAME,
|
||||||
collation: field.COLLATION_NAME,
|
collation: field.COLLATION_NAME,
|
||||||
autoIncrement: field.EXTRA.includes('auto_increment'),
|
autoIncrement: field.EXTRA.includes('auto_increment'),
|
||||||
@@ -537,8 +584,8 @@ export class MySQLClient extends AntaresCore {
|
|||||||
sql: row['SQL Original Statement'].match(/(BEGIN|begin)(.*)(END|end)/gs)[0],
|
sql: row['SQL Original Statement'].match(/(BEGIN|begin)(.*)(END|end)/gs)[0],
|
||||||
name: row.Trigger,
|
name: row.Trigger,
|
||||||
table: row['SQL Original Statement'].match(/(?<=ON `).*?(?=`)/gs)[0],
|
table: row['SQL Original Statement'].match(/(?<=ON `).*?(?=`)/gs)[0],
|
||||||
event1: row['SQL Original Statement'].match(/(BEFORE|AFTER)/gs)[0],
|
activation: row['SQL Original Statement'].match(/(BEFORE|AFTER)/gs)[0],
|
||||||
event2: row['SQL Original Statement'].match(/(INSERT|UPDATE|DELETE)/gs)[0]
|
event: row['SQL Original Statement'].match(/(INSERT|UPDATE|DELETE)/gs)[0]
|
||||||
};
|
};
|
||||||
})[0];
|
})[0];
|
||||||
}
|
}
|
||||||
@@ -583,7 +630,7 @@ export class MySQLClient extends AntaresCore {
|
|||||||
* @memberof MySQLClient
|
* @memberof MySQLClient
|
||||||
*/
|
*/
|
||||||
async createTrigger (trigger) {
|
async createTrigger (trigger) {
|
||||||
const sql = `CREATE ${trigger.definer ? `DEFINER=${trigger.definer} ` : ''}TRIGGER \`${this._schema}\`.\`${trigger.name}\` ${trigger.event1} ${trigger.event2} ON \`${trigger.table}\` FOR EACH ROW ${trigger.sql}`;
|
const sql = `CREATE ${trigger.definer ? `DEFINER=${trigger.definer} ` : ''}TRIGGER \`${this._schema}\`.\`${trigger.name}\` ${trigger.activation} ${trigger.event} ON \`${trigger.table}\` FOR EACH ROW ${trigger.sql}`;
|
||||||
return await this.raw(sql, { split: false });
|
return await this.raw(sql, { split: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1072,7 +1119,7 @@ export class MySQLClient extends AntaresCore {
|
|||||||
options
|
options
|
||||||
} = params;
|
} = params;
|
||||||
|
|
||||||
let sql = `ALTER TABLE \`${this._schema}\`.\`${table}\` `;
|
let sql = `ALTER TABLE \`${this._schema || params.options.schema}\`.\`${table}\` `;
|
||||||
const alterColumns = [];
|
const alterColumns = [];
|
||||||
|
|
||||||
// OPTIONS
|
// OPTIONS
|
||||||
@@ -1084,7 +1131,7 @@ export class MySQLClient extends AntaresCore {
|
|||||||
// ADD FIELDS
|
// ADD FIELDS
|
||||||
additions.forEach(addition => {
|
additions.forEach(addition => {
|
||||||
const typeInfo = this._getTypeInfo(addition.type);
|
const typeInfo = this._getTypeInfo(addition.type);
|
||||||
const length = typeInfo.length ? addition.numLength || addition.charLength || addition.datePrecision : false;
|
const length = typeInfo.length ? addition.enumValues || addition.numLength || addition.charLength || addition.datePrecision : false;
|
||||||
|
|
||||||
alterColumns.push(`ADD COLUMN \`${addition.name}\`
|
alterColumns.push(`ADD COLUMN \`${addition.name}\`
|
||||||
${addition.type.toUpperCase()}${length ? `(${length})` : ''}
|
${addition.type.toUpperCase()}${length ? `(${length})` : ''}
|
||||||
@@ -1262,7 +1309,10 @@ export class MySQLClient extends AntaresCore {
|
|||||||
// LIMIT
|
// LIMIT
|
||||||
const limitRaw = this._query.limit.length ? `LIMIT ${this._query.limit.join(', ')} ` : '';
|
const limitRaw = this._query.limit.length ? `LIMIT ${this._query.limit.join(', ')} ` : '';
|
||||||
|
|
||||||
return `${selectRaw}${updateRaw ? 'UPDATE' : ''}${insertRaw ? 'INSERT ' : ''}${this._query.delete ? 'DELETE ' : ''}${fromRaw}${updateRaw}${whereRaw}${groupByRaw}${orderByRaw}${limitRaw}${insertRaw}`;
|
// OFFSET
|
||||||
|
const offsetRaw = this._query.offset.length ? `OFFSET ${this._query.offset.join(', ')} ` : '';
|
||||||
|
|
||||||
|
return `${selectRaw}${updateRaw ? 'UPDATE' : ''}${insertRaw ? 'INSERT ' : ''}${this._query.delete ? 'DELETE ' : ''}${fromRaw}${updateRaw}${whereRaw}${groupByRaw}${orderByRaw}${limitRaw}${offsetRaw}${insertRaw}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1351,6 +1401,7 @@ export class MySQLClient extends AntaresCore {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
|
if (isPool) connection.release();
|
||||||
reject(err);
|
reject(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1359,6 +1410,7 @@ export class MySQLClient extends AntaresCore {
|
|||||||
keysArr = keysArr ? [...keysArr, ...response] : response;
|
keysArr = keysArr ? [...keysArr, ...response] : response;
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
|
if (isPool) connection.release();
|
||||||
reject(err);
|
reject(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -496,17 +496,33 @@ export class PostgreSQLClient extends AntaresCore {
|
|||||||
* @memberof PostgreSQLClient
|
* @memberof PostgreSQLClient
|
||||||
*/
|
*/
|
||||||
async getTriggerInformations ({ schema, trigger }) {
|
async getTriggerInformations ({ schema, trigger }) {
|
||||||
const sql = `SHOW CREATE TRIGGER \`${schema}\`.\`${trigger}\``;
|
const [table, triggerName] = trigger.split('.');
|
||||||
const results = await this.raw(sql);
|
|
||||||
|
const results = await this.raw(`
|
||||||
|
SELECT event_object_schema AS table_schema,
|
||||||
|
event_object_table AS table_name,
|
||||||
|
trigger_schema,
|
||||||
|
trigger_name,
|
||||||
|
string_agg(event_manipulation, ',') AS event,
|
||||||
|
action_timing AS activation,
|
||||||
|
action_condition AS condition,
|
||||||
|
action_statement AS definition
|
||||||
|
FROM information_schema.triggers
|
||||||
|
WHERE trigger_schema = '${schema}'
|
||||||
|
AND trigger_name = '${triggerName}'
|
||||||
|
AND event_object_table = '${table}'
|
||||||
|
GROUP BY 1,2,3,4,6,7,8
|
||||||
|
ORDER BY table_schema,
|
||||||
|
table_name
|
||||||
|
`);
|
||||||
|
|
||||||
return results.rows.map(row => {
|
return results.rows.map(row => {
|
||||||
return {
|
return {
|
||||||
definer: row['SQL Original Statement'].match(/(?<=DEFINER=).*?(?=\s)/gs)[0],
|
sql: row.definition,
|
||||||
sql: row['SQL Original Statement'].match(/(BEGIN|begin)(.*)(END|end)/gs)[0],
|
name: row.trigger_name,
|
||||||
name: row.Trigger,
|
table: row.table_name,
|
||||||
table: row['SQL Original Statement'].match(/(?<=ON `).*?(?=`)/gs)[0],
|
event: row.event.split(','),
|
||||||
event1: row['SQL Original Statement'].match(/(BEFORE|AFTER)/gs)[0],
|
activation: row.activation
|
||||||
event2: row['SQL Original Statement'].match(/(INSERT|UPDATE|DELETE)/gs)[0]
|
|
||||||
};
|
};
|
||||||
})[0];
|
})[0];
|
||||||
}
|
}
|
||||||
@@ -531,18 +547,21 @@ export class PostgreSQLClient extends AntaresCore {
|
|||||||
*/
|
*/
|
||||||
async alterTrigger (params) {
|
async alterTrigger (params) {
|
||||||
const { trigger } = params;
|
const { trigger } = params;
|
||||||
const tempTrigger = Object.assign({}, trigger);
|
// const tempTrigger = Object.assign({}, trigger);
|
||||||
tempTrigger.name = `Antares_${tempTrigger.name}_tmp`;
|
// tempTrigger.name = `Antares_${tempTrigger.name}_tmp`;
|
||||||
|
|
||||||
try {
|
// try {
|
||||||
await this.createTrigger(tempTrigger);
|
// await this.createTrigger(tempTrigger);
|
||||||
await this.dropTrigger({ trigger: tempTrigger.name });
|
// await this.dropTrigger({ trigger: tempTrigger.name });
|
||||||
await this.dropTrigger({ trigger: trigger.oldName });
|
// await this.dropTrigger({ trigger: trigger.oldName });
|
||||||
await this.createTrigger(trigger);
|
// await this.createTrigger(trigger);
|
||||||
}
|
// }
|
||||||
catch (err) {
|
// catch (err) {
|
||||||
return Promise.reject(err);
|
// return Promise.reject(err);
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
const sql = `ALTER TRIGGER ${trigger.oldName} ON ${trigger.table} RENAME TO ${trigger.name}`;
|
||||||
|
return await this.raw(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -552,7 +571,7 @@ export class PostgreSQLClient extends AntaresCore {
|
|||||||
* @memberof PostgreSQLClient
|
* @memberof PostgreSQLClient
|
||||||
*/
|
*/
|
||||||
async createTrigger (trigger) {
|
async createTrigger (trigger) {
|
||||||
const sql = `CREATE ${trigger.definer ? `DEFINER=${trigger.definer} ` : ''}TRIGGER \`${trigger.name}\` ${trigger.event1} ${trigger.event2} ON \`${trigger.table}\` FOR EACH ROW ${trigger.sql}`;
|
const sql = `CREATE ${trigger.definer ? `DEFINER=${trigger.definer} ` : ''}TRIGGER \`${trigger.name}\` ${trigger.event} ${trigger.activation} ON \`${trigger.table}\` FOR EACH ROW ${trigger.sql}`;
|
||||||
return await this.raw(sql, { split: false });
|
return await this.raw(sql, { split: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1139,7 +1158,10 @@ export class PostgreSQLClient extends AntaresCore {
|
|||||||
// LIMIT
|
// LIMIT
|
||||||
const limitRaw = selectArray.length && this._query.limit.length ? `LIMIT ${this._query.limit.join(', ')} ` : '';
|
const limitRaw = selectArray.length && this._query.limit.length ? `LIMIT ${this._query.limit.join(', ')} ` : '';
|
||||||
|
|
||||||
return `${selectRaw}${updateRaw ? 'UPDATE' : ''}${insertRaw ? 'INSERT ' : ''}${this._query.delete ? 'DELETE ' : ''}${fromRaw}${updateRaw}${whereRaw}${groupByRaw}${orderByRaw}${limitRaw}${insertRaw}`;
|
// OFFSET
|
||||||
|
const offsetRaw = selectArray.length && this._query.offset.length ? `OFFSET ${this._query.offset.join(', ')} ` : '';
|
||||||
|
|
||||||
|
return `${selectRaw}${updateRaw ? 'UPDATE' : ''}${insertRaw ? 'INSERT ' : ''}${this._query.delete ? 'DELETE ' : ''}${fromRaw}${updateRaw}${whereRaw}${groupByRaw}${orderByRaw}${limitRaw}${offsetRaw}${insertRaw}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -51,7 +51,8 @@ export default {
|
|||||||
}),
|
}),
|
||||||
isValidDefault () {
|
isValidDefault () {
|
||||||
if (!this.foreignList.length) return true;
|
if (!this.foreignList.length) return true;
|
||||||
return this.value === null || this.foreignList.some(foreign => foreign.foreign_column.toString() === this.value.toString());
|
if (this.value === null) return false;
|
||||||
|
return this.foreignList.some(foreign => foreign.foreign_column.toString() === this.value.toString());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async created () {
|
async created () {
|
||||||
@@ -65,7 +66,7 @@ export default {
|
|||||||
try { // Field data
|
try { // Field data
|
||||||
const { status, response } = await Tables.getTableColumns(params);
|
const { status, response } = await Tables.getTableColumns(params);
|
||||||
if (status === 'success') {
|
if (status === 'success') {
|
||||||
const textField = response.find(field => [...TEXT, ...LONG_TEXT].includes(field.type));
|
const textField = response.find(field => [...TEXT, ...LONG_TEXT].includes(field.type) && field.name !== this.keyUsage.refField);
|
||||||
foreignDesc = textField ? textField.name : false;
|
foreignDesc = textField ? textField.name : false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@@ -250,10 +250,15 @@ export default {
|
|||||||
if (field.default === 'NULL') fieldDefault = null;
|
if (field.default === 'NULL') fieldDefault = null;
|
||||||
else {
|
else {
|
||||||
if ([...NUMBER, ...FLOAT].includes(field.type))
|
if ([...NUMBER, ...FLOAT].includes(field.type))
|
||||||
fieldDefault = +field.default;
|
fieldDefault = Number.isNaN(+field.default) ? null : +field.default;
|
||||||
|
|
||||||
if ([...TEXT, ...LONG_TEXT].includes(field.type))
|
if ([...TEXT, ...LONG_TEXT].includes(field.type)) {
|
||||||
fieldDefault = field.default ? field.default.substring(1, field.default.length - 1) : '';
|
fieldDefault = field.default
|
||||||
|
? field.default.includes('\'')
|
||||||
|
? field.default.split('\'')[1]
|
||||||
|
: field.default
|
||||||
|
: '';
|
||||||
|
}
|
||||||
|
|
||||||
if ([...TIME, ...DATE].includes(field.type))
|
if ([...TIME, ...DATE].includes(field.type))
|
||||||
fieldDefault = field.default;
|
fieldDefault = field.default;
|
||||||
|
@@ -71,11 +71,11 @@
|
|||||||
</label>
|
</label>
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<select v-model="localTrigger.event1" class="form-select">
|
<select v-model="localTrigger.activation" class="form-select">
|
||||||
<option>BEFORE</option>
|
<option>BEFORE</option>
|
||||||
<option>AFTER</option>
|
<option>AFTER</option>
|
||||||
</select>
|
</select>
|
||||||
<select v-model="localTrigger.event2" class="form-select">
|
<select v-model="localTrigger.event" class="form-select">
|
||||||
<option>INSERT</option>
|
<option>INSERT</option>
|
||||||
<option>UPDATE</option>
|
<option>UPDATE</option>
|
||||||
<option>DELETE</option>
|
<option>DELETE</option>
|
||||||
@@ -106,8 +106,8 @@ export default {
|
|||||||
sql: 'BEGIN\r\n\r\nEND',
|
sql: 'BEGIN\r\n\r\nEND',
|
||||||
name: '',
|
name: '',
|
||||||
table: '',
|
table: '',
|
||||||
event1: 'BEFORE',
|
activation: 'BEFORE',
|
||||||
event2: 'INSERT'
|
event: 'INSERT'
|
||||||
},
|
},
|
||||||
isOptionsChanging: false
|
isOptionsChanging: false
|
||||||
};
|
};
|
||||||
|
@@ -83,6 +83,27 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-6 col-sm-12">
|
||||||
|
<label class="form-label">
|
||||||
|
{{ $t('message.dataTabPageSize') }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="col-6 col-sm-12">
|
||||||
|
<select
|
||||||
|
v-model="localPageSize"
|
||||||
|
class="form-select"
|
||||||
|
@change="changePageSize(+localPageSize)"
|
||||||
|
>
|
||||||
|
<option
|
||||||
|
v-for="size in pageSizes"
|
||||||
|
:key="size"
|
||||||
|
>
|
||||||
|
{{ size }}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-6 col-sm-12">
|
<div class="col-6 col-sm-12">
|
||||||
<label class="form-label">
|
<label class="form-label">
|
||||||
@@ -227,7 +248,7 @@
|
|||||||
<h4>{{ appName }}</h4>
|
<h4>{{ appName }}</h4>
|
||||||
<p>
|
<p>
|
||||||
{{ $t('word.version') }} {{ appVersion }}<br>
|
{{ $t('word.version') }} {{ appVersion }}<br>
|
||||||
<a class="c-hand" @click="openOutside('https://github.com/Fabio286/antares')">GitHub</a> | <a class="c-hand" @click="openOutside('https://antares-sql.app/')">Website</a><br>
|
<a class="c-hand" @click="openOutside('https://github.com/Fabio286/antares')"><i class="mdi mdi-github d-inline" /> GitHub</a> • <a class="c-hand" @click="openOutside('https://twitter.com/AntaresSQL')"><i class="mdi mdi-twitter d-inline" /> Twitter</a> • <a class="c-hand" @click="openOutside('https://antares-sql.app/')"><i class="mdi mdi-web d-inline" /> Website</a><br>
|
||||||
<small>{{ $t('word.author') }} <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">Fabio Di Stasio</a></small><br>
|
<small>{{ $t('word.author') }} <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">Fabio Di Stasio</a></small><br>
|
||||||
<small>{{ $t('message.madeWithJS') }}</small>
|
<small>{{ $t('message.madeWithJS') }}</small>
|
||||||
</p>
|
</p>
|
||||||
@@ -257,9 +278,11 @@ export default {
|
|||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
localLocale: null,
|
localLocale: null,
|
||||||
|
localPageSize: null,
|
||||||
localTimeout: null,
|
localTimeout: null,
|
||||||
localEditorTheme: null,
|
localEditorTheme: null,
|
||||||
selectedTab: 'general',
|
selectedTab: 'general',
|
||||||
|
pageSizes: [40, 100, 250, 500, 1000],
|
||||||
editorThemes: [
|
editorThemes: [
|
||||||
{
|
{
|
||||||
group: this.$t('word.light'),
|
group: this.$t('word.light'),
|
||||||
@@ -317,6 +340,7 @@ export default {
|
|||||||
appVersion: 'application/appVersion',
|
appVersion: 'application/appVersion',
|
||||||
selectedSettingTab: 'application/selectedSettingTab',
|
selectedSettingTab: 'application/selectedSettingTab',
|
||||||
selectedLocale: 'settings/getLocale',
|
selectedLocale: 'settings/getLocale',
|
||||||
|
pageSize: 'settings/getDataTabLimit',
|
||||||
selectedAutoComplete: 'settings/getAutoComplete',
|
selectedAutoComplete: 'settings/getAutoComplete',
|
||||||
selectedLineWrap: 'settings/getLineWrap',
|
selectedLineWrap: 'settings/getLineWrap',
|
||||||
notificationsTimeout: 'settings/getNotificationsTimeout',
|
notificationsTimeout: 'settings/getNotificationsTimeout',
|
||||||
@@ -359,6 +383,7 @@ ORDER BY
|
|||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
this.localLocale = this.selectedLocale;
|
this.localLocale = this.selectedLocale;
|
||||||
|
this.localPageSize = this.pageSize;
|
||||||
this.localTimeout = this.notificationsTimeout;
|
this.localTimeout = this.notificationsTimeout;
|
||||||
this.localEditorTheme = this.editorTheme;
|
this.localEditorTheme = this.editorTheme;
|
||||||
this.selectedTab = this.selectedSettingTab;
|
this.selectedTab = this.selectedSettingTab;
|
||||||
@@ -371,6 +396,7 @@ ORDER BY
|
|||||||
...mapActions({
|
...mapActions({
|
||||||
closeModal: 'application/hideSettingModal',
|
closeModal: 'application/hideSettingModal',
|
||||||
changeLocale: 'settings/changeLocale',
|
changeLocale: 'settings/changeLocale',
|
||||||
|
changePageSize: 'settings/changePageSize',
|
||||||
changeAutoComplete: 'settings/changeAutoComplete',
|
changeAutoComplete: 'settings/changeAutoComplete',
|
||||||
changeLineWrap: 'settings/changeLineWrap',
|
changeLineWrap: 'settings/changeLineWrap',
|
||||||
changeApplicationTheme: 'settings/changeApplicationTheme',
|
changeApplicationTheme: 'settings/changeApplicationTheme',
|
||||||
|
@@ -239,11 +239,11 @@ export default {
|
|||||||
field.defaultType = 'noval';
|
field.defaultType = 'noval';
|
||||||
else if (field.default === 'NULL')
|
else if (field.default === 'NULL')
|
||||||
field.defaultType = 'null';
|
field.defaultType = 'null';
|
||||||
else if (field.default.match(/^\s*(\w+)\s*\((.*)\)$/))
|
else if (isNaN(+field.default) && field.default.charAt(0) !== '\'')
|
||||||
field.defaultType = 'expression';
|
field.defaultType = 'expression';
|
||||||
else {
|
else {
|
||||||
field.defaultType = 'custom';
|
field.defaultType = 'custom';
|
||||||
if (isNaN(field.default) && !field.default.includes('\''))
|
if (isNaN(+field.default) && !field.default.includes('\''))
|
||||||
field.default = `'${field.default}'`;
|
field.default = `'${field.default}'`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -37,7 +37,7 @@
|
|||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-auto">
|
<div v-if="customizations.definer" class="column col-auto">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label">{{ $t('word.definer') }}</label>
|
<label class="form-label">{{ $t('word.definer') }}</label>
|
||||||
<select
|
<select
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="columns">
|
<fieldset class="columns" :disabled="customizations.triggerOnlyRename">
|
||||||
<div class="column col-auto">
|
<div class="column col-auto">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label">{{ $t('word.table') }}</label>
|
<label class="form-label">{{ $t('word.table') }}</label>
|
||||||
@@ -82,19 +82,33 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label">{{ $t('word.event') }}</label>
|
<label class="form-label">{{ $t('word.event') }}</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<select v-model="localTrigger.event1" class="form-select">
|
<select v-model="localTrigger.activation" class="form-select">
|
||||||
<option>BEFORE</option>
|
<option>BEFORE</option>
|
||||||
<option>AFTER</option>
|
<option>AFTER</option>
|
||||||
</select>
|
</select>
|
||||||
<select v-model="localTrigger.event2" class="form-select">
|
<select
|
||||||
<option>INSERT</option>
|
v-if="!customizations.triggerMultipleEvents"
|
||||||
<option>UPDATE</option>
|
v-model="localTrigger.event"
|
||||||
<option>DELETE</option>
|
class="form-select"
|
||||||
|
>
|
||||||
|
<option v-for="event in Object.keys(localEvents)" :key="event">
|
||||||
|
{{ event }}
|
||||||
|
</option>
|
||||||
</select>
|
</select>
|
||||||
|
<div v-if="customizations.triggerMultipleEvents" class="px-4">
|
||||||
|
<label
|
||||||
|
v-for="event in Object.keys(localEvents)"
|
||||||
|
:key="event"
|
||||||
|
class="form-checkbox form-inline"
|
||||||
|
@change.prevent="changeEvents(event)"
|
||||||
|
>
|
||||||
|
<input :checked="localEvents[event]" type="checkbox"><i class="form-icon" /> {{ event }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
<div class="workspace-query-results column col-12 mt-2 p-relative">
|
<div class="workspace-query-results column col-12 mt-2 p-relative">
|
||||||
<BaseLoader v-if="isLoading" />
|
<BaseLoader v-if="isLoading" />
|
||||||
@@ -136,7 +150,8 @@ export default {
|
|||||||
localTrigger: { sql: '' },
|
localTrigger: { sql: '' },
|
||||||
lastTrigger: null,
|
lastTrigger: null,
|
||||||
sqlProxy: '',
|
sqlProxy: '',
|
||||||
editorHeight: 300
|
editorHeight: 300,
|
||||||
|
localEvents: { INSERT: false, UPDATE: false, DELETE: false }
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -147,6 +162,9 @@ export default {
|
|||||||
workspace () {
|
workspace () {
|
||||||
return this.getWorkspace(this.connection.uid);
|
return this.getWorkspace(this.connection.uid);
|
||||||
},
|
},
|
||||||
|
customizations () {
|
||||||
|
return this.workspace.customizations;
|
||||||
|
},
|
||||||
isSelected () {
|
isSelected () {
|
||||||
return this.workspace.selected_tab === 'prop' && this.selectedWorkspace === this.workspace.uid && this.trigger;
|
return this.workspace.selected_tab === 'prop' && this.selectedWorkspace === this.workspace.uid && this.trigger;
|
||||||
},
|
},
|
||||||
@@ -209,6 +227,10 @@ export default {
|
|||||||
async getTriggerData () {
|
async getTriggerData () {
|
||||||
if (!this.trigger) return;
|
if (!this.trigger) return;
|
||||||
|
|
||||||
|
Object.keys(this.localEvents).forEach(event => {
|
||||||
|
this.localEvents[event] = false;
|
||||||
|
});
|
||||||
|
|
||||||
this.localTrigger = { sql: '' };
|
this.localTrigger = { sql: '' };
|
||||||
this.isLoading = true;
|
this.isLoading = true;
|
||||||
|
|
||||||
@@ -224,6 +246,12 @@ export default {
|
|||||||
this.originalTrigger = response;
|
this.originalTrigger = response;
|
||||||
this.localTrigger = JSON.parse(JSON.stringify(this.originalTrigger));
|
this.localTrigger = JSON.parse(JSON.stringify(this.originalTrigger));
|
||||||
this.sqlProxy = this.localTrigger.sql;
|
this.sqlProxy = this.localTrigger.sql;
|
||||||
|
|
||||||
|
if (this.customizations.triggerMultipleEvents) {
|
||||||
|
this.originalTrigger.event.forEach(e => {
|
||||||
|
this.localEvents[e] = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
this.addNotification({ status: 'error', message: response });
|
this.addNotification({ status: 'error', message: response });
|
||||||
@@ -235,6 +263,16 @@ export default {
|
|||||||
this.resizeQueryEditor();
|
this.resizeQueryEditor();
|
||||||
this.isLoading = false;
|
this.isLoading = false;
|
||||||
},
|
},
|
||||||
|
changeEvents (event) {
|
||||||
|
if (this.customizations.triggerMultipleEvents) {
|
||||||
|
this.localEvents[event] = !this.localEvents[event];
|
||||||
|
this.localTrigger.event = [];
|
||||||
|
for (const key in this.localEvents) {
|
||||||
|
if (this.localEvents[key])
|
||||||
|
this.localTrigger.event.push(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
async saveChanges () {
|
async saveChanges () {
|
||||||
if (this.isSaving) return;
|
if (this.isSaving) return;
|
||||||
this.isSaving = true;
|
this.isSaving = true;
|
||||||
@@ -257,7 +295,8 @@ export default {
|
|||||||
|
|
||||||
if (oldName !== this.localTrigger.name) {
|
if (oldName !== this.localTrigger.name) {
|
||||||
this.setUnsavedChanges(false);
|
this.setUnsavedChanges(false);
|
||||||
this.changeBreadcrumbs({ schema: this.schema, trigger: this.localTrigger.name });
|
const triggerName = this.customizations.triggerTableInName ? `${this.localTrigger.table}.${this.localTrigger.name}` : this.localTrigger.name;
|
||||||
|
this.changeBreadcrumbs({ schema: this.schema, trigger: triggerName });
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getTriggerData();
|
this.getTriggerData();
|
||||||
@@ -274,6 +313,16 @@ export default {
|
|||||||
clearChanges () {
|
clearChanges () {
|
||||||
this.localTrigger = JSON.parse(JSON.stringify(this.originalTrigger));
|
this.localTrigger = JSON.parse(JSON.stringify(this.originalTrigger));
|
||||||
this.$refs.queryEditor.editor.session.setValue(this.localTrigger.sql);
|
this.$refs.queryEditor.editor.session.setValue(this.localTrigger.sql);
|
||||||
|
|
||||||
|
Object.keys(this.localEvents).forEach(event => {
|
||||||
|
this.localEvents[event] = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this.customizations.triggerMultipleEvents) {
|
||||||
|
this.originalTrigger.event.forEach(e => {
|
||||||
|
this.localEvents[e] = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
resizeQueryEditor () {
|
resizeQueryEditor () {
|
||||||
if (this.$refs.queryEditor) {
|
if (this.$refs.queryEditor) {
|
||||||
|
@@ -96,7 +96,12 @@
|
|||||||
class="cell-content"
|
class="cell-content"
|
||||||
@dblclick="editON($event, localLength, 'length')"
|
@dblclick="editON($event, localLength, 'length')"
|
||||||
>
|
>
|
||||||
{{ localLength }}
|
<span v-if="localRow.enumValues">
|
||||||
|
{{ localRow.enumValues }}
|
||||||
|
</span>
|
||||||
|
<span v-else>
|
||||||
|
{{ localLength }}
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<input
|
<input
|
||||||
v-else-if="localRow.enumValues"
|
v-else-if="localRow.enumValues"
|
||||||
@@ -361,7 +366,7 @@ export default {
|
|||||||
getWorkspace: 'workspaces/getWorkspace'
|
getWorkspace: 'workspaces/getWorkspace'
|
||||||
}),
|
}),
|
||||||
localLength () {
|
localLength () {
|
||||||
return this.localRow.enumValues || this.localRow.numLength || this.localRow.charLength || this.localRow.datePrecision || this.localRow.numPrecision || 0;
|
return this.localRow.numLength || this.localRow.charLength || this.localRow.datePrecision || this.localRow.numPrecision || 0;
|
||||||
},
|
},
|
||||||
fieldType () {
|
fieldType () {
|
||||||
const fieldType = this.dataTypes.reduce((acc, group) => [...acc, ...group.types], []).filter(type =>
|
const fieldType = this.dataTypes.reduce((acc, group) => [...acc, ...group.types], []).filter(type =>
|
||||||
@@ -445,8 +450,13 @@ export default {
|
|||||||
|
|
||||||
this.defaultValue.onUpdate = this.localRow.onUpdate;
|
this.defaultValue.onUpdate = this.localRow.onUpdate;
|
||||||
this.defaultValue.type = this.localRow.defaultType;
|
this.defaultValue.type = this.localRow.defaultType;
|
||||||
if (this.defaultValue.type === 'custom')
|
if (this.defaultValue.type === 'custom') {
|
||||||
this.defaultValue.custom = this.localRow.default;
|
this.defaultValue.custom = this.localRow.default
|
||||||
|
? this.localRow.default.includes('\'')
|
||||||
|
? this.localRow.default.split('\'')[1]
|
||||||
|
: this.localRow.default
|
||||||
|
: '';
|
||||||
|
}
|
||||||
if (this.defaultValue.type === 'expression')
|
if (this.defaultValue.type === 'expression')
|
||||||
this.defaultValue.expression = this.localRow.default;
|
this.defaultValue.expression = this.localRow.default;
|
||||||
},
|
},
|
||||||
@@ -525,7 +535,7 @@ export default {
|
|||||||
break;
|
break;
|
||||||
case 'custom':
|
case 'custom':
|
||||||
this.localRow.autoIncrement = false;
|
this.localRow.autoIncrement = false;
|
||||||
this.localRow.default = this.defaultValue.custom;
|
this.localRow.default = Number.isNaN(+this.defaultValue.custom) ? `'${this.defaultValue.custom}'` : this.defaultValue.custom;
|
||||||
break;
|
break;
|
||||||
case 'expression':
|
case 'expression':
|
||||||
this.localRow.autoIncrement = false;
|
this.localRow.autoIncrement = false;
|
||||||
|
@@ -139,7 +139,8 @@ export default {
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters({
|
...mapGetters({
|
||||||
getWorkspace: 'workspaces/getWorkspace'
|
getWorkspace: 'workspaces/getWorkspace',
|
||||||
|
pageSize: 'settings/getDataTabLimit'
|
||||||
}),
|
}),
|
||||||
workspaceSchema () {
|
workspaceSchema () {
|
||||||
return this.getWorkspace(this.connUid).breadcrumbs.schema;
|
return this.getWorkspace(this.connUid).breadcrumbs.schema;
|
||||||
@@ -157,7 +158,7 @@ export default {
|
|||||||
return this.fields.every(field => field.name);
|
return this.fields.every(field => field.name);
|
||||||
},
|
},
|
||||||
isHardSort () {
|
isHardSort () {
|
||||||
return this.mode === 'table' && this.localResults.length === 1000;
|
return this.mode === 'table' && this.localResults.length === this.pageSize;
|
||||||
},
|
},
|
||||||
sortedResults () {
|
sortedResults () {
|
||||||
if (this.currentSort && !this.isHardSort) {
|
if (this.currentSort && !this.isHardSort) {
|
||||||
@@ -345,7 +346,9 @@ export default {
|
|||||||
closeContext () {
|
closeContext () {
|
||||||
this.isContext = false;
|
this.isContext = false;
|
||||||
},
|
},
|
||||||
showDeleteConfirmModal () {
|
showDeleteConfirmModal (e) {
|
||||||
|
if (e && e.path && ['INPUT', 'TEXTAREA', 'SELECT'].includes(e.path[0].tagName))
|
||||||
|
return;
|
||||||
this.isDeleteConfirmModal = true;
|
this.isDeleteConfirmModal = true;
|
||||||
},
|
},
|
||||||
hideDeleteConfirmModal () {
|
hideDeleteConfirmModal () {
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
>
|
>
|
||||||
<template v-if="cKey !== '_id'">
|
<template v-if="cKey !== '_id'">
|
||||||
<span
|
<span
|
||||||
v-if="!isInlineEditor[cKey]"
|
v-if="!isInlineEditor[cKey] && fields[cKey]"
|
||||||
class="cell-content px-2"
|
class="cell-content px-2"
|
||||||
:class="`${isNull(col)} ${typeClass(fields[cKey].type)}`"
|
:class="`${isNull(col)} ${typeClass(fields[cKey].type)}`"
|
||||||
@dblclick="editON($event, col, cKey)"
|
@dblclick="editON($event, col, cKey)"
|
||||||
@@ -348,7 +348,7 @@ export default {
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
enumArray () {
|
enumArray () {
|
||||||
if (this.fields[this.editingField].enumValues)
|
if (this.fields[this.editingField] && this.fields[this.editingField].enumValues)
|
||||||
return this.fields[this.editingField].enumValues.replaceAll('\'', '').split(',');
|
return this.fields[this.editingField].enumValues.replaceAll('\'', '').split(',');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -32,6 +32,29 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="btn-group">
|
||||||
|
<button
|
||||||
|
class="btn btn-dark btn-sm mr-0"
|
||||||
|
:disabled="isQuering || page === 1"
|
||||||
|
title="CTRL+ᐊ"
|
||||||
|
@click="pageChange('prev')"
|
||||||
|
>
|
||||||
|
<i class="mdi mdi-24px mdi-skip-previous" />
|
||||||
|
</button>
|
||||||
|
<div class="btn btn-dark btn-sm mr-0 text-bold c-auto px-2">
|
||||||
|
{{ page }}
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
class="btn btn-dark btn-sm mr-0"
|
||||||
|
:disabled="isQuering || (results.length && results[0].rows.length < limit)"
|
||||||
|
title="CTRL+ᐅ"
|
||||||
|
@click="pageChange('next')"
|
||||||
|
>
|
||||||
|
<i class="mdi mdi-24px mdi-skip-next" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="divider-vert py-3" />
|
||||||
|
|
||||||
<button
|
<button
|
||||||
v-if="isTable"
|
v-if="isTable"
|
||||||
@@ -72,10 +95,10 @@
|
|||||||
<i class="mdi mdi-timer-sand mdi-rotate-180 pr-1" /> <b>{{ results[0].duration / 1000 }}s</b>
|
<i class="mdi mdi-timer-sand mdi-rotate-180 pr-1" /> <b>{{ results[0].duration / 1000 }}s</b>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="results.length && results[0].rows">
|
<div v-if="results.length && results[0].rows">
|
||||||
{{ $t('word.results') }}: <b>{{ results[0].rows.length.toLocaleString() }}</b>
|
{{ $t('word.results') }}: <b>{{ results[0].rows.length | localeString }}</b>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="hasApproximately">
|
<div v-if="hasApproximately || (page > 1 && tableInfo.rows)">
|
||||||
{{ $t('word.total') }}: <b>{{ tableInfo.rows.toLocaleString() }}</b> <small>({{ $t('word.approximately') }})</small>
|
{{ $t('word.total') }}: <b>{{ tableInfo.rows | localeString }}</b> <small>({{ $t('word.approximately') }})</small>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="workspace.breadcrumbs.database">
|
<div v-if="workspace.breadcrumbs.database">
|
||||||
{{ $t('word.schema') }}: <b>{{ workspace.breadcrumbs.database }}</b>
|
{{ $t('word.schema') }}: <b>{{ workspace.breadcrumbs.database }}</b>
|
||||||
@@ -134,6 +157,12 @@ export default {
|
|||||||
ModalNewTableRow,
|
ModalNewTableRow,
|
||||||
ModalFakerRows
|
ModalFakerRows
|
||||||
},
|
},
|
||||||
|
filters: {
|
||||||
|
localeString (val) {
|
||||||
|
if (val)
|
||||||
|
return val.toLocaleString();
|
||||||
|
}
|
||||||
|
},
|
||||||
mixins: [tableTabs],
|
mixins: [tableTabs],
|
||||||
props: {
|
props: {
|
||||||
connection: Object,
|
connection: Object,
|
||||||
@@ -149,13 +178,15 @@ export default {
|
|||||||
isFakerModal: false,
|
isFakerModal: false,
|
||||||
autorefreshTimer: 0,
|
autorefreshTimer: 0,
|
||||||
refreshInterval: null,
|
refreshInterval: null,
|
||||||
sortParams: {}
|
sortParams: {},
|
||||||
|
page: 1
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters({
|
...mapGetters({
|
||||||
getWorkspace: 'workspaces/getWorkspace',
|
getWorkspace: 'workspaces/getWorkspace',
|
||||||
selectedWorkspace: 'workspaces/getSelected'
|
selectedWorkspace: 'workspaces/getSelected',
|
||||||
|
limit: 'settings/getDataTabLimit'
|
||||||
}),
|
}),
|
||||||
workspace () {
|
workspace () {
|
||||||
return this.getWorkspace(this.connection.uid);
|
return this.getWorkspace(this.connection.uid);
|
||||||
@@ -184,19 +215,23 @@ export default {
|
|||||||
return this.results.length &&
|
return this.results.length &&
|
||||||
this.results[0].rows &&
|
this.results[0].rows &&
|
||||||
this.tableInfo &&
|
this.tableInfo &&
|
||||||
this.results[0].rows.length === 1000 &&
|
this.results[0].rows.length === this.limit &&
|
||||||
this.results[0].rows.length < this.tableInfo.rows;
|
this.results[0].rows.length < this.tableInfo.rows;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
table () {
|
table () {
|
||||||
if (this.isSelected) {
|
if (this.isSelected) {
|
||||||
|
this.page = 1;
|
||||||
this.sortParams = {};
|
this.sortParams = {};
|
||||||
this.getTableData();
|
this.getTableData();
|
||||||
this.lastTable = this.table;
|
this.lastTable = this.table;
|
||||||
this.$refs.queryTable.resetSort();
|
this.$refs.queryTable.resetSort();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
page () {
|
||||||
|
this.getTableData();
|
||||||
|
},
|
||||||
isSelected (val) {
|
isSelected (val) {
|
||||||
if (val && this.lastTable !== this.table) {
|
if (val && this.lastTable !== this.table) {
|
||||||
this.getTableData();
|
this.getTableData();
|
||||||
@@ -228,6 +263,8 @@ export default {
|
|||||||
uid: this.connection.uid,
|
uid: this.connection.uid,
|
||||||
schema: this.schema,
|
schema: this.schema,
|
||||||
table: this.workspace.breadcrumbs.table || this.workspace.breadcrumbs.view,
|
table: this.workspace.breadcrumbs.table || this.workspace.breadcrumbs.view,
|
||||||
|
limit: this.limit,
|
||||||
|
page: this.page,
|
||||||
sortParams
|
sortParams
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -255,6 +292,14 @@ export default {
|
|||||||
this.sortParams = sortParams;
|
this.sortParams = sortParams;
|
||||||
this.getTableData(sortParams);
|
this.getTableData(sortParams);
|
||||||
},
|
},
|
||||||
|
pageChange (direction) {
|
||||||
|
if (this.isQuering) return;
|
||||||
|
|
||||||
|
if (direction === 'next' && (this.results.length && this.results[0].rows.length === this.limit))
|
||||||
|
this.page++;
|
||||||
|
else if (direction === 'prev' && this.page > 1)
|
||||||
|
this.page--;
|
||||||
|
},
|
||||||
showAddModal () {
|
showAddModal () {
|
||||||
this.isAddModal = true;
|
this.isAddModal = true;
|
||||||
},
|
},
|
||||||
@@ -273,6 +318,13 @@ export default {
|
|||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
if (e.key === 'F5')
|
if (e.key === 'F5')
|
||||||
this.reloadTable();
|
this.reloadTable();
|
||||||
|
|
||||||
|
if (e.ctrlKey) {
|
||||||
|
if (e.key === 'ArrowRight')
|
||||||
|
this.pageChange('next');
|
||||||
|
if (e.key === 'ArrowLeft')
|
||||||
|
this.pageChange('prev');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
setRefreshInterval () {
|
setRefreshInterval () {
|
||||||
|
379
src/renderer/i18n/de-DE.js
Normal file
379
src/renderer/i18n/de-DE.js
Normal file
@@ -0,0 +1,379 @@
|
|||||||
|
module.exports = {
|
||||||
|
word: {
|
||||||
|
edit: 'Bearbeiten',
|
||||||
|
save: 'Speichern',
|
||||||
|
close: 'Schließen',
|
||||||
|
delete: 'Löschen',
|
||||||
|
confirm: 'Bestätigen',
|
||||||
|
cancel: 'Abbrechen',
|
||||||
|
send: 'Senden',
|
||||||
|
connectionName: 'Verbindungsname',
|
||||||
|
client: 'Client',
|
||||||
|
hostName: 'Hostname',
|
||||||
|
port: 'Port',
|
||||||
|
user: 'Nutzer',
|
||||||
|
password: 'Kennwort',
|
||||||
|
credentials: 'Zugangsdaten',
|
||||||
|
connect: 'Verbinden',
|
||||||
|
connected: 'Verbunden',
|
||||||
|
disconnect: 'Trennen',
|
||||||
|
disconnected: 'Getrennt',
|
||||||
|
refresh: 'Aktualisieren',
|
||||||
|
settings: 'Einstellungen',
|
||||||
|
general: 'Allgemein',
|
||||||
|
themes: 'Designs',
|
||||||
|
update: 'Aktualisierung',
|
||||||
|
about: 'Über',
|
||||||
|
language: 'Sprache',
|
||||||
|
version: 'Version',
|
||||||
|
donate: 'Spenden',
|
||||||
|
run: 'Ausführen',
|
||||||
|
schema: 'Schema',
|
||||||
|
results: 'Ergebnisse',
|
||||||
|
size: 'Größe',
|
||||||
|
seconds: 'Sekunden',
|
||||||
|
type: 'Typ',
|
||||||
|
mimeType: 'Mime-Type',
|
||||||
|
download: 'Herunterladen',
|
||||||
|
add: 'Hinzufügen',
|
||||||
|
data: 'Daten',
|
||||||
|
properties: 'Eigenschaften',
|
||||||
|
insert: 'Einfügen',
|
||||||
|
connecting: 'Verbinden',
|
||||||
|
name: 'Name',
|
||||||
|
collation: 'Kollation',
|
||||||
|
clear: 'Leeren',
|
||||||
|
options: 'Optionen',
|
||||||
|
autoRefresh: 'Auto-Aktualisierung',
|
||||||
|
indexes: 'Indizes',
|
||||||
|
foreignKeys: 'Fremdschlüssel',
|
||||||
|
length: 'Länge',
|
||||||
|
unsigned: 'Unsigniert',
|
||||||
|
default: 'Standard',
|
||||||
|
comment: 'Kommentar',
|
||||||
|
key: 'Schlüssel',
|
||||||
|
order: 'Sortierung',
|
||||||
|
expression: 'Ausdruck',
|
||||||
|
autoIncrement: 'Auto Inkrement',
|
||||||
|
engine: 'Engine',
|
||||||
|
field: 'Feld | Felder',
|
||||||
|
approximately: 'Ungefähr',
|
||||||
|
total: 'Gesamt',
|
||||||
|
table: 'Tabelle',
|
||||||
|
discard: 'Verwerfen',
|
||||||
|
stay: 'Warten',
|
||||||
|
author: 'Autor',
|
||||||
|
light: 'Hell',
|
||||||
|
dark: 'Dunkel',
|
||||||
|
autoCompletion: 'Auto-Vervollständigung',
|
||||||
|
application: 'Anwendung',
|
||||||
|
editor: 'Editor',
|
||||||
|
view: 'Ansicht',
|
||||||
|
definer: 'Bestimmer',
|
||||||
|
algorithm: 'Algorithmus',
|
||||||
|
trigger: 'Auslöser',
|
||||||
|
storedRoutine: 'Gespeicherte Routine | Gespeicherte Routinen',
|
||||||
|
scheduler: 'Zeitplaner',
|
||||||
|
event: 'Ereignis',
|
||||||
|
parameters: 'Parameter',
|
||||||
|
function: 'Funktion | Funktionen',
|
||||||
|
deterministic: 'Deterministisch',
|
||||||
|
context: 'Kontext',
|
||||||
|
export: 'Export',
|
||||||
|
returns: 'Rückgabe',
|
||||||
|
timing: 'Dauer',
|
||||||
|
state: 'Stand',
|
||||||
|
execution: 'Ausführung',
|
||||||
|
starts: 'Startet',
|
||||||
|
ends: 'Endet',
|
||||||
|
ssl: 'SSL',
|
||||||
|
privateKey: 'Privater Schlüssel',
|
||||||
|
certificate: 'Zertifikat',
|
||||||
|
caCertificate: 'CA Zertifikat',
|
||||||
|
ciphers: 'Chiffren',
|
||||||
|
upload: 'Hochladen',
|
||||||
|
browse: 'Suchen',
|
||||||
|
faker: 'Faker',
|
||||||
|
content: 'Inhalt',
|
||||||
|
cut: 'Ausschneiden',
|
||||||
|
copy: 'Kopieren',
|
||||||
|
paste: 'Einfügen',
|
||||||
|
tools: 'Tools',
|
||||||
|
variables: 'Variablen',
|
||||||
|
processes: 'Prozesse',
|
||||||
|
database: 'Datenbank',
|
||||||
|
scratchpad: 'Scratchpad',
|
||||||
|
array: 'Array',
|
||||||
|
format: 'Formatierung'
|
||||||
|
},
|
||||||
|
message: {
|
||||||
|
appWelcome: 'Willkommen im Antares SQL Client!',
|
||||||
|
appFirstStep: 'Dein erster Schritt: Erstelle eine neue Datenbankverbindung.',
|
||||||
|
addConnection: 'Verbindung hinzufügen',
|
||||||
|
createConnection: 'Verbindung erstellen',
|
||||||
|
createNewConnection: 'Neue Verbindung erstellen',
|
||||||
|
askCredentials: 'Frage nach Zugangsdaten',
|
||||||
|
testConnection: 'Verbindung testen',
|
||||||
|
editConnection: 'Verbindung bearbeiten',
|
||||||
|
deleteConnection: 'Verbindung löschen',
|
||||||
|
deleteCorfirm: 'Bestätige den Abbruch von',
|
||||||
|
connectionSuccessfullyMade: 'Verbindung erfolgreich erstellt!',
|
||||||
|
madeWithJS: 'Mit 💛 und JavaScript gemacht!',
|
||||||
|
checkForUpdates: 'Suche nach Aktualisierungen',
|
||||||
|
noUpdatesAvailable: 'Keine Aktualisierungen verfügbar',
|
||||||
|
checkingForUpdate: 'Suche nach Aktualisierungen',
|
||||||
|
checkFailure: 'Suche fehlgeschlagen, bitte versuche es später noch einmal',
|
||||||
|
updateAvailable: 'Aktualisierung verfügbar',
|
||||||
|
downloadingUpdate: 'Aktualisierung wird heruntergeladen',
|
||||||
|
updateDownloaded: 'Aktualisierung heruntergeladen',
|
||||||
|
restartToInstall: 'Starte Antares neu für die Installation',
|
||||||
|
unableEditFieldWithoutPrimary: 'Feld kann ohne Primärschlüssel in Ergebnisliste nicht bearbeitet werden',
|
||||||
|
editCell: 'Zelle bearbeiten',
|
||||||
|
deleteRows: 'Zeile löschen | Lösche {count} Zeilen',
|
||||||
|
confirmToDeleteRows: 'Eine Zeile wirklich löschen? | {count} Zeilen wirklich löschen?',
|
||||||
|
notificationsTimeout: 'Timeout für Benachrichtigungen',
|
||||||
|
uploadFile: 'Datei hochladen',
|
||||||
|
addNewRow: 'Neue Zeile hinzufügen',
|
||||||
|
numberOfInserts: 'Anzahl der eingefügten Zeilen',
|
||||||
|
openNewTab: 'Öffne einen neuen Tab',
|
||||||
|
affectedRows: 'Betroffene Zeilen',
|
||||||
|
createNewDatabase: 'Erstelle ein neue Datenbank',
|
||||||
|
databaseName: 'Datenbankname',
|
||||||
|
serverDefault: 'Server default',
|
||||||
|
deleteDatabase: 'Datenbank löschen',
|
||||||
|
editDatabase: 'Datenbank bearbeiten',
|
||||||
|
clearChanges: 'Änderungen leeren',
|
||||||
|
addNewField: 'Neues Feld hinzufügen',
|
||||||
|
manageIndexes: 'Indizes verwalten',
|
||||||
|
manageForeignKeys: 'Fremdschlüssel verwalten',
|
||||||
|
allowNull: 'Erlaube NULL',
|
||||||
|
zeroFill: 'Nullauffüllung',
|
||||||
|
customValue: 'Spezifischer Wert',
|
||||||
|
onUpdate: 'Bei Aktualisierung',
|
||||||
|
deleteField: 'Feld löschen',
|
||||||
|
createNewIndex: 'Neuen Index erstellen',
|
||||||
|
addToIndex: 'Zum Index hinzufügen',
|
||||||
|
createNewTable: 'Neue Tabelle erstellen',
|
||||||
|
emptyTable: 'Tabelle leeren',
|
||||||
|
deleteTable: 'Tabelle löschen',
|
||||||
|
emptyCorfirm: 'Wirklich leeren?',
|
||||||
|
unsavedChanges: 'Ungespeicherte Änderungen',
|
||||||
|
discardUnsavedChanges: 'Du hast ungespeicherte Änderungen. Wenn du den Tab verlässt, werden diese Änderungen verworfen.',
|
||||||
|
thereAreNoIndexes: 'Es gibt keine Indizes',
|
||||||
|
thereAreNoForeign: 'Es gibt keine Fremdschlüssel',
|
||||||
|
createNewForeign: 'Neuen Fremdschlüssel erstellen',
|
||||||
|
referenceTable: 'Referenztabelle',
|
||||||
|
referenceField: 'Referenzfeld',
|
||||||
|
foreignFields: 'Fremdfelder',
|
||||||
|
invalidDefault: 'Ungültiger Standard',
|
||||||
|
onDelete: 'Bei Löschung',
|
||||||
|
applicationTheme: 'Anwendungsdesign',
|
||||||
|
editorTheme: 'Editordesign',
|
||||||
|
wrapLongLines: 'Lange Zeilen umbrechen',
|
||||||
|
selectStatement: 'Select-Anweisung',
|
||||||
|
triggerStatement: 'Trigger-Anweisung',
|
||||||
|
sqlSecurity: 'SQL-Sicherheit',
|
||||||
|
updateOption: 'Aktualisierungsoption',
|
||||||
|
deleteView: 'View löschen',
|
||||||
|
createNewView: 'Neue View erstellen',
|
||||||
|
deleteTrigger: 'Trigger löschen',
|
||||||
|
createNewTrigger: 'Neuen Trigger erstellen',
|
||||||
|
currentUser: 'Aktueller Nutzer',
|
||||||
|
routineBody: 'Routineninhalt',
|
||||||
|
dataAccess: 'Datenzugriff',
|
||||||
|
thereAreNoParameters: 'Es gibt keine Parameter',
|
||||||
|
createNewParameter: 'Neue Parameter erstellen',
|
||||||
|
createNewRoutine: 'Neue Routine erstellen',
|
||||||
|
deleteRoutine: 'Routine löschen',
|
||||||
|
functionBody: 'Funktionsinhalt',
|
||||||
|
createNewFunction: 'Neue Funktion erstellen',
|
||||||
|
deleteFunction: 'Funktion löschen',
|
||||||
|
schedulerBody: 'Zeitplaner-Inhalt',
|
||||||
|
createNewScheduler: 'Neuen Zeitplaner erstellen',
|
||||||
|
deleteScheduler: 'Zeitplaner löschen',
|
||||||
|
preserveOnCompletion: 'Bei Vervollständigung erhalten',
|
||||||
|
enableSsl: 'Aktiviere SSL',
|
||||||
|
manualValue: 'Manueller Wert',
|
||||||
|
tableFiller: 'Tabellenfüller',
|
||||||
|
fakeDataLanguage: 'Fingierte Datensprache',
|
||||||
|
searchForElements: 'Suche nach Elemente',
|
||||||
|
selectAll: 'Alle auswählen',
|
||||||
|
queryDuration: 'Dauer der Abfrage',
|
||||||
|
includeBetaUpdates: 'Beta-Aktualisierungen berücksichtigen',
|
||||||
|
setNull: 'Setze NULL',
|
||||||
|
processesList: 'Prozessliste',
|
||||||
|
processInfo: 'Prozessinformationen',
|
||||||
|
manageUsers: 'Benutzer verwalten',
|
||||||
|
createNewSchema: 'Neues Schema erstellen',
|
||||||
|
schemaName: 'Schemaname',
|
||||||
|
editSchema: 'Schema bearbeiten',
|
||||||
|
deleteSchema: 'Schema löschen',
|
||||||
|
markdownSupported: 'Unterstützt Markdown',
|
||||||
|
plantATree: 'Pflanze einen Baum',
|
||||||
|
dataTabPageSize: 'Einträge pro Tab / Seite'
|
||||||
|
},
|
||||||
|
faker: {
|
||||||
|
address: 'Adresse',
|
||||||
|
commerce: 'Handel',
|
||||||
|
company: 'Firma',
|
||||||
|
database: 'Datenbank',
|
||||||
|
date: 'Datum',
|
||||||
|
finance: 'Finanzen',
|
||||||
|
git: 'Git',
|
||||||
|
hacker: 'Hacker',
|
||||||
|
internet: 'Internet',
|
||||||
|
lorem: 'Lorem',
|
||||||
|
name: 'Name',
|
||||||
|
music: 'Musik',
|
||||||
|
phone: 'Telefon',
|
||||||
|
random: 'Zufällig',
|
||||||
|
system: 'System',
|
||||||
|
time: 'Zeit',
|
||||||
|
vehicle: 'Fahrzeug',
|
||||||
|
zipCode: 'Postleitzahl',
|
||||||
|
zipCodeByState: 'Postleitzahl nach Stadt',
|
||||||
|
city: 'Stadt',
|
||||||
|
cityPrefix: 'Stadtpräfix',
|
||||||
|
citySuffix: 'Stadtzusatz',
|
||||||
|
streetName: 'Straßenname',
|
||||||
|
streetAddress: 'Anschrift',
|
||||||
|
streetSuffix: 'Straßenzusatz',
|
||||||
|
streetPrefix: 'Straßenpräfix',
|
||||||
|
secondaryAddress: 'Zweite Anschrift',
|
||||||
|
county: 'Landkreis',
|
||||||
|
country: 'Land',
|
||||||
|
countryCode: 'Ländercode',
|
||||||
|
state: 'Bundesland',
|
||||||
|
stateAbbr: 'Bundeslandkürzel',
|
||||||
|
latitude: 'Breitengrad',
|
||||||
|
longitude: 'Längengrad',
|
||||||
|
direction: 'Richtung',
|
||||||
|
cardinalDirection: 'Himmelsrichtung',
|
||||||
|
ordinalDirection: 'Nebenhimmelsrichtung',
|
||||||
|
nearbyGPSCoordinate: 'Nächste GPS-Koordinate',
|
||||||
|
timeZone: 'Zeitzone',
|
||||||
|
color: 'Farbe',
|
||||||
|
department: 'Abteilung',
|
||||||
|
productName: 'Produktname',
|
||||||
|
price: 'Preis',
|
||||||
|
productAdjective: 'Produkteigenschaft',
|
||||||
|
productMaterial: 'Produktmaterial',
|
||||||
|
product: 'Produkt',
|
||||||
|
productDescription: 'Produktbeschreibung',
|
||||||
|
suffixes: 'Zusätze',
|
||||||
|
companyName: 'Firmenname',
|
||||||
|
companySuffix: 'Firmenzusatz',
|
||||||
|
catchPhrase: 'Slogan',
|
||||||
|
bs: 'BS',
|
||||||
|
catchPhraseAdjective: 'Sloganeigenschaft',
|
||||||
|
catchPhraseDescriptor: 'Sloganbeschreibung',
|
||||||
|
catchPhraseNoun: 'Slogannomen',
|
||||||
|
bsAdjective: 'BS-Eigenschaft',
|
||||||
|
bsBuzz: 'BS-Klatsch',
|
||||||
|
bsNoun: 'BS-Nomen',
|
||||||
|
column: 'Spalte',
|
||||||
|
type: 'Typ',
|
||||||
|
collation: 'Kollation',
|
||||||
|
engine: 'Engine',
|
||||||
|
past: 'Vergangenheit',
|
||||||
|
future: 'Zukunft',
|
||||||
|
between: 'Zwischen',
|
||||||
|
recent: 'Kürzlich',
|
||||||
|
soon: 'Bald',
|
||||||
|
month: 'Monat',
|
||||||
|
weekday: 'Wochentag',
|
||||||
|
account: 'Konto',
|
||||||
|
accountName: 'Kontoname',
|
||||||
|
routingNumber: 'Bankleitzahl',
|
||||||
|
mask: 'Maske',
|
||||||
|
amount: 'Wert',
|
||||||
|
transactionType: 'Vorgangstyp',
|
||||||
|
currencyCode: 'Währungscode',
|
||||||
|
currencyName: 'Währungsname',
|
||||||
|
currencySymbol: 'Währungssymbol',
|
||||||
|
bitcoinAddress: 'Bitcoin-Adresse',
|
||||||
|
litecoinAddress: 'Litecoin-Adresse',
|
||||||
|
creditCardNumber: 'Kreditkartennummer',
|
||||||
|
creditCardCVV: 'Kartenprüfnummer',
|
||||||
|
ethereumAddress: 'Ethereum-Adresse',
|
||||||
|
iban: 'IBAN',
|
||||||
|
bic: 'BIC',
|
||||||
|
transactionDescription: 'Vorgangsbeschreibung',
|
||||||
|
branch: 'Zweig',
|
||||||
|
commitEntry: 'Commit-Eintrag',
|
||||||
|
commitMessage: 'Commit-Nachricht',
|
||||||
|
commitSha: 'Commit-SHA',
|
||||||
|
shortSha: 'Kurzer SHA',
|
||||||
|
abbreviation: 'Kürzel',
|
||||||
|
adjective: 'Adjektiv',
|
||||||
|
noun: 'Nomen',
|
||||||
|
verb: 'Verb',
|
||||||
|
ingverb: 'Ingverb',
|
||||||
|
phrase: 'Phrase',
|
||||||
|
avatar: 'Avatar',
|
||||||
|
email: 'E-Mail',
|
||||||
|
exampleEmail: 'Beispiel-E-Mail',
|
||||||
|
userName: 'Benutzername',
|
||||||
|
protocol: 'Protokoll',
|
||||||
|
url: 'Url',
|
||||||
|
domainName: 'Domainname',
|
||||||
|
domainSuffix: 'Domainzusatz',
|
||||||
|
domainWord: 'Domainwort',
|
||||||
|
ip: 'IP',
|
||||||
|
ipv6: 'IPv6',
|
||||||
|
userAgent: 'Browserkennung',
|
||||||
|
mac: 'Mac',
|
||||||
|
password: 'Kennwort',
|
||||||
|
word: 'Wort',
|
||||||
|
words: 'Wörter',
|
||||||
|
sentence: 'Satz',
|
||||||
|
slug: 'Slug',
|
||||||
|
sentences: 'Sätze',
|
||||||
|
paragraph: 'Paragraph',
|
||||||
|
paragraphs: 'Paragraphen',
|
||||||
|
text: 'Text',
|
||||||
|
lines: 'Zeilen',
|
||||||
|
genre: 'Genre',
|
||||||
|
firstName: 'Vorname',
|
||||||
|
lastName: 'Nachname',
|
||||||
|
middleName: 'Zweitname',
|
||||||
|
findName: 'Vollständiger Name',
|
||||||
|
jobTitle: 'Berufsbezeichnung',
|
||||||
|
gender: 'Geschlecht',
|
||||||
|
prefix: 'Präfix',
|
||||||
|
suffix: 'Zusatz',
|
||||||
|
title: 'Titel',
|
||||||
|
jobDescriptor: 'Berufsbeschreibung',
|
||||||
|
jobArea: 'Berufsfeld',
|
||||||
|
jobType: 'Anstellungsart',
|
||||||
|
phoneNumber: 'Telefonnummer',
|
||||||
|
phoneNumberFormat: 'Telefonnummerformat',
|
||||||
|
phoneFormats: 'Telefonnummerformate',
|
||||||
|
number: 'Nummer',
|
||||||
|
float: 'Gleitkommazahl',
|
||||||
|
arrayElement: 'Array-Element',
|
||||||
|
arrayElements: 'Array-Elemente',
|
||||||
|
objectElement: 'Object-Element',
|
||||||
|
uuid: 'Uuid',
|
||||||
|
boolean: 'Boolean',
|
||||||
|
image: 'Grafik',
|
||||||
|
locale: 'Sprachumgebung',
|
||||||
|
alpha: 'Alpha',
|
||||||
|
alphaNumeric: 'Alphanumerisch',
|
||||||
|
hexaDecimal: 'Hexadezimal',
|
||||||
|
fileName: 'Dateiname',
|
||||||
|
commonFileName: 'Allgemeiner Dateiname',
|
||||||
|
mimeType: 'Mimetype',
|
||||||
|
commonFileType: 'Allgemeiner Dateityp',
|
||||||
|
commonFileExt: 'Allgemeine Dateiendung',
|
||||||
|
fileType: 'Dateityp',
|
||||||
|
fileExt: 'Dateiendung',
|
||||||
|
directoryPath: 'Verzeichnispfad',
|
||||||
|
filePath: 'Dateipfad',
|
||||||
|
semver: 'Semver',
|
||||||
|
manufacturer: 'Hersteller',
|
||||||
|
model: 'Modell',
|
||||||
|
fuel: 'Treibstoff',
|
||||||
|
vin: 'Wein'
|
||||||
|
}
|
||||||
|
};
|
@@ -210,7 +210,8 @@ module.exports = {
|
|||||||
editSchema: 'Edit schema',
|
editSchema: 'Edit schema',
|
||||||
deleteSchema: 'Delete schema',
|
deleteSchema: 'Delete schema',
|
||||||
markdownSupported: 'Markdown supported',
|
markdownSupported: 'Markdown supported',
|
||||||
plantATree: 'Plant a Tree'
|
plantATree: 'Plant a Tree',
|
||||||
|
dataTabPageSize: 'DATA tab page size'
|
||||||
},
|
},
|
||||||
faker: {
|
faker: {
|
||||||
address: 'Address',
|
address: 'Address',
|
||||||
|
@@ -10,7 +10,8 @@ const i18n = new VueI18n({
|
|||||||
'ar-SA': require('./ar-SA'),
|
'ar-SA': require('./ar-SA'),
|
||||||
'es-ES': require('./es-ES'),
|
'es-ES': require('./es-ES'),
|
||||||
'fr-FR': require('./fr-FR'),
|
'fr-FR': require('./fr-FR'),
|
||||||
'pt-BR': require('./pt-BR')
|
'pt-BR': require('./pt-BR'),
|
||||||
|
'de-DE': require('./de-DE')
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
export default i18n;
|
export default i18n;
|
||||||
|
@@ -4,5 +4,6 @@ export default {
|
|||||||
'ar-SA': 'العربية',
|
'ar-SA': 'العربية',
|
||||||
'es-ES': 'Español',
|
'es-ES': 'Español',
|
||||||
'fr-FR': 'Français',
|
'fr-FR': 'Français',
|
||||||
'pt-BR': 'Português (Brasil)'
|
'pt-BR': 'Português (Brasil)',
|
||||||
|
'de-DE': 'Deutsch (Deutschland)'
|
||||||
};
|
};
|
||||||
|
@@ -23,8 +23,6 @@ export default class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static deleteTableRows (params) {
|
static deleteTableRows (params) {
|
||||||
delete params.row._id;
|
|
||||||
delete params.orgRow._id;
|
|
||||||
return ipcRenderer.invoke('delete-table-rows', params);
|
return ipcRenderer.invoke('delete-table-rows', params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -11,6 +11,7 @@ export default {
|
|||||||
allow_prerelease: persistentStore.get('allow_prerelease', true),
|
allow_prerelease: persistentStore.get('allow_prerelease', true),
|
||||||
explorebar_size: persistentStore.get('explorebar_size', null),
|
explorebar_size: persistentStore.get('explorebar_size', null),
|
||||||
notifications_timeout: persistentStore.get('notifications_timeout', 5),
|
notifications_timeout: persistentStore.get('notifications_timeout', 5),
|
||||||
|
data_tab_limit: persistentStore.get('data_tab_limit', 1000),
|
||||||
auto_complete: persistentStore.get('auto_complete', true),
|
auto_complete: persistentStore.get('auto_complete', true),
|
||||||
line_wrap: persistentStore.get('line_wrap', true),
|
line_wrap: persistentStore.get('line_wrap', true),
|
||||||
application_theme: persistentStore.get('application_theme', 'dark'),
|
application_theme: persistentStore.get('application_theme', 'dark'),
|
||||||
@@ -18,6 +19,7 @@ export default {
|
|||||||
},
|
},
|
||||||
getters: {
|
getters: {
|
||||||
getLocale: state => state.locale,
|
getLocale: state => state.locale,
|
||||||
|
getDataTabLimit: state => state.data_tab_limit,
|
||||||
getAllowPrerelease: state => state.allow_prerelease,
|
getAllowPrerelease: state => state.allow_prerelease,
|
||||||
getExplorebarSize: state => state.explorebar_size,
|
getExplorebarSize: state => state.explorebar_size,
|
||||||
getNotificationsTimeout: state => state.notifications_timeout,
|
getNotificationsTimeout: state => state.notifications_timeout,
|
||||||
@@ -32,6 +34,10 @@ export default {
|
|||||||
i18n.locale = locale;
|
i18n.locale = locale;
|
||||||
persistentStore.set('locale', state.locale);
|
persistentStore.set('locale', state.locale);
|
||||||
},
|
},
|
||||||
|
SET_DATA_TAB_LIMIT (state, limit) {
|
||||||
|
state.data_tab_limit = limit;
|
||||||
|
persistentStore.set('data_tab_limit', state.data_tab_limit);
|
||||||
|
},
|
||||||
SET_ALLOW_PRERELEASE (state, allow) {
|
SET_ALLOW_PRERELEASE (state, allow) {
|
||||||
state.allow_prerelease = allow;
|
state.allow_prerelease = allow;
|
||||||
persistentStore.set('allow_prerelease', state.allow_prerelease);
|
persistentStore.set('allow_prerelease', state.allow_prerelease);
|
||||||
@@ -65,6 +71,9 @@ export default {
|
|||||||
changeLocale ({ commit }, locale) {
|
changeLocale ({ commit }, locale) {
|
||||||
commit('SET_LOCALE', locale);
|
commit('SET_LOCALE', locale);
|
||||||
},
|
},
|
||||||
|
changePageSize ({ commit }, limit) {
|
||||||
|
commit('SET_DATA_TAB_LIMIT', limit);
|
||||||
|
},
|
||||||
changeAllowPrerelease ({ commit }, allow) {
|
changeAllowPrerelease ({ commit }, allow) {
|
||||||
commit('SET_ALLOW_PRERELEASE', allow);
|
commit('SET_ALLOW_PRERELEASE', allow);
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user