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

Compare commits

..

31 Commits

Author SHA1 Message Date
0b861d962d chore(release): 0.5.2 2022-04-10 10:55:23 +02:00
6cc098c6f0 feat(core): option to allow untrusted SSL connections 2022-04-10 10:49:27 +02:00
40828cb3ff Merge pull request #208 from antares-sql/feat/postgre-import-export
feat(PostgreSQL): import/export
2022-04-07 17:56:37 +02:00
6086ca4a80 feat(PostgreSQL): sql dump importer 2022-04-07 12:49:34 +02:00
d92facf518 chore: update README.md 2022-04-05 14:06:36 +02:00
allcontributors[bot]
e9643a0d6b docs: update .all-contributorsrc [skip ci] 2022-04-04 10:32:23 +02:00
allcontributors[bot]
cc609a7051 docs: update README.md [skip ci] 2022-04-04 10:32:23 +02:00
796f61bf2f feat: french translation updated, closes #222 2022-04-04 10:29:11 +02:00
0f9c991f53 fix(PostgreSQL): wrong values exporting table content 2022-04-02 11:44:55 +02:00
638a88a1fb perf(PostgreSQL): improved views exportation 2022-04-01 18:36:02 +02:00
026d74c8c8 fix: ssh tunnel not properly working, closes #220 2022-04-01 09:51:03 +02:00
77f8cac6cf refactor: update repo links 2022-03-31 16:04:47 +02:00
d6fadf5db0 chore: update README.md 2022-03-29 15:47:50 +02:00
408ddeda56 perf(PostgreSQL): improved dump file 2022-03-27 11:41:35 +02:00
88cd097ec0 chore(release): 0.5.1 2022-03-25 09:26:04 +01:00
f12e6a96dd fix(UI): connection buttons out of screen on small displays, closes #213 2022-03-24 17:34:24 +01:00
a8ca8f2f76 feat(PostgreSQL): export functions and procedures 2022-03-23 13:26:46 +01:00
allcontributors[bot]
6fcae957e1 docs: update .all-contributorsrc [skip ci] 2022-03-22 21:38:32 +01:00
allcontributors[bot]
1cd2d8abf3 docs: update README.md [skip ci] 2022-03-22 21:38:32 +01:00
ed3c5fe559 Merge pull request #210 from SmileYzn/patch-1
Added some missing translations for pt-BR
2022-03-22 21:36:52 +01:00
Cleverson
9601c59392 Update pt-BR.js 2022-03-22 14:38:24 -03:00
Cleverson
14d20a30c1 Added some missing translations for pt-BR
Added some translations for pt-BR
2022-03-22 14:29:33 -03:00
42376b4bc6 feat(PostgreSQL): export triggers 2022-03-22 17:25:34 +01:00
e9079adb25 feat(UI): option to disable blur effects, closes #209 2022-03-22 16:13:44 +01:00
86f011f34f feat(PostgreSQL): export views 2022-03-22 12:59:13 +01:00
bb02479b71 feat(PostgreSQL): export user-defined types before tables 2022-03-22 12:40:14 +01:00
a67071e284 feat(PostgreSQL): export tables 2022-03-21 18:32:45 +01:00
8f3efabb69 feat: export database as zip sql file 2022-03-18 18:12:13 +01:00
db628f7722 fix: numeric scale displayed on non decimal fields 2022-03-17 18:17:59 +01:00
e4bd747381 chore: update bug_report.md 2022-03-15 18:39:46 +01:00
88eb113e53 chore: update README.md 2022-03-12 17:42:34 +01:00
35 changed files with 1375 additions and 302 deletions

View File

@@ -1,6 +1,6 @@
{ {
"projectName": "antares", "projectName": "antares",
"projectOwner": "Fabio286", "projectOwner": "antares-sql",
"repoType": "github", "repoType": "github",
"repoHost": "https://github.com", "repoHost": "https://github.com",
"files": [ "files": [
@@ -147,6 +147,24 @@
"contributions": [ "contributions": [
"code" "code"
] ]
},
{
"login": "SmileYzn",
"name": "Cleverson",
"avatar_url": "https://avatars.githubusercontent.com/u/5851851?v=4",
"profile": "https://github.com/SmileYzn",
"contributions": [
"translation"
]
},
{
"login": "fredatgithub",
"name": "fred",
"avatar_url": "https://avatars.githubusercontent.com/u/6720055?v=4",
"profile": "https://github.com/fredatgithub",
"contributions": [
"translation"
]
} }
], ],
"contributorsPerLine": 7, "contributorsPerLine": 7,

View File

@@ -26,13 +26,14 @@ If applicable, add screenshots to help explain your problem.
**Application (please complete the following information):** **Application (please complete the following information):**
- Client [e.g. MySQL]
- Version [e.g. 0.14.0] - Version [e.g. 0.14.0]
- Distribution: [e.g. exe, Linux Store, AppImage, dmg] - Distribution: [e.g. exe, Linux Store, AppImage, dmg]
**Desktop (please complete the following information):** **Desktop (please complete the following information):**
- OS: [e.g. iOS] - OS: [e.g. Windows 11]
- Version [e.g. 22] - Version [e.g. 21H2]
**Additional context** **Additional context**
Add any other context about the problem here. Add any other context about the problem here.

View File

@@ -2,6 +2,46 @@
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.5.2](https://github.com/antares-sql/antares/compare/v0.5.1...v0.5.2) (2022-04-10)
### Features
* **core:** option to allow untrusted SSL connections ([6cc098c](https://github.com/antares-sql/antares/commit/6cc098c6f02fb52cc71c0141431ab75f12744a1c))
* french translation updated, closes [#222](https://github.com/antares-sql/antares/issues/222) ([796f61b](https://github.com/antares-sql/antares/commit/796f61bf2feab0da515901e2137dc7bf04371d7d))
* **PostgreSQL:** export functions and procedures ([a8ca8f2](https://github.com/antares-sql/antares/commit/a8ca8f2f76ab36c4afe84d602709386315f4b7d1))
* **PostgreSQL:** export tables ([a67071e](https://github.com/antares-sql/antares/commit/a67071e28470bcbd0ec26780bb86f3c65750ded8))
* **PostgreSQL:** export triggers ([42376b4](https://github.com/antares-sql/antares/commit/42376b4bc6dd8b630402d09b026d9fbc0b8646bb))
* **PostgreSQL:** export user-defined types before tables ([bb02479](https://github.com/antares-sql/antares/commit/bb02479b71bf75a6e69e28af57c5fe213d3f30bc))
* **PostgreSQL:** export views ([86f011f](https://github.com/antares-sql/antares/commit/86f011f34fec9d6829bce324493fea888a863ffc))
* **PostgreSQL:** sql dump importer ([6086ca4](https://github.com/antares-sql/antares/commit/6086ca4a80b9ad6a07086446253d781f052d3abc))
### Bug Fixes
* **PostgreSQL:** wrong values exporting table content ([0f9c991](https://github.com/antares-sql/antares/commit/0f9c991f539560913fa0e9361a16e6448a066a27))
* ssh tunnel not properly working, closes [#220](https://github.com/antares-sql/antares/issues/220) ([026d74c](https://github.com/antares-sql/antares/commit/026d74c8c88c605a3c8c963c211078f5b3dcfda1))
### Improvements
* **PostgreSQL:** improved dump file ([408dded](https://github.com/antares-sql/antares/commit/408ddeda5634ab6bf41eff760271669170b60eb6))
* **PostgreSQL:** improved views exportation ([638a88a](https://github.com/antares-sql/antares/commit/638a88a1fb35c048ff4c6d120aaaef831c846f58))
### [0.5.1](https://github.com/Fabio286/antares/compare/v0.5.0...v0.5.1) (2022-03-25)
### Features
* export database as zip sql file ([8f3efab](https://github.com/Fabio286/antares/commit/8f3efabb6962c55c23a43c8da1433185dbc3fb41))
* **UI:** option to disable blur effects, closes [#209](https://github.com/Fabio286/antares/issues/209) ([e9079ad](https://github.com/Fabio286/antares/commit/e9079adb25ec28e9546acd54bc2565b8d6e28120))
### Bug Fixes
* numeric scale displayed on non decimal fields ([db628f7](https://github.com/Fabio286/antares/commit/db628f77226b161c3df31b7450b92a6e58754ab7))
* **UI:** connection buttons out of screen on small displays, closes [#213](https://github.com/Fabio286/antares/issues/213) ([f12e6a9](https://github.com/Fabio286/antares/commit/f12e6a96dd66140b06c55eda775af48a666627dd))
## [0.5.0](https://github.com/Fabio286/antares/compare/v0.4.4...v0.5.0) (2022-03-12) ## [0.5.0](https://github.com/Fabio286/antares/compare/v0.4.4...v0.5.0) (2022-03-12)

View File

@@ -32,13 +32,14 @@ We are actively working on it, hoping to provide new cool features, improvements
- Query history: search through the last 1000 queries. - Query history: search through the last 1000 queries.
- SSH tunnel support. - SSH tunnel support.
- Manual commit mode. - Manual commit mode.
- Import and export database dumps.
- Dark and light theme. - Dark and light theme.
- Editor themes. - Editor themes.
## Philosophy ## Philosophy
Why are we developing an SQL client when there are a lot of them on the market? Why are we developing an SQL client when there are a lot of them on the market?
The main goal is to develop a totally free, full featured, cross platform and open source alternative, empowered by JavaScript's ecosystem. The main goal is to develop a **forever 100% free (without paid premium feature)**, full featured, as possible community driven, cross platform and open source alternative, empowered by JavaScript ecosystem.
A modern application created with minimalism and semplicity in mind, with features in the right places, not hundreds of tiny buttons, nested tabs or submenu; productivity comes first. A modern application created with minimalism and semplicity in mind, with features in the right places, not hundreds of tiny buttons, nested tabs or submenu; productivity comes first.
## Installation ## Installation
@@ -71,7 +72,6 @@ This is a roadmap with major features will come in near future.
- Users management (add/edit/delete). - Users management (add/edit/delete).
- More context menu shortcuts. - More context menu shortcuts.
- More keyboard shortcuts. - More keyboard shortcuts.
- Import/export and migration.
- Support for other databases. - Support for other databases.
- Apple Silicon distribution - Apple Silicon distribution
@@ -104,7 +104,7 @@ This is a roadmap with major features will come in near future.
- 🌍 [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/users/Fabio286/projects/1) - 🚧 [Project Board](https://github.com/antares-sql/antares/projects/1)
## Contributors ✨ ## Contributors ✨
@@ -115,9 +115,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<!-- markdownlint-disable --> <!-- markdownlint-disable -->
<table> <table>
<tr> <tr>
<td align="center"><a href="https://fabiodistasio.it/"><img src="https://avatars.githubusercontent.com/u/31471771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Fabio Di Stasio</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=Fabio286" title="Code">💻</a> <a href="#translation-Fabio286" title="Translation">🌍</a> <a href="https://github.com/Fabio286/antares/commits?author=Fabio286" title="Documentation">📖</a></td> <td align="center"><a href="https://fabiodistasio.it/"><img src="https://avatars.githubusercontent.com/u/31471771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Fabio Di Stasio</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=Fabio286" title="Code">💻</a> <a href="#translation-Fabio286" title="Translation">🌍</a> <a href="https://github.com/antares-sql/antares/commits?author=Fabio286" title="Documentation">📖</a></td>
<td align="center"><a href="https://www.linkedin.com/in/giulioganci/"><img src="https://avatars.githubusercontent.com/u/4192159?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Giulio Ganci</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=toriphes" title="Code">💻</a></td> <td align="center"><a href="https://www.linkedin.com/in/giulioganci/"><img src="https://avatars.githubusercontent.com/u/4192159?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Giulio Ganci</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=toriphes" title="Code">💻</a></td>
<td align="center"><a href="https://christianratz.de/"><img src="https://avatars.githubusercontent.com/u/2630316?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Ratz</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=digitalgopnik" title="Code">💻</a> <a href="#translation-digitalgopnik" title="Translation">🌍</a></td> <td align="center"><a href="https://christianratz.de/"><img src="https://avatars.githubusercontent.com/u/2630316?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Ratz</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=digitalgopnik" title="Code">💻</a> <a href="#translation-digitalgopnik" title="Translation">🌍</a></td>
<td align="center"><a href="https://reverb6821.github.io/"><img src="https://avatars.githubusercontent.com/u/55198803?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Giuseppe Gigliotti</b></sub></a><br /><a href="#translation-reverb6821" title="Translation">🌍</a></td> <td align="center"><a href="https://reverb6821.github.io/"><img src="https://avatars.githubusercontent.com/u/55198803?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Giuseppe Gigliotti</b></sub></a><br /><a href="#translation-reverb6821" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/Mohd-PH"><img src="https://avatars.githubusercontent.com/u/9362157?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mohd-PH</b></sub></a><br /><a href="#translation-Mohd-PH" title="Translation">🌍</a></td> <td align="center"><a href="https://github.com/Mohd-PH"><img src="https://avatars.githubusercontent.com/u/9362157?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mohd-PH</b></sub></a><br /><a href="#translation-Mohd-PH" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/hongkfui"><img src="https://avatars.githubusercontent.com/u/37477191?v=4?s=100" width="100px;" alt=""/><br /><sub><b>hongkfui</b></sub></a><br /><a href="#translation-hongkfui" title="Translation">🌍</a></td> <td align="center"><a href="https://github.com/hongkfui"><img src="https://avatars.githubusercontent.com/u/37477191?v=4?s=100" width="100px;" alt=""/><br /><sub><b>hongkfui</b></sub></a><br /><a href="#translation-hongkfui" title="Translation">🌍</a></td>
@@ -128,12 +128,14 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<td align="center"><a href="https://ngoquocdat.com/"><img src="https://avatars.githubusercontent.com/u/56961917?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ngô Quốc Đạt</b></sub></a><br /><a href="#translation-datlechin" title="Translation">🌍</a></td> <td align="center"><a href="https://ngoquocdat.com/"><img src="https://avatars.githubusercontent.com/u/56961917?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ngô Quốc Đạt</b></sub></a><br /><a href="#translation-datlechin" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/IsamuSugi"><img src="https://avatars.githubusercontent.com/u/7746658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Isamu Sugiura</b></sub></a><br /><a href="#translation-IsamuSugi" title="Translation">🌍</a></td> <td align="center"><a href="https://github.com/IsamuSugi"><img src="https://avatars.githubusercontent.com/u/7746658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Isamu Sugiura</b></sub></a><br /><a href="#translation-IsamuSugi" title="Translation">🌍</a></td>
<td align="center"><a href="http://rsacchetto.nexxontech.it/"><img src="https://avatars.githubusercontent.com/u/18429412?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Riccardo Sacchetto</b></sub></a><br /><a href="#platform-Occhioverde" title="Packaging/porting to new platform">📦</a></td> <td align="center"><a href="http://rsacchetto.nexxontech.it/"><img src="https://avatars.githubusercontent.com/u/18429412?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Riccardo Sacchetto</b></sub></a><br /><a href="#platform-Occhioverde" title="Packaging/porting to new platform">📦</a></td>
<td align="center"><a href="https://kilianstallinger.com"><img src="https://avatars.githubusercontent.com/u/5290318?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kilian Stallinger</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=kilianstallz" title="Code">💻</a></td> <td align="center"><a href="https://kilianstallinger.com"><img src="https://avatars.githubusercontent.com/u/5290318?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kilian Stallinger</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=kilianstallz" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/wenj91"><img src="https://avatars.githubusercontent.com/u/12549338?v=4?s=100" width="100px;" alt=""/><br /><sub><b>文杰</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=wenj91" title="Code">💻</a></td> <td align="center"><a href="https://github.com/wenj91"><img src="https://avatars.githubusercontent.com/u/12549338?v=4?s=100" width="100px;" alt=""/><br /><sub><b>文杰</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=wenj91" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/goYou"><img src="https://avatars.githubusercontent.com/u/62732795?v=4?s=100" width="100px;" alt=""/><br /><sub><b>goYou</b></sub></a><br /><a href="#translation-goYou" title="Translation">🌍</a></td> <td align="center"><a href="https://github.com/goYou"><img src="https://avatars.githubusercontent.com/u/62732795?v=4?s=100" width="100px;" alt=""/><br /><sub><b>goYou</b></sub></a><br /><a href="#translation-goYou" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center"><a href="https://github.com/raliqala"><img src="https://avatars.githubusercontent.com/u/30502407?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Topollo</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=raliqala" title="Code">💻</a></td> <td align="center"><a href="https://github.com/raliqala"><img src="https://avatars.githubusercontent.com/u/30502407?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Topollo</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=raliqala" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/SmileYzn"><img src="https://avatars.githubusercontent.com/u/5851851?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cleverson</b></sub></a><br /><a href="#translation-SmileYzn" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/fredatgithub"><img src="https://avatars.githubusercontent.com/u/6720055?v=4?s=100" width="100px;" alt=""/><br /><sub><b>fred</b></sub></a><br /><a href="#translation-fredatgithub" title="Translation">🌍</a></td>
</tr> </tr>
</table> </table>

View File

@@ -1,10 +1,10 @@
{ {
"name": "antares", "name": "antares",
"productName": "Antares", "productName": "Antares",
"version": "0.5.0", "version": "0.5.2",
"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/Fabio286/antares.git", "repository": "https://github.com/antares-sql/antares.git",
"scripts": { "scripts": {
"debug": "npm run rebuild:electron && npm run debug-runner", "debug": "npm run rebuild:electron && npm run debug-runner",
"debug-runner": "node scripts/devRunner.js --remote-debug", "debug-runner": "node scripts/devRunner.js --remote-debug",
@@ -52,8 +52,7 @@
"target": { "target": {
"target": "default", "target": "default",
"arch": [ "arch": [
"x64", "x64"
"arm64"
] ]
} }
}, },
@@ -121,6 +120,7 @@
"moment": "^2.29.1", "moment": "^2.29.1",
"mysql2": "^2.3.2", "mysql2": "^2.3.2",
"pg": "^8.7.1", "pg": "^8.7.1",
"pg-query-stream": "^4.2.3",
"pgsql-ast-parser": "^7.2.1", "pgsql-ast-parser": "^7.2.1",
"source-map-support": "^0.5.20", "source-map-support": "^0.5.20",
"spectre.css": "^0.5.9", "spectre.css": "^0.5.9",

View File

@@ -39,6 +39,7 @@ module.exports = {
schemaEdit: false, schemaEdit: false,
schemaDrop: false, schemaDrop: false,
schemaExport: false, schemaExport: false,
exportByChunks: false,
schemaImport: false, schemaImport: false,
tableSettings: false, tableSettings: false,
tableOptions: false, tableOptions: false,

View File

@@ -35,6 +35,7 @@ module.exports = {
schemaEdit: true, schemaEdit: true,
schemaDrop: true, schemaDrop: true,
schemaExport: true, schemaExport: true,
exportByChunks: true,
schemaImport: true, schemaImport: true,
tableSettings: true, tableSettings: true,
viewSettings: true, viewSettings: true,

View File

@@ -31,9 +31,9 @@ module.exports = {
routineAdd: true, routineAdd: true,
functionAdd: true, functionAdd: true,
schemaDrop: true, schemaDrop: true,
schemaExport: true,
schemaImport: true,
databaseEdit: false, databaseEdit: false,
schemaExport: false,
schemaImport: false,
tableSettings: true, tableSettings: true,
viewSettings: true, viewSettings: true,
triggerSettings: true, triggerSettings: true,

View File

@@ -24,7 +24,8 @@ export default connections => {
key: conn.key ? fs.readFileSync(conn.key) : null, key: conn.key ? fs.readFileSync(conn.key) : null,
cert: conn.cert ? fs.readFileSync(conn.cert) : null, cert: conn.cert ? fs.readFileSync(conn.cert) : null,
ca: conn.ca ? fs.readFileSync(conn.ca) : null, ca: conn.ca ? fs.readFileSync(conn.ca) : null,
ciphers: conn.ciphers ciphers: conn.ciphers,
rejectUnauthorized: !conn.untrustedConnection
}; };
} }
@@ -84,7 +85,8 @@ export default connections => {
key: conn.key ? fs.readFileSync(conn.key) : null, key: conn.key ? fs.readFileSync(conn.key) : null,
cert: conn.cert ? fs.readFileSync(conn.cert) : null, cert: conn.cert ? fs.readFileSync(conn.cert) : null,
ca: conn.ca ? fs.readFileSync(conn.ca) : null, ca: conn.ca ? fs.readFileSync(conn.ca) : null,
ciphers: conn.ciphers ciphers: conn.ciphers,
rejectUnauthorized: !conn.untrustedConnection
}; };
} }

View File

@@ -151,6 +151,8 @@ export class MySQLClient extends AntaresCore {
remoteAddr: this._params.host, remoteAddr: this._params.host,
remotePort: this._params.port remotePort: this._params.port
}); });
dbConfig.host = this._ssh.config.host;
dbConfig.port = tunnel.localPort; dbConfig.port = tunnel.localPort;
} }
catch (err) { catch (err) {
@@ -505,7 +507,7 @@ export class MySQLClient extends AntaresCore {
schema: field.TABLE_SCHEMA, schema: field.TABLE_SCHEMA,
table: field.TABLE_NAME, table: field.TABLE_NAME,
numPrecision: field.NUMERIC_PRECISION, numPrecision: field.NUMERIC_PRECISION,
numScale: field.NUMERIC_SCALE, numScale: Number(field.NUMERIC_SCALE),
numLength, numLength,
enumValues, enumValues,
datePrecision: field.DATETIME_PRECISION, datePrecision: field.DATETIME_PRECISION,

View File

@@ -96,6 +96,8 @@ export class PostgreSQLClient extends AntaresCore {
remoteAddr: this._params.host, remoteAddr: this._params.host,
remotePort: this._params.port remotePort: this._params.port
}); });
dbConfig.host = this._ssh.config.host;
dbConfig.port = tunnel.localPort; dbConfig.port = tunnel.localPort;
} }
catch (err) { catch (err) {
@@ -570,7 +572,7 @@ export class PostgreSQLClient extends AntaresCore {
* @memberof MySQLClient * @memberof MySQLClient
*/ */
async dropSchema (params) { async dropSchema (params) {
return await this.raw(`DROP SCHEMA "${params.database}"`); return await this.raw(`DROP SCHEMA "${params.database}" CASCADE`);
} }
/** /**

View File

@@ -1,4 +1,5 @@
import fs from 'fs'; import fs from 'fs';
import { createGzip } from 'zlib';
import path from 'path'; import path from 'path';
import EventEmitter from 'events'; import EventEmitter from 'events';
@@ -8,12 +9,19 @@ export class BaseExporter extends EventEmitter {
this._tables = tables; this._tables = tables;
this._options = options; this._options = options;
this._isCancelled = false; this._isCancelled = false;
this._outputStream = fs.createWriteStream(this._options.outputFile, { this._outputFileStream = fs.createWriteStream(this._options.outputFile, { flags: 'w' });
flags: 'w' this._processedStream = null;
});
this._state = {}; this._state = {};
this._outputStream.once('error', err => { if (this._options.outputFormat === 'sql.zip') {
const outputZipStream = createGzip();
outputZipStream.pipe(this._outputFileStream);
this._processedStream = outputZipStream;
}
else
this._processedStream = this._outputFileStream;
this._processedStream.once('error', err => {
this._isCancelled = true; this._isCancelled = true;
this.emit('error', err); this.emit('error', err);
}); });
@@ -29,7 +37,7 @@ export class BaseExporter extends EventEmitter {
throw err; throw err;
} }
finally { finally {
this._outputStream.end(); this._processedStream.end();
this.emit('end'); this.emit('end');
} }
} }
@@ -68,7 +76,7 @@ export class BaseExporter extends EventEmitter {
const fileName = path.basename(this._options.outputFile); const fileName = path.basename(this._options.outputFile);
this.emit('error', `The file ${fileName} is not accessible`); this.emit('error', `The file ${fileName} is not accessible`);
} }
this._outputStream.write(data); this._processedStream.write(data);
} }
dump () { dump () {

View File

@@ -6,6 +6,12 @@ import moment from 'moment';
import { lineString, point, polygon } from '@turf/helpers'; import { lineString, point, polygon } from '@turf/helpers';
export default class MysqlExporter extends SqlExporter { export default class MysqlExporter extends SqlExporter {
constructor (...args) {
super(...args);
this._commentChar = '#';
}
async getSqlHeader () { async getSqlHeader () {
let dump = await super.getSqlHeader(); let dump = await super.getSqlHeader();
dump += ` dump += `

View File

@@ -0,0 +1,495 @@
import { SqlExporter } from './SqlExporter';
import { BLOB, BIT, DATE, DATETIME, FLOAT, NUMBER, TEXT_SEARCH } from 'common/fieldTypes';
import hexToBinary from 'common/libs/hexToBinary';
import { getArrayDepth } from 'common/libs/getArrayDepth';
import moment from 'moment';
import { lineString, point, polygon } from '@turf/helpers';
import QueryStream from 'pg-query-stream';
export default class PostgreSQLExporter extends SqlExporter {
async getSqlHeader () {
let dump = await super.getSqlHeader();
dump += `
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;\n\n\n`;
if (this.schemaName !== 'public') dump += `CREATE SCHEMA "${this.schemaName}";\n\n`;
dump += await this.getCreateTypes();
return dump;
}
async getCreateTable (tableName) {
let createSql = '';
const sequences = [];
const columnsSql = [];
const arrayTypes = {
_int2: 'smallint',
_int4: 'integer',
_int8: 'bigint',
_float4: 'real',
_float8: 'double precision',
_char: '"char"',
_varchar: 'character varying'
};
// Table columns
const { rows } = await this._client.raw(`
SELECT *
FROM "information_schema"."columns"
WHERE "table_schema" = '${this.schemaName}'
AND "table_name" = '${tableName}'
ORDER BY "ordinal_position" ASC
`, { schema: 'information_schema' });
if (!rows.length) return '';
for (const column of rows) {
let fieldType = column.data_type;
if (fieldType === 'USER-DEFINED') fieldType = `"${this.schemaName}".${column.udt_name}`;
else if (fieldType === 'ARRAY') {
if (Object.keys(arrayTypes).includes(fieldType))
fieldType = arrayTypes[type] + '[]';
else
fieldType = column.udt_name.replaceAll('_', '') + '[]';
}
const columnArr = [
`"${column.column_name}"`,
`${fieldType}${column.character_maximum_length ? `(${column.character_maximum_length})` : ''}`
];
if (column.column_default) {
columnArr.push(`DEFAULT ${column.column_default}`);
if (column.column_default.includes('nextval')) {
const sequenceName = column.column_default.split('\'')[1];
sequences.push(sequenceName);
}
}
if (column.is_nullable === 'NO') columnArr.push('NOT NULL');
columnsSql.push(columnArr.join(' '));
}
// Table sequences
for (let sequence of sequences) {
if (sequence.includes('.')) sequence = sequence.split('.')[1];
const { rows } = await this._client
.select('*')
.schema('information_schema')
.from('sequences')
.where({ sequence_schema: `= '${this.schemaName}'`, sequence_name: `= '${sequence}'` })
.run();
if (rows.length) {
createSql += `CREATE SEQUENCE "${this.schemaName}"."${sequence}"
START WITH ${rows[0].start_value}
INCREMENT BY ${rows[0].increment}
MINVALUE ${rows[0].minimum_value}
MAXVALUE ${rows[0].maximum_value}
CACHE 1;\n`;
// createSql += `\nALTER TABLE "${sequence}" OWNER TO ${this._client._params.user};\n\n`;
}
}
// Table create
createSql += `\nCREATE TABLE "${this.schemaName}"."${tableName}"(
${columnsSql.join(',\n ')}
);\n`;
// createSql += `\nALTER TABLE "${tableName}" OWNER TO ${this._client._params.user};\n\n`;
// Table indexes
createSql += '\n';
const { rows: indexes } = await this._client
.select('*')
.schema('pg_catalog')
.from('pg_indexes')
.where({ schemaname: `= '${this.schemaName}'`, tablename: `= '${tableName}'` })
.run();
for (const index of indexes)
createSql += `${index.indexdef};\n`;
// Table foreigns
const { rows: foreigns } = await this._client.raw(`
SELECT
tc.table_schema,
tc.constraint_name,
tc.table_name,
kcu.column_name,
ccu.table_schema AS foreign_table_schema,
ccu.table_name AS foreign_table_name,
ccu.column_name AS foreign_column_name,
rc.update_rule,
rc.delete_rule
FROM information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
AND ccu.table_schema = tc.table_schema
JOIN information_schema.referential_constraints AS rc
ON rc.constraint_name = kcu.constraint_name
WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = '${this.schemaName}'
AND tc.table_name = '${tableName}'
`);
for (const foreign of foreigns) {
this._postTablesSql += `\nALTER TABLE ONLY "${this.schemaName}"."${tableName}"
ADD CONSTRAINT "${foreign.constraint_name}" FOREIGN KEY ("${foreign.column_name}") REFERENCES "${this.schemaName}"."${foreign.foreign_table_name}" ("${foreign.foreign_column_name}") ON UPDATE ${foreign.update_rule} ON DELETE ${foreign.delete_rule};\n`;
}
return createSql;
}
getDropTable (tableName) {
return `DROP TABLE IF EXISTS "${this.schemaName}"."${tableName}";`;
}
async * getTableInsert (tableName) {
let rowCount = 0;
const sqlStr = '';
const countResults = await this._client.raw(`SELECT COUNT(1) as count FROM "${this.schemaName}"."${tableName}"`);
if (countResults.rows.length === 1) rowCount = countResults.rows[0].count;
if (rowCount > 0) {
const columns = await this._client.getTableColumns({
table: tableName,
schema: this.schemaName
});
const columnNames = columns.map(col => '"' + col.name + '"').join(', ');
yield sqlStr;
const stream = await this._queryStream(
`SELECT ${columnNames} FROM "${this.schemaName}"."${tableName}"`
);
for await (const row of stream) {
if (this.isCancelled) {
stream.destroy();
yield null;
return;
}
let sqlInsertString = `INSERT INTO "${this.schemaName}"."${tableName}" (${columnNames}) VALUES`;
sqlInsertString += ' (';
for (const i in columns) {
const column = columns[i];
const val = row[column.name];
if (val === null) sqlInsertString += 'NULL';
else if (DATE.includes(column.type)) {
sqlInsertString += moment(val).isValid()
? this.escapeAndQuote(moment(val).format('YYYY-MM-DD'))
: val;
}
else if (DATETIME.includes(column.type)) {
let datePrecision = '';
for (let i = 0; i < column.precision; i++)
datePrecision += i === 0 ? '.S' : 'S';
sqlInsertString += moment(val).isValid()
? this.escapeAndQuote(moment(val).format(`YYYY-MM-DD HH:mm:ss${datePrecision}`))
: this.escapeAndQuote(val);
}
else if (column.isArray) {
let parsedVal;
if (Array.isArray(val))
parsedVal = JSON.stringify(val).replaceAll('[', '{').replaceAll(']', '}');
else
parsedVal = typeof val === 'string' ? val.replaceAll('[', '{').replaceAll(']', '}') : '';
sqlInsertString += `'${parsedVal}'`;
}
else if (TEXT_SEARCH.includes(column.type))
sqlInsertString += `'${val.replaceAll('\'', '\'\'')}'`;
else if (BIT.includes(column.type))
sqlInsertString += `b'${hexToBinary(Buffer.from(val).toString('hex'))}'`;
else if (BLOB.includes(column.type))
sqlInsertString += `decode('${val.toString('hex').toUpperCase()}', 'hex')`;
else if (NUMBER.includes(column.type))
sqlInsertString += val;
else if (FLOAT.includes(column.type))
sqlInsertString += parseFloat(val);
else if (val === '') sqlInsertString += '\'\'';
else {
sqlInsertString += typeof val === 'string'
? this.escapeAndQuote(val)
: typeof val === 'object'
? this.escapeAndQuote(JSON.stringify(val))
: val;
}
if (parseInt(i) !== columns.length - 1)
sqlInsertString += ', ';
}
sqlInsertString += ');\n';
yield sqlInsertString;
}
yield sqlStr;
}
}
async getCreateTypes () {
let sqlString = '';
const { rows: types } = await this._client.raw(`
SELECT pg_type.typname, pg_enum.enumlabel
FROM pg_type
JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid;
`);
if (types.length) { // TODO: refactor
sqlString += this.buildComment('Dump of types\n------------------------------------------------------------') + '\n\n';
const typesArr = types.reduce((arr, type) => {
if (arr.every(el => el.name !== type.typname))
arr.push({ name: type.typname, enums: [this.escapeAndQuote(type.enumlabel)] });
else {
const i = arr.findIndex(el => el.name === type.typname);
arr[i].enums.push(this.escapeAndQuote(type.enumlabel));
}
return arr;
}, []);
for (const type of typesArr) {
sqlString += `CREATE TYPE "${this.schemaName}"."${type.name}" AS ENUM (
${type.enums.join(',\n\t')}
);`;
}
// sqlString += `\nALTER TYPE "${tableName}" OWNER TO ${this._client._params.user};\n`
}
return sqlString;
}
async getCreateAggregates () {
let sqlString = '';
const { rows: aggregates } = await this._client.raw(`
SELECT proname
FROM pg_proc
WHERE prokind = 'a'
AND pronamespace::regnamespace::text = '${this.schemaName}'
ORDER BY 1;
`);
if (aggregates.length) {
for (const aggregate of aggregates) {
const { rows: aggregateDef } = await this._client.raw(
`SELECT
format(
E'CREATE AGGREGATE %s (\n%s\n);'
, (pg_identify_object('pg_proc'::regclass, aggfnoid, 0)).identity
, array_to_string(
ARRAY[
format(E'\tSFUNC = %s', aggtransfn::regproc)
, format(E'\tSTYPE = %s', format_type(aggtranstype, NULL))
, CASE aggfinalfn WHEN '-'::regproc THEN NULL ELSE format(E'\tFINALFUNC = %s',aggfinalfn::text) END
, CASE aggsortop WHEN 0 THEN NULL ELSE format(E'\tSORTOP = %s', oprname) END
, CASE WHEN agginitval IS NULL THEN NULL ELSE format(E'\tINITCOND = %s', agginitval) END
]
, E',\n'
)
)
FROM pg_aggregate
LEFT JOIN pg_operator ON pg_operator.oid = aggsortop
WHERE aggfnoid = '${this.schemaName}.${aggregate.proname}'::regproc;`
);
if (aggregateDef.length)
sqlString += '\n\n' + aggregateDef[0].format;
}
}
return sqlString + '\n\n\n';
}
async getViews () {
const { rows: views } = await this._client.raw(`SELECT * FROM "pg_views" WHERE "schemaname"='${this.schemaName}'`);
let sqlString = '';
for (const view of views) {
sqlString += `\nDROP VIEW IF EXISTS "${view.viewname}";\n`;
// const { rows: columns } = await this._client
// .select('*')
// .schema('information_schema')
// .from('columns')
// .where({ table_schema: `= '${this.schemaName}'`, table_name: `= '${view.viewname}'` })
// .orderBy({ ordinal_position: 'ASC' })
// .run();
// sqlString += `
// CREATE VIEW "${this.schemaName}"."${view.viewname}" AS
// SELECT
// ${columns.reduce((acc, curr) => {
// const fieldType = curr.data_type === 'USER-DEFINED' ? curr.udt_name : curr.data_type;
// acc.push(`NULL::${fieldType}${curr.character_maximum_length ? `(${curr.character_maximum_length})` : ''} AS "${curr.column_name}"`);
// return acc;
// }, []).join(',\n ')};
// `;
sqlString += `\nCREATE OR REPLACE VIEW "${this.schemaName}"."${view.viewname}" AS \n${view.definition}\n`;
}
return sqlString;
}
async getTriggers () {
let sqlString = '';
// Trigger functions
const { rows: triggerFunctions } = await this._client.raw(
`SELECT DISTINCT routine_name AS name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema = '${this.schemaName}' AND data_type = 'trigger'`
);
for (const func of triggerFunctions) {
const { rows: functionDef } = await this._client.raw(
`SELECT pg_get_functiondef((SELECT oid FROM pg_proc WHERE proname = '${func.name}')) AS definition`
);
sqlString += `\n${functionDef[0].definition};\n`;
}
const { rows: triggers } = await this._client.raw(
`SELECT * FROM "information_schema"."triggers" WHERE "trigger_schema"='${this.schemaName}'`
);
const remappedTriggers = triggers.reduce((acc, trigger) => {
const i = acc.findIndex(t => t.trigger_name === trigger.trigger_name && t.event_object_table === trigger.event_object_table);
if (i === -1) {
trigger.events = [trigger.event_manipulation];
acc.push(trigger);
}
else
acc[i].events.push(trigger.event_manipulation);
return acc;
}, []);
for (const trigger of remappedTriggers)
sqlString += `\nCREATE TRIGGER "${trigger.trigger_name}" ${trigger.action_timing} ${trigger.events.join(' OR ')} ON "${this.schemaName}"."${trigger.event_object_table}" FOR EACH ${trigger.action_orientation} ${trigger.action_statement};\n`;
return sqlString;
}
async getFunctions () {
let sqlString = '';
const { rows: functions } = await this._client.raw(
`SELECT DISTINCT routine_name AS name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema = '${this.schemaName}' AND data_type != 'trigger'`
);
for (const func of functions) {
const { rows: functionDef } = await this._client.raw(
`SELECT pg_get_functiondef((SELECT oid FROM pg_proc WHERE proname = '${func.name}')) AS definition`
);
sqlString += `\n${functionDef[0].definition};\n`;
}
sqlString += await this.getCreateAggregates();
return sqlString;
}
async getRoutines () {
let sqlString = '';
const { rows: functions } = await this._client.raw(
`SELECT DISTINCT routine_name AS name FROM information_schema.routines WHERE routine_type = 'PROCEDURE' AND routine_schema = '${this.schemaName}'`
);
for (const func of functions) {
const { rows: functionDef } = await this._client.raw(
`SELECT pg_get_functiondef((SELECT oid FROM pg_proc WHERE proname = '${func.name}')) AS definition`
);
sqlString += `\n${functionDef[0].definition};\n`;
}
return sqlString;
}
async _queryStream (sql) {
if (process.env.NODE_ENV === 'development') console.log('EXPORTER:', sql);
const connection = await this._client.getConnection();
const query = new QueryStream(sql, null);
const stream = connection.query(query);
const dispose = () => connection.end();
stream.on('end', dispose);
stream.on('error', dispose);
stream.on('close', dispose);
return stream;
}
getEscapedDefiner (definer) {
return definer
.split('@')
.map(part => '`' + part + '`')
.join('@');
}
escapeAndQuote (val) {
// eslint-disable-next-line no-control-regex
const CHARS_TO_ESCAPE = /[\0\b\t\n\r\x1a"'\\]/g;
const CHARS_ESCAPE_MAP = {
'\0': '\\0',
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\r': '\\r',
'\x1a': '\\Z',
'"': '\\"',
'\'': '\\\'',
'\\': '\\\\'
};
let chunkIndex = CHARS_TO_ESCAPE.lastIndex = 0;
let escapedVal = '';
let match;
while ((match = CHARS_TO_ESCAPE.exec(val))) {
escapedVal += val.slice(chunkIndex, match.index) + CHARS_ESCAPE_MAP[match[0]];
chunkIndex = CHARS_TO_ESCAPE.lastIndex;
}
if (chunkIndex === 0)
return `'${val}'`;
if (chunkIndex < val.length)
return `'${escapedVal + val.slice(chunkIndex)}'`;
return `'${escapedVal}'`;
}
_getGeoJSON (val) {
if (Array.isArray(val)) {
if (getArrayDepth(val) === 1)
return lineString(val.reduce((acc, curr) => [...acc, [curr.x, curr.y]], []));
else
return polygon(val.map(arr => arr.reduce((acc, curr) => [...acc, [curr.x, curr.y]], [])));
}
else
return point([val.x, val.y]);
}
}

View File

@@ -5,7 +5,8 @@ export class SqlExporter extends BaseExporter {
constructor (client, tables, options) { constructor (client, tables, options) {
super(tables, options); super(tables, options);
this._client = client; this._client = client;
this._commentChar = '#'; this._commentChar = '--';
this._postTablesSql = '';
} }
get schemaName () { get schemaName () {
@@ -90,6 +91,12 @@ export class SqlExporter extends BaseExporter {
this.writeString('\n\n'); this.writeString('\n\n');
} }
// SQL to execute after tables creation
if (this._postTablesSql) {
this.writeString(this._postTablesSql);
this.writeString('\n\n');
}
for (const item of extraItems) { for (const item of extraItems) {
const processingMethod = `get${item.charAt(0).toUpperCase() + item.slice(1)}`; const processingMethod = `get${item.charAt(0).toUpperCase() + item.slice(1)}`;
exportState.currentItemIndex++; exportState.currentItemIndex++;
@@ -130,7 +137,7 @@ Antares - SQL Client
Version ${process.env.PACKAGE_VERSION} Version ${process.env.PACKAGE_VERSION}
https://antares-sql.app/ https://antares-sql.app/
https://github.com/Fabio286/antares https://github.com/antares-sql/antares
Host: ${this.host} (${serverVersion}) Host: ${this.host} (${serverVersion})
Database: ${this.schemaName} Database: ${this.schemaName}

View File

@@ -1,8 +1,8 @@
import fs from 'fs/promises'; import fs from 'fs/promises';
import SqlParser from '../../../../common/libs/sqlParser'; import MySQLParser from '../../parsers/MySQLParser';
import { BaseImporter } from '../BaseImporter'; import { BaseImporter } from '../BaseImporter';
export default class MysqlImporter extends BaseImporter { export default class MySQLImporter extends BaseImporter {
constructor (client, options) { constructor (client, options) {
super(options); super(options);
this._client = client; this._client = client;
@@ -11,7 +11,7 @@ export default class MysqlImporter extends BaseImporter {
async import () { async import () {
try { try {
const { size: totalFileSize } = await fs.stat(this._options.file); const { size: totalFileSize } = await fs.stat(this._options.file);
const parser = new SqlParser(); const parser = new MySQLParser();
let readPosition = 0; let readPosition = 0;
let queryCount = 0; let queryCount = 0;
@@ -22,11 +22,6 @@ export default class MysqlImporter extends BaseImporter {
queryCount: 0 queryCount: 0
}); });
// 1. detect file encoding
// 2. set fh encoding
// 3. detect sql mode
// 4. restore sql mode in case of exception
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this._fileHandler.pipe(parser); this._fileHandler.pipe(parser);

View File

@@ -0,0 +1,80 @@
import fs from 'fs/promises';
import PostgreSQLParser from '../../parsers/PostgreSQLParser';
import { BaseImporter } from '../BaseImporter';
export default class PostgreSQLImporter extends BaseImporter {
constructor (client, options) {
super(options);
this._client = client;
}
async import () {
try {
const { size: totalFileSize } = await fs.stat(this._options.file);
const parser = new PostgreSQLParser();
let readPosition = 0;
let queryCount = 0;
this.emitUpdate({
fileSize: totalFileSize,
readPosition: 0,
percentage: 0,
queryCount: 0
});
return new Promise((resolve, reject) => {
this._fileHandler.pipe(parser);
parser.on('error', reject);
parser.on('close', async () => {
console.log('TOTAL QUERIES', queryCount);
console.log('import end');
resolve();
});
parser.on('data', async (query) => {
queryCount++;
parser.pause();
try {
await this._client.query(query);
}
catch (error) {
this.emit('query-error', {
sql: query,
message: error.hint || error.toString(),
sqlSnippet: error.sql,
time: new Date().getTime()
});
}
this.emitUpdate({
queryCount,
readPosition,
percentage: readPosition / totalFileSize * 100
});
this._fileHandler.pipe(parser);
parser.resume();
});
parser.on('pause', () => {
this._fileHandler.unpipe(parser);
this._fileHandler.readableFlowing = false;
});
this._fileHandler.on('data', (chunk) => {
readPosition += chunk.length;
});
this._fileHandler.on('error', (err) => {
console.log(err);
reject(err);
});
});
}
catch (err) {
console.log(err);
}
}
}

View File

@@ -1,6 +1,6 @@
import { Transform } from 'stream'; import { Transform } from 'stream';
export default class SqlParser extends Transform { export default class MySQLParser extends Transform {
constructor (opts) { constructor (opts) {
opts = { opts = {
delimiter: ';', delimiter: ';',

View File

@@ -0,0 +1,142 @@
import { Transform } from 'stream';
export default class PostgreSQLParser extends Transform {
constructor (opts) {
opts = {
delimiter: ';',
encoding: 'utf8',
writableObjectMode: true,
readableObjectMode: true,
...opts
};
super(opts);
this._buffer = '';
this._lastChar = '';
this._lastChars = '';
this.encoding = opts.encoding;
this.delimiter = opts.delimiter;// ';'
this._bodyWrapper = '';
this._bodyWrapperBuffer = '';
this.isEscape = false;
this.currentQuote = null;
this._firstDollarFound = false;
this._isBody = false;
this._isSingleLineComment = false;
this._isMultiLineComment = false;
}
get _isComment () {
return this._isSingleLineComment || this._isMultiLineComment;
}
_transform (chunk, encoding, next) {
for (const char of chunk.toString(this.encoding)) {
this.checkEscape();
this._buffer += char;
this._lastChar = char;
this._lastChars += char;
if (this._lastChars.length > this._bodyWrapper.length)
this._lastChars = this._lastChars.slice(-(this._bodyWrapper.length || 2));
this.checkBodyWrapper(char);
this.checkQuote(char);
this.checkCommentRow();
const query = this.getQuery();
if (query)
this.push(query);
}
next();
}
checkEscape () {
if (this._buffer.length > 0) {
this.isEscape = this._lastChar === '\\'
? !this.isEscape
: false;
}
}
checkCommentRow () {
if (this._isBody) return;
if (!this._isComment) {
if (this.currentQuote === null && this._lastChars.includes('--'))
this._isSingleLineComment = true;
if (this.currentQuote === null && this._lastChars.includes('/*'))
this._isMultiLineComment = true;
}
else {
if (this._isSingleLineComment && (this._lastChar === '\n' || this._lastChar === '\r')) {
this._buffer = '';
this._isSingleLineComment = false;
}
if (this._isMultiLineComment && this._lastChars.includes('*/')) {
this._buffer = '';
this._isMultiLineComment = false;
}
}
}
checkBodyWrapper (char) {
if (this._isBody)
this._isBody = this._lastChars !== this._bodyWrapper;
if (this.currentQuote === null && char === '$' && !this._firstDollarFound && !this._bodyWrapper) {
this._firstDollarFound = true;
this._bodyWrapperBuffer += char;
this._isBody = true;
}
else if (this._firstDollarFound) {
if (char === '\n' || char === ' ') {
this._firstDollarFound = false;
this._bodyWrapperBuffer = '';
this._bodyWrapper = '';
this._isBody = false;
return;
}
this._bodyWrapperBuffer += char;
const isEndDollar = char === '$';
if (isEndDollar) {
this._firstDollarFound = false;
this._bodyWrapper = this._bodyWrapperBuffer;
this._bodyWrapperBuffer = '';
}
}
}
checkQuote (char) {
const isQuote = !this.isEscape && (char === '\'' || char === '"');
if (isQuote && this.currentQuote === char)
this.currentQuote = null;
else if (isQuote && this.currentQuote === null)
this.currentQuote = char;
}
getQuery () {
if (this._isBody || this._isComment)
return false;
let query = false;
let demiliterFound = false;
if (this.currentQuote === null && this._buffer.length >= this.delimiter.length)
demiliterFound = this._lastChars.slice(-this.delimiter.length) === this.delimiter;
if (demiliterFound) {
const parsedStr = this._buffer.trim();
query = parsedStr;
this._buffer = '';
this._bodyWrapper = '';
}
return query;
}
}

View File

@@ -1,6 +1,7 @@
import fs from 'fs';
import { ClientsFactory } from '../libs/ClientsFactory'; import { ClientsFactory } from '../libs/ClientsFactory';
import MysqlExporter from '../libs/exporters/sql/MysqlExporter.js'; import MysqlExporter from '../libs/exporters/sql/MysqlExporter.js';
import fs from 'fs'; import PostgreSQLExporter from '../libs/exporters/sql/PostgreSQLExporter';
let exporter; let exporter;
process.on('message', async ({ type, client, tables, options }) => { process.on('message', async ({ type, client, tables, options }) => {
@@ -17,6 +18,9 @@ process.on('message', async ({ type, client, tables, options }) => {
case 'maria': case 'maria':
exporter = new MysqlExporter(connection, tables, options); exporter = new MysqlExporter(connection, tables, options);
break; break;
case 'pg':
exporter = new PostgreSQLExporter(connection, tables, options);
break;
default: default:
process.send({ process.send({
type: 'error', type: 'error',

View File

@@ -1,5 +1,6 @@
import { ClientsFactory } from '../libs/ClientsFactory'; import { ClientsFactory } from '../libs/ClientsFactory';
import MysqlImporter from '../libs/importers/sql/MysqlImporter'; import MySQLImporter from '../libs/importers/sql/MysqlImporter';
import PostgreSQLImporter from '../libs/importers/sql/PostgreSQLImporter';
let importer; let importer;
process.on('message', async ({ type, dbConfig, options }) => { process.on('message', async ({ type, dbConfig, options }) => {
@@ -18,7 +19,10 @@ process.on('message', async ({ type, dbConfig, options }) => {
switch (options.type) { switch (options.type) {
case 'mysql': case 'mysql':
case 'maria': case 'maria':
importer = new MysqlImporter(pool, options); importer = new MySQLImporter(pool, options);
break;
case 'pg':
importer = new PostgreSQLImporter(pool, options);
break; break;
default: default:
process.send({ process.send({

View File

@@ -1,5 +1,5 @@
<template> <template>
<div id="wrapper" :class="`theme-${applicationTheme}`"> <div id="wrapper" :class="[`theme-${applicationTheme}`, !disableBlur || 'no-blur']">
<TheTitleBar /> <TheTitleBar />
<div id="window-content"> <div id="window-content">
<TheSettingBar /> <TheSettingBar />
@@ -10,8 +10,10 @@
:key="connection.uid" :key="connection.uid"
:connection="connection" :connection="connection"
/> />
<div class="connection-panel-wrapper">
<WorkspaceAddConnectionPanel v-if="selectedWorkspace === 'NEW'" /> <WorkspaceAddConnectionPanel v-if="selectedWorkspace === 'NEW'" />
</div> </div>
</div>
<TheFooter /> <TheFooter />
<TheNotificationsBoard /> <TheNotificationsBoard />
<TheScratchpad v-if="isScratchpad" /> <TheScratchpad v-if="isScratchpad" />
@@ -51,6 +53,7 @@ export default {
isScratchpad: 'application/isScratchpad', isScratchpad: 'application/isScratchpad',
connections: 'connections/getConnections', connections: 'connections/getConnections',
applicationTheme: 'settings/getApplicationTheme', applicationTheme: 'settings/getApplicationTheme',
disableBlur: 'settings/getDisableBlur',
isUnsavedDiscardModal: 'workspaces/isUnsavedDiscardModal' isUnsavedDiscardModal: 'workspaces/isUnsavedDiscardModal'
}) })
}, },
@@ -130,5 +133,15 @@ export default {
> .columns { > .columns {
height: calc(100vh - #{$footer-height}); height: calc(100vh - #{$footer-height});
} }
.connection-panel-wrapper{
height: calc(100vh - #{$excluding-size});
width: 100%;
padding-top: 15vh;
display: flex;
justify-content: center;
align-items: flex-start;
overflow: auto;
}
} }
</style> </style>

View File

@@ -78,6 +78,7 @@ export default {
.file-uploader-message { .file-uploader-message {
display: flex; display: flex;
word-break: keep-all;
border-radius: $border-radius 0 0 $border-radius; border-radius: $border-radius 0 0 $border-radius;
} }

View File

@@ -181,20 +181,19 @@
</div> </div>
</div> </div>
<div class="column col-4"> <div class="column col-4">
<h4> <h5 class="h5">
{{ $t('word.options') }} {{ $t('word.options') }}
</h4> </h5>
<span>{{ $t('word.includes') }}:</span> <span class="h6">{{ $t('word.includes') }}:</span>
<label <label
v-for="(_, key) in options.includes" v-for="(_, key) in options.includes"
:key="key" :key="key"
class="form-checkbox" class="form-checkbox"
> >
<input v-model="options.includes[key]" type="checkbox"><i class="form-icon" /> {{ $t(`word.${key}`) }} <input v-model="options.includes[key]" type="checkbox"><i class="form-icon" /> {{ $tc(`word.${key}`, 2) }}
</label> </label>
<div v-if="customizations.exportByChunks">
<div class="mt-4 mb-2"> <div class="h6 mt-4 mb-2">
{{ $t('message.newInserStmtEvery') }}: {{ $t('message.newInserStmtEvery') }}:
</div> </div>
<div class="columns"> <div class="columns">
@@ -218,6 +217,23 @@
</div> </div>
</div> </div>
</div> </div>
<div class="h6 mb-2 mt-4">
{{ $t('message.ourputFormat') }}:
</div>
<div class="columns">
<div class="column h5 mb-4">
<select v-model="options.outputFormat" class="form-select">
<option value="sql">
{{ $t('message.singleFile', {ext: '.sql'}) }}
</option>
<option value="sql.zip">
{{ $t('message.zipCompressedFile', {ext: '.sql'}) }}
</option>
</select>
</div>
</div>
</div>
</div> </div>
</div> </div>
<div class="modal-footer columns"> <div class="modal-footer columns">
@@ -275,6 +291,7 @@ export default {
tables: [], tables: [],
options: { options: {
includes: {}, includes: {},
outputFormat: 'sql',
sqlInsertAfter: 250, sqlInsertAfter: 250,
sqlInsertDivider: 'bytes' sqlInsertDivider: 'bytes'
}, },
@@ -290,6 +307,9 @@ export default {
currentWorkspace () { currentWorkspace () {
return this.getWorkspace(this.selectedWorkspace); return this.getWorkspace(this.selectedWorkspace);
}, },
customizations () {
return this.currentWorkspace.customizations;
},
schemaItems () { schemaItems () {
const db = this.currentWorkspace.structure.find(db => db.name === this.selectedSchema); const db = this.currentWorkspace.structure.find(db => db.name === this.selectedSchema);
if (db) if (db)
@@ -299,7 +319,7 @@ export default {
}, },
filename () { filename () {
const date = moment().format('YYYY-MM-DD'); const date = moment().format('YYYY-MM-DD');
return `${this.selectedSchema}_${date}.sql`; return `${this.selectedSchema}_${date}.${this.options.outputFormat}`;
}, },
dumpFilePath () { dumpFilePath () {
return `${this.basePath}/${this.filename}`; return `${this.basePath}/${this.filename}`;
@@ -333,7 +353,7 @@ export default {
includeDropStatement: true includeDropStatement: true
})); }));
const structure = ['views', 'triggers', 'routines', 'functions', 'schedulers', 'triggerFunctions']; const structure = ['functions', 'views', 'triggers', 'routines', 'schedulers'];
structure.forEach(feat => { structure.forEach(feat => {
const val = customizations[this.currentWorkspace.client][feat]; const val = customizations[this.currentWorkspace.client][feat];

View File

@@ -117,6 +117,19 @@
</label> </label>
</div> </div>
</div> </div>
<div class="form-group mb-0">
<div class="col-7 col-sm-12">
<label class="form-label">
{{ $t('message.disableBlur') }}
</label>
</div>
<div class="col-5 col-sm-12">
<label class="form-switch d-inline-block" @click.prevent="toggleDisableBlur">
<input type="checkbox" :checked="disableBlur">
<i class="form-icon" />
</label>
</div>
</div>
<div class="form-group"> <div class="form-group">
<div class="col-7 col-sm-12"> <div class="col-7 col-sm-12">
<label class="form-label"> <label class="form-label">
@@ -284,7 +297,7 @@
<h4>{{ appName }}</h4> <h4>{{ appName }}</h4>
<p class="mb-2"> <p class="mb-2">
{{ $t('word.version') }} {{ appVersion }}<br> {{ $t('word.version') }} {{ appVersion }}<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> <a class="c-hand" @click="openOutside('https://github.com/antares-sql/antares')"><i class="mdi mdi-github d-inline" /> GitHub</a> <a class="c-hand" @click="openOutside('https://twitter.com/AntaresSQL')"><i class="mdi mdi-twitter d-inline" /> Twitter</a> <a class="c-hand" @click="openOutside('https://antares-sql.app/')"><i class="mdi mdi-web d-inline" /> Website</a><br>
<small>{{ $t('word.author') }} <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">{{ appAuthor }}</a></small><br> <small>{{ $t('word.author') }} <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">{{ appAuthor }}</a></small><br>
</p> </p>
<div class="mb-2"> <div class="mb-2">
@@ -389,6 +402,7 @@ export default {
selectedLineWrap: 'settings/getLineWrap', selectedLineWrap: 'settings/getLineWrap',
notificationsTimeout: 'settings/getNotificationsTimeout', notificationsTimeout: 'settings/getNotificationsTimeout',
restoreTabs: 'settings/getRestoreTabs', restoreTabs: 'settings/getRestoreTabs',
disableBlur: 'settings/getDisableBlur',
applicationTheme: 'settings/getApplicationTheme', applicationTheme: 'settings/getApplicationTheme',
editorTheme: 'settings/getEditorTheme', editorTheme: 'settings/getEditorTheme',
editorFontSize: 'settings/getEditorFontSize', editorFontSize: 'settings/getEditorFontSize',
@@ -450,6 +464,7 @@ ORDER BY
changeLocale: 'settings/changeLocale', changeLocale: 'settings/changeLocale',
changePageSize: 'settings/changePageSize', changePageSize: 'settings/changePageSize',
changeRestoreTabs: 'settings/changeRestoreTabs', changeRestoreTabs: 'settings/changeRestoreTabs',
changeDisableBlur: 'settings/changeDisableBlur',
changeAutoComplete: 'settings/changeAutoComplete', changeAutoComplete: 'settings/changeAutoComplete',
changeLineWrap: 'settings/changeLineWrap', changeLineWrap: 'settings/changeLineWrap',
changeApplicationTheme: 'settings/changeApplicationTheme', changeApplicationTheme: 'settings/changeApplicationTheme',
@@ -477,6 +492,9 @@ ORDER BY
toggleRestoreSession () { toggleRestoreSession () {
this.changeRestoreTabs(!this.restoreTabs); this.changeRestoreTabs(!this.restoreTabs);
}, },
toggleDisableBlur () {
this.changeDisableBlur(!this.disableBlur);
},
toggleAutoComplete () { toggleAutoComplete () {
this.changeAutoComplete(!this.selectedAutoComplete); this.changeAutoComplete(!this.selectedAutoComplete);
}, },

View File

@@ -15,7 +15,7 @@
<i class="mdi mdi-18px mdi-coffee mr-1" /> <i class="mdi mdi-18px mdi-coffee mr-1" />
<small>{{ $t('word.donate') }}</small> <small>{{ $t('word.donate') }}</small>
</li> </li>
<li class="footer-element footer-link" @click="openOutside('https://github.com/Fabio286/antares/issues')"> <li class="footer-element footer-link" @click="openOutside('https://github.com/antares-sql/antares/issues')">
<i class="mdi mdi-18px mdi-bug" /> <i class="mdi mdi-18px mdi-bug" />
</li> </li>
<li class="footer-element footer-link" @click="showSettingModal('about')"> <li class="footer-element footer-link" @click="showSettingModal('about')">

View File

@@ -450,7 +450,9 @@
/> />
</template> </template>
</div> </div>
<WorkspaceEditConnectionPanel v-else :connection="connection" /> <div v-else class="connection-panel-wrapper">
<WorkspaceEditConnectionPanel :connection="connection" />
</div>
<ModalProcessesList <ModalProcessesList
v-if="isProcessesModal" v-if="isProcessesModal"
:connection="connection" :connection="connection"

View File

@@ -34,7 +34,7 @@
<fieldset class="m-0" :disabled="isBusy"> <fieldset class="m-0" :disabled="isBusy">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.connectionName') }}</label> <label class="form-label cut-text">{{ $t('word.connectionName') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -47,7 +47,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.client') }}</label> <label class="form-label cut-text">{{ $t('word.client') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<select v-model="connection.client" class="form-select"> <select v-model="connection.client" class="form-select">
@@ -63,7 +63,7 @@
</div> </div>
<div v-if="connection.client === 'pg'" class="form-group columns"> <div v-if="connection.client === 'pg'" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.connectionString') }}</label> <label class="form-label cut-text">{{ $t('word.connectionString') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -76,7 +76,7 @@
</div> </div>
<div v-if="!customizations.fileConnection" class="form-group columns"> <div v-if="!customizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.hostName') }}/IP</label> <label class="form-label cut-text">{{ $t('word.hostName') }}/IP</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -88,7 +88,7 @@
</div> </div>
<div v-if="customizations.fileConnection" class="form-group columns"> <div v-if="customizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.database') }}</label> <label class="form-label cut-text">{{ $t('word.database') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
@@ -101,7 +101,7 @@
</div> </div>
<div v-if="!customizations.fileConnection" class="form-group columns"> <div v-if="!customizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.port') }}</label> <label class="form-label cut-text">{{ $t('word.port') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -115,7 +115,7 @@
</div> </div>
<div v-if="customizations.database" class="form-group columns"> <div v-if="customizations.database" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.database') }}</label> <label class="form-label cut-text">{{ $t('word.database') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -127,7 +127,7 @@
</div> </div>
<div v-if="!customizations.fileConnection" class="form-group columns"> <div v-if="!customizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.user') }}</label> <label class="form-label cut-text">{{ $t('word.user') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -140,7 +140,7 @@
</div> </div>
<div v-if="!customizations.fileConnection" class="form-group columns"> <div v-if="!customizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.password') }}</label> <label class="form-label cut-text">{{ $t('word.password') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -153,7 +153,7 @@
</div> </div>
<div v-if="customizations.connectionSchema" class="form-group columns"> <div v-if="customizations.connectionSchema" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.schema') }}</label> <label class="form-label cut-text">{{ $t('word.schema') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -189,7 +189,7 @@
<form class="form-horizontal"> <form class="form-horizontal">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label"> <label class="form-label cut-text">
{{ $t('message.enableSsl') }} {{ $t('message.enableSsl') }}
</label> </label>
</div> </div>
@@ -203,7 +203,7 @@
<fieldset class="m-0" :disabled="isBusy || !connection.ssl"> <fieldset class="m-0" :disabled="isBusy || !connection.ssl">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.privateKey') }}</label> <label class="form-label cut-text">{{ $t('word.privateKey') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
@@ -216,7 +216,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.certificate') }}</label> <label class="form-label cut-text">{{ $t('word.certificate') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
@@ -229,7 +229,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.caCertificate') }}</label> <label class="form-label cut-text">{{ $t('word.caCertificate') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
@@ -242,7 +242,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.ciphers') }}</label> <label class="form-label cut-text">{{ $t('word.ciphers') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -253,6 +253,14 @@
> >
</div> </div>
</div> </div>
<div class="form-group columns">
<div class="column col-4 col-sm-12" />
<div class="column col-8 col-sm-12">
<label class="form-checkbox form-inline">
<input v-model="connection.untrustedConnection" type="checkbox"><i class="form-icon" /> {{ $t('message.untrustedConnection') }}
</label>
</div>
</div>
</fieldset> </fieldset>
</form> </form>
</div> </div>
@@ -262,7 +270,7 @@
<form class="form-horizontal"> <form class="form-horizontal">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label"> <label class="form-label cut-text">
{{ $t('message.enableSsh') }} {{ $t('message.enableSsh') }}
</label> </label>
</div> </div>
@@ -276,7 +284,7 @@
<fieldset class="m-0" :disabled="isBusy || !connection.ssh"> <fieldset class="m-0" :disabled="isBusy || !connection.ssh">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.hostName') }}/IP</label> <label class="form-label cut-text">{{ $t('word.hostName') }}/IP</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -288,7 +296,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.user') }}</label> <label class="form-label cut-text">{{ $t('word.user') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -300,7 +308,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.password') }}</label> <label class="form-label cut-text">{{ $t('word.password') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -312,7 +320,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.port') }}</label> <label class="form-label cut-text">{{ $t('word.port') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -326,7 +334,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.privateKey') }}</label> <label class="form-label cut-text">{{ $t('word.privateKey') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
@@ -339,7 +347,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.passphrase') }}</label> <label class="form-label cut-text">{{ $t('word.passphrase') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -420,6 +428,7 @@ export default {
key: '', key: '',
ca: '', ca: '',
ciphers: '', ciphers: '',
untrustedConnection: false,
ssh: false, ssh: false,
sshHost: '', sshHost: '',
sshUser: '', sshUser: '',
@@ -554,12 +563,12 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.connection-panel { .connection-panel {
margin-top: 15vh;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
margin-bottom: 1rem;
.panel { .panel {
width: 450px; min-width: 450px;
border-radius: $border-radius; border-radius: $border-radius;
.panel-body { .panel-body {

View File

@@ -34,7 +34,7 @@
<fieldset class="m-0" :disabled="isBusy"> <fieldset class="m-0" :disabled="isBusy">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.connectionName') }}</label> <label class="form-label cut-text">{{ $t('word.connectionName') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -47,7 +47,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.client') }}</label> <label class="form-label cut-text">{{ $t('word.client') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<select v-model="localConnection.client" class="form-select"> <select v-model="localConnection.client" class="form-select">
@@ -63,7 +63,7 @@
</div> </div>
<div v-if="connection.client === 'pg'" class="form-group columns"> <div v-if="connection.client === 'pg'" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.connectionString') }}</label> <label class="form-label cut-text">{{ $t('word.connectionString') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -76,7 +76,7 @@
</div> </div>
<div v-if="!customizations.fileConnection" class="form-group columns"> <div v-if="!customizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.hostName') }}/IP</label> <label class="form-label cut-text">{{ $t('word.hostName') }}/IP</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -88,7 +88,7 @@
</div> </div>
<div v-if="customizations.fileConnection" class="form-group columns"> <div v-if="customizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.database') }}</label> <label class="form-label cut-text">{{ $t('word.database') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
@@ -101,7 +101,7 @@
</div> </div>
<div v-if="!customizations.fileConnection" class="form-group columns"> <div v-if="!customizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.port') }}</label> <label class="form-label cut-text">{{ $t('word.port') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -115,7 +115,7 @@
</div> </div>
<div v-if="customizations.database" class="form-group columns"> <div v-if="customizations.database" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.database') }}</label> <label class="form-label cut-text">{{ $t('word.database') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -127,7 +127,7 @@
</div> </div>
<div v-if="!customizations.fileConnection" class="form-group columns"> <div v-if="!customizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.user') }}</label> <label class="form-label cut-text">{{ $t('word.user') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -140,7 +140,7 @@
</div> </div>
<div v-if="!customizations.fileConnection" class="form-group columns"> <div v-if="!customizations.fileConnection" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.password') }}</label> <label class="form-label cut-text">{{ $t('word.password') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -153,7 +153,7 @@
</div> </div>
<div v-if="customizations.connectionSchema" class="form-group columns"> <div v-if="customizations.connectionSchema" class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.schema') }}</label> <label class="form-label cut-text">{{ $t('word.schema') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -189,7 +189,7 @@
<form class="form-horizontal"> <form class="form-horizontal">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label"> <label class="form-label cut-text">
{{ $t('message.enableSsl') }} {{ $t('message.enableSsl') }}
</label> </label>
</div> </div>
@@ -203,7 +203,7 @@
<fieldset class="m-0" :disabled="isBusy || !localConnection.ssl"> <fieldset class="m-0" :disabled="isBusy || !localConnection.ssl">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.privateKey') }}</label> <label class="form-label cut-text">{{ $t('word.privateKey') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
@@ -216,7 +216,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.certificate') }}</label> <label class="form-label cut-text">{{ $t('word.certificate') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
@@ -229,7 +229,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.caCertificate') }}</label> <label class="form-label cut-text">{{ $t('word.caCertificate') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
@@ -242,7 +242,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.ciphers') }}</label> <label class="form-label cut-text">{{ $t('word.ciphers') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -253,6 +253,14 @@
> >
</div> </div>
</div> </div>
<div class="form-group columns">
<div class="column col-4 col-sm-12" />
<div class="column col-8 col-sm-12">
<label class="form-checkbox form-inline">
<input v-model="localConnection.untrustedConnection" type="checkbox"><i class="form-icon" /> {{ $t('message.untrustedConnection') }}
</label>
</div>
</div>
</fieldset> </fieldset>
</form> </form>
</div> </div>
@@ -262,7 +270,7 @@
<form class="form-horizontal"> <form class="form-horizontal">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label"> <label class="form-label cut-text">
{{ $t('message.enableSsh') }} {{ $t('message.enableSsh') }}
</label> </label>
</div> </div>
@@ -276,7 +284,7 @@
<fieldset class="m-0" :disabled="isBusy || !localConnection.ssh"> <fieldset class="m-0" :disabled="isBusy || !localConnection.ssh">
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.hostName') }}/IP</label> <label class="form-label cut-text">{{ $t('word.hostName') }}/IP</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -288,7 +296,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.user') }}</label> <label class="form-label cut-text">{{ $t('word.user') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -300,7 +308,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.password') }}</label> <label class="form-label cut-text">{{ $t('word.password') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -312,7 +320,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.port') }}</label> <label class="form-label cut-text">{{ $t('word.port') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -326,7 +334,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.privateKey') }}</label> <label class="form-label cut-text">{{ $t('word.privateKey') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<BaseUploadInput <BaseUploadInput
@@ -339,7 +347,7 @@
</div> </div>
<div class="form-group columns"> <div class="form-group columns">
<div class="column col-4 col-sm-12"> <div class="column col-4 col-sm-12">
<label class="form-label">{{ $t('word.passphrase') }}</label> <label class="form-label cut-text">{{ $t('word.passphrase') }}</label>
</div> </div>
<div class="column col-8 col-sm-12"> <div class="column col-8 col-sm-12">
<input <input
@@ -532,12 +540,12 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.connection-panel { .connection-panel {
margin-top: 15vh;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
margin-bottom: 1rem;
.panel { .panel {
width: 450px; min-width: 450px;
border-radius: $border-radius; border-radius: $border-radius;
.panel-body { .panel-body {

View File

@@ -283,7 +283,12 @@ module.exports = {
manualCommit: 'Manual commit', manualCommit: 'Manual commit',
actionSuccessful: '{action} successful', actionSuccessful: '{action} successful',
importQueryErrors: 'Warning: {n} error has accurrend | Warning: {n} errors occurred', importQueryErrors: 'Warning: {n} error has accurrend | Warning: {n} errors occurred',
executedQueries: '{n} query executed | {n} queries executed' executedQueries: '{n} query executed | {n} queries executed',
ourputFormat: 'Output format',
singleFile: 'Single {ext} file',
zipCompressedFile: 'ZIP compressed {ext} file',
disableBlur: 'Disable blur',
untrustedConnection: 'Untrusted connection'
}, },
faker: { faker: {
address: 'Address', address: 'Address',

View File

@@ -1,196 +1,298 @@
module.exports = { module.exports = {
word: { word: {
edit: 'Éditer', edit: 'Editer',
save: 'Enregistrer', save: 'Sauver',
close: 'Fermer', close: 'Fermer',
delete: 'Supprimer', delete: 'Effacer',
confirm: 'Confirmer', confirm: 'Confirmer',
cancel: 'Annuler', cancel: 'Annuler',
send: 'Envoyer', send: 'Envoyer',
connectionName: 'Nom de connexion', connectionName: 'Nom de la connexion',
client: 'Client', client: 'Client',
hostName: 'Nom d\'hôte', hostName: 'Nom du host',
port: 'Port', port: 'Port',
user: 'Utilisateur', user: 'Utilisateur',
password: 'Mot de passe', password: 'Mot de passe',
credentials: 'Identifiants', credentials: 'Credentials',
connect: 'Se connecter', connect: 'Connexion',
connected: 'Connecté', connected: 'Connecté',
disconnect: 'Se déconnecter', disconnect: 'Déconnection',
disconnected: 'Déconnecté', disconnected: 'Déconnecté',
refresh: 'Rafraichir', refresh: 'Rafrechir',
settings: 'Paramètres', settings: 'Paramètres',
general: 'Général', general: 'Général',
themes: 'Thèmes', themes: 'Thèmes',
update: 'Mise à jour', update: 'Mise à jour',
about: 'À propos', about: 'A propos de',
language: 'Langue', language: 'Langage',
version: 'Version', version: 'Version',
donate: 'Faire un don', donate: 'Faire une donation',
run: 'Exécuter', run: 'Lancer',
schema: 'Schéma', schema: 'Schéma',
results: 'Résutats', results: 'Resultats',
size: 'Taille', size: 'Taille',
seconds: 'Secondes', seconds: 'Secondes',
type: 'Type', type: 'Type',
mimeType: 'Mime-Type', mimeType: 'Mime-Type',
download: 'Télécharger', download: 'Télécharger',
add: 'Ajouter', add: 'Ajouter',
data: 'Données', data: 'Donnée',
properties: 'Propriétés', properties: 'Propriétés',
insert: 'Insérer', insert: 'Insérer',
connecting: 'Connexion', connecting: 'Connexion en cours',
name: 'Nom', name: 'Nom',
collation: 'Collation', collation: 'Langage',
clear: 'Effacer', clear: 'Effacer',
options: 'Options', options: 'Options',
autoRefresh: 'Auto-rafraichissement', autoRefresh: 'Auto-rafraichissemnt',
indexes: 'Index', indexes: 'Indexs',
foreignKeys: 'Clés étrangères', foreignKeys: 'Clefs étrangères',
length: 'Taille', length: 'Longueur',
unsigned: 'Non-signé', unsigned: 'non signé',
default: 'Défaut', default: 'Par défault',
comment: 'Commentaire', comment: 'Commentaire',
key: 'Clé | Clés', key: 'Clef | Clefs',
order: 'Ordre', order: 'Ordre',
expression: 'Expression', expression: 'Expression',
autoIncrement: 'Auto Increment', autoIncrement: 'Auto Incrémentation',
engine: 'Engine', engine: 'Moteur',
field: 'Champ | Champs', field: 'Champ | Champs',
approximately: 'Approximativement', approximately: 'Approximativement',
total: 'Totale', total: 'Total',
table: 'Table', table: 'Table',
discard: 'Abandonner', discard: 'Jeter',
stay: 'Rester', stay: 'Rester',
author: 'Auteur', author: 'Auteur',
light: 'Clair', light: 'Léger',
dark: 'Sombre', dark: 'Sombre',
autoCompletion: 'Completion auto', autoCompletion: 'Auto Completion',
application: 'Application', application: 'Application',
editor: 'Editeur', editor: 'Editor',
view: 'Vue', view: 'Vue',
definer: 'Définisseur', definer: 'Définisseur',
algorithm: 'Algorithme', algorithme: 'Algorithme',
trigger: 'Déclencheur | Déclencheurs', trigger: 'Déclencheur | Déclencheurs',
storedRoutine: 'Procedure stockée | Procedures stockées', storedRoutine: 'Routine stockée | Routines stockées',
scheduler: 'Opération planifiée | Opérations planifiées', scheduler: 'Planificateur | Planificateurs',
event: 'Evenement', event: 'Évènement',
parameters: 'Paramètres', parameters: 'Paramètres',
function: 'Fonction | Fonctions', function: 'Fonction | Fonctions',
deterministic: 'Déterministe', deterministic: 'Déterministe',
context: 'Contextz', context: 'Contexte',
export: 'Exporter', export: 'Export',
returns: 'Retourner', import: 'Import',
timing: 'Horaire', returns: 'Retourne',
state: 'État', timing: 'Temps',
state: 'Etat',
execution: 'Exécution', execution: 'Exécution',
starts: 'Débuts', starts: 'Commence',
ends: 'Fins', ends: 'Fini',
ssl: 'SSL', ssl: 'SSL',
privateKey: 'Clé privée', privateKey: 'Clé privée',
certificate: 'Certificat', certificate: 'Certificat',
caCertificate: 'CA certificat', caCertificate: 'Certificat CA',
ciphers: 'Chiffrement', ciphers: 'Codes secrets',
upload: 'Charger', upload: 'Téléverser',
browse: 'Parcourir', browse: 'Naviguer',
faker: 'Faker', faker: 'Imposteur',
sshTunnel: 'SSH tunnel' sshTunnel: 'SSH tunnel',
content: 'Contenu',
cut: 'Couper',
copy: 'Copier',
paste: 'Coller',
tools: 'Outils',
variables: 'Variables',
processes: 'Processus',
Database: 'Base de données',
scratchpad: 'Bloc-notes',
array: 'Tableau',
changelog: 'Log de changement',
Format: 'Format',
structure: 'Structure',
small: 'Petit',
medium: 'Moyen',
large: 'Grand',
row: 'Ligne | Lignes',
cell: 'Cellule | Cellules',
triggerFunction: 'Fonction de déclenchement | Fonctions de déclenchement',
all: 'Tout',
duplicate: 'Double',
routine: 'Routine',
new: 'Nouveau',
history: 'Passé',
select: 'Sélectionner',
passphrase: 'Phrase',
filter: 'Filtre',
change: 'Changement',
views: 'Vues',
triggers: 'Déclencheurs',
routines: 'Routines',
fonctions: 'Fonctions',
schedulers: 'Programmateurs',
includes: 'Inclut',
drop: 'Effacer',
completed: 'Terminé',
aborted: 'Annulé',
disabled: 'Désactivé',
enable: 'activer',
disable: 'Désactiver',
commit: 'Appliquer',
rollback: 'Retour arrière',
connectionString: 'Chaîne de connexion',
contributors: 'Contributeurs'
}, },
message: { message: {
appWelcome: 'Bienvenu sur le client SQL Antares!', appWelcome: 'Bienvenue dans le client SQL Antares!',
appFirstStep: 'Première étape: Créer une nouvelle connexion à une base de données.', appFirstStep: 'Votre première étape : créer une nouvelle connexion à la base de données.',
addConnection: 'Ajouter une connexion', addConnection: 'Ajouter une connexion',
createConnection: 'Créer une connexion', createConnection: 'Créer une connexion',
createNewConnection: 'Créer une nouvelle connexion', createNewConnection: 'Créer une nouvelle connexion',
askCredentials: 'Demander les identifiants', askCredentials: 'Demander des informations d\'identification',
testConnection: 'Tester la connexion', testConnection: 'Tester la connexion',
editConnection: 'Editer la connexion', editConnection: 'Modifier la connexion',
deleteConnection: 'Supprimer la connexion', deleteConnection: 'Supprimer la connexion',
deleteCorfirm: 'Êtes-vous sûr de vouloir annuler', deleteCorfirm: 'Confirmez-vous l\'annulation de',
connectionSuccessfullyMade: 'Connexion établie avec succès !', connectionSuccessfullyMade: 'Connexion établie avec succès !',
madeWithJS: 'Créé avec 💛 et JavaScript!', madeWithJS: 'Fait avec 💛 et JavaScript !',
checkForUpdates: 'Rechercher des mises à jour', checkForUpdates: 'Vérifier les mises à jour',
noUpdatesAvailable: 'Aucune mise à jour disponible', noUpdatesAvailable: 'Aucune mise à jour disponible',
checkingForUpdate: 'Recherche de mise à jour', checkingForUpdate: 'Vérification des mises à jour',
checkFailure: 'Erreur lors de la recherche, essayez plus tard', checkFailure: 'La vérification a échoué, veuillez essayer plus tard',
updateAvailable: 'Une mise à jour est disponible', updateAvailable: 'Mise à jour disponible',
downloadingUpdate: 'Téléchargement de la mise à jour', downloadingUpdate: 'Téléchargement de la mise à jour',
updateDownloaded: 'Mise à jour téléchargée', updateDownloaded: 'Mise à jour téléchargée',
restartToInstall: 'Redémarrer Antares pour l\'installer', restartToInstall: 'Redémarrer Antares pour installer',
unableEditFieldWithoutPrimary: 'Impossible de modifier un champ sans clé primaire dans l\'ensemble de résultats', unableEditFieldWithoutPrimary: 'Impossible de modifier un champ sans clé primaire dans le jeu de résultats',
editCell: 'Modifier une cellule', editCell: 'Editer la cellule',
deleteRows: 'Supprimer une ligne | Supprimer {count} lignes', deleteRows: 'Effacer la ligne | Effacer {count} lignes',
confirmToDeleteRows: 'Êtes-vous sûr de vouloir supprimer une ligne? | Êtes-vous sûr de vouloir supprimer {count} lignes?', confirmToDeleteRows: 'Confirmez-vous la suppression d\'une ligne ? | Confirmez-vous la suppression de {count} lignes ?',
notificationsTimeout: 'Délai d\'expiration des notifications', notificationsTimeout: 'Délai d\'attente pour les notifications',
uploadFile: 'Charger un fichier', uploadFile: 'Télécharger un fichier',
addNewRow: 'Ajouter une ligne', addNewRow: 'Ajouter une nouvelle ligne',
numberOfInserts: 'Nombre d\'insertions', numberOfInserts: 'Nombre d\'insertions',
openNewTab: 'Ouvrir un nouvel onglet', openNewTab: 'Ouvrir un nouvel onglet',
affectedRows: 'Lignes concernées', affectedRows: 'Lignes affectées',
createNewDatabase: 'Créer une nouvelle base de données', createNewDatabase: 'Créer une nouvelle base de données',
databaseName: 'Nom par défaut', databaseName: 'Nom de la base de données',
serverDefault: 'Serveur par défaut', serverDefault: 'Serveur par défaut',
deleteDatabase: 'Supprimer la base de données', deleteDatabase: 'Supprimer la base de données',
editDatabase: 'Modifier la base de données', editDatabase: 'Editer la base de données',
clearChanges: 'Effacer les modifications', clearChanges: 'Effacer les modifications',
addNewField: 'Ajouter un champ', addNewField: 'Ajouter un nouveau champ',
manageIndexes: 'Gérer les index', manageIndexes: 'Gère les index',
manageForeignKeys: 'Gérer les clés étrangères', manageForeignKeys: 'Gère les clés étrangères',
allowNull: 'NULL autorisé', allowNull: 'Autoriser NULL',
zeroFill: 'Remplissage zéro', zeroFill: 'Remplissage avec zéro',
customValue: 'Valeur personnalisée', customValue: 'Valeur personnalisée',
onUpdate: 'Lors d\'une mise à jour', onUpdate: 'lors de la mise à jour',
deleteField: 'Supprimer le champ', deleteField: 'Supprimer le champ',
createNewIndex: 'Créer un index', createNewIndex: 'Créer un nouvel index',
addToIndex: 'Ajouter à l\'index', addToIndex: 'Ajouter à l\'index',
createNewTable: 'Créer une nouvelle table', createNewTable: 'Créer une nouvelle table',
emptyTable: 'Table vide', emptyTable: 'Vider la table',
deleteTable: 'Supprimer la table', deleteTable: 'Supprimer une table',
emptyCorfirm: 'Êtes-vous sûr de vouloir videz', emptyCorfirm: 'Confirmez-vous que vous souhaitez vider la table ?',
unsavedChanges: 'Changements non sauvegardés', unsavedChanges: 'Modifications non sauvegardées',
discardUnsavedChanges: 'Vous avez des modifications non sauvegardées. En quittant cet onglet, ces changements seront supprimés.', discardUnsavedChanges: 'Vous avez des modifications non sauvegardées. En fermant cet onglet, ces modifications seront supprimées',
thereAreNoIndexes: 'Il n\'y a pas d\'indexes', thereAreNoIndexes: 'Il n\'y a pas d\'index',
thereAreNoForeign: 'Il n\'y a pas de clés étrangères', thereAreNoForeign: 'Il n\'y a pas de clés étrangères',
createNewForeign: 'Créer une clés étrangère', createNewForeign: 'Créer une nouvelle clé étrangère',
referenceTable: 'Table de référence', referenceTable: 'Table de référence',
referenceField: 'CHamp de référence', referenceField: 'Champ de référence',
foreignFields: 'Champ étrangé', foreignFields: 'Champs étrangers',
invalidDefault: 'Valeur par défaut invalide', invalidDefault: 'Valeur par défaut invalide',
onDelete: 'Lors de la suppression', onDelete: 'lors de l\'effacement',
applicationTheme: 'Thème de l\'application', applicationTheme: 'Thème de l\'application',
editorTheme: 'Thème de l\'éditeur', editorTheme: 'Thème de l\'éditeur',
wrapLongLines: 'Retour à la ligne automatique', wrapLongLines: 'Retour à la ligne pour les lignes longues',
selectStatement: 'Sélectionnez la déclaration', selectStatement: 'Sélectionner un état',
triggerStatement: 'Déclaration de déclencheur', triggerStatement: 'Déclencher un état',
sqlSecurity: 'Sécurité SQL', sqlSecurity: 'Sécurité SQL',
updateOption: 'Options de mises à jour', updateOption: 'Mide à jour d\'une option',
deleteView: 'Supprimer la vue', deleteView: 'Effacer une vue',
createNewView: 'Créer une nouvelle vue', createNewView: 'Créer une nouvelle vue',
deleteTrigger: 'Supprimer le déclencheur', deleteTrigger: 'Effacer un déclencheur',
createNewTrigger: 'Créer un nouveau déclencheur', createNewTrigger: 'Cr"er un nouveau déclencheur',
currentUser: 'Utilisateur actuel', currentUser: 'utilisateur courant',
routineBody: 'Contenu de la procédure', routineBody: 'Corps de la routine',
dataAccess: 'Accès aux données', dataAccess: 'Accès aux données',
thereAreNoParameters: 'Il n\'y a pas de paramètres', thereAreNoParameters: 'Il n\'y a pas de paramètre',
createNewParameter: 'Créer un nouveau paramètre', createNewParameter: 'Créer un nouveau paramètre',
createNewRoutine: 'Créer une nouvelle procédure stockée', createNewRoutine: 'Créer une nouvelle routine stockée',
deleteRoutine: 'Supprimer une procédure stockée', deleteRoutine: 'Effacer une routine stockée',
functionBody: 'Contenu de la fonction', functionBody: 'Corps d\'une fonction',
createNewFunction: 'Créer une nouvelle fonction', createNewFunction: 'Créer une nouvelle fonction',
deleteFunction: 'Supprimer la fonction', deleteFunction: 'Effacer une fonction',
schedulerBody: 'Contenu du opération planifiée', schedulerBody: 'Corps d\'un programmateur',
createNewScheduler: 'Créere une nouvelle opération planifiée', createNewScheduler: 'Créer un nouveau programmateur',
deleteScheduler: 'Supprimer l\'opération planifiée', deleteScheduler: 'Effacer un programmateur',
preserveOnCompletion: 'Préserver à l\'achèvement', preserveOnCompletion: 'Préserver à la terminaison',
enableSsl: 'Activer le SSL', enableSsl: 'Activer le SSL',
manualValue: 'Valeur manuelle', manualValue: 'Valeur manuelle',
tableFiller: 'Remplisseur de table', tableFiller: 'Remplisseur de table',
enableSsh: 'Activer le SSH' fakeDataLanguage: 'Language de données fausses',
searchForElements: 'Rechercher des éléments',
selectAll: 'Tout séélectionner',
queryDuration: 'Temps de requêtage',
includeBetaUpdates: 'Inclure les mises à jour beta',
setNull: 'Définir comme NULL',
processesList: 'List des processus',
processInfo: 'Information sur le processus',
manageUsers: 'Organisation des utilisateurs',
createNewSchema: 'Créer un nouveau schéma',
schemaName: 'Nom du Schéma',
editSchema: 'Modifier le schéma',
deleteSchema: 'Effacer le schéma',
markdownSupported: 'Support du Markdown',
plantATree: 'Planter un arbre',
dataTabPageSize: 'Taille de la page de l\'onglet données',
enableSsh: 'Activer le SSH',
pageNumber: 'Numéro de la page',
duplicateTable: 'Copier la table',
noOpenTabs: 'Il n\'y a pas d\'onglet ouvert, naviguer vers la barre gauche ou :',
noSchema: 'Pas de schéma',
restorePreviourSession: 'Restorer une session précédente',
runQuery: 'Lancer la requête',
thereAreNoTableFields: 'Il n\'y a pas de champ table',
newTable: 'Nouvelle table',
newView: 'Nouvelle vue',
newTrigger: 'Nouveau déclencheur',
newRoutine: 'Nouvelle routine',
newFunction: 'Nouvelle function',
newScheduler: 'Nouveau déclencheur',
newTriggerFunction: 'Nouvelle fonction de déclencheur',
thereIsNoQueriesYet: 'Il n\'y a pas encore de requête',
searchForQueries: 'Rechercher des requêtes',
killProcess: 'tuer un processus',
closeTab: 'Fermer un onglet',
exportSchema: 'Exporter un schéma',
importSchema: 'Importer un schéma',
directoryPath: 'chemin du répertoire',
newInserStmtEvery: 'Nouvelle déclaration d\'insertion tous les',
processingTableExport: 'Traitement {table}',
fechingTableExport: 'Recherche des données de la table {table}',
writingTableExport: 'Ecriture des données de la table {table}',
checkAllTables: 'Vérification de toutes les tables',
uncheckAllTables: 'Désélectionner toutes les tables',
goToDownloadPage: 'Aller vers la page de téléchargement',
readOnlyMode: 'Mode lecture seule',
killQuery: 'Terminer une requête',
insertRow: 'Insérer un ligne | Insérer des lignes',
commitMode: 'Mode insertion directe',
autoCommit: 'Insertion directe automatique',
manualCommit: 'Insertion directe manuelle',
actionSuccessful: '{action} réussie',
importQueryErrors: 'Attention : {n} erreurs se sont produites | Attention: {n} erreurs sont apparues',
executedQueries: '{n} requêtes ont été exécutées | {n} requêtes exécutées',
ourputFormat: 'Format de sortie',
singleFile: 'Seul fichier avec l\'extension {ext}',
zipCompressedFile: 'Fichier compréssé avec l\'extension {ext}',
disableBlur: 'Désactiver le floue'
}, },
faker: { faker: {
address: 'Adresse', address: 'Adresse',
commerce: 'Commerce', commerce: 'Commerce',
company: 'Entreprise', company: 'Companie',
database: 'Base de données', database: 'Base de données',
date: 'Date', date: 'Date',
finance: 'Finance', finance: 'Finance',
@@ -204,105 +306,105 @@ module.exports = {
random: 'Aléatoire', random: 'Aléatoire',
system: 'Système', system: 'Système',
time: 'Temps', time: 'Temps',
vehicle: 'Véhicle', vehicle: 'Véhicule',
zipCode: 'Code postal', zipCode: 'Code postal',
zipCodeByState: 'Code postal par région', zipCodeByState: 'Code postal par état',
city: 'Ville', city: 'Ville',
cityPrefix: 'Préfixe de la ville', cityPrefix: 'Préfixe de la ville',
citySuffix: 'Suffixe de la ville', citySuffix: 'Suffixe de la ville',
streetName: 'Ne de la rue', streetName: 'Nom de la rue',
streetAddress: 'Adresse', streetAddress: 'Adresse de la rue',
streetSuffix: 'Suffixe de la rue', streetSuffix: 'Suffixe de la rue',
streetPrefix: 'Préfixe de la rue', streetPrefix: 'Préfixe de la rue',
secondaryAddress: 'Adresse secondaire', secondaryAddress: 'Adresse secondaire',
county: 'Comté', county: 'Département',
country: 'Pays', country: 'Pays',
countryCode: 'Code du pays', countryCode: 'Code du pays',
state: 'Région', state: 'Etat',
stateAbbr: 'Abbreviation de la région', stateAbbr: 'Abviation de l\'état',
latitude: 'Latitude', latitude: 'Latitude',
longitude: 'Longitude', longitude: 'Longitude',
direction: 'Direction', direction: 'Direction',
cardinalDirection: 'Orientation cardinale', cardinalDirection: 'Direction cardinale',
ordinalDirection: 'Orientation originale', ordinalDirection: 'Direction Ordinale',
nearbyGPSCoordinate: 'Coordonnées GPS des environs', nearbyGPSCoordinate: 'Coordonnées GPS proches',
timeZone: 'Fuseau horaire', timeZone: 'fuseau horaire',
color: 'Couleur', color: 'Couleur',
department: 'Département', department: 'Départment',
productName: 'Nom de produit', productName: 'Nom du produit',
price: 'Prix', price: 'Prix',
productAdjective: 'Adjectif du produit', productAdjective: 'Adjectif du produit',
productMaterial: 'Matériau du produit', productMaterial: 'Matériaux du produit',
product: 'Produit', product: 'Produit',
productDescription: 'Description du produit', productDescription: 'Description du produit',
suffixes: 'Suffixes', suffixes: 'Suffixes',
companyName: 'Nom de l\'entreprise', companyName: 'Nom de la société',
companySuffix: 'Suffixe de l\'entreprise', companySuffix: 'Suffixe de la société',
catchPhrase: 'Slogan', catchPhrase: 'Phrase de rappel',
bs: 'BS', bs: 'BS',
catchPhraseAdjective: 'Adjectif du slogan', catchPhraseAdjective: 'Adjectif de la phrase de rappel',
catchPhraseDescriptor: 'Descripteur de slogan', catchPhraseDescriptor: 'Descripteur de la phrase de rappel',
catchPhraseNoun: 'Nom de la phrase d\'accroche', catchPhraseNoun: 'Nom de la phrase de rappel',
bsAdjective: 'Adjectif BS', bsAdjective: 'Adjectif BS',
bsBuzz: 'BS buzz', bsBuzz: 'BS buzz',
bsNoun: 'Nom BS', bsNoun: 'Nom BS',
column: 'Colonne', column: 'Colonne',
type: 'Type', type: 'Type',
collation: 'Collation', collation: 'Langue',
engine: 'Engine', engine: 'Moteur',
past: 'Passé', past: 'Passé',
future: 'Futur', future: 'Future',
between: 'Entre', between: 'Entre',
recent: 'Récent', recent: 'Récent',
soon: 'Bientôt', soon: 'Bientôt',
month: 'Mois', month: 'Mois',
weekday: 'Mercredi', weekday: 'Jour de la semaine',
account: 'Compte', account: 'compte',
accountName: 'Nom de compte', accountName: 'Nom du compte',
routingNumber: 'Numéros de routage', routingNumber: 'Numéro de la routing',
mask: 'Masque', mask: 'Masque',
amount: 'Quantité', amount: 'Montant',
transactionType: 'Type de transaction', transactionType: 'Type de la transaction',
currencyCode: 'Code de la devise', currencyCode: 'Code de la devise',
currencyName: 'Nom de la devise', currencyName: 'Nom de la devise',
currencySymbol: 'Symbole de la devise', currencySymbol: 'Symbole de la devise',
bitcoinAddress: 'Adresse Bitcoin', bitcoinAddress: 'Adresse Bitcoin',
litecoinAddress: 'Adresse Litecoin', litecoinAddress: 'Adresse Litecoin',
creditCardNumber: 'Numero de carte de crédit', creditCardNumber: 'Numéro de la carte de bancaire',
creditCardCVV: 'Cryptogramme', creditCardCVV: 'Numéro de vérification',
ethereumAddress: 'Adresse Ethereum', ethereumAddress: 'Adresse Ethereum',
iban: 'Iban', iban: 'Iban',
bic: 'Bic', bic: 'Bic',
transactionDescription: 'Description de la transaction', transactionDescription: 'Description de la transaction',
branch: 'Branche', branch: 'Branche',
commitEntry: 'Valider l\'entrée', commitEntry: 'Insérer les données',
commitMessage: 'Valider le message', commitMessage: 'Insérer le message',
commitSha: 'Valider le SHA', commitSha: 'Insérer SHA',
shortSha: 'SHA court', shortSha: 'SHA réduit',
abbreviation: 'Abbréviation', abbreviation: 'Abréviation',
adjective: 'Adjectif', adjective: 'Adjectif',
noun: 'Nom', noun: 'Nom',
verb: 'Verbe', verb: 'Verbe',
ingverb: 'Ingverb', ingverb: 'Ingverb',
phrase: 'Phrase', phrase: 'Phrase',
avatar: 'Avatar', avatar: 'Avatar',
email: 'Email', email: 'mail',
exampleEmail: 'Exemple d\'email', exampleEmail: 'Exemple de mail',
userName: 'Nom d\'utilisateur', userName: 'Nom utilisateur',
protocol: 'Protocole', protocol: 'Protocole',
url: 'Url', url: 'Url',
domainName: 'Nom de domaine', domainName: 'Nom du domaine',
domainSuffix: 'Suffixe du nom de domaine', domainSuffix: 'Suffixe du domaine',
domainWord: 'Mot de domaine', domainWord: 'Mot domaine',
ip: 'Ip', ip: 'Ip',
ipv6: 'Ipv6', ipv6: 'Ipv6',
userAgent: 'User agent', userAgent: 'Agent utilisateur',
mac: 'Mac', mac: 'Mac',
password: 'Mot de passe', password: 'Mot de passe',
word: 'Mot', word: 'Mot',
words: 'Mots', words: 'Mots',
sentence: 'Phrase', sentence: 'Phrase',
slug: 'Slug', slug: 'Identifiant',
sentences: 'Phrases', sentences: 'Phrases',
paragraph: 'Paragraphe', paragraph: 'Paragraphe',
paragraphs: 'Paragraphes', paragraphs: 'Paragraphes',
@@ -310,45 +412,45 @@ module.exports = {
lines: 'Lignes', lines: 'Lignes',
genre: 'Genre', genre: 'Genre',
firstName: 'Prénom', firstName: 'Prénom',
lastName: 'Nom', lastName: 'Nom de famille',
middleName: 'Deuxième prénom', middleName: 'Deuxième prénom',
findName: 'Nom et prénom', findName: 'Nom complet',
jobTitle: 'Intitulé du poste', jobTitle: 'Nom du poste',
gender: 'Genre', gender: 'Sexe',
prefix: 'Préfixe', prefix: 'Préfixe',
suffix: 'Suffixe', suffix: 'Suffixe',
title: 'Titre', title: 'Fonction',
jobDescriptor: 'Descripteur de poste', jobDescriptor: 'Desciption du travail',
jobArea: 'Domaine d\'activité', jobArea: 'Zone du travail',
jobType: 'Type de poste', jobType: 'Type de travail',
phoneNumber: 'Numéro de téléphone', phoneNumber: 'Numéro de téléphone',
phoneNumberFormat: 'Format du numéro de téléphone', phoneNumberFormat: 'Format du Numéro de téléphone',
phoneFormats: 'Formats de téléphone', phoneFormats: 'Formats téléphone',
number: 'Numéro', number: 'Nombre',
float: 'Nombre décimaux', float: 'décimal',
arrayElement: 'Élément de Liste', arrayElement: 'élément du tableau',
arrayElements: 'Éléments de liste', arrayElements: 'éléments du tableau',
objectElement: 'Élément d\'objet', objectElement: 'élément de l\'object',
uuid: 'Uuid', uuid: 'Uuid',
boolean: 'Boolean', boolean: 'Booléen',
image: 'Image', image: 'Image',
locale: 'Locale', locale: 'Locale',
alpha: 'Alpha', alpha: 'Alpha',
alphaNumeric: 'Alphanumerique', alphaNumeric: 'Alphanumerique',
hexaDecimal: 'Hexadecimale', hexaDecimal: 'Hexadécimal',
fileName: 'Nom deu fichier', fileName: 'Nom du fichier',
commonFileName: 'Nom de fichier commun', commonFileName: 'Nom de fichier commun',
mimeType: 'Mime type', mimeType: 'Type Mime',
commonFileType: 'Type de dossier commun', commonFileType: 'Type de fichier commun',
commonFileExt: 'Extension de fichier commun', commonFileExt: 'Extension de fichier commun',
fileType: 'Type de fichier', fileType: 'Type de fichier',
fileExt: 'Extension de fichier', fileExt: 'Extension de fichier',
directoryPath: 'Chemin du répertoire', directoryPath: 'Chemin du répertoire',
filePath: 'Chemin d\'accès au fichier', filePath: 'Chemin du fichier',
semver: 'Semver', semver: 'Semver',
manufacturer: 'Fabricant', manufacturer: 'Constructeur',
model: 'Modèle', model: 'Modèle',
fuel: 'Carburant', fuel: 'Essence',
vin: 'Vin' vin: 'Plaque d\'imatriculation'
} }
}; };

View File

@@ -106,7 +106,39 @@ module.exports = {
array: 'Array', array: 'Array',
changelog: 'Logs de alteração', changelog: 'Logs de alteração',
format: 'Formato', format: 'Formato',
sshTunnel: 'SSH túnel' sshTunnel: 'SSH túnel',
structure: 'Estrutura',
small: 'Pequeno',
medium: 'Médio',
large: 'Grande',
row: 'Linha | Linhas',
cell: 'Celula | Células',
triggerFunction: 'Gatinho de função | Gatilhos de Funções',
all: 'Todos',
duplicate: 'Duplicado',
routine: 'Rotina',
new: 'Novo',
history: 'Histórico',
select: 'Seleciomar',
passphrase: 'Palavara-Passe',
filter: 'Filtrar',
change: 'Alterar',
views: 'Visualizações',
triggers: 'Gatilhos',
routines: 'Rotinas',
functions: 'Funções',
schedulers: 'Agendadores',
includes: 'Includes',
drop: 'Drop',
completed: 'Completo',
aborted: 'Abortado',
disabled: 'Inativo',
enable: 'Ativo',
disable: 'Disable',
commit: 'Enviar',
rollback: 'Reverter',
connectionString: 'String da conexão',
contributors: 'Contribuintes'
}, },
message: { message: {
appWelcome: 'Bem vindo ao Antares SQL Client!', appWelcome: 'Bem vindo ao Antares SQL Client!',
@@ -212,7 +244,48 @@ module.exports = {
deleteSchema: 'Apagar schema', deleteSchema: 'Apagar schema',
markdownSupported: 'Markdown suportado', markdownSupported: 'Markdown suportado',
plantATree: 'Plante uma árvore', plantATree: 'Plante uma árvore',
enableSsh: 'Habilitar SSH' enableSsh: 'Habilitar SSH',
pageNumber: 'Número de página',
duplicateTable: 'Duplicar tabela',
noOpenTabs: 'Nenhuma aba aberta, navege na barra lateral ou:',
noSchema: 'Nenhum banco de dados',
restorePreviourSession: 'Restaurar sessão anterior',
runQuery: 'Executar Query',
thereAreNoTableFields: 'Nenhum campo na tabela',
newTable: 'Nova tabela',
newView: 'Nova vista',
newTrigger: 'Novo gatilho',
newRoutine: 'Nova rotina',
newFunction: 'Nova função',
newScheduler: 'Novo agendento',
newTriggerFunction: 'Novo gatinho de função',
thereIsNoQueriesYet: 'Nenhuma consulta ainda',
searchForQueries: 'Pesquisar por consultas',
killProcess: 'Matar processo',
closeTab: 'Fechar aba',
exportSchema: 'Exportar banco de dados',
importSchema: 'Importar banco de dados',
directoryPath: 'Caminho da pasta',
newInserStmtEvery: 'Nova query INSERT',
processingTableExport: 'Processando {table}',
fechingTableExport: 'Carregando dados da tabela {table}',
writingTableExport: 'Escrevendo dados na tabela {table}',
checkAllTables: 'Marcar todas as tabelas',
uncheckAllTables: 'Desmarcar todas as tabelas',
goToDownloadPage: 'Ir a página de download',
readOnlyMode: 'Modo somente leitura',
killQuery: 'Matar consulta',
insertRow: 'Inserir linha | Inserir linhas',
commitMode: 'Modo de confirmação',
autoCommit: 'Auto confirmar',
manualCommit: 'Confirmar manualmente',
actionSuccessful: '{action} teve sucesso',
importQueryErrors: 'Aviso: ocorreu {n} erro | Aviso: ocorreram {n} erros',
executedQueries: '{n} consulta executada | {n} consultas executadas',
ourputFormat: 'Formato da saída',
singleFile: 'Arquivo {ext} único',
zipCompressedFile: 'Arquivo compactado {ext} ZIP',
disableBlur: 'Desabilitar Blur'
}, },
faker: { faker: {
address: 'Endereço', address: 'Endereço',

View File

@@ -169,10 +169,13 @@ option:checked {
.modal-overlay{ .modal-overlay{
background: rgba( 255, 255, 255, 0.1); background: rgba( 255, 255, 255, 0.1);
box-shadow: 0 8px 32px 0 rgba( 31, 38, 135, 0.37 ); box-shadow: 0 8px 32px 0 rgba( 31, 38, 135, 0.37 );
}
}
#wrapper:not(.no-blur){
.modal-overlay{
backdrop-filter: blur( 4px ); backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px ); -webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
} }
} }

View File

@@ -6,7 +6,7 @@ export default {
namespaced: true, namespaced: true,
strict: true, strict: true,
state: { state: {
notes: persistentStore.get('notes', '# HOW TO SUPPORT ANTARES\n\n- [ ] Leave a star to Antares [GitHub repo](https://github.com/Fabio286/antares)\n- [ ] Send feedbacks and advices\n- [ ] Report for bugs\n- [ ] If you enjoy, share Antares with friends\n\n# ABOUT SCRATCHPAD\n\nThis is a scratchpad where you can save your **personal notes**. It supports `markdown` format, but you are free to use plain text.\nThis content is just a placeholder, feel free to clear it to make space for your notes.\n') notes: persistentStore.get('notes', '# HOW TO SUPPORT ANTARES\n\n- [ ] Leave a star to Antares [GitHub repo](https://github.com/antares-sql/antares)\n- [ ] Send feedbacks and advices\n- [ ] Report for bugs\n- [ ] If you enjoy, share Antares with friends\n\n# ABOUT SCRATCHPAD\n\nThis is a scratchpad where you can save your **personal notes**. It supports `markdown` format, but you are free to use plain text.\nThis content is just a placeholder, feel free to clear it to make space for your notes.\n')
}, },
getters: { getters: {
getNotes: state => state.notes getNotes: state => state.notes

View File

@@ -20,7 +20,8 @@ export default {
application_theme: persistentStore.get('application_theme', defaultAppTheme), application_theme: persistentStore.get('application_theme', defaultAppTheme),
editor_theme: persistentStore.get('editor_theme', defaultEditorTheme), editor_theme: persistentStore.get('editor_theme', defaultEditorTheme),
editor_font_size: persistentStore.get('editor_font_size', 'medium'), editor_font_size: persistentStore.get('editor_font_size', 'medium'),
restore_tabs: persistentStore.get('restore_tabs', true) restore_tabs: persistentStore.get('restore_tabs', true),
disable_blur: persistentStore.get('disable_blur', false)
}, },
getters: { getters: {
getLocale: state => state.locale, getLocale: state => state.locale,
@@ -33,7 +34,8 @@ export default {
getApplicationTheme: state => state.application_theme, getApplicationTheme: state => state.application_theme,
getEditorTheme: state => state.editor_theme, getEditorTheme: state => state.editor_theme,
getEditorFontSize: state => state.editor_font_size, getEditorFontSize: state => state.editor_font_size,
getRestoreTabs: state => state.restore_tabs getRestoreTabs: state => state.restore_tabs,
getDisableBlur: state => state.disable_blur
}, },
mutations: { mutations: {
SET_LOCALE (state, locale) { SET_LOCALE (state, locale) {
@@ -80,6 +82,10 @@ export default {
SET_RESTORE_TABS (state, val) { SET_RESTORE_TABS (state, val) {
state.restore_tabs = val; state.restore_tabs = val;
persistentStore.set('restore_tabs', state.restore_tabs); persistentStore.set('restore_tabs', state.restore_tabs);
},
SET_DISABLE_BLUR (state, val) {
state.disable_blur = val;
persistentStore.set('disable_blur', state.disable_blur);
} }
}, },
actions: { actions: {
@@ -115,6 +121,9 @@ export default {
}, },
changeRestoreTabs ({ commit }, size) { changeRestoreTabs ({ commit }, size) {
commit('SET_RESTORE_TABS', size); commit('SET_RESTORE_TABS', size);
},
changeDisableBlur ({ commit }, val) {
commit('SET_DISABLE_BLUR', val);
} }
} }
}; };