From a7a6c664c881589ae5d57731b8361be207efd6b0 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Tue, 21 Oct 2025 10:42:26 +0200 Subject: [PATCH 01/79] SYNC: #1220 fixed typo --- packages/web/src/datagrid/ReferenceManager.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/src/datagrid/ReferenceManager.svelte b/packages/web/src/datagrid/ReferenceManager.svelte index 5b808b8da..2585ac697 100644 --- a/packages/web/src/datagrid/ReferenceManager.svelte +++ b/packages/web/src/datagrid/ReferenceManager.svelte @@ -53,7 +53,7 @@ {/if} {#if dependencies.length > 0} -
Dependend tables ({dependencies.length})
+
Dependent tables ({dependencies.length})
{#each dependencies.filter(fk => filterName(filter, fk.pureName)) as fk} {/if} - {#if $currentArchive && $currentArchive != 'default'} + {#if isProApp() && $currentArchive && $currentArchive != 'default'}
{#if hasPermission('widgets/database')} @@ -22,7 +23,7 @@ {#if $visibleSelectedWidget == 'history' && hasPermission('widgets/history')} {/if} -{#if $visibleSelectedWidget == 'archive' && hasPermission('widgets/archive')} +{#if $visibleSelectedWidget == 'archive' && hasPermission('widgets/archive') && isProApp()} {/if} {#if $visibleSelectedWidget == 'plugins' && hasPermission('widgets/plugins')} diff --git a/packages/web/src/widgets/WidgetIconPanel.svelte b/packages/web/src/widgets/WidgetIconPanel.svelte index 5f3c1ff06..f2d0850f5 100644 --- a/packages/web/src/widgets/WidgetIconPanel.svelte +++ b/packages/web/src/widgets/WidgetIconPanel.svelte @@ -60,7 +60,7 @@ name: 'history', title: 'Query history & Closed tabs', }, - { + isProApp() && { icon: 'icon archive', name: 'archive', title: 'Archive (saved tabular data)', From 64c2faf5384a70214cc6f20603a337e2b920a09d Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 13:10:45 +0100 Subject: [PATCH 15/79] JSON UI --- packages/api/src/controllers/cloud.js | 12 +++ packages/api/src/utility/cloudIntf.js | 12 +++ packages/web/public/icon-colors.css | 5 ++ packages/web/src/commands/stdCommands.ts | 37 ++++++++++ .../src/jsonui/JsonUiContentRenderer.svelte | 9 ++- .../web/src/jsonui/JsonUiCountdown.svelte | 73 +++++++++++++++++++ .../web/src/jsonui/JsonUiHighlight.svelte | 19 +++++ packages/web/src/jsonui/JsonUiMarkdown.svelte | 15 ++++ packages/web/src/stores.ts | 3 + .../widgets/AdminPremiumPromoWidget.svelte | 7 +- .../web/src/widgets/WidgetIconPanel.svelte | 9 ++- 11 files changed, 195 insertions(+), 6 deletions(-) create mode 100644 packages/web/src/jsonui/JsonUiCountdown.svelte create mode 100644 packages/web/src/jsonui/JsonUiHighlight.svelte create mode 100644 packages/web/src/jsonui/JsonUiMarkdown.svelte diff --git a/packages/api/src/controllers/cloud.js b/packages/api/src/controllers/cloud.js index 407eafcad..ad348b1f7 100644 --- a/packages/api/src/controllers/cloud.js +++ b/packages/api/src/controllers/cloud.js @@ -9,6 +9,8 @@ const { putCloudContent, removeCloudCachedConnection, getPromoWidgetData, + getPromoWidgetList, + getPromoWidgetPreview, } = require('../utility/cloudIntf'); const connections = require('./connections'); const socket = require('../utility/socket'); @@ -296,6 +298,16 @@ module.exports = { return data; }, + promoWidgetList_meta: true, + async promoWidgetList() { + return getPromoWidgetList(); + }, + + promoWidgetPreview_meta: true, + async promoWidgetPreview({ campaign, variant }) { + return getPromoWidgetPreview(campaign, variant); + }, + // chatStream_meta: { // raw: true, // method: 'post', diff --git a/packages/api/src/utility/cloudIntf.js b/packages/api/src/utility/cloudIntf.js index b27880689..b0ea4217a 100644 --- a/packages/api/src/utility/cloudIntf.js +++ b/packages/api/src/utility/cloudIntf.js @@ -480,6 +480,16 @@ async function getPromoWidgetData() { return promoWidgetData; } +async function getPromoWidgetPreview(campaign, variant) { + const resp = await axios.default.get(`${DBGATE_CLOUD_URL}/premium-promo-widget-preview/${campaign}/${variant}`); + return resp.data; +} + +async function getPromoWidgetList() { + const resp = await axios.default.get(`${DBGATE_CLOUD_URL}/promo-widget-list`); + return resp.data; +} + module.exports = { createDbGateIdentitySession, startCloudTokenChecking, @@ -498,4 +508,6 @@ module.exports = { readCloudTestTokenHolder, getPublicIpInfo, getPromoWidgetData, + getPromoWidgetPreview, + getPromoWidgetList, }; diff --git a/packages/web/public/icon-colors.css b/packages/web/public/icon-colors.css index 0e904452d..25cad9a76 100644 --- a/packages/web/public/icon-colors.css +++ b/packages/web/public/icon-colors.css @@ -35,6 +35,11 @@ background: linear-gradient(135deg, #1686c8, #8a25b1); } +.premium-gradient { + background: linear-gradient(135deg, #1686c8, #8a25b1); + color: white; +} + .web-color-primary { background: #1686c8; } diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index cbf82fc72..f2f3872d6 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -8,6 +8,7 @@ import { getCloudSigninTokenHolder, getExtensions, getVisibleToolbar, + promoWidgetPreview, visibleToolbar, visibleWidgetSideBar, } from '../stores'; @@ -50,6 +51,7 @@ import { isProApp } from '../utility/proTools'; import { openWebLink } from '../utility/simpleTools'; import { _t } from '../translations'; import ExportImportConnectionsModal from '../modals/ExportImportConnectionsModal.svelte'; +import { getBoolSettingsValue } from '../settings/settingsTools'; // function themeCommand(theme: ThemeDefinition) { // return { @@ -1164,6 +1166,41 @@ registerCommand({ onClick: () => currentDatabase.set(null), }); +let loadedCampaignList = []; + +registerCommand({ + id: 'internal.loadCampaigns', + category: 'Internal', + name: 'Load campaign list', + testEnabled: () => getBoolSettingsValue('internal.showCampaigns', false), + onClick: async () => { + const resp = await apiCall('cloud/promo-widget-list', {}); + loadedCampaignList = resp; + }, +}); + +registerCommand({ + id: 'internal.showCampaigns', + category: 'Internal', + name: 'Show campaigns', + testEnabled: () => getBoolSettingsValue('internal.showCampaigns', false) && loadedCampaignList?.length > 0, + getSubCommands: () => { + return loadedCampaignList.map(campaign => ({ + text: `${campaign.campaignName} (${campaign.countries || 'Global'}) - #${campaign.quantileRank ?? '*'}/${ + campaign.quantileGroupCount ?? '*' + } - ${campaign.variantIdentifier}`, + onClick: async () => { + promoWidgetPreview.set( + await apiCall('cloud/promo-widget-preview', { + campaign: campaign.campaignIdentifier, + variant: campaign.variantIdentifier, + }) + ); + }, + })); + }, +}); + const electron = getElectron(); if (electron) { electron.addEventListener('run-command', (e, commandId) => runCommand(commandId)); diff --git a/packages/web/src/jsonui/JsonUiContentRenderer.svelte b/packages/web/src/jsonui/JsonUiContentRenderer.svelte index b1562d16d..07fdcb667 100644 --- a/packages/web/src/jsonui/JsonUiContentRenderer.svelte +++ b/packages/web/src/jsonui/JsonUiContentRenderer.svelte @@ -1,22 +1,29 @@ {#each blocks as block, i} {#if block.type in componentMap} - + {/if} {/each} diff --git a/packages/web/src/jsonui/JsonUiCountdown.svelte b/packages/web/src/jsonui/JsonUiCountdown.svelte new file mode 100644 index 000000000..c0e196f05 --- /dev/null +++ b/packages/web/src/jsonui/JsonUiCountdown.svelte @@ -0,0 +1,73 @@ + + +{#if validTo} +
+ Offer ends in:
+ {#each parts as part} + + {part.num} + {part.unit} + + {/each} +
+{/if} + + diff --git a/packages/web/src/jsonui/JsonUiHighlight.svelte b/packages/web/src/jsonui/JsonUiHighlight.svelte new file mode 100644 index 000000000..8437d7a84 --- /dev/null +++ b/packages/web/src/jsonui/JsonUiHighlight.svelte @@ -0,0 +1,19 @@ + + +
+ {text} +
+ + diff --git a/packages/web/src/jsonui/JsonUiMarkdown.svelte b/packages/web/src/jsonui/JsonUiMarkdown.svelte new file mode 100644 index 000000000..cfe522772 --- /dev/null +++ b/packages/web/src/jsonui/JsonUiMarkdown.svelte @@ -0,0 +1,15 @@ + + +
+ +
+ + diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts index 6ab382f5e..d30046e99 100644 --- a/packages/web/src/stores.ts +++ b/packages/web/src/stores.ts @@ -187,6 +187,9 @@ export const seenPremiumPromoWidget = writableWithStorage(null, 'seenPremiumProm export const cloudConnectionsStore = writable({}); +export const promoWidgetPreview = writable(null); + + export const DEFAULT_OBJECT_SEARCH_SETTINGS = { pureName: true, schemaName: false, diff --git a/packages/web/src/widgets/AdminPremiumPromoWidget.svelte b/packages/web/src/widgets/AdminPremiumPromoWidget.svelte index d3f80daed..ec3c9ea16 100644 --- a/packages/web/src/widgets/AdminPremiumPromoWidget.svelte +++ b/packages/web/src/widgets/AdminPremiumPromoWidget.svelte @@ -1,14 +1,17 @@ - {#if $promoWidget?.state == 'data'} - + {#if promoWidgetData?.state == 'data'} + {/if} diff --git a/packages/web/src/widgets/WidgetIconPanel.svelte b/packages/web/src/widgets/WidgetIconPanel.svelte index 5f3c1ff06..052ca4a98 100644 --- a/packages/web/src/widgets/WidgetIconPanel.svelte +++ b/packages/web/src/widgets/WidgetIconPanel.svelte @@ -11,6 +11,7 @@ getCurrentConfig, cloudSigninTokenHolder, seenPremiumPromoWidget, + promoWidgetPreview, } from '../stores'; import mainMenuDefinition from '../../../../app/src/mainMenuDefinition'; import hasPermission from '../utility/hasPermission'; @@ -167,6 +168,8 @@ openWebLink(url, true); } } + + $: promoWidgetData = $promoWidgetPreview || $promoWidget;
@@ -177,7 +180,7 @@ {/if} {#each widgets .filter(x => x && hasPermission(`widgets/${x.name}`)) - .filter(x => !x.isPremiumPromo || (!isProApp() && $promoWidget?.state == 'data')) + .filter(x => !x.isPremiumPromo || (!isProApp() && promoWidgetData?.state == 'data')) // .filter(x => !x.isPremiumOnly || isProApp()) .filter(x => x.name != 'cloud-private' || $cloudSigninTokenHolder) as item}
handleChangeWidget(item.name)} > - {#if item.isPremiumPromo && $promoWidget?.isColoredIcon} + {#if item.isPremiumPromo && promoWidgetData?.isColoredIcon} Premium
- {#if $promoWidget?.identifier != $seenPremiumPromoWidget} + {#if promoWidgetData?.identifier != $seenPremiumPromoWidget}
{/if} {/if} From 28fecc683421d80d7ac2cafb178332561a1e9a17 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 13:18:55 +0100 Subject: [PATCH 16/79] v6.6.6-beta.14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index df09f2e42..4bf715acd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6-beta.13", + "version": "6.6.6-beta.14", "name": "dbgate-all", "workspaces": [ "packages/*", From 6e645cb054c519e755c699da31c8c43fe29bad6d Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 13:19:11 +0100 Subject: [PATCH 17/79] v6.6.6-beta.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4bf715acd..87354f37c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6-beta.14", + "version": "6.6.6-beta.7", "name": "dbgate-all", "workspaces": [ "packages/*", From 70c53248ae63b7ee17d027118d8bcf5b27d6f779 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 13:19:20 +0100 Subject: [PATCH 18/79] v6.6.6-beta.17 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87354f37c..ad56007ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6-beta.7", + "version": "6.6.6-beta.17", "name": "dbgate-all", "workspaces": [ "packages/*", From 4d6957a6fa56c457502a39fc86822bb4d7810c5d Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 13:19:40 +0100 Subject: [PATCH 19/79] v6.6.6-premium-beta.18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ad56007ef..65fda0599 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6-beta.17", + "version": "6.6.6-premium-beta.18", "name": "dbgate-all", "workspaces": [ "packages/*", From 87c58cae83ce7c31964cd0cb85ee9e628fd24bfa Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 15:45:17 +0100 Subject: [PATCH 20/79] SYNC: fixed test --- e2e-tests/cypress/e2e/charts.cy.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/e2e-tests/cypress/e2e/charts.cy.js b/e2e-tests/cypress/e2e/charts.cy.js index b1196aa2a..0bd54c4b0 100644 --- a/e2e-tests/cypress/e2e/charts.cy.js +++ b/e2e-tests/cypress/e2e/charts.cy.js @@ -110,7 +110,7 @@ describe('Charts', () => { cy.themeshot('new-object-window'); }); - it('Database chat - charts', () => { + it.only('Database chat - charts', () => { cy.contains('MySql-connection').click(); cy.contains('MyChinook').click(); cy.testid('TabsPanel_buttonNewObject').click(); @@ -119,8 +119,7 @@ describe('Charts', () => { cy.get('body').realType('show me chart of most popular genres'); cy.get('body').realPress('{enter}'); cy.testid('DatabaseChatTab_executeAllQueries', { timeout: 30000 }).click(); - cy.wait(5000); - cy.testid('chart-canvas').should($c => expect($c[0].toDataURL()).to.match(/^data:image\/png;base64/)); + cy.testid('chart-canvas', { timeout: 30000 }).should($c => expect($c[0].toDataURL()).to.match(/^data:image\/png;base64/)); cy.themeshot('database-chat-chart'); }); From 26d34f896b5ac62725b52cb6de15606ee2a54210 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 16:20:24 +0100 Subject: [PATCH 21/79] changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82ddc86c2..4ab7db5b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,19 @@ Builds: - linux - application for linux - win - application for Windows +## 6.6.6 - not released yet +- ADDED: Allow disable/re-enable filter #1174 +- ADDED: Close right side tabs #1219 +- ADDED: Ability disable execute current line in query editor #1209 +- ADDED: Support for Redis Cluster #1204 (Premium) + ## 6.6.5 - ADDED: SQL AI assistant - powered by database chat, could help you to write SQL queries (Premium) - ADDED: Explain SQL error (powered by AI) (Premium) - ADDED: Database chat (and SQL AI Assistant) now supports showing charts (Premium) - FIXED: Fxied editing new files and roles (Team Premium) - FIXED: Connection to standalone database could be now pinned +- FIXED: Cannot open up large JSON file #1215 ## 6.6.4 - ADDED: AI Database chat now supports much more LLM models. (Premium) From 2d135d708e38617166477064f200430ef2f4b4b6 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 17:18:48 +0100 Subject: [PATCH 22/79] v6.6.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 65fda0599..0a2444f7e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6-premium-beta.18", + "version": "6.6.6", "name": "dbgate-all", "workspaces": [ "packages/*", From 0e2a77ced7cca2879df96a9ff01cbf7e5588d3e9 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 27 Oct 2025 17:19:16 +0100 Subject: [PATCH 23/79] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ab7db5b6..c5342aa98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ Builds: - linux - application for linux - win - application for Windows -## 6.6.6 - not released yet +## 6.6.6 - ADDED: Allow disable/re-enable filter #1174 - ADDED: Close right side tabs #1219 - ADDED: Ability disable execute current line in query editor #1209 From 6934cdd1223b2a864d6b86591cf8f1e0a3096feb Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 13:08:37 +0100 Subject: [PATCH 24/79] json UI improvements --- .../src/jsonui/JsonUiContentRenderer.svelte | 2 ++ .../web/src/jsonui/JsonUiCountdown.svelte | 16 +++++++++++++- .../web/src/jsonui/JsonUiHighlight.svelte | 15 ++++++++++--- .../web/src/jsonui/JsonUiLinkButton.svelte | 3 --- .../src/jsonui/JsonUiLinkButtonBlock.svelte | 21 +++++++++++++++++++ 5 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 packages/web/src/jsonui/JsonUiLinkButtonBlock.svelte diff --git a/packages/web/src/jsonui/JsonUiContentRenderer.svelte b/packages/web/src/jsonui/JsonUiContentRenderer.svelte index 07fdcb667..517d4915b 100644 --- a/packages/web/src/jsonui/JsonUiContentRenderer.svelte +++ b/packages/web/src/jsonui/JsonUiContentRenderer.svelte @@ -3,6 +3,7 @@ import JsonUiHeading from './JsonUiHeading.svelte'; import JsonUiHighlight from './JsonUiHighlight.svelte'; import JsonUiLinkButton from './JsonUiLinkButton.svelte'; + import JsonUiLinkButtonBlock from './JsonUiLinkButtonBlock.svelte'; import JsonUiMarkdown from './JsonUiMarkdown.svelte'; import JsonUiTextBlock from './JsonUiTextBlock.svelte'; import JsonUiTickList from './JsonUiTickList.svelte'; @@ -19,6 +20,7 @@ markdown: JsonUiMarkdown, highlight: JsonUiHighlight, countdown: JsonUiCountdown, + buttonblock: JsonUiLinkButtonBlock, } as const; diff --git a/packages/web/src/jsonui/JsonUiCountdown.svelte b/packages/web/src/jsonui/JsonUiCountdown.svelte index c0e196f05..db11a62f1 100644 --- a/packages/web/src/jsonui/JsonUiCountdown.svelte +++ b/packages/web/src/jsonui/JsonUiCountdown.svelte @@ -1,8 +1,10 @@ {#if validTo} -
+
{ + if (link) { + openWebLink(link); + } + }} + > Offer ends in:
{#each parts as part} @@ -62,6 +72,10 @@ padding: 5px; } + .countdown.isLink { + cursor: pointer; + } + .big { font-size: large; font-weight: bold; diff --git a/packages/web/src/jsonui/JsonUiHighlight.svelte b/packages/web/src/jsonui/JsonUiHighlight.svelte index 8437d7a84..697a2cb04 100644 --- a/packages/web/src/jsonui/JsonUiHighlight.svelte +++ b/packages/web/src/jsonui/JsonUiHighlight.svelte @@ -1,19 +1,28 @@ -
- {text} -
+{#if link} + + {text} + +{:else} +
+ {text} +
+{/if} diff --git a/packages/web/src/jsonui/JsonUiLinkButton.svelte b/packages/web/src/jsonui/JsonUiLinkButton.svelte index e3d2ce311..e9a00925c 100644 --- a/packages/web/src/jsonui/JsonUiLinkButton.svelte +++ b/packages/web/src/jsonui/JsonUiLinkButton.svelte @@ -5,9 +5,6 @@ export let text: string; export let link: string; export let colorClass: string = ''; - - // very light url guard - const safe = /^(https?:)?\/\//i.test(link) || link.startsWith('/');
diff --git a/packages/web/src/jsonui/JsonUiLinkButtonBlock.svelte b/packages/web/src/jsonui/JsonUiLinkButtonBlock.svelte new file mode 100644 index 000000000..9800e831e --- /dev/null +++ b/packages/web/src/jsonui/JsonUiLinkButtonBlock.svelte @@ -0,0 +1,21 @@ + + +
+ {#each items as item} + openWebLink(item.link)} value={item.text} skipWidth {colorClass} /> + {/each} +
+ + From e57e2469917c7f402b4e48fa9ca70ddb692a73c4 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 13:59:47 +0100 Subject: [PATCH 25/79] SYNC: fixed web info --- packages/web/src/EnterLicensePage.svelte | 4 ++-- packages/web/src/ErrorPage.svelte | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/web/src/EnterLicensePage.svelte b/packages/web/src/EnterLicensePage.svelte index 79fdf6104..f3ae2ab59 100644 --- a/packages/web/src/EnterLicensePage.svelte +++ b/packages/web/src/EnterLicensePage.svelte @@ -125,8 +125,8 @@ {/if}
- For more info about DbGate licensing, you could visit dbgate.eu web or contact - us at sales@dbgate.eu + For more info about DbGate licensing, you could visit dbgate.io web or contact + us at sales@dbgate.io
{:else} diff --git a/packages/web/src/ErrorPage.svelte b/packages/web/src/ErrorPage.svelte index a24063184..42aa2f941 100644 --- a/packages/web/src/ErrorPage.svelte +++ b/packages/web/src/ErrorPage.svelte @@ -16,7 +16,7 @@
Configuration error
{#if $config?.checkedLicense?.status == 'error'} {:else if $config?.configurationError} From f0ac047978581b6675a543b5e0f39ae4fa2ec479 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 14:26:05 +0100 Subject: [PATCH 26/79] v6.6.7-beta.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0a2444f7e..bea34016a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.6", + "version": "6.6.7-beta.1", "name": "dbgate-all", "workspaces": [ "packages/*", From 47eb74d5babecb52d89ff5d6d8e701a186bcd1fc Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 14:59:14 +0100 Subject: [PATCH 27/79] fix --- .../web/src/jsonui/JsonUiHighlight.svelte | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/packages/web/src/jsonui/JsonUiHighlight.svelte b/packages/web/src/jsonui/JsonUiHighlight.svelte index 697a2cb04..4b083ee89 100644 --- a/packages/web/src/jsonui/JsonUiHighlight.svelte +++ b/packages/web/src/jsonui/JsonUiHighlight.svelte @@ -1,18 +1,22 @@ -{#if link} - - {text} - -{:else} -
- {text} -
-{/if} +
{ + if (link) { + openWebLink(link); + } + }} +> + {text} +
From b087df8d978a5813e95a6e882dcd5ebbb5b34290 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 14:59:28 +0100 Subject: [PATCH 28/79] v6.6.7-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bea34016a..ef7beac4d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.7-beta.1", + "version": "6.6.7-beta.2", "name": "dbgate-all", "workspaces": [ "packages/*", From e2546578137f238dc490d99916f3ff6b496a6397 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 15:06:30 +0100 Subject: [PATCH 29/79] remvoed links to dbgate.org --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 40b0051af..639af9c4c 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,9 @@ DbGate is licensed under GPL-3.0 license and is free to use for any purpose. * Try it online - [demo.dbgate.org](https://demo.dbgate.org) - online demo application * **Download** application for Windows, Linux or Mac from [dbgate.io](https://www.dbgate.io/download/) -* Looking for DbGate Community? **Download** from [dbgate.org](https://dbgate.org/download/) +* Looking for DbGate Community? **Download** from [dbgate.io](https://www.dbgate.io/download-community/) * Run web version as [NPM package](https://www.npmjs.com/package/dbgate-serve) or as [docker image](https://hub.docker.com/r/dbgate/dbgate) * Use nodeJs [scripting interface](https://docs.dbgate.io/scripting) ([API documentation](https://docs.dbgate.io/apidoc)) -* [Recommend DbGate](https://testimonial.to/dbgate) | [Rate on G2](https://www.g2.com/products/dbgate/reviews) -* [Give us feedback](https://dbgate.org/feedback) - it will help us to decide, how to improve DbGate in future -* We [offer 2-year PREMIUM license](https://dbgate.org/review/) for any honest review on these platforms (time-limited offer) ## Supported databases * MySQL @@ -93,7 +90,6 @@ Any contributions are welcome. If you want to contribute without coding, conside * Tell your friends about DbGate or share on social networks - when more people will use DbGate, it will grow to be better * Purchase a [DbGate Premium](https://www.dbgate.io/purchase/premium/) license -* Write review on [Product Hunt](https://www.producthunt.com/products/dbgate) or [G2](https://www.g2.com/products/dbgate/reviews) - we offer [2-year PREMIUM license](https://dbgate.org/review/) for reviewers (time limited offer) * Create issue, if you find problem in app, or you have idea to new feature. If issue already exists, you could leave comment on it, to prioritise most wanted issues * Create some tutorial video on [youtube](https://www.youtube.com/playlist?list=PLCo7KjCVXhr0RfUSjM9wJMsp_ShL1q61A) * Become a backer on [GitHub sponsors](https://github.com/sponsors/dbgate) or [Open collective](https://opencollective.com/dbgate) From 46553a80adadb6eb8ef2880c156393a26d3362a8 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 15:20:51 +0100 Subject: [PATCH 30/79] v6.6.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ef7beac4d..4861194d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.7-beta.2", + "version": "6.6.7", "name": "dbgate-all", "workspaces": [ "packages/*", From acb4f5924e80c4c3f6456da209b988284791ce0b Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 16:43:28 +0100 Subject: [PATCH 31/79] upgrade button --- packages/web/src/tabpanel/TabsPanel.svelte | 42 ++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/packages/web/src/tabpanel/TabsPanel.svelte b/packages/web/src/tabpanel/TabsPanel.svelte index 997349c43..4565e8673 100644 --- a/packages/web/src/tabpanel/TabsPanel.svelte +++ b/packages/web/src/tabpanel/TabsPanel.svelte @@ -358,6 +358,8 @@ import { handleAfterTabClick } from '../utility/changeCurrentDbByTab'; import { getBoolSettingsValue } from '../settings/settingsTools'; import NewObjectModal from '../modals/NewObjectModal.svelte'; + import { isProApp } from '../utility/proTools'; + import { openWebLink } from '../utility/simpleTools'; export let multiTabIndex; export let shownTab; @@ -583,7 +585,13 @@
-
+
{#each groupedTabs as tabGroup}
{#if !$lockedDatabaseMode} @@ -713,7 +721,7 @@ {/each}
- {#if allowSplitTab} + {#if allowSplitTab && isProApp()}
splitTab(multiTabIndex)} @@ -723,6 +731,20 @@
{/if} + + {#if !isProApp()} +
{ + openWebLink('https://www.dbgate.io/purchase/premium/?utm_campaign=premiumUpgradeButton'); + }} + title="Upgrade to Premium" + data-testid="TabsPanel_buttonUpgrade" + > + Upgrade +
+ {/if} +
showModal(NewObjectModal, { multiTabIndex })} @@ -756,6 +778,18 @@ color: var(--theme-font-2); cursor: pointer; } + .upgrade-button { + background: linear-gradient(135deg, #1686c8, #8a25b1); + border: 1px solid var(--theme-border); + border-radius: 10px; + color: white; + cursor: pointer; + font-size: 10pt; + padding: 5px; + } + .upgrade-button:hover { + background: linear-gradient(135deg, #0f5a85, #5c1870); + } .icon-button:hover { color: var(--theme-font-1); } @@ -769,6 +803,10 @@ right: 35px; bottom: 0; } + + .tabs-upgrade-button { + right: 120px; + } .tabs.can-split { right: 60px; } From ba0ecaf70fb4d7adef83d794e2aab5b313d1cec7 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 29 Oct 2025 16:47:52 +0100 Subject: [PATCH 32/79] fix --- packages/web/src/tabpanel/TabsPanel.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/web/src/tabpanel/TabsPanel.svelte b/packages/web/src/tabpanel/TabsPanel.svelte index 4565e8673..d38637874 100644 --- a/packages/web/src/tabpanel/TabsPanel.svelte +++ b/packages/web/src/tabpanel/TabsPanel.svelte @@ -736,7 +736,9 @@
{ - openWebLink('https://www.dbgate.io/purchase/premium/?utm_campaign=premiumUpgradeButton'); + openWebLink( + `https://www.dbgate.io/purchase/${isElectronAvailable() ? 'premium' : 'team-premium'}/?utm_campaign=premiumUpgradeButton` + ); }} title="Upgrade to Premium" data-testid="TabsPanel_buttonUpgrade" From 8663ab2d2820380c7c78928475a4e4455f466ee0 Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Mon, 27 Oct 2025 09:33:26 +0100 Subject: [PATCH 33/79] translation-settings,common --- .../web/src/settings/SettingsModal.svelte | 207 ++++++++-------- packages/web/src/translations.ts | 2 + translations/cs.json | 232 +++++++++++++++++- translations/en.json | 164 ++++++++++++- translations/sk.json | 231 +++++++++++++++++ 5 files changed, 732 insertions(+), 104 deletions(-) create mode 100644 translations/sk.json diff --git a/packages/web/src/settings/SettingsModal.svelte b/packages/web/src/settings/SettingsModal.svelte index a68f98941..198c01009 100644 --- a/packages/web/src/settings/SettingsModal.svelte +++ b/packages/web/src/settings/SettingsModal.svelte @@ -44,6 +44,10 @@ import AiSettingsTab from './AiSettingsTab.svelte'; import { _t } from '../translations'; import hasPermission from '../utility/hasPermission'; + import ConfirmModal from '../modals/ConfirmModal.svelte'; + import { showModal } from '../modals/modalTools'; + import { internalRedirectTo } from '../clientAuth'; + import { getSelectedLanguage } from '../translations'; const electron = getElectron(); let restartWarning = false; @@ -93,7 +97,7 @@ ORDER BY -
Settings
+
{_t('settings.title', { defaultMessage: 'Settings' })}
{#if electron} -
Appearance
+
{_t('settings.appearance', { defaultMessage: 'Appearance' })}
{#if restartWarning}
- Native menu settings will be applied after app restart + {_t('settings.nativeMenuRestartWarning', { defaultMessage: 'Native menu settings will be applied after app restart' })}
{/if} {/if} -
Data grid
+
{_t('settings.dataGrid.title', { defaultMessage: 'Data grid' })}
- + - + - + -
SQL editor
+
{_t('settings.sqlEditor', { defaultMessage: 'SQL editor' })}
- +
- + ($currentEditorWrapEnabled = e.target.checked)} @@ -243,33 +247,33 @@ ORDER BY -
Connection
+
{_t('settings.connection', { defaultMessage: 'Connection' })}
{ @@ -282,17 +286,17 @@ ORDER BY -
Query sessions
+
{_t('settings.session', { defaultMessage: 'Query sessions' })}
-
Application theme
+
{_t('settings.appearance', { defaultMessage: 'Application theme' })}
{ @@ -352,19 +356,19 @@ ORDER BY
- More themes are available as plugins + {_t('settings.appearance.moreThemes', { defaultMessage: 'More themes are available as' })} plugins
- After installing theme plugin (try search "theme" in available extensions) new themes will be available here. + {_t('settings.appearance.afterInstalling', { defaultMessage: 'After installing theme plugin (try search "theme" in available extensions) new themes will be available here.' })}
-
Editor theme
+
{_t('settings.appearance.editorTheme', { defaultMessage: 'Editor theme' })}
- + ({ label: theme, value: theme }))} value={$currentEditorTheme} on:change={e => ($currentEditorTheme = e.detail)} @@ -373,7 +377,7 @@ ORDER BY
- +
- + ($currentEditorFontSize = e.target['value'])} @@ -396,7 +400,7 @@ ORDER BY
- +
@@ -405,68 +409,68 @@ ORDER BY
-
Default actions
+
{_t('settings.defaultActions', { defaultMessage: 'Default actions' })}
- +
-
Behaviour
+
{_t('settings.behaviour', { defaultMessage: 'Behaviour' })}
- +
- When you single-click or select a file in the "Tables, Views, Functions" view, it - is shown in a preview mode and reuses an existing tab (preview tab). This is useful if you are quickly browsing - tables and don't want every visited table to have its own tab. When you start editing the table or use double-click - to open the table from the "Tables" view, a new tab is dedicated to that table. + {_t('settings.behaviour.singleClickPreview', { defaultMessage: 'When you single-click or select a file in the "Tables, Views, Functions" view, it is shown in a preview mode and reuses an existing tab (preview tab). This is useful if you are quickly browsing tables and don\'t want every visited table to have its own tab. When you start editing the table or use double-click to open the table from the "Tables" view, a new tab is dedicated to that table.' })}
-
Confirmations
+
{_t('settings.confirmations', { defaultMessage: 'Confirmations' })}
- +
-
Other
+
{_t('settings.other', { defaultMessage: 'Other' })}
- + {#if isProApp()} {/if}
-
License
+
{_t('settings.other.license', { defaultMessage: 'License' })}
{ licenseKeyCheckResult = await apiCall('config/check-license', { licenseKey: value }); @@ -536,28 +537,28 @@ ORDER BY
{#if licenseKeyCheckResult.status == 'ok'}
- License key is valid + { _t('settings.other.licenseKey.valid', { defaultMessage: 'License key is valid' }) }
{#if licenseKeyCheckResult.validTo}
- License valid to: {licenseKeyCheckResult.validTo} + { _t('settings.other.licenseKey.validTo', { defaultMessage: 'License valid to:' }) } {licenseKeyCheckResult.validTo}
{/if} {#if licenseKeyCheckResult.expiration} -
License key expiration: {safeFormatDate(licenseKeyCheckResult.expiration)}
+
{ _t('settings.other.licenseKey.expiration', { defaultMessage: 'License key expiration:' }) } {safeFormatDate(licenseKeyCheckResult.expiration)}
{/if} {:else if licenseKeyCheckResult.status == 'error'}
- {licenseKeyCheckResult.errorMessage ?? 'License key is invalid'} + {licenseKeyCheckResult.errorMessage ?? _t('settings.other.licenseKey.invalid', { defaultMessage: 'License key is invalid' })} {#if licenseKeyCheckResult.expiration} -
License key expiration: {safeFormatDate(licenseKeyCheckResult.expiration)}
+
{ _t('settings.other.licenseKey.expiration', { defaultMessage: 'License key expiration:' }) } {safeFormatDate(licenseKeyCheckResult.expiration)}
{/if}
{#if licenseKeyCheckResult.isExpired}
{ licenseKeyCheckResult = await apiCall('config/get-new-license', { oldLicenseKey: licenseKey }); @@ -574,24 +575,32 @@ ORDER BY -
External tools
+
{_t('settings.externalTools', { defaultMessage: 'External tools' })}
- + - +
@@ -602,7 +611,7 @@ ORDER BY
- +
diff --git a/packages/web/src/translations.ts b/packages/web/src/translations.ts index c6bbb56a4..b1665567b 100644 --- a/packages/web/src/translations.ts +++ b/packages/web/src/translations.ts @@ -1,4 +1,5 @@ import cs from '../../../translations/cs.json'; +import sk from '../../../translations/sk.json'; import MessageFormat, { MessageFunction } from '@messageformat/core'; import { getStringSettingsValue } from './settings/settingsTools'; @@ -6,6 +7,7 @@ import { getStringSettingsValue } from './settings/settingsTools'; const translations = { en: {}, cs, + sk, }; const supportedLanguages = Object.keys(translations); diff --git a/translations/cs.json b/translations/cs.json index 0967ef424..735ada06f 100644 --- a/translations/cs.json +++ b/translations/cs.json @@ -1 +1,231 @@ -{} +{ + "app.databaseName": "Název databáze", + "app.preparingPlugins": "Příprava pluginů...", + "app.starting": "Spouštění DbGate", + "authToken": "Auth token", + "column.copyName": "Kopírovat název", + "column.dropColumn": "Odstranit sloupec", + "column.renameColumn": "Přejmenovat sloupec", + "command.datagrid.addNewColumn": "Přidat nový sloupec", + "command.datagrid.addNewColumn.toolbar": "Nový sloupec", + "command.datagrid.cloneRows": "Klonovat řádky", + "command.datagrid.cloneRows.toolbar": "Klonovat řádek(y)", + "command.datagrid.copyToClipboard": "Kopírovat do schránky", + "command.datagrid.deleteSelectedRows": "Odstranit vybrané řádky", + "command.datagrid.deleteSelectedRows.toolbar": "Odstranit řádek(y)", + "command.datagrid.editJsonDocument": "Upravit řádek jako JSON dokument", + "command.datagrid.insertNewRow": "Vložit nový řádek", + "command.datagrid.insertNewRow.toolbar": "Nový řádek", + "command.datagrid.loadCellFromFile": "Načíst buňku ze souboru", + "command.datagrid.openJsonArrayInSheet": "Otevřít pole jako tabulku", + "command.datagrid.openSelectionInMap": "Otevřít výběr v mapě", + "command.datagrid.reconnect": "Znovu připojit", + "command.datagrid.redo": "Znovu", + "command.datagrid.removeField": "Odstranit pole", + "command.datagrid.revertAllChanges": "Vrátit všechny změny", + "command.datagrid.revertAllChanges.toolbar": "Vrátit vše", + "command.datagrid.revertRowChanges": "Vrátit změny řádku", + "command.datagrid.saveCellToFile": "Uložit buňku do souboru", + "command.datagrid.setNull": "Nastavit NULL", + "command.datagrid.undo": "Krok zpět", + "command.datagrid.viewJsonDocument": "Zobrazit řádek jako JSON dokument", + "command.datagrid.viewJsonValue": "Zobrazit buňku jako JSON dokument", + "command.new.duckdbDatabase": "Nová DuckDB databáze", + "command.new.sqliteDatabase": "Nová SQLite databáze", + "command.tabs.addToFavorites": "Přidat aktuální kartu do oblíbených", + "command.tabs.closeAll": "Zavřít všechny karty", + "command.tabs.closeTab": "Zavřít kartu", + "command.tabs.closeTabsButCurrentDb": "Zavřít karty kromě aktuální DB", + "command.tabs.closeTabsWithCurrentDb": "Zavřít karty s aktuální DB", + "command.tabs.nextTab": "Další karta", + "command.tabs.previousTab": "Předchozí karta", + "command.tabs.reopenClosedTab": "Znovu otevřít zavřenou kartu", + "common.archive": "Archivovat (JSONL)", + "common.close": "Zavřít", + "common.connections": "Připojení", + "common.database": "Databáze", + "common.export": "Export", + "common.import": "Import", + "common.kill": "Ukončit", + "common.query": "Dotaz", + "common.refresh": "Obnovit", + "common.save": "Uložit", + "common.saveToArchive": "Uložit do archívu", + "common.schema": "Schéma", + "connection.connect": "Připojit", + "connection.createDatabase": "Vytvořit databázi", + "connection.databaseName": "Název databáze", + "connection.delete": "Odstranit", + "connection.disconnect": "Odpojit", + "connection.duplicate": "Duplikovat", + "connection.edit": "Upravit", + "connection.newQuery": "Nový dotaz (server)", + "connection.refresh": "Obnovit", + "connection.serverSummary": "Shrnutí serveru", + "connection.viewDetails": "Zobrazit detaily", + "database.backup": "Záloha #", + "database.compare": "Porovnat", + "database.copyDatabaseName": "Kopírovat název databáze", + "database.createDatabaseBackup": "Vytvořit zálohu databáze", + "database.createNewApplication": "Vytvořit novou aplikaci", + "database.dataDeployer": "Nasazovač dat", + "database.databaseChat": "Databázový chat", + "database.databaseProfiler": "Databázový profilovač", + "database.designPerspectiveQuery": "Návrh perspektivního dotazu", + "database.designQuery": "Návrh dotazu", + "database.diagram": "Diagram #", + "database.disconnect": "Odpojit", + "database.dropDatabase": "Odstranit databázi", + "database.editApplications": "Upravit aplikaci", + "database.export": "Export", + "database.exportDbModel": "Export DB model", + "database.generateScript": "Vygenerovat skript", + "database.import": "Import", + "database.newQuery": "Nový dotaz", + "database.newTable": "Nová tabulka", + "database.perspective": "Perspektiva #", + "database.profiler": "Profiler", + "database.queryDesigner": "Dotaz #", + "database.refreshSchemas": "Obnovit schémata", + "database.restore": "Obnovit #", + "database.restoreDatabaseBackup": "Obnovit zálohu databáze", + "database.shellDropAllObjects": "Shell: Odstranit všechny objekty", + "database.shellRunScript": "Shell: Spustit skript", + "database.shellTitle": "Shell #", + "database.showDiagram": "Zobrazit diagram", + "database.sqlGenerator": "SQL generátor", + "error.driverNotFound": "Neplatné připojení k databázi, ovladač nebyl nalezen", + "error.selectedCloudConnection": "Vybrané připojení je z DbGate cloudu", + "error.selectedNotCloudConnection": "Vybrané připojení není z DbGate cloudu", + "file.allSupported": "Všechny podporované soubory", + "file.diagramFiles": "Soubory diagramů", + "file.duckdb": "Databáze DuckDB", + "file.jsonFiles": "Soubory JSON", + "file.perspectiveFiles": "Soubory perspektivy", + "file.queryDesignerFiles": "Soubory návrháře dotazů", + "file.sqlFiles": "Soubory SQL", + "file.sqliteDatabase": "Databáze SQLite", + "importExport.createZipFileInArchive": "Vytvořit ZIP soubor v archivu", + "importExport.exportToZipArchive": "Exportovat do ZIP archivu", + "importExport.exportToZipFile": "Exportovat do ZIP souboru", + "importExport.importFromZipArchive": "Importovat z ZIP archivu", + "importExport.importFromZipFile": "Importovat z ZIP souboru (v archivní složce)", + "importExport.sourceFiles": "Zdrojové soubory", + "importExport.tablesViewsCollections": "Tabulky / pohledy / kolekce", + "schema.add": "Přidat nové schéma", + "schema.createSchema": "Vytvořit schéma", + "schema.delete": "Odstranit schéma", + "schema.resetToDefault": "Resetovat na výchozí", + "schema.schemaName": "Název schématu", + "serverSummaryTab.databases": "Databáze", + "serverSummaryTab.errorTitle": "Chyba při načítání shrnutí serveru", + "serverSummaryTab.loadingMessage": "Načítání detailů serveru", + "serverSummaryTab.processes": "Procesy", + "serverSummaryTab.variables": "Proměnné", + "settings.appearance": "Vzhled aplikace", + "settings.appearance.customSize": "Vlastní velikost", + "settings.appearance.editorTheme": "Téma", + "settings.appearance.editorTheme.default": "(použít výchozí téma)", + "settings.appearance.fontFamily": "Písmo editoru", + "settings.appearance.fontSize": "Velikost fontu", + "settings.appearance.moreThemes": "Více témat je k dispozici jako", + "settings.appearance.useSystemTheme": "Použít systémové téma", + "settings.behaviour": "Chování", + "settings.behaviour.jsonPreviewWrap": "Zalomit JSON v náhledu", + "settings.behaviour.openDetailOnArrows": "Otevřít detail při navigaci klávesnicí", + "settings.behaviour.useTabPreviewMode": "Použít režim náhledu na kartě", + "settings.confirmations": "Potvrzení", + "settings.confirmations.skipConfirm.collectionDataSave": "Přeskočit potvrzení při ukládání údajů kolekce (NoSQL)", + "settings.confirmations.skipConfirm.tableDataSave": "Přeskočit potvrzení při ukládání údajů tabulky (SQL)", + "settings.connection": "Připojení", + "settings.connection.autoRefresh": "Automatické obnovení modelu databáze na pozadí", + "settings.connection.autoRefreshInterval": "Interval mezi automatickým načítáním struktury DB v sekundách", + "settings.connection.showOnlyTabsFromSelectedDatabase": "Zobrazit pouze karty z vybrané databáze", + "settings.connection.sshBindHost": "Adresa localhostu pro SSH připojení", + "settings.dataGrid.alignNumbersRight": "Zarovnat čísla doprava", + "settings.dataGrid.collectionPageSize": "Velikost stránky kolekce (pro MongoDB JSON zobrazení, musí být mezi 5 a 50000)", + "settings.dataGrid.coloringMode": "Režim zabarvení řádků", + "settings.dataGrid.coloringMode.2-primary": "Každý 2. řádek, primární barva", + "settings.dataGrid.coloringMode.2-secondary": "Každý 2. řádek, sekundární barva", + "settings.dataGrid.coloringMode.36": "Každý 3. a 6. řádek", + "settings.dataGrid.coloringMode.none": "Žádný", + "settings.dataGrid.defaultAutoRefreshInterval": "Výchozí interval automatického obnovení mřížky (v sekundách)", + "settings.dataGrid.pageSize": "Velikost stránky (počet řádků pro inkrementální načítání, musí být mezi 5 a 50000)", + "settings.dataGrid.showAllColumnsWhenSearch": "Zobrazit všechny sloupce při hledání", + "settings.dataGrid.showHintColumns": "Zobrazit nápovědu pro cizí klíče", + "settings.dataGrid.thousandsSeparator": "Použít oddělovač tisíců pro čísla", + "settings.dataGrid.title": "Mřížka dat", + "settings.defaultActions": "Výchozí akce", + "settings.defaultActions.collectionClick": "Kliknutí na kolekci", + "settings.defaultActions.connectionClick": "Kliknutí na připojení", + "settings.defaultActions.connectionClick.connect": "Připojit", + "settings.defaultActions.connectionClick.none": "Neprovádět žádnou akci", + "settings.defaultActions.connectionClick.openDetails": "Upravit / otevřít detaily", + "settings.defaultActions.databaseClick": "Kliknutí na databázi", + "settings.defaultActions.databaseClick.none": "Neprovádět žádnou akci", + "settings.defaultActions.databaseClick.switch": "Přepnout databázi", + "settings.defaultActions.functionClick": "Kliknutí na funkci", + "settings.defaultActions.materializedViewClick": "Kliknutí na materializovaný pohled", + "settings.defaultActions.procedureClick": "Kliknutí na proceduru", + "settings.defaultActions.tableClick": "Kliknutí na tabulku", + "settings.defaultActions.useLastUsedAction": "Použít naposledy použitou akci", + "settings.defaultActions.viewClick": "Kliknutí na pohled", + "settings.editor.keybinds": "Klávesové zkratky editoru", + "settings.editor.wordWrap": "Povolit zalamování textu", + "settings.externalTools": "Externí nástroje", + "settings.general": "Obecné", + "settings.license": "Licence", + "settings.localization": "Lokalizace", + "settings.localization.language": "Jazyk", + "settings.localization.reloadWarning": "Aplikace bude restartována, aby se změnil jazyk", + "settings.nativeMenuRestartWarning": "Nastavení nativního menu budou aplikována po restartu aplikace", + "settings.other": "Ostatní", + "settings.other.ai.allowSendModels": "Povolit odesílání DB modelů a dotazových fragmentů do AI služby", + "settings.other.autoUpdateApplication": "Automaticky aktualizovat aplikaci", + "settings.other.autoUpdateApplication.check": "Zkontrolovat dostupnost nových verzí", + "settings.other.autoUpdateApplication.download": "Zkontrolovat a stáhnout nové verze", + "settings.other.autoUpdateApplication.skip": "Nekontrolovat nové verze", + "settings.other.externalTools.mysql": "mysql (obnovení databáze MySQL)", + "settings.other.externalTools.mysqlPlugins": "Složka s MySQL pluginy (například pro autentizaci). Nastavit pouze v případě problémů", + "settings.other.externalTools.mysqldump": "mysqldump (záloha databáze MySQL)", + "settings.other.externalTools.pg_dump": "pg_dump (záloha databáze PostgreSQL)", + "settings.other.externalTools.psql": "psql (obnovení databáze PostgreSQL)", + "settings.other.gistCreateToken": "API token pro vytváření chybových gistů", + "settings.other.license": "Licence", + "settings.other.licenseKey": "Licenční klíč", + "settings.other.licenseKey.checkForNew": "Ověřit nový licenční klíč", + "settings.other.licenseKey.expiration": "Expirace licenčního klíče:", + "settings.other.licenseKey.invalid": "Licenční klíč je neplatný", + "settings.other.licenseKey.valid": "Licenční klíč je platný", + "settings.other.licenseKey.validTo": "Licence platná do:", + "settings.session": "Dotazové relace", + "settings.session.autoClose": "Automatické uzavření dotazových relací po období nečinnosti", + "settings.session.autoCloseTimeout": "Interval, po kterém je dotazová relace bez aktivity uzavřena (v minutách)", + "settings.sqlEditor": "SQL editor", + "settings.sqlEditor.disableExecuteCurrentLine": "Zakázat vykonání aktuálního řádku (Execute current)", + "settings.sqlEditor.disableSplitByEmptyLine": "Zakázat rozdělení podle prázdného řádku", + "settings.sqlEditor.limitRows": "Vrátit pouze N řádků při spuštění dotazu", + "settings.sqlEditor.limitRowsPlaceholder": "(bez limitu)", + "settings.sqlEditor.showTableAliasesInCodeCompletion": "Zobrazit aliasy tabulek v dokončování kódu", + "settings.sqlEditor.sqlCommandsCase": "Velikost písmen SQL příkazů", + "settings.tabGroup.showServerName": "Zobrazit název serveru vedle názvu databáze v záhlaví skupiny karet", + "settings.theme": "Vzhled", + "settings.title": "Nastavení", + "summaryProcesses.actions": "Akce", + "summaryProcesses.client": "Klient", + "summaryProcesses.connectionId": "ID připojení", + "summaryProcesses.namespace": "Namespace", + "summaryProcesses.operation": "Operace", + "summaryProcesses.processId": "ID procesu", + "summaryProcesses.runningTime": "Čas běhu", + "summaryProcesses.state": "Stav", + "summaryProcesses.waitingFor": "Čeká na", + "summaryVariables.value": "Hodnota", + "summaryVariables.variable": "Proměnná", + "tab.administration": "Administrace", + "widget.databaseContent": "Obsah databáze", + "widget.databases": "Databáze", + "widget.keys": "Klíče", + "widget.pinned": "Připnuté", + "widget.tablesViewsFunctions": "Tabulky, pohledy, funkce" +} \ No newline at end of file diff --git a/translations/en.json b/translations/en.json index 3eadc7994..d232d8fcd 100644 --- a/translations/en.json +++ b/translations/en.json @@ -1,7 +1,11 @@ { + "app.databaseName": "Database name", "app.preparingPlugins": "Preparing plugins ...", "app.starting": "Starting DbGate", "authToken": "Auth token", + "column.copyName": "Copy name", + "column.dropColumn": "Drop column", + "column.renameColumn": "Rename column", "command.datagrid.addNewColumn": "Add new column", "command.datagrid.addNewColumn.toolbar": "New column", "command.datagrid.cloneRows": "Clone rows", @@ -27,9 +31,7 @@ "command.datagrid.viewJsonDocument": "View row as JSON document", "command.datagrid.viewJsonValue": "View cell as JSON document", "command.new.duckdbDatabase": "New DuckDB database", - "command.new.duckdbDatabase.header": "Create DuckDB database", "command.new.sqliteDatabase": "New SQLite database", - "command.new.sqliteDatabase.header": "Create SQLite database", "command.tabs.addToFavorites": "Add current tab to favorites", "command.tabs.closeAll": "Close all tabs", "command.tabs.closeTab": "Close tab", @@ -38,12 +40,17 @@ "command.tabs.nextTab": "Next tab", "command.tabs.previousTab": "Previous tab", "command.tabs.reopenClosedTab": "Reopen closed tab", - "common.archive": "Archive", + "common.archive": "Archive (JSONL)", + "common.close": "Close", "common.connections": "Connections", "common.database": "Database", + "common.export": "Export", + "common.import": "Import", + "common.kill": "Kill", "common.query": "Query", "common.refresh": "Refresh", "common.save": "Save", + "common.saveToArchive": "Save to archive", "common.schema": "Schema", "connection.connect": "Connect", "connection.createDatabase": "Create database", @@ -56,7 +63,53 @@ "connection.refresh": "Refresh", "connection.serverSummary": "Server summary", "connection.viewDetails": "View details", + "database.backup": "Backup #", + "database.compare": "Compare", + "database.copyDatabaseName": "Copy database name", + "database.createDatabaseBackup": "Create database backup", + "database.createNewApplication": "Create new application", + "database.dataDeployer": "Data deployer", + "database.databaseChat": "Database chat", + "database.databaseProfiler": "Database profiler", + "database.designPerspectiveQuery": "Design perspective query", + "database.designQuery": "Design query", + "database.diagram": "Diagram #", + "database.disconnect": "Disconnect", + "database.dropDatabase": "Drop database", + "database.editApplications": "Edit application", + "database.export": "Export", + "database.exportDbModel": "Export DB model", + "database.generateScript": "Generate script", + "database.import": "Import", + "database.newQuery": "New query", + "database.newTable": "New table", + "database.perspective": "Perspective #", + "database.profiler": "Profiler", + "database.queryDesigner": "Query #", + "database.refreshSchemas": "Refresh schemas", + "database.restore": "Restore #", + "database.restoreDatabaseBackup": "Restore database backup", + "database.shellDropAllObjects": "Shell: Drop all objects", + "database.shellRunScript": "Shell: Run script", + "database.shellTitle": "Shell #", + "database.showDiagram": "Show diagram", + "database.sqlGenerator": "SQL Generator", "error.driverNotFound": "Invalid database connection, driver not found", + "error.selectedCloudConnection": "Selected connection is from DbGate cloud", + "error.selectedNotCloudConnection": "Selected connection is not from DbGate cloud", + "file.allSupported": "All supported files", + "file.diagramFiles": "Diagram files", + "file.duckdb": "DuckDB database", + "file.jsonFiles": "JSON files", + "file.perspectiveFiles": "Perspective files", + "file.queryDesignerFiles": "Query designer files", + "file.sqlFiles": "SQL files", + "file.sqliteDatabase": "SQLite database", + "importExport.createZipFileInArchive": "Create ZIP file in archive", + "importExport.exportToZipArchive": "Output ZIP archive", + "importExport.exportToZipFile": "Export to ZIP file", + "importExport.importFromZipArchive": "Input ZIP archive", + "importExport.importFromZipFile": "Import from ZIP file (in archive folder)", "importExport.sourceFiles": "Source files", "importExport.tablesViewsCollections": "Tables / views / collections", "schema.add": "Add new schema", @@ -64,8 +117,111 @@ "schema.delete": "Delete schema", "schema.resetToDefault": "Reset to default", "schema.schemaName": "Schema name", - "settings.behaviour.jsonPreviewWrap": "Wrap json in preview", + "serverSummaryTab.databases": "Databases", + "serverSummaryTab.errorTitle": "Error loading server summary", + "serverSummaryTab.loadingMessage": "Loading server details", + "serverSummaryTab.processes": "Processes", + "serverSummaryTab.variables": "Variables", + "settings.appearance": "Application theme", + "settings.appearance.customSize": "Custom size", + "settings.appearance.editorTheme": "Theme", + "settings.appearance.editorTheme.default": "(use theme default)", + "settings.appearance.fontFamily": "Editor font family", + "settings.appearance.fontSize": "Font size", + "settings.appearance.moreThemes": "More themes are available as", + "settings.appearance.useSystemTheme": "Use system theme", + "settings.behaviour": "Behaviour", + "settings.behaviour.jsonPreviewWrap": "Wrap JSON in preview", + "settings.behaviour.openDetailOnArrows": "Open detail on keyboard navigation", + "settings.behaviour.useTabPreviewMode": "Use tab preview mode", + "settings.confirmations": "Confirmations", + "settings.confirmations.skipConfirm.collectionDataSave": "Skip confirmation when saving collection data (NoSQL)", + "settings.confirmations.skipConfirm.tableDataSave": "Skip confirmation when saving table data (SQL)", + "settings.connection": "Connection", + "settings.connection.autoRefresh": "Automatic refresh of database model on background", + "settings.connection.autoRefreshInterval": "Interval between automatic DB structure reloads in seconds", + "settings.connection.showOnlyTabsFromSelectedDatabase": "Show only tabs from selected database", + "settings.connection.sshBindHost": "Local host address for SSH connections", + "settings.dataGrid.alignNumbersRight": "Align numbers to right", + "settings.dataGrid.collectionPageSize": "Collection page size (for MongoDB JSON view, must be between 5 and 1000)", + "settings.dataGrid.coloringMode": "Row coloring mode", + "settings.dataGrid.coloringMode.2-primary": "Every 2-nd row, primary color", + "settings.dataGrid.coloringMode.2-secondary": "Every 2-nd row, secondary color", + "settings.dataGrid.coloringMode.36": "Every 3rd and 6th row", + "settings.dataGrid.coloringMode.none": "None", + "settings.dataGrid.defaultAutoRefreshInterval": "Default grid auto refresh interval in seconds", + "settings.dataGrid.pageSize": "Page size (number of rows for incremental loading, must be between 5 and 50000)", + "settings.dataGrid.showAllColumnsWhenSearch": "Show all columns when searching", + "settings.dataGrid.showHintColumns": "Show foreign key hints", + "settings.dataGrid.thousandsSeparator": "Use thousands separator for numbers", + "settings.dataGrid.title": "Data grid", + "settings.defaultActions": "Default actions", + "settings.defaultActions.collectionClick": "NoSQL collection click", + "settings.defaultActions.connectionClick": "Connection click", + "settings.defaultActions.connectionClick.connect": "Connect", + "settings.defaultActions.connectionClick.none": "Do nothing", + "settings.defaultActions.connectionClick.openDetails": "Edit / open details", + "settings.defaultActions.databaseClick": "Database click", + "settings.defaultActions.databaseClick.none": "Do nothing", + "settings.defaultActions.databaseClick.switch": "Switch database", + "settings.defaultActions.functionClick": "Function click", + "settings.defaultActions.materializedViewClick": "Materialized view click", + "settings.defaultActions.procedureClick": "Procedure click", + "settings.defaultActions.tableClick": "Table click", + "settings.defaultActions.useLastUsedAction": "Use last used action", + "settings.defaultActions.viewClick": "View click", + "settings.editor.keybinds": "Editor keybinds", + "settings.editor.wordWrap": "Enable word wrap", + "settings.externalTools": "External tools", + "settings.general": "General", + "settings.license": "License", "settings.localization": "Localization", + "settings.localization.language": "Language", + "settings.localization.reloadWarning": "Application will be reloaded to apply new language settings", + "settings.nativeMenuRestartWarning": "Native menu settings will be applied after app restart", + "settings.other": "Other", + "settings.other.ai.allowSendModels": "Allow to send DB models and query snippets to AI service", + "settings.other.autoUpdateApplication": "Auto update application", + "settings.other.autoUpdateApplication.check": "Check for new versions", + "settings.other.autoUpdateApplication.download": "Check and download new versions", + "settings.other.autoUpdateApplication.skip": "Do not check for new versions", + "settings.other.externalTools.mysql": "mysql (restore MySQL database)", + "settings.other.externalTools.mysqlPlugins": "Folder with mysql plugins (for example for authentication). Set only in case of problems", + "settings.other.externalTools.mysqldump": "mysqldump (backup MySQL database)", + "settings.other.externalTools.pg_dump": "pg_dump (backup PostgreSQL database)", + "settings.other.externalTools.psql": "psql (restore PostgreSQL database)", + "settings.other.gistCreateToken": "API token for creating error gists", + "settings.other.license": "License", + "settings.other.licenseKey": "License key", + "settings.other.licenseKey.checkForNew": "Check for new license key", + "settings.other.licenseKey.expiration": "License key expiration:", + "settings.other.licenseKey.invalid": "License key is invalid", + "settings.other.licenseKey.valid": "License key is valid", + "settings.other.licenseKey.validTo": "License valid to:", + "settings.session": "Query sessions", + "settings.session.autoClose": "Automatic close query sessions after period without any activity", + "settings.session.autoCloseTimeout": "Interval, after which query session without activity is closed (in minutes)", + "settings.sqlEditor": "SQL editor", + "settings.sqlEditor.disableExecuteCurrentLine": "Disable current line execution (Execute current)", + "settings.sqlEditor.disableSplitByEmptyLine": "Disable split by empty line", + "settings.sqlEditor.limitRows": "Return only N rows from query", + "settings.sqlEditor.limitRowsPlaceholder": "(No rows limit)", + "settings.sqlEditor.showTableAliasesInCodeCompletion": "Show table aliases in code completion", + "settings.sqlEditor.sqlCommandsCase": "SQL commands case", + "settings.tabGroup.showServerName": "Show server name alongside database name in title of the tab group", + "settings.theme": "Themes", + "settings.title": "Settings", + "summaryProcesses.actions": "Actions", + "summaryProcesses.client": "Client", + "summaryProcesses.connectionId": "Connection ID", + "summaryProcesses.namespace": "Namespace", + "summaryProcesses.operation": "Operation", + "summaryProcesses.processId": "Process ID", + "summaryProcesses.runningTime": "Running Time", + "summaryProcesses.state": "State", + "summaryProcesses.waitingFor": "Waiting For", + "summaryVariables.value": "Value", + "summaryVariables.variable": "Variable", "tab.administration": "Administration", "widget.databaseContent": "Database content", "widget.databases": "Databases", diff --git a/translations/sk.json b/translations/sk.json new file mode 100644 index 000000000..094b13546 --- /dev/null +++ b/translations/sk.json @@ -0,0 +1,231 @@ +{ + "app.databaseName": "Názov databázy", + "app.preparingPlugins": "Príprava pluginov...", + "app.starting": "Spúšťam DbGate", + "authToken": "Autentifikačný token", + "column.copyName": "Kopírovať názov", + "column.dropColumn": "Odstrániť stĺpec", + "column.renameColumn": "Premenovať stĺpec", + "command.datagrid.addNewColumn": "Pridať nový stĺpec", + "command.datagrid.addNewColumn.toolbar": "Nový stĺpec", + "command.datagrid.cloneRows": "Klonovať riadky", + "command.datagrid.cloneRows.toolbar": "Klonovať riadok(y)", + "command.datagrid.copyToClipboard": "Kopírovať do schránky", + "command.datagrid.deleteSelectedRows": "Odstrániť vybrané riadky", + "command.datagrid.deleteSelectedRows.toolbar": "Odstrániť riadok(y)", + "command.datagrid.editJsonDocument": "Upraviť riadok ako JSON dokument", + "command.datagrid.insertNewRow": "Vložiť nový riadok", + "command.datagrid.insertNewRow.toolbar": "Nový riadok", + "command.datagrid.loadCellFromFile": "Načítať bunku zo súboru", + "command.datagrid.openJsonArrayInSheet": "Otvoriť pole ako tabuľku", + "command.datagrid.openSelectionInMap": "Otvoriť výber v mape", + "command.datagrid.reconnect": "Znovu pripojiť", + "command.datagrid.redo": "Znova", + "command.datagrid.removeField": "Odstrániť pole", + "command.datagrid.revertAllChanges": "Vrátiť všetky zmeny", + "command.datagrid.revertAllChanges.toolbar": "Vrátiť všetko", + "command.datagrid.revertRowChanges": "Vrátiť zmeny riadka", + "command.datagrid.saveCellToFile": "Uložiť bunku do súboru", + "command.datagrid.setNull": "Nastaviť NULL", + "command.datagrid.undo": "Krok späť", + "command.datagrid.viewJsonDocument": "Zobraziť riadok ako JSON dokument", + "command.datagrid.viewJsonValue": "Zobraziť bunku ako JSON dokument", + "command.new.duckdbDatabase": "Nová DuckDB databáza", + "command.new.sqliteDatabase": "Nová SQLite databáza", + "command.tabs.addToFavorites": "Pridať aktuálnu kartu do obľúbených", + "command.tabs.closeAll": "Zavrieť všetky karty", + "command.tabs.closeTab": "Zavrieť kartu", + "command.tabs.closeTabsButCurrentDb": "Zavrieť karty okrem aktuálnej DB", + "command.tabs.closeTabsWithCurrentDb": "Zavrieť karty s aktuálnou DB", + "command.tabs.nextTab": "Ďalšia karta", + "command.tabs.previousTab": "Predchádzajúca karta", + "command.tabs.reopenClosedTab": "Znovu otvoriť zatvorenú kartu", + "common.archive": "Archivovať (JSONL)", + "common.close": "Zavrieť", + "common.connections": "Pripojenia", + "common.database": "Databáza", + "common.export": "Exportovať", + "common.import": "Importovať", + "common.kill": "Ukončiť", + "common.query": "Dotaz", + "common.refresh": "Obnoviť", + "common.save": "Uložiť", + "common.saveToArchive": "Uložiť do archívu", + "common.schema": "Schéma", + "connection.connect": "Pripojiť", + "connection.createDatabase": "Vytvoriť databázu", + "connection.databaseName": "Názov databázy", + "connection.delete": "Odstrániť", + "connection.disconnect": "Odpojiť", + "connection.duplicate": "Duplikovať", + "connection.edit": "Upraviť", + "connection.newQuery": "Nový dotaz (server)", + "connection.refresh": "Obnoviť", + "connection.serverSummary": "Zhrnutie servera", + "connection.viewDetails": "Zobraziť detaily", + "database.backup": "Záloha #", + "database.compare": "Porovnať", + "database.copyDatabaseName": "Kopírovať názov databázy", + "database.createDatabaseBackup": "Vytvoriť zálohu databázy", + "database.createNewApplication": "Vytvoriť novú aplikáciu", + "database.dataDeployer": "Nasadzovač dát", + "database.databaseChat": "Databázový chat", + "database.databaseProfiler": "Databázový profilovač", + "database.designPerspectiveQuery": "Návrh perspektívneho dotazu", + "database.designQuery": "Návrh dotazu", + "database.diagram": "Diagram #", + "database.disconnect": "Odpojiť", + "database.dropDatabase": "Odstrániť databázu", + "database.editApplications": "Upraviť aplikáciu", + "database.export": "Exportovať", + "database.exportDbModel": "Exportovať DB model", + "database.generateScript": "Generovať skript", + "database.import": "Importovať", + "database.newQuery": "Nový dotaz", + "database.newTable": "Nová tabuľka", + "database.perspective": "Perspektíva #", + "database.profiler": "Profilovač", + "database.queryDesigner": "Dotaz #", + "database.refreshSchemas": "Obnoviť schémy", + "database.restore": "Obnoviť #", + "database.restoreDatabaseBackup": "Obnoviť zálohu databázy", + "database.shellDropAllObjects": "Shell: Odstrániť všetky objekty", + "database.shellRunScript": "Shell: Spustiť skript", + "database.shellTitle": "Shell #", + "database.showDiagram": "Zobraziť", + "database.sqlGenerator": "SQL generátor", + "error.driverNotFound": "Neplatné pripojenie k databáze, ovládač nenájdený", + "error.selectedCloudConnection": "Vybrané pripojenie je z DbGate cloudu", + "error.selectedNotCloudConnection": "Vybrané pripojenie nie je z DbGate cloudu", + "file.allSupported": "Všetky podporované súbory", + "file.diagramFiles": "Súbory diagramov", + "file.duckdb": "Databáza DuckDB", + "file.jsonFiles": "JSON súbory", + "file.perspectiveFiles": "Súbory perspektívy", + "file.queryDesignerFiles": "Súbory návrhu dotazu", + "file.sqlFiles": "SQL súbory", + "file.sqliteDatabase": "SQLite databáza", + "importExport.createZipFileInArchive": "Vytvoriť ZIP súbor v archíve", + "importExport.exportToZipArchive": "Exportovať do ZIP archívu", + "importExport.exportToZipFile": "Exportovať do ZIP súboru", + "importExport.importFromZipArchive": "Importovať zo ZIP archívu", + "importExport.importFromZipFile": "Importovať zo ZIP súboru (v archívnej zložke)", + "importExport.sourceFiles": "Zdrojové súbory", + "importExport.tablesViewsCollections": "Tabuľky / pohľady / kolekcie", + "schema.add": "Pridať novú schému", + "schema.createSchema": "Vytvoriť schému", + "schema.delete": "Odstrániť schému", + "schema.resetToDefault": "Resetovať na predvolené", + "schema.schemaName": "Názov schémy", + "serverSummaryTab.databases": "Databázy", + "serverSummaryTab.errorTitle": "Chyba pri načítaní zhrnutia servera", + "serverSummaryTab.loadingMessage": "Načítavanie detailov servera", + "serverSummaryTab.processes": "Procesy", + "serverSummaryTab.variables": "Premenné", + "settings.appearance": "Vzhľad aplikácie", + "settings.appearance.customSize": "Vlastná veľkosť", + "settings.appearance.editorTheme": "Téma", + "settings.appearance.editorTheme.default": "(použiť predvolenú tému)", + "settings.appearance.fontFamily": "Písmo editora", + "settings.appearance.fontSize": "Veľkosť písma", + "settings.appearance.moreThemes": "Viac tém je k dispozícii ako", + "settings.appearance.useSystemTheme": "Použiť systémovú tému", + "settings.behaviour": "Správanie", + "settings.behaviour.jsonPreviewWrap": "Zalomiť JSON v náhľade", + "settings.behaviour.openDetailOnArrows": "Otvoriť detail pri navigácii klávesnicou", + "settings.behaviour.useTabPreviewMode": "Použiť režim náhľadu na karte", + "settings.confirmations": "Potvrdenia", + "settings.confirmations.skipConfirm.collectionDataSave": "Preskočiť potvrdenie pri ukladaní údajov kolekcie (NoSQL)", + "settings.confirmations.skipConfirm.tableDataSave": "Preskočiť potvrdenie pri ukladaní údajov tabuľky (SQL)", + "settings.connection": "Pripojenie", + "settings.connection.autoRefresh": "Automatické obnovenie modelu databázy na pozadí", + "settings.connection.autoRefreshInterval": "Interval medzi automatickým načítaním štruktúry DB (v sekundách)", + "settings.connection.showOnlyTabsFromSelectedDatabase": "Zobraziť iba karty z vybranej databázy", + "settings.connection.sshBindHost": "Adresa localhostu pre SSH pripojenia", + "settings.dataGrid.alignNumbersRight": "Zarovnať čísla doprava", + "settings.dataGrid.collectionPageSize": "Veľkosť stránky kolekcie (pre JSON zobrazenie MongoDB, musí byť medzi 5 a 1000)", + "settings.dataGrid.coloringMode": "Režim farbenia riadkov", + "settings.dataGrid.coloringMode.2-primary": "Každý 2. riadok, primárna farba", + "settings.dataGrid.coloringMode.2-secondary": "Každý 2. riadok, sekundárna farba", + "settings.dataGrid.coloringMode.36": "Každý 3. a 6. riadok", + "settings.dataGrid.coloringMode.none": "Žiadne", + "settings.dataGrid.defaultAutoRefreshInterval": "Predvolený interval automatického obnovenia mriežky v sekundách", + "settings.dataGrid.pageSize": "Veľkosť stránky (počet riadkov pre inkrementálne načítanie, musí byť medzi 5 a 50000)", + "settings.dataGrid.showAllColumnsWhenSearch": "Zobraziť všetky stĺpce pri vyhľadávaní", + "settings.dataGrid.showHintColumns": "Zobraziť nápovedy pre cudzie kľúče", + "settings.dataGrid.thousandsSeparator": "Použiť oddeľovač tisícov pre čísla", + "settings.dataGrid.title": "Mriežka údajov", + "settings.defaultActions": "Predvolené akcie", + "settings.defaultActions.collectionClick": "Kliknutie na kolekciu NoSQL", + "settings.defaultActions.connectionClick": "Kliknutie na pripojenie", + "settings.defaultActions.connectionClick.connect": "Pripojiť", + "settings.defaultActions.connectionClick.none": "Nevykonať nič", + "settings.defaultActions.connectionClick.openDetails": "Upraviť / otvoriť detaily", + "settings.defaultActions.databaseClick": "Kliknutie na databázu", + "settings.defaultActions.databaseClick.none": "Nevykonať nič", + "settings.defaultActions.databaseClick.switch": "Prepnúť databázu", + "settings.defaultActions.functionClick": "Kliknutie na funkciu", + "settings.defaultActions.materializedViewClick": "Kliknutie na materializovaný pohľad", + "settings.defaultActions.procedureClick": "Kliknutie na procedúru", + "settings.defaultActions.tableClick": "Kliknutie na tabuľku", + "settings.defaultActions.useLastUsedAction": "Použiť naposledy použitú akciu", + "settings.defaultActions.viewClick": "Kliknutie na pohľad", + "settings.editor.keybinds": "Klávesové skratky editora", + "settings.editor.wordWrap": "Povoliť zalomovanie riadkov", + "settings.externalTools": "Externé nástroje", + "settings.general": "Všeobecné", + "settings.license": "Licencia", + "settings.localization": "Lokalizácia", + "settings.localization.language": "Jazyk", + "settings.localization.reloadWarning": "Aplikácia musí byť reštartovaná, aby sa zmenil jazyk", + "settings.nativeMenuRestartWarning": "Nastavenie natívnej ponuky vyžaduje reštart aplikácie", + "settings.other": "Ostatné", + "settings.other.ai.allowSendModels": "Povoliť odosielanie modelov DB a fragmentov dotazov do AI služby", + "settings.other.autoUpdateApplication": "Automaticky aktualizovať aplikáciu", + "settings.other.autoUpdateApplication.check": "Skontrolovať nové verzie", + "settings.other.autoUpdateApplication.download": "Skontrolovať a stiahnuť nové verzie", + "settings.other.autoUpdateApplication.skip": "Nekontrolovať nové verzie", + "settings.other.externalTools.mysql": "mysql (obnovenie databázy MySQL)", + "settings.other.externalTools.mysqlPlugins": "Priečinok s pluginmi MySQL (napríklad pre autentifikáciu). Nastaviť iba v prípade problémov", + "settings.other.externalTools.mysqldump": "mysqldump (záloha databázy MySQL)", + "settings.other.externalTools.pg_dump": "pg_dump (záloha databázy PostgreSQL)", + "settings.other.externalTools.psql": "psql (obnovenie databázy PostgreSQL)", + "settings.other.gistCreateToken": "API token pre vytváranie chybových gistov", + "settings.other.license": "Licencia", + "settings.other.licenseKey": "Licenčný kľúč", + "settings.other.licenseKey.checkForNew": "Overiť nový licenčný kľúč", + "settings.other.licenseKey.expiration": "Expirácia licencie:", + "settings.other.licenseKey.invalid": "Licenčný kľúč je neplatný", + "settings.other.licenseKey.valid": "Licenčný kľúč je platný", + "settings.other.licenseKey.validTo": "Licencia platná do:", + "settings.session": "Dotazové relácie", + "settings.session.autoClose": "Automaticky zatvoriť relácie dotazov po čase nečinnosti", + "settings.session.autoCloseTimeout": "Interval, po ktorom sa relácia dotazov bez aktivity zatvorí (v minútach)", + "settings.sqlEditor": "SQL editor", + "settings.sqlEditor.disableExecuteCurrentLine": "Zakázať vykonanie aktuálneho riadku (Execute current)", + "settings.sqlEditor.disableSplitByEmptyLine": "Zakázať rozdelenie prázdnym riadkom", + "settings.sqlEditor.limitRows": "Vrátiť iba N riadkov z dotazu", + "settings.sqlEditor.limitRowsPlaceholder": "(bez limitu)", + "settings.sqlEditor.showTableAliasesInCodeCompletion": "Zobraziť aliasy tabuliek v automatickom doplňovaní", + "settings.sqlEditor.sqlCommandsCase": "Veľkosť písmen", + "settings.tabGroup.showServerName": "Zobraziť názov servera vedľa názvu databázy v názve skupiny kariet", + "settings.theme": "Vzhľad", + "settings.title": "Nastavenia", + "summaryProcesses.actions": "Akcie", + "summaryProcesses.client": "Klient", + "summaryProcesses.connectionId": "ID pripojenia", + "summaryProcesses.namespace": "Namespace", + "summaryProcesses.operation": "Operácia", + "summaryProcesses.processId": "ID procesu", + "summaryProcesses.runningTime": "Čas behu", + "summaryProcesses.state": "Stav", + "summaryProcesses.waitingFor": "Čaká na", + "summaryVariables.value": "Hodnota", + "summaryVariables.variable": "Premenná", + "tab.administration": "Administrácia", + "widget.databaseContent": "Obsah databázy", + "widget.databases": "Databázy", + "widget.keys": "Kľúče", + "widget.pinned": "Pripnuté", + "widget.tablesViewsFunctions": "Tabuľky, pohľady, funkcie" +} \ No newline at end of file From 0e211dc91b273f988ef73fa0290f3a39f82d36e8 Mon Sep 17 00:00:00 2001 From: Stela Augustinova Date: Mon, 27 Oct 2025 15:04:04 +0100 Subject: [PATCH 34/79] translation-connections,sqlObject,column,filter --- .../web/src/appobj/ConnectionAppObject.svelte | 2 +- packages/web/src/commands/stdCommands.ts | 4 +- .../web/src/datagrid/ColumnManager.svelte | 11 +- .../web/src/datagrid/DataFilterControl.svelte | 87 +++++----- packages/web/src/modals/InputTextModal.svelte | 3 +- packages/web/src/modals/SetFilterModal.svelte | 11 +- .../src/modals/SetFilterModal_Select.svelte | 43 ++--- .../ConnectionAdvancedDriverFields.svelte | 5 +- .../settings/ConnectionDriverFields.svelte | 84 +++++----- .../settings/ConnectionSshTunnelFields.svelte | 19 +-- .../src/settings/ConnectionSslFields.svelte | 13 +- .../web/src/widgets/ConnectionList.svelte | 23 +-- packages/web/src/widgets/SqlObjectList.svelte | 35 ++-- translations/cs.json | 149 +++++++++++++++++- translations/en.json | 149 +++++++++++++++++- translations/sk.json | 149 +++++++++++++++++- 16 files changed, 619 insertions(+), 168 deletions(-) diff --git a/packages/web/src/appobj/ConnectionAppObject.svelte b/packages/web/src/appobj/ConnectionAppObject.svelte index d99ccaf2a..afdaa91e5 100644 --- a/packages/web/src/appobj/ConnectionAppObject.svelte +++ b/packages/web/src/appobj/ConnectionAppObject.svelte @@ -279,7 +279,7 @@ showModal(InputTextModal, { header: _t('connection.createDatabase', { defaultMessage: 'Create database' }), value: 'newdb', - label: _t('connection.databaseName', { defaultMessage: 'Database name' }), + label: _t('connection.database', { defaultMessage: 'Database name' }), onConfirm: name => apiCall('server-connections/create-database', { conid: data._id, diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index f2f3872d6..b912b5846 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -161,8 +161,8 @@ registerCommand({ onClick: () => { showModal(InputTextModal, { value: '', - label: 'New connection folder name', - header: 'Create connection folder', + label: _t('connection.createNewFolderName', { defaultMessage: 'New connection folder name' }), + header: _t('connection.createNewFolder', { defaultMessage: 'Create connection folder' }), onConfirm: async folder => { emptyConnectionGroupNames.update(names => { if (!folder) return names; diff --git a/packages/web/src/datagrid/ColumnManager.svelte b/packages/web/src/datagrid/ColumnManager.svelte index fbc024457..573df7ea9 100644 --- a/packages/web/src/datagrid/ColumnManager.svelte +++ b/packages/web/src/datagrid/ColumnManager.svelte @@ -17,6 +17,7 @@ import SelectField from '../forms/SelectField.svelte'; import ColumnEditorModal from '../tableeditor/ColumnEditorModal.svelte'; import { tick } from 'svelte'; + import { _t } from '../translations'; export let managerSize; export let display: GridDisplay; @@ -154,8 +155,8 @@ class="colmode" value={isDynamicStructure ? 'variable' : 'fixed'} options={[ - { label: 'Fixed columns (like SQL)', value: 'fixed' }, - { label: 'Variable columns (like MongoDB)', value: 'variable' }, + { label: _t('column.fixed', {defaultMessage: 'Fixed columns (like SQL)'}), value: 'fixed' }, + { label: _t('column.variable', {defaultMessage: 'Variable columns (like MongoDB)'}) , value: 'variable' }, ]} on:change={e => { dispatchChangeSet({ @@ -175,7 +176,7 @@ {/if} display.setSearchInColumns(value)} data-testid="ColumnManager_searchColumns" @@ -186,8 +187,8 @@ on:click={() => { showModal(InputTextModal, { value: '', - label: 'Column name', - header: 'Add new column', + label: _t('column.name', {defaultMessage: 'Column name'}), + header: _t('column.addNew', {defaultMessage: 'Add new column'}), onConfirm: name => { display.addDynamicColumn(name); tick().then(() => { diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte index 9508de601..7f2a5025a 100644 --- a/packages/web/src/datagrid/DataFilterControl.svelte +++ b/packages/web/src/datagrid/DataFilterControl.svelte @@ -17,6 +17,7 @@ import FontIcon from '../icons/FontIcon.svelte'; import DictionaryLookupModal from '../modals/DictionaryLookupModal.svelte'; import ValueLookupModal from '../modals/ValueLookupModal.svelte'; + import { _t } from '../translations'; export let isReadOnly = false; export let filterBehaviour; @@ -64,43 +65,43 @@ function createMenu() { const res = [ - { onClick: () => setFilter(''), text: 'Clear Filter' }, - { onClick: () => filterMultipleValues(), text: 'Filter multiple values' }, + { onClick: () => setFilter(''), text: _t('filter.clear', { defaultMessage: 'Clear Filter' }) }, + { onClick: () => filterMultipleValues(), text: _t('filter.multipleValues', { defaultMessage: 'Filter multiple values' }) }, ]; if (filterBehaviour.supportEquals) { res.push( - { onClick: () => openFilterWindow('='), text: 'Equals...' }, - { onClick: () => openFilterWindow('<>'), text: 'Does Not Equal...' } + { onClick: () => openFilterWindow('='), text: _t('filter.equals', { defaultMessage: 'Equals...' }) }, + { onClick: () => openFilterWindow('<>'), text: _t('filter.doesNotEqual', { defaultMessage: 'Does Not Equal...' }) } ); } if (filterBehaviour.supportExistsTesting) { res.push( - { onClick: () => setFilter('EXISTS'), text: 'Field exists' }, - { onClick: () => setFilter('NOT EXISTS'), text: 'Field does not exist' } + { onClick: () => setFilter('EXISTS'), text: _t('filter.fieldExists', { defaultMessage: 'Field exists' }) }, + { onClick: () => setFilter('NOT EXISTS'), text: _t('filter.fieldDoesNotExist', { defaultMessage: 'Field does not exist' }) } ); } if (filterBehaviour.supportNotEmptyArrayTesting) { - res.push({ onClick: () => setFilter('NOT EMPTY ARRAY'), text: 'Array is not empty' }); + res.push({ onClick: () => setFilter('NOT EMPTY ARRAY'), text: _t('filter.arrayIsNotEmpty', { defaultMessage: 'Array is not empty' }) }); } if (filterBehaviour.supportEmptyArrayTesting) { - res.push({ onClick: () => setFilter('EMPTY ARRAY'), text: 'Array is empty' }); + res.push({ onClick: () => setFilter('EMPTY ARRAY'), text: _t('filter.arrayIsEmpty', { defaultMessage: 'Array is empty' }) }); } if (filterBehaviour.supportNullTesting) { res.push( - { onClick: () => setFilter('NULL'), text: 'Is Null' }, - { onClick: () => setFilter('NOT NULL'), text: 'Is Not Null' } + { onClick: () => setFilter('NULL'), text: _t('filter.isNull', { defaultMessage: 'Is Null' }) }, + { onClick: () => setFilter('NOT NULL'), text: _t('filter.isNotNull', { defaultMessage: 'Is Not Null' }) } ); } if (filterBehaviour.supportEmpty) { res.push( - { onClick: () => setFilter('EMPTY, NULL'), text: 'Is Empty Or Null' }, - { onClick: () => setFilter('NOT EMPTY NOT NULL'), text: 'Has Not Empty Value' } + { onClick: () => setFilter('EMPTY, NULL'), text: _t('filter.isEmptyOrNull', { defaultMessage: 'Is Empty Or Null' }) }, + { onClick: () => setFilter('NOT EMPTY NOT NULL'), text: _t('filter.hasNotEmptyValue', { defaultMessage: 'Has Not Empty Value' }) } ); } @@ -108,10 +109,10 @@ res.push( { divider: true }, - { onClick: () => openFilterWindow('>'), text: 'Greater Than...' }, - { onClick: () => openFilterWindow('>='), text: 'Greater Than Or Equal To...' }, - { onClick: () => openFilterWindow('<'), text: 'Less Than...' }, - { onClick: () => openFilterWindow('<='), text: 'Less Than Or Equal To...' } + { onClick: () => openFilterWindow('>'), text: _t('filter.greaterThan', { defaultMessage: 'Greater Than...' }) }, + { onClick: () => openFilterWindow('>='), text: _t('filter.greaterThanOrEqualTo', { defaultMessage: 'Greater Than Or Equal To...' }) }, + { onClick: () => openFilterWindow('<'), text: _t('filter.lessThan', { defaultMessage: 'Less Than...' }) }, + { onClick: () => openFilterWindow('<='), text: _t('filter.lessThanOrEqualTo', { defaultMessage: 'Less Than Or Equal To...' }) } ); } @@ -119,26 +120,26 @@ res.push( { divider: true }, - { onClick: () => openFilterWindow('+'), text: 'Contains...' }, - { onClick: () => openFilterWindow('~'), text: 'Does Not Contain...' }, - { onClick: () => openFilterWindow('^'), text: 'Begins With...' }, - { onClick: () => openFilterWindow('!^'), text: 'Does Not Begin With...' }, - { onClick: () => openFilterWindow('$'), text: 'Ends With...' }, - { onClick: () => openFilterWindow('!$'), text: 'Does Not End With...' } + { onClick: () => openFilterWindow('+'), text: _t('filter.contains', { defaultMessage: 'Contains...' }) }, + { onClick: () => openFilterWindow('~'), text: _t('filter.doesNotContain', { defaultMessage: 'Does Not Contain...' }) }, + { onClick: () => openFilterWindow('^'), text: _t('filter.beginsWith', { defaultMessage: 'Begins With...' }) }, + { onClick: () => openFilterWindow('!^'), text: _t('filter.doesNotBeginWith', { defaultMessage: 'Does Not Begin With...' }) }, + { onClick: () => openFilterWindow('$'), text: _t('filter.endsWith', { defaultMessage: 'Ends With...' }) }, + { onClick: () => openFilterWindow('!$'), text: _t('filter.doesNotEndWith', { defaultMessage: 'Does Not End With...' }) } ); } if (filterBehaviour.supportBooleanValues) { res.push( - { onClick: () => setFilter('TRUE'), text: 'Is True' }, - { onClick: () => setFilter('FALSE'), text: 'Is False' } + { onClick: () => setFilter('TRUE'), text: _t('filter.isTrue', { defaultMessage: 'Is True' }) }, + { onClick: () => setFilter('FALSE'), text: _t('filter.isFalse', { defaultMessage: 'Is False' }) } ); } if (filterBehaviour.supportBooleanOrNull) { res.push( - { onClick: () => setFilter('TRUE, NULL'), text: 'Is True or NULL' }, - { onClick: () => setFilter('FALSE, NULL'), text: 'Is False or NULL' } + { onClick: () => setFilter('TRUE, NULL'), text: _t('filter.isTrueOrNull', { defaultMessage: 'Is True or NULL' }) }, + { onClick: () => setFilter('FALSE, NULL'), text: _t('filter.isFalseOrNull', { defaultMessage: 'Is False or NULL' }) } ); } @@ -146,44 +147,44 @@ res.push( { divider: true }, - { onClick: () => setFilter('TOMORROW'), text: 'Tomorrow' }, - { onClick: () => setFilter('TODAY'), text: 'Today' }, - { onClick: () => setFilter('YESTERDAY'), text: 'Yesterday' }, + { onClick: () => setFilter('TOMORROW'), text: _t('filter.tomorrow', { defaultMessage: 'Tomorrow' }) }, + { onClick: () => setFilter('TODAY'), text: _t('filter.today', { defaultMessage: 'Today' }) }, + { onClick: () => setFilter('YESTERDAY'), text: _t('filter.yesterday', { defaultMessage: 'Yesterday' }) }, { divider: true }, - { onClick: () => setFilter('NEXT WEEK'), text: 'Next Week' }, - { onClick: () => setFilter('THIS WEEK'), text: 'This Week' }, - { onClick: () => setFilter('LAST WEEK'), text: 'Last Week' }, + { onClick: () => setFilter('NEXT WEEK'), text: _t('filter.nextWeek', { defaultMessage: 'Next Week' }) }, + { onClick: () => setFilter('THIS WEEK'), text: _t('filter.thisWeek', { defaultMessage: 'This Week' }) }, + { onClick: () => setFilter('LAST WEEK'), text: _t('filter.lastWeek', { defaultMessage: 'Last Week' }) }, { divider: true }, - { onClick: () => setFilter('NEXT MONTH'), text: 'Next Month' }, - { onClick: () => setFilter('THIS MONTH'), text: 'This Month' }, - { onClick: () => setFilter('LAST MONTH'), text: 'Last Month' }, + { onClick: () => setFilter('NEXT MONTH'), text: _t('filter.nextMonth', { defaultMessage: 'Next Month' }) }, + { onClick: () => setFilter('THIS MONTH'), text: _t('filter.thisMonth', { defaultMessage: 'This Month' }) }, + { onClick: () => setFilter('LAST MONTH'), text: _t('filter.lastMonth', { defaultMessage: 'Last Month' }) }, { divider: true }, - { onClick: () => setFilter('NEXT YEAR'), text: 'Next Year' }, - { onClick: () => setFilter('THIS YEAR'), text: 'This Year' }, - { onClick: () => setFilter('LAST YEAR'), text: 'Last Year' } + { onClick: () => setFilter('NEXT YEAR'), text: _t('filter.nextYear', { defaultMessage: 'Next Year' }) }, + { onClick: () => setFilter('THIS YEAR'), text: _t('filter.thisYear', { defaultMessage: 'This Year' }) }, + { onClick: () => setFilter('LAST YEAR'), text: _t('filter.lastYear', { defaultMessage: 'Last Year' }) } ); } if (filterBehaviour.supportDatetimeComparison) { res.push( { divider: true }, - { onClick: () => openFilterWindow('<='), text: 'Before...' }, - { onClick: () => openFilterWindow('>='), text: 'After...' }, - { onClick: () => openFilterWindow('>=;<='), text: 'Between...' } + { onClick: () => openFilterWindow('<='), text: _t('filter.before', { defaultMessage: 'Before...' }) }, + { onClick: () => openFilterWindow('>='), text: _t('filter.after', { defaultMessage: 'After...' }) }, + { onClick: () => openFilterWindow('>=;<='), text: _t('filter.between', { defaultMessage: 'Between...' }) } ); } if (filterBehaviour.supportSqlCondition) { res.push( { divider: true }, - { onClick: () => openFilterWindow('sql'), text: 'SQL condition ...' }, - { onClick: () => openFilterWindow('sqlRight'), text: 'SQL condition - right side ...' } + { onClick: () => openFilterWindow('sql'), text: _t('filter.sqlCondition', { defaultMessage: 'SQL condition ...' }) }, + { onClick: () => openFilterWindow('sqlRight'), text: _t('filter.sqlConditionRight', { defaultMessage: 'SQL condition - right side ...' }) } ); } diff --git a/packages/web/src/modals/InputTextModal.svelte b/packages/web/src/modals/InputTextModal.svelte index 7ce64667e..22dbd1545 100644 --- a/packages/web/src/modals/InputTextModal.svelte +++ b/packages/web/src/modals/InputTextModal.svelte @@ -6,6 +6,7 @@ import FormTextField from '../forms/FormTextField.svelte'; import ModalBase from './ModalBase.svelte'; import { closeCurrentModal } from './modalTools'; + import { _t } from '../translations'; export let header; export let value; @@ -29,7 +30,7 @@ handleSubmit(e.detail)} data-testid="InputTextModal_ok" /> - + diff --git a/packages/web/src/modals/SetFilterModal.svelte b/packages/web/src/modals/SetFilterModal.svelte index 436d734ff..38e224852 100644 --- a/packages/web/src/modals/SetFilterModal.svelte +++ b/packages/web/src/modals/SetFilterModal.svelte @@ -10,6 +10,7 @@ import { closeCurrentModal } from './modalTools'; import FormRadioGroupItem from '../forms/FormRadioGroupItem.svelte'; import FormValues from '../forms/FormValues.svelte'; + import { _t } from '../translations'; export let condition1; export let onFilter; @@ -44,10 +45,10 @@ -
Set filter
+
{_t('filter.setFilter', {defaultMessage: 'Set filter'})}
-
Show rows where
+
{_t('filter.showRowsWhere', {defaultMessage: 'Show rows where'})}
@@ -62,9 +63,9 @@
- + {#if !filterBehaviour.disableOr} - + {/if}
@@ -84,7 +85,7 @@
- +
diff --git a/packages/web/src/modals/SetFilterModal_Select.svelte b/packages/web/src/modals/SetFilterModal_Select.svelte index dd4b54b15..2f0ffee8d 100644 --- a/packages/web/src/modals/SetFilterModal_Select.svelte +++ b/packages/web/src/modals/SetFilterModal_Select.svelte @@ -1,56 +1,57 @@ - - + + {#if advancedFields} diff --git a/packages/web/src/settings/ConnectionDriverFields.svelte b/packages/web/src/settings/ConnectionDriverFields.svelte index 32076ef62..5933239a5 100644 --- a/packages/web/src/settings/ConnectionDriverFields.svelte +++ b/packages/web/src/settings/ConnectionDriverFields.svelte @@ -87,13 +87,13 @@ !driver.isElectronOnly || electron) @@ -109,7 +109,7 @@ {#if $authTypes && driver?.showConnectionField('authType', $values, showConnectionFieldArgs) && driver?.authTypeFirst} {#key $authTypes} {:else} @@ -164,8 +164,8 @@ name="useDatabaseUrl" matchValueToOption={(value, option) => !!option.value == !!value} options={[ - { label: 'Fill database connection details', value: '', default: true }, - { label: 'Use database URL', value: '1' }, + { label: _t('connection.fillDetails', { defaultMessage: 'Fill database connection details' }), value: '', default: true }, + { label: _t('connection.useUrl', { defaultMessage: 'Use database URL' }), value: '1' }, ]} />
@@ -173,7 +173,7 @@ {#if driver?.showConnectionField('databaseUrl', $values, showConnectionFieldArgs)}
- Under docker, localhost and 127.0.0.1 will not work, use dockerhost instead + { _t('connection.dockerWarning', { defaultMessage: 'Under docker, localhost and 127.0.0.1 will not work, use dockerhost instead' }) }
{/if} {/if} @@ -280,7 +280,7 @@
@@ -418,7 +418,7 @@ {#if driver?.showConnectionField('treeKeySeparator', $values, showConnectionFieldArgs)} + {/if} {#if driver}
{#if electron} {:else}
{#if $platformInfo && $platformInfo.sshAuthSock} - SSH Agent found + {_t('connection.sshTunnel.agentFound', {defaultMessage: "SSH Agent found"})} {:else} - SSH Agent not found + {_t('connection.sshTunnel.agentNotFound', {defaultMessage: "SSH Agent not found"})} {/if}
{/if} diff --git a/packages/web/src/settings/ConnectionSslFields.svelte b/packages/web/src/settings/ConnectionSslFields.svelte index 24936f42f..a50928458 100644 --- a/packages/web/src/settings/ConnectionSslFields.svelte +++ b/packages/web/src/settings/ConnectionSslFields.svelte @@ -7,6 +7,7 @@ import getElectron from '../utility/getElectron'; import FormPasswordField from '../forms/FormPasswordField.svelte'; import { openedConnections, openedSingleDatabaseConnections } from '../stores'; + import { _t } from '../translations'; const { values, setFieldValue } = getFormContext(); const electron = getElectron(); @@ -15,21 +16,21 @@ $: isConnected = $openedConnections.includes($values._id) || $openedSingleDatabaseConnections.includes($values._id); - - + + - + diff --git a/packages/web/src/widgets/ConnectionList.svelte b/packages/web/src/widgets/ConnectionList.svelte index 0e9227335..01808473c 100644 --- a/packages/web/src/widgets/ConnectionList.svelte +++ b/packages/web/src/widgets/ConnectionList.svelte @@ -47,6 +47,7 @@ getOpenDetailOnArrowsSettings, } from '../settings/settingsTools'; import DropDownButton from '../buttons/DropDownButton.svelte'; + import { _t } from '../translations'; const connections = useConnectionList(); const serverStatus = useServerStatus(); @@ -58,7 +59,7 @@ let domContainer = null; let domFilter = null; - const RECENT_AND_UNSAVED_LABEL = 'Recent & unsaved'; + const RECENT_AND_UNSAVED_LABEL = _t('connection.recentUnsaved', { defaultMessage: 'Recent & unsaved' }); function extractConnectionParent(data, openedConnections, openedSingleDatabaseConnections) { if (data.parent) { @@ -193,12 +194,12 @@ function createSearchMenu() { const res = []; - res.push({ label: 'Search by:', isBold: true, disabled: true }); - res.push({ label: 'Display name', switchValue: 'displayName' }); - res.push({ label: 'Server', switchValue: 'server' }); - res.push({ label: 'User', switchValue: 'user' }); - res.push({ label: 'Database engine', switchValue: 'engine' }); - res.push({ label: 'Database name', switchValue: 'database' }); + res.push({ label: _t('common.searchBy', { defaultMessage: 'Search by:' }), isBold: true, disabled: true }); + res.push({ label: _t('connection.displayName', { defaultMessage: 'Display name' }), switchValue: 'displayName' }); + res.push({ label: _t('connection.server', { defaultMessage: 'Server' }), switchValue: 'server' }); + res.push({ label: _t('connection.user', { defaultMessage: 'User' }), switchValue: 'user' }); + res.push({ label: _t('connection.engine', { defaultMessage: 'Database engine' }), switchValue: 'engine' }); + res.push({ label: _t('connection.database', { defaultMessage: 'Database name' }), switchValue: 'database' }); return res.map(item => ({ ...item, switchStore: connectionAppObjectSearchSettings, @@ -209,7 +210,7 @@ { @@ -227,16 +228,16 @@ {#if $commandsCustomized['new.connection']?.enabled} runCommand('new.connection')} - title="Add new connection" + title={_t('connection.new.title', { defaultMessage: 'Add new connection' })} data-testid="ConnectionList_buttonNewConnection" > - runCommand('new.connection.folder')} title="Add new connection folder"> + runCommand('new.connection.folder')} title={_t('connection.new.folder.title', { defaultMessage: 'Add new connection folder' })}> {/if} - + diff --git a/packages/web/src/widgets/SqlObjectList.svelte b/packages/web/src/widgets/SqlObjectList.svelte index 96de61bcd..fbafef8a2 100644 --- a/packages/web/src/widgets/SqlObjectList.svelte +++ b/packages/web/src/widgets/SqlObjectList.svelte @@ -56,6 +56,7 @@ import FocusedConnectionInfoWidget from './FocusedConnectionInfoWidget.svelte'; import SubProcedureParamList from '../appobj/SubProcedureParamList.svelte'; import SubProcedureLineList from '../appobj/SubProcedureLineList.svelte'; + import { _t } from '../translations'; export let conid; export let database; @@ -130,20 +131,20 @@ function createSearchMenu() { const res = []; - res.push({ label: 'Search by:', isBold: true, disabled: true }); + res.push({ label: _t('sqlObject.searchBy', { defaultMessage: 'Search by:' }), isBold: true, disabled: true }); if (driver?.databaseEngineTypes?.includes('document')) { - res.push({ label: 'Collection name', switchValue: 'pureName' }); + res.push({ label: _t('sqlObject.collectionName', { defaultMessage: 'Collection name' }), switchValue: 'pureName' }); } if (driver?.databaseEngineTypes?.includes('sql')) { - res.push({ label: 'Table/view/procedure name', switchValue: 'pureName' }); - res.push({ label: 'Schema', switchValue: 'schemaName' }); - res.push({ label: 'Column name', switchValue: 'columnName' }); - res.push({ label: 'Column data type', switchValue: 'columnDataType' }); - res.push({ label: 'Table comment', switchValue: 'tableComment' }); - res.push({ label: 'Column comment', switchValue: 'columnComment' }); - res.push({ label: 'View/procedure/trigger text', switchValue: 'sqlObjectText' }); - res.push({ label: 'Table engine', switchValue: 'tableEngine' }); - res.push({ label: 'Only tables with rows', switchValue: 'tablesWithRows' }); + res.push({ label: _t('sqlObject.tableViewProcedureName', { defaultMessage: 'Table/view/procedure name' }), switchValue: 'pureName' }); + res.push({ label: _t('sqlObject.schemaName', { defaultMessage: 'Schema' }), switchValue: 'schemaName' }); + res.push({ label: _t('sqlObject.columnName', { defaultMessage: 'Column name' }), switchValue: 'columnName' }); + res.push({ label: _t('sqlObject.columnDataType', { defaultMessage: 'Column data type' }), switchValue: 'columnDataType' }); + res.push({ label: _t('sqlObject.tableComment', { defaultMessage: 'Table comment' }), switchValue: 'tableComment' }); + res.push({ label: _t('sqlObject.columnComment', { defaultMessage: 'Column comment' }), switchValue: 'columnComment' }); + res.push({ label: _t('sqlObject.viewProcedureTriggerText', { defaultMessage: 'View/procedure/trigger text' }), switchValue: 'sqlObjectText' }); + res.push({ label: _t('sqlObject.tableEngine', { defaultMessage: 'Table engine' }), switchValue: 'tableEngine' }); + res.push({ label: _t('sqlObject.tablesWithRows', { defaultMessage: 'Only tables with rows' }), switchValue: 'tablesWithRows' }); } return res.map(item => ({ ...item, @@ -175,7 +176,7 @@ - Refresh + {_t('common.refresh', { defaultMessage: 'Refresh' })} {:else if objectList.length == 0 && $status && $status.name != 'pending' && $status.name != 'checkStructure' && $status.name != 'loadStructure' && $objects}
- Refresh + {_t('common.refresh', { defaultMessage: 'Refresh' })} {#if driver?.databaseEngineTypes?.includes('sql')}
- runCommand('new.table')}>New table + runCommand('new.table')}>{_t('database.newTable', { defaultMessage: 'New table' })} {/if} {#if driver?.databaseEngineTypes?.includes('document')}
@@ -211,7 +212,7 @@ {:else} { @@ -259,7 +260,7 @@ data-testid="SqlObjectList_container" > {#if ($status && ($status.name == 'pending' || $status.name == 'checkStructure' || $status.name == 'loadStructure') && $objects) || !$objects} - + {:else} Date: Thu, 30 Oct 2025 08:47:55 +0100 Subject: [PATCH 35/79] azure code signing --- workflow-templates/build-app.tpl.yaml | 55 ++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/workflow-templates/build-app.tpl.yaml b/workflow-templates/build-app.tpl.yaml index bfdd0bb55..35aa4049d 100644 --- a/workflow-templates/build-app.tpl.yaml +++ b/workflow-templates/build-app.tpl.yaml @@ -85,9 +85,14 @@ on: # branches: # - production +permissions: + id-token: write + contents: write + jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false @@ -145,33 +150,65 @@ jobs: _if: _community if: matrix.os == 'ubuntu-22.04' uses: samuelmeuli/action-snapcraft@v1 - - name: Publish + + - name: Publish Windows + if: matrix.os == 'windows-2022' run: | <> yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} - # WIN_CSC_LINK: ${{ secrets.WINCERT_CERTIFICATE }} - # WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_PASSWORD }} - + - name: Publish MacOS + if: matrix.os == 'macos-14' + run: | + <> + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} - APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + <> + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} + - name: generatePadFile _if: _community_stable run: | yarn generatePadFile + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + + files-folder: app/dist + files-folder-filter: exe + + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 + - name: Copy artifacts run: | mkdir artifacts From 32729350f6e38c41c708cae005821df7f454e438 Mon Sep 17 00:00:00 2001 From: CI workflows Date: Thu, 30 Oct 2025 07:48:22 +0000 Subject: [PATCH 36/79] chore: auto-update github workflows --- .github/workflows/build-app-beta.yaml | 43 +++++++++++++++++++-- .github/workflows/build-app-check.yaml | 43 +++++++++++++++++++-- .github/workflows/build-app-pro-beta.yaml | 47 +++++++++++++++++++++-- .github/workflows/build-app-pro.yaml | 47 +++++++++++++++++++++-- .github/workflows/build-app.yaml | 43 +++++++++++++++++++-- 5 files changed, 203 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build-app-beta.yaml b/.github/workflows/build-app-beta.yaml index ca9df362f..d9003cafa 100644 --- a/.github/workflows/build-app-beta.yaml +++ b/.github/workflows/build-app-beta.yaml @@ -6,9 +6,13 @@ name: Electron app BETA push: tags: - v[0-9]+.[0-9]+.[0-9]+-beta.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false matrix: @@ -60,21 +64,52 @@ jobs: - name: Install Snapcraft if: matrix.os == 'ubuntu-22.04' uses: samuelmeuli/action-snapcraft@v1 - - name: Publish + - name: Publish Windows + if: matrix.os == 'windows-2022' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Publish MacOS + if: matrix.os == 'macos-14' run: | yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + files-folder: app/dist + files-folder-filter: exe + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app-check.yaml b/.github/workflows/build-app-check.yaml index c5686419e..112dca034 100644 --- a/.github/workflows/build-app-check.yaml +++ b/.github/workflows/build-app-check.yaml @@ -6,9 +6,13 @@ name: Electron app check build push: tags: - check-[0-9]+-[0-9]+-[0-9]+.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false matrix: @@ -56,21 +60,52 @@ jobs: - name: Install Snapcraft if: matrix.os == 'ubuntu-22.04' uses: samuelmeuli/action-snapcraft@v1 - - name: Publish + - name: Publish Windows + if: matrix.os == 'windows-2022' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Publish MacOS + if: matrix.os == 'macos-14' run: | yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + files-folder: app/dist + files-folder-filter: exe + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app-pro-beta.yaml b/.github/workflows/build-app-pro-beta.yaml index 4f1cd8591..2ae47f81b 100644 --- a/.github/workflows/build-app-pro-beta.yaml +++ b/.github/workflows/build-app-pro-beta.yaml @@ -6,9 +6,13 @@ name: Electron app PREMIUM BETA push: tags: - v[0-9]+.[0-9]+.[0-9]+-premium-beta.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false matrix: @@ -87,7 +91,17 @@ jobs: cd dbgate-merged yarn fillPackagedPlugins - - name: Publish + - name: Publish Windows + if: matrix.os == 'windows-2022' + run: | + cd .. + cd dbgate-merged + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Publish MacOS + if: matrix.os == 'macos-14' run: | cd .. cd dbgate-merged @@ -95,15 +109,40 @@ jobs: yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + cd .. + cd dbgate-merged + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + files-folder: app/dist + files-folder-filter: exe + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app-pro.yaml b/.github/workflows/build-app-pro.yaml index 6ad30d299..a26e343ae 100644 --- a/.github/workflows/build-app-pro.yaml +++ b/.github/workflows/build-app-pro.yaml @@ -6,9 +6,13 @@ name: Electron app PREMIUM push: tags: - v[0-9]+.[0-9]+.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false matrix: @@ -87,7 +91,17 @@ jobs: cd dbgate-merged yarn fillPackagedPlugins - - name: Publish + - name: Publish Windows + if: matrix.os == 'windows-2022' + run: | + cd .. + cd dbgate-merged + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Publish MacOS + if: matrix.os == 'macos-14' run: | cd .. cd dbgate-merged @@ -95,15 +109,40 @@ jobs: yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + cd .. + cd dbgate-merged + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + files-folder: app/dist + files-folder-filter: exe + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app.yaml b/.github/workflows/build-app.yaml index 22545dd62..00cb951c5 100644 --- a/.github/workflows/build-app.yaml +++ b/.github/workflows/build-app.yaml @@ -6,9 +6,13 @@ name: Electron app push: tags: - v[0-9]+.[0-9]+.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} + environment: dbgate-app strategy: fail-fast: false matrix: @@ -56,24 +60,55 @@ jobs: - name: Install Snapcraft if: matrix.os == 'ubuntu-22.04' uses: samuelmeuli/action-snapcraft@v1 - - name: Publish + - name: Publish Windows + if: matrix.os == 'windows-2022' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + - name: Publish MacOS + if: matrix.os == 'macos-14' run: | yarn run build:app env: GH_TOKEN: ${{ secrets.GH_TOKEN }} - WIN_CSC_LINK: ${{ secrets.WINCERT_2025 }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.WINCERT_2025_PASSWORD }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_APP_SPECIFIC_PASSWORD}} + - name: Publish Linux + if: matrix.os == 'ubuntu-22.04' + run: | + + yarn run build:app + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} - name: generatePadFile run: | yarn generatePadFile + - name: Azure login (OIDC) + uses: azure/login@v2 + if: matrix.os == 'windows-2022' + with: + client-id: ${{ secrets.AZURE_TC_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TC_TENANT_ID }} + allow-no-subscriptions: true + - name: Sign Windows artifacts with Azure Trusted Signing + uses: azure/trusted-signing-action@v0 + if: matrix.os == 'windows-2022' + with: + endpoint: https://wus3.codesigning.azure.net/ + trusted-signing-account-name: DbGate + certificate-profile-name: DbGate-Release + files-folder: app/dist + files-folder-filter: exe + timestamp-rfc3161: http://timestamp.acs.microsoft.com + timestamp-digest: SHA256 - name: Copy artifacts run: | mkdir artifacts From f24caad99714b95c0b89319b28e04ab0f29148e3 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 08:49:48 +0100 Subject: [PATCH 37/79] v6.6.8-beta.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4861194d2..5b29fbcd6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.7", + "version": "6.6.8-beta.1", "name": "dbgate-all", "workspaces": [ "packages/*", From 23f7dd6ee3d9c8f7e590b35ac9bc8d62046792ac Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 13:18:05 +0100 Subject: [PATCH 38/79] use OIDC NPM sign --- workflow-templates/build-npm.yaml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/workflow-templates/build-npm.yaml b/workflow-templates/build-npm.yaml index a2f74f558..5c0fb3a86 100644 --- a/workflow-templates/build-npm.yaml +++ b/workflow-templates/build-npm.yaml @@ -8,6 +8,10 @@ on: - 'v[0-9]+.[0-9]+.[0-9]+' - 'v[0-9]+.[0-9]+.[0-9]+-alpha.[0-9]+' +permissions: + id-token: write + contents: write + # on: # push: # branches: @@ -35,11 +39,15 @@ jobs: with: node-version: 22.x - - name: Configure NPM token - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: | - npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" + # Ensure npm 11.5.1 or later is installed + - name: Update npm + run: npm install -g npm@latest + + # - name: Configure NPM token + # env: + # NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + # run: | + # npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" - name: yarn install run: | From e2d1771a7aa617230b6600a6c568c4b5cc2807be Mon Sep 17 00:00:00 2001 From: CI workflows Date: Thu, 30 Oct 2025 12:18:26 +0000 Subject: [PATCH 39/79] chore: auto-update github workflows --- .github/workflows/build-npm.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-npm.yaml b/.github/workflows/build-npm.yaml index 9b815cea7..ad5019cd2 100644 --- a/.github/workflows/build-npm.yaml +++ b/.github/workflows/build-npm.yaml @@ -7,6 +7,9 @@ name: NPM packages tags: - v[0-9]+.[0-9]+.[0-9]+ - v[0-9]+.[0-9]+.[0-9]+-alpha.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} @@ -26,11 +29,8 @@ jobs: uses: actions/setup-node@v1 with: node-version: 22.x - - name: Configure NPM token - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: | - npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" + - name: Update npm + run: npm install -g npm@latest - name: yarn install run: | yarn install From 6cc8c7cb9de0df8a4d12d6ff9bcd30c289cadb42 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 13:20:32 +0100 Subject: [PATCH 40/79] v6.6.8-alpha.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5b29fbcd6..bb3bbbbac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-beta.1", + "version": "6.6.8-alpha.4", "name": "dbgate-all", "workspaces": [ "packages/*", From 8a7a73678cac616cce54ec47229533ea36731a27 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 13:30:56 +0100 Subject: [PATCH 41/79] added npm publish --tag --- workflow-templates/build-npm.yaml | 52 ++++++++++++++++++------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/workflow-templates/build-npm.yaml b/workflow-templates/build-npm.yaml index 5c0fb3a86..2c6eef85a 100644 --- a/workflow-templates/build-npm.yaml +++ b/workflow-templates/build-npm.yaml @@ -57,112 +57,120 @@ jobs: run: | yarn setCurrentVersion + - name: Compute npm dist-tag + run: | + if [[ "${GITHUB_REF_NAME}" =~ -alpha\. ]]; then + echo "NPM_TAG=alpha" >> $GITHUB_ENV + else + echo "NPM_TAG=latest" >> $GITHUB_ENV + fi + - name: Publish types working-directory: packages/types run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish tools working-directory: packages/tools run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish sqltree working-directory: packages/sqltree run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish api working-directory: packages/api run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish datalib working-directory: packages/datalib run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish filterparser working-directory: packages/filterparser run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish web working-directory: packages/web run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-serve working-directory: packages/serve run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbmodel working-directory: packages/dbmodel run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-csv working-directory: plugins/dbgate-plugin-csv run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-xml working-directory: plugins/dbgate-plugin-xml run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-excel working-directory: plugins/dbgate-plugin-excel run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-mssql working-directory: plugins/dbgate-plugin-mssql run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-mysql working-directory: plugins/dbgate-plugin-mysql run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-mongo working-directory: plugins/dbgate-plugin-mongo run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-postgres working-directory: plugins/dbgate-plugin-postgres run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-sqlite working-directory: plugins/dbgate-plugin-sqlite run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-redis working-directory: plugins/dbgate-plugin-redis run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-oracle working-directory: plugins/dbgate-plugin-oracle run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-clickhouse working-directory: plugins/dbgate-plugin-clickhouse run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-dbf working-directory: plugins/dbgate-plugin-dbf run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-cassandra working-directory: plugins/dbgate-plugin-cassandra run: | - npm publish + npm publish --tag "$NPM_TAG" From c1a6daf9d2693c77ced80925f48cb5acfd131977 Mon Sep 17 00:00:00 2001 From: CI workflows Date: Thu, 30 Oct 2025 12:31:14 +0000 Subject: [PATCH 42/79] chore: auto-update github workflows --- .github/workflows/build-npm.yaml | 51 ++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/.github/workflows/build-npm.yaml b/.github/workflows/build-npm.yaml index ad5019cd2..079c25f8a 100644 --- a/.github/workflows/build-npm.yaml +++ b/.github/workflows/build-npm.yaml @@ -37,92 +37,99 @@ jobs: - name: setCurrentVersion run: | yarn setCurrentVersion + - name: Compute npm dist-tag + run: | + if [[ "${GITHUB_REF_NAME}" =~ -alpha\. ]]; then + echo "NPM_TAG=alpha" >> $GITHUB_ENV + else + echo "NPM_TAG=latest" >> $GITHUB_ENV + fi - name: Publish types working-directory: packages/types run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish tools working-directory: packages/tools run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish sqltree working-directory: packages/sqltree run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish api working-directory: packages/api run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish datalib working-directory: packages/datalib run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish filterparser working-directory: packages/filterparser run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish web working-directory: packages/web run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-serve working-directory: packages/serve run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbmodel working-directory: packages/dbmodel run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-csv working-directory: plugins/dbgate-plugin-csv run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-xml working-directory: plugins/dbgate-plugin-xml run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-excel working-directory: plugins/dbgate-plugin-excel run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-mssql working-directory: plugins/dbgate-plugin-mssql run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-mysql working-directory: plugins/dbgate-plugin-mysql run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-mongo working-directory: plugins/dbgate-plugin-mongo run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-postgres working-directory: plugins/dbgate-plugin-postgres run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-sqlite working-directory: plugins/dbgate-plugin-sqlite run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-redis working-directory: plugins/dbgate-plugin-redis run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-oracle working-directory: plugins/dbgate-plugin-oracle run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-clickhouse working-directory: plugins/dbgate-plugin-clickhouse run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-dbf working-directory: plugins/dbgate-plugin-dbf run: | - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-cassandra working-directory: plugins/dbgate-plugin-cassandra run: | - npm publish + npm publish --tag "$NPM_TAG" From 363a72c3adacb6da60017fdd7677e22fb0fd5e32 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 13:31:42 +0100 Subject: [PATCH 43/79] v6.6.8-alpha.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb3bbbbac..770d24485 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-alpha.4", + "version": "6.6.8-alpha.5", "name": "dbgate-all", "workspaces": [ "packages/*", From 530b830586b50e44699f8cb7caab0c532465e65f Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 13:41:24 +0100 Subject: [PATCH 44/79] fixed repo --- packages/datalib/package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/datalib/package.json b/packages/datalib/package.json index b82b4585a..12b52917e 100644 --- a/packages/datalib/package.json +++ b/packages/datalib/package.json @@ -3,6 +3,10 @@ "name": "dbgate-datalib", "main": "lib/index.js", "typings": "lib/index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/dbgate/dbgate.git" + }, "scripts": { "build": "tsc", "test": "jest", From a1724134ec9a485722ac75a426e004eda0055944 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 13:41:53 +0100 Subject: [PATCH 45/79] v6.6.8-alpha.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 770d24485..abd4df0d6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-alpha.5", + "version": "6.6.8-alpha.6", "name": "dbgate-all", "workspaces": [ "packages/*", From c0acecc6e9630c117caa49223301b2690b3f5fff Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 13:48:44 +0100 Subject: [PATCH 46/79] git repo config --- packages/filterparser/package.json | 4 ++++ packages/web/package.json | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/filterparser/package.json b/packages/filterparser/package.json index 1f3d32570..94dd86ef2 100644 --- a/packages/filterparser/package.json +++ b/packages/filterparser/package.json @@ -3,6 +3,10 @@ "name": "dbgate-filterparser", "main": "lib/index.js", "typings": "lib/index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/dbgate/dbgate.git" + }, "scripts": { "build": "tsc", "start": "tsc --watch", diff --git a/packages/web/package.json b/packages/web/package.json index c36891158..6c4c99198 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -9,6 +9,10 @@ "build:index": "node build-index.js", "prepublishOnly": "yarn build" }, + "repository": { + "type": "git", + "url": "https://github.com/dbgate/dbgate.git" + }, "files": [ "public" ], From e38676415145d05cf9ab3961b194ae978456109b Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 14:08:48 +0100 Subject: [PATCH 47/79] npm publish fix --- workflow-templates/build-npm-pro.yaml | 39 ++++++++++++++++++--------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/workflow-templates/build-npm-pro.yaml b/workflow-templates/build-npm-pro.yaml index 09110cd31..ddd73729f 100644 --- a/workflow-templates/build-npm-pro.yaml +++ b/workflow-templates/build-npm-pro.yaml @@ -8,6 +8,10 @@ on: - 'v[0-9]+.[0-9]+.[0-9]+' - 'v[0-9]+.[0-9]+.[0-9]+-alpha.[0-9]+' +permissions: + id-token: write + contents: write + # on: # push: # branches: @@ -43,13 +47,17 @@ jobs: cd dbgate-merged node adjustNpmPackageJsonPremium - - name: Configure NPM token - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: | - cd .. - cd dbgate-merged - npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" + # - name: Configure NPM token + # env: + # NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + # run: | + # cd .. + # cd dbgate-merged + # npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" + + # Ensure npm 11.5.1 or later is installed + - name: Update npm + run: npm install -g npm@latest - name: Remove dbmodel - should be not published run: | @@ -69,33 +77,40 @@ jobs: cd dbgate-merged yarn setCurrentVersion + - name: Compute npm dist-tag + run: | + if [[ "${GITHUB_REF_NAME}" =~ -alpha\. ]]; then + echo "NPM_TAG=alpha" >> $GITHUB_ENV + else + echo "NPM_TAG=latest" >> $GITHUB_ENV + fi - name: Publish dbgate-api-premium run: | cd .. cd dbgate-merged/packages/api - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-web-premium run: | cd .. cd dbgate-merged/packages/web - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-serve-premium run: | cd .. cd dbgate-merged/packages/serve - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-cosmosdb run: | cd .. cd dbgate-merged/plugins/dbgate-plugin-cosmosdb - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-firestore run: | cd .. cd dbgate-merged/plugins/dbgate-plugin-firestore - npm publish + npm publish --tag "$NPM_TAG" From 8b346c6b441d68b9cf2a4a00057dd886835de0e9 Mon Sep 17 00:00:00 2001 From: CI workflows Date: Thu, 30 Oct 2025 13:09:06 +0000 Subject: [PATCH 48/79] chore: auto-update github workflows --- .github/workflows/build-npm-pro.yaml | 29 ++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-npm-pro.yaml b/.github/workflows/build-npm-pro.yaml index 054be0c9c..c0e532861 100644 --- a/.github/workflows/build-npm-pro.yaml +++ b/.github/workflows/build-npm-pro.yaml @@ -7,6 +7,9 @@ name: NPM packages PREMIUM tags: - v[0-9]+.[0-9]+.[0-9]+ - v[0-9]+.[0-9]+.[0-9]+-alpha.[0-9]+ +permissions: + id-token: write + contents: write jobs: build: runs-on: ${{ matrix.os }} @@ -49,13 +52,8 @@ jobs: cd .. cd dbgate-merged node adjustNpmPackageJsonPremium - - name: Configure NPM token - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: | - cd .. - cd dbgate-merged - npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" + - name: Update npm + run: npm install -g npm@latest - name: Remove dbmodel - should be not published run: | cd .. @@ -71,28 +69,35 @@ jobs: cd .. cd dbgate-merged yarn setCurrentVersion + - name: Compute npm dist-tag + run: | + if [[ "${GITHUB_REF_NAME}" =~ -alpha\. ]]; then + echo "NPM_TAG=alpha" >> $GITHUB_ENV + else + echo "NPM_TAG=latest" >> $GITHUB_ENV + fi - name: Publish dbgate-api-premium run: | cd .. cd dbgate-merged/packages/api - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-web-premium run: | cd .. cd dbgate-merged/packages/web - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-serve-premium run: | cd .. cd dbgate-merged/packages/serve - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-cosmosdb run: | cd .. cd dbgate-merged/plugins/dbgate-plugin-cosmosdb - npm publish + npm publish --tag "$NPM_TAG" - name: Publish dbgate-plugin-firestore run: | cd .. cd dbgate-merged/plugins/dbgate-plugin-firestore - npm publish + npm publish --tag "$NPM_TAG" From c7f82d3d4667bf7fa8573665a84b46b664859e1c Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 14:08:58 +0100 Subject: [PATCH 49/79] v6.6.8-alpha.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index abd4df0d6..a3a86d04b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-alpha.6", + "version": "6.6.8-alpha.7", "name": "dbgate-all", "workspaces": [ "packages/*", From 599f783c0478820bc1a546444753b8233f1884b5 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 14:10:07 +0100 Subject: [PATCH 50/79] v6.6.8-alpha.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a3a86d04b..57736bc28 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-alpha.7", + "version": "6.6.8-alpha.8", "name": "dbgate-all", "workspaces": [ "packages/*", From 34dfac8bb2f6e8cae432bb291d6fc05515738953 Mon Sep 17 00:00:00 2001 From: CI workflows Date: Thu, 30 Oct 2025 13:18:11 +0000 Subject: [PATCH 51/79] Update pro ref --- workflow-templates/includes.tpl.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow-templates/includes.tpl.yaml b/workflow-templates/includes.tpl.yaml index f5e9ef3a1..3f5086f98 100644 --- a/workflow-templates/includes.tpl.yaml +++ b/workflow-templates/includes.tpl.yaml @@ -7,7 +7,7 @@ checkout-and-merge-pro: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: 11203754aad94189b565c2816d37760b15c8e07f + ref: 6195e103e1d45e4f59bade60df5dd1784f4e6c77 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro From a7ae6d7b47ded6b61e0007730def89fd371f34c6 Mon Sep 17 00:00:00 2001 From: CI workflows Date: Thu, 30 Oct 2025 13:18:30 +0000 Subject: [PATCH 52/79] chore: auto-update github workflows --- .github/workflows/build-app-pro-beta.yaml | 2 +- .github/workflows/build-app-pro.yaml | 2 +- .github/workflows/build-cloud-pro.yaml | 2 +- .github/workflows/build-docker-pro.yaml | 2 +- .github/workflows/build-npm-pro.yaml | 2 +- .github/workflows/e2e-pro.yaml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-app-pro-beta.yaml b/.github/workflows/build-app-pro-beta.yaml index 2ae47f81b..e2d736af7 100644 --- a/.github/workflows/build-app-pro-beta.yaml +++ b/.github/workflows/build-app-pro-beta.yaml @@ -43,7 +43,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: 11203754aad94189b565c2816d37760b15c8e07f + ref: 6195e103e1d45e4f59bade60df5dd1784f4e6c77 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-app-pro.yaml b/.github/workflows/build-app-pro.yaml index a26e343ae..dfb24d278 100644 --- a/.github/workflows/build-app-pro.yaml +++ b/.github/workflows/build-app-pro.yaml @@ -43,7 +43,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: 11203754aad94189b565c2816d37760b15c8e07f + ref: 6195e103e1d45e4f59bade60df5dd1784f4e6c77 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-cloud-pro.yaml b/.github/workflows/build-cloud-pro.yaml index dc5cb248e..d5bdce153 100644 --- a/.github/workflows/build-cloud-pro.yaml +++ b/.github/workflows/build-cloud-pro.yaml @@ -39,7 +39,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: 11203754aad94189b565c2816d37760b15c8e07f + ref: 6195e103e1d45e4f59bade60df5dd1784f4e6c77 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-docker-pro.yaml b/.github/workflows/build-docker-pro.yaml index 519e08fe7..1fd89b418 100644 --- a/.github/workflows/build-docker-pro.yaml +++ b/.github/workflows/build-docker-pro.yaml @@ -44,7 +44,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: 11203754aad94189b565c2816d37760b15c8e07f + ref: 6195e103e1d45e4f59bade60df5dd1784f4e6c77 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-npm-pro.yaml b/.github/workflows/build-npm-pro.yaml index c0e532861..14d6d6991 100644 --- a/.github/workflows/build-npm-pro.yaml +++ b/.github/workflows/build-npm-pro.yaml @@ -35,7 +35,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: 11203754aad94189b565c2816d37760b15c8e07f + ref: 6195e103e1d45e4f59bade60df5dd1784f4e6c77 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/e2e-pro.yaml b/.github/workflows/e2e-pro.yaml index 7df23b243..0849eede4 100644 --- a/.github/workflows/e2e-pro.yaml +++ b/.github/workflows/e2e-pro.yaml @@ -26,7 +26,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: 11203754aad94189b565c2816d37760b15c8e07f + ref: 6195e103e1d45e4f59bade60df5dd1784f4e6c77 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro From dd77ee4a8ed792050365dc66d19d3922503c6229 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 14:18:32 +0100 Subject: [PATCH 53/79] added missing repo info --- plugins/dbgate-plugin-cassandra/package.json | 4 ++++ plugins/dbgate-plugin-clickhouse/package.json | 4 ++++ plugins/dbgate-plugin-oracle/package.json | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/dbgate-plugin-cassandra/package.json b/plugins/dbgate-plugin-cassandra/package.json index d6a916293..9a978e2a3 100644 --- a/plugins/dbgate-plugin-cassandra/package.json +++ b/plugins/dbgate-plugin-cassandra/package.json @@ -5,6 +5,10 @@ "license": "GPL-3.0", "author": "Jan Prochazka", "description": "cassandra connector for DbGate", + "repository": { + "type": "git", + "url": "https://github.com/dbgate/dbgate.git" + }, "keywords": [ "dbgate", "cassandra", diff --git a/plugins/dbgate-plugin-clickhouse/package.json b/plugins/dbgate-plugin-clickhouse/package.json index d4da7b170..badbc0cee 100644 --- a/plugins/dbgate-plugin-clickhouse/package.json +++ b/plugins/dbgate-plugin-clickhouse/package.json @@ -14,6 +14,10 @@ "dist", "icon.svg" ], + "repository": { + "type": "git", + "url": "https://github.com/dbgate/dbgate.git" + }, "scripts": { "build:frontend": "webpack --config webpack-frontend.config", "build:frontend:watch": "webpack --watch --config webpack-frontend.config", diff --git a/plugins/dbgate-plugin-oracle/package.json b/plugins/dbgate-plugin-oracle/package.json index b0d0a26b7..7f3428220 100644 --- a/plugins/dbgate-plugin-oracle/package.json +++ b/plugins/dbgate-plugin-oracle/package.json @@ -7,7 +7,7 @@ "homepage": "https://dbgate.org", "repository": { "type": "git", - "url": "https://github.com/rinie/dbgate-plugin-oracle" + "url": "https://github.com/dbgate/dbgate.git" }, "author": "Rinie Kervel", "keywords": [ From 55fb233ce4f8a9397e0b39d81254619fad833a91 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 14:20:14 +0100 Subject: [PATCH 54/79] v6.6.8-alpha.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 57736bc28..fa210f7d8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-alpha.8", + "version": "6.6.8-alpha.9", "name": "dbgate-all", "workspaces": [ "packages/*", From 901e7581fef7ed4ad8ab06cefecbfded41f76eef Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 30 Oct 2025 14:32:16 +0100 Subject: [PATCH 55/79] v6.6.8-alpha.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fa210f7d8..62addab15 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-alpha.9", + "version": "6.6.8-alpha.10", "name": "dbgate-all", "workspaces": [ "packages/*", From 4b4c2606cdb91a71c546a1a5cf8e34f12541aee5 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 08:19:15 +0100 Subject: [PATCH 56/79] skipped publish --- app/package.json | 2 +- workflow-templates/build-app.tpl.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/package.json b/app/package.json index 8db96276c..32fa1276e 100644 --- a/app/package.json +++ b/app/package.json @@ -117,7 +117,7 @@ "scripts": { "start": "cross-env ELECTRON_START_URL=http://localhost:5001 DEVMODE=1 electron .", "start:local": "cross-env electron .", - "dist": "electron-builder", + "dist": "electron-builder --publish never", "build": "cd ../packages/api && yarn build && cd ../web && yarn build && cd ../../app && yarn dist", "build:local": "cd ../packages/api && yarn build && cd ../web && yarn build && cd ../../app && yarn predist", "postinstall": "yarn rebuild && patch-package", diff --git a/workflow-templates/build-app.tpl.yaml b/workflow-templates/build-app.tpl.yaml index 35aa4049d..750d99d30 100644 --- a/workflow-templates/build-app.tpl.yaml +++ b/workflow-templates/build-app.tpl.yaml @@ -156,8 +156,8 @@ jobs: run: | <> yarn run build:app - env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish + # env: + # GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish - name: Publish MacOS if: matrix.os == 'macos-14' @@ -165,7 +165,7 @@ jobs: <> yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish + # GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} @@ -179,7 +179,7 @@ jobs: <> yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish + # GH_TOKEN: ${{ secrets.GH_TOKEN }} # token for electron publish SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} - name: generatePadFile From a501f0cdefe84922f3c0f8fdeca0ec86603f1ac2 Mon Sep 17 00:00:00 2001 From: CI workflows Date: Fri, 31 Oct 2025 07:19:48 +0000 Subject: [PATCH 57/79] chore: auto-update github workflows --- .github/workflows/build-app-beta.yaml | 4 ---- .github/workflows/build-app-check.yaml | 4 ---- .github/workflows/build-app-pro-beta.yaml | 4 ---- .github/workflows/build-app-pro.yaml | 4 ---- .github/workflows/build-app.yaml | 4 ---- 5 files changed, 20 deletions(-) diff --git a/.github/workflows/build-app-beta.yaml b/.github/workflows/build-app-beta.yaml index d9003cafa..b3fdaf413 100644 --- a/.github/workflows/build-app-beta.yaml +++ b/.github/workflows/build-app-beta.yaml @@ -69,15 +69,12 @@ jobs: run: | yarn run build:app - env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} - name: Publish MacOS if: matrix.os == 'macos-14' run: | yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} @@ -90,7 +87,6 @@ jobs: yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} - name: Azure login (OIDC) uses: azure/login@v2 diff --git a/.github/workflows/build-app-check.yaml b/.github/workflows/build-app-check.yaml index 112dca034..f0e43b064 100644 --- a/.github/workflows/build-app-check.yaml +++ b/.github/workflows/build-app-check.yaml @@ -65,15 +65,12 @@ jobs: run: | yarn run build:app - env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} - name: Publish MacOS if: matrix.os == 'macos-14' run: | yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} @@ -86,7 +83,6 @@ jobs: yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} - name: Azure login (OIDC) uses: azure/login@v2 diff --git a/.github/workflows/build-app-pro-beta.yaml b/.github/workflows/build-app-pro-beta.yaml index e2d736af7..1e695829f 100644 --- a/.github/workflows/build-app-pro-beta.yaml +++ b/.github/workflows/build-app-pro-beta.yaml @@ -98,8 +98,6 @@ jobs: cd dbgate-merged yarn run build:app - env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} - name: Publish MacOS if: matrix.os == 'macos-14' run: | @@ -108,7 +106,6 @@ jobs: yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} @@ -123,7 +120,6 @@ jobs: yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} - name: Azure login (OIDC) uses: azure/login@v2 diff --git a/.github/workflows/build-app-pro.yaml b/.github/workflows/build-app-pro.yaml index dfb24d278..62adba165 100644 --- a/.github/workflows/build-app-pro.yaml +++ b/.github/workflows/build-app-pro.yaml @@ -98,8 +98,6 @@ jobs: cd dbgate-merged yarn run build:app - env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} - name: Publish MacOS if: matrix.os == 'macos-14' run: | @@ -108,7 +106,6 @@ jobs: yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} @@ -123,7 +120,6 @@ jobs: yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} - name: Azure login (OIDC) uses: azure/login@v2 diff --git a/.github/workflows/build-app.yaml b/.github/workflows/build-app.yaml index 00cb951c5..0761e9b7c 100644 --- a/.github/workflows/build-app.yaml +++ b/.github/workflows/build-app.yaml @@ -65,15 +65,12 @@ jobs: run: | yarn run build:app - env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} - name: Publish MacOS if: matrix.os == 'macos-14' run: | yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} CSC_LINK: ${{ secrets.APPLECERT_CERTIFICATE }} CSC_KEY_PASSWORD: ${{ secrets.APPLECERT_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} @@ -86,7 +83,6 @@ jobs: yarn run build:app env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} SNAPCRAFT_STORE_CREDENTIALS: ${{secrets.SNAPCRAFT_LOGIN}} - name: generatePadFile run: | From 5c7ab3793f8be8ba8a3fe991f8e444a20c9162c9 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 08:21:42 +0100 Subject: [PATCH 58/79] v6.6.8-beta.13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 62addab15..52aae3440 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-alpha.10", + "version": "6.6.8-beta.13", "name": "dbgate-all", "workspaces": [ "packages/*", From 15e475873e8dad756deb345ba7b63e5a3bc1fd93 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 10:49:37 +0100 Subject: [PATCH 59/79] v6.8.8-beta.14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 52aae3440..24d09866a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-beta.13", + "version": "6.8.8-beta.14", "name": "dbgate-all", "workspaces": [ "packages/*", From 151665c880702854e6ed190d440ceeec57e75b14 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 14:00:23 +0100 Subject: [PATCH 60/79] pragmatic hack - fix yaml hashes for windows --- common/fixYamlHashes.js | 110 ++++++++++++++++++++++++++ package.json | 1 + workflow-templates/build-app.tpl.yaml | 5 ++ 3 files changed, 116 insertions(+) create mode 100644 common/fixYamlHashes.js diff --git a/common/fixYamlHashes.js b/common/fixYamlHashes.js new file mode 100644 index 000000000..bf317ef23 --- /dev/null +++ b/common/fixYamlHashes.js @@ -0,0 +1,110 @@ +import fs from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import path from 'node:path'; +import process from 'node:process'; +import { fileURLToPath } from 'node:url'; +import YAML from 'yaml'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +async function sha512Base64(filePath) { + const buf = await fs.readFile(filePath); + const h = createHash('sha512'); + h.update(buf); + return h.digest('base64'); +} + +async function fileSize(filePath) { + const st = await fs.stat(filePath); + return st.size; +} + +async function fixOneYaml(ymlPath, distDir) { + let raw; + try { + raw = await fs.readFile(ymlPath, 'utf8'); + } catch (e) { + console.error(`✗ Cannot read ${ymlPath}:`, e.message); + return; + } + + let doc; + try { + doc = YAML.parse(raw); + } catch (e) { + console.error(`✗ Cannot parse YAML ${ymlPath}:`, e.message); + return; + } + + if (!doc || !Array.isArray(doc.files)) { + console.warn(`! ${path.basename(ymlPath)} has no 'files' array — skipped.`); + return; + } + + let changed = false; + + // Update each files[i].sha512 and files[i].size based on files[i].url + for (const entry of doc.files) { + if (!entry?.url) continue; + + const target = path.resolve(distDir, entry.url); + try { + const [hash, size] = await Promise.all([sha512Base64(target), fileSize(target)]); + if (entry.sha512 !== hash || entry.size !== size) { + console.log(`• ${path.basename(ymlPath)}: refresh ${entry.url}`); + entry.sha512 = hash; + entry.size = size; + changed = true; + } + } catch (e) { + console.warn( + `! Missing or unreadable file for ${entry.url} (referenced by ${path.basename(ymlPath)}): ${e.message}` + ); + } + } + + // Update top-level sha512 for the primary "path" file if present + if (doc.path) { + const primary = path.resolve(distDir, doc.path); + try { + const hash = await sha512Base64(primary); + if (doc.sha512 !== hash) { + console.log(`• ${path.basename(ymlPath)}: refresh top-level sha512 for path=${doc.path}`); + doc.sha512 = hash; + changed = true; + } + } catch (e) { + console.warn(`! Primary 'path' file not found for ${path.basename(ymlPath)}: ${doc.path} (${e.message})`); + } + } + + if (changed) { + const out = YAML.stringify(doc); + await fs.writeFile(ymlPath, out, 'utf8'); + console.log(`✓ Updated ${path.basename(ymlPath)}`); + } else { + console.log(`= No changes for ${path.basename(ymlPath)}`); + } +} + +async function main() { + const distDir = path.resolve(process.argv[2] ?? path.join(__dirname, '..', 'app', 'dist')); + const entries = await fs.readdir(distDir); + const ymls = entries.filter(f => f.toLowerCase().endsWith('.yml')); + + if (ymls.length === 0) { + console.warn(`No .yml files found in ${distDir}`); + return; + } + + console.log(`Scanning ${distDir}`); + for (const y of ymls) { + await fixOneYaml(path.join(distDir, y), distDir); + } +} + +main().catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/package.json b/package.json index 24d09866a..fe0d62ab2 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "generatePadFile": "node generatePadFile", "fillPackagedPlugins": "node fillPackagedPlugins", "resetPackagedPlugins": "node resetPackagedPlugins", + "fixYmlHashes": "cd common && yarn init -y && yarn add yaml -W && cd .. && node common/fixYmlHashes.js app/dist", "prettier": "prettier --write packages/api/src && prettier --write packages/datalib/src && prettier --write packages/filterparser/src && prettier --write packages/sqltree/src && prettier --write packages/tools/src && prettier --write packages/types && prettier --write packages/web/src && prettier --write app/src", "copy:docker:build": "copyfiles packages/api/dist/* docker -f && copyfiles packages/web/public/* docker -u 2 && copyfiles \"packages/web/public/**/*\" docker -u 2 && copyfiles \"plugins/dist/**/*\" docker/plugins -u 2", "copy:packer:build": "copyfiles packages/api/dist/* packer/build -f && copyfiles packages/web/public/* packer/build -u 2 && copyfiles \"packages/web/public/**/*\" packer/build -u 2 && copyfiles \"plugins/dist/**/*\" packer/build/plugins -u 2 && copyfiles packer/install-packages.sh packer/build -f && yarn install:drivers:packer", diff --git a/workflow-templates/build-app.tpl.yaml b/workflow-templates/build-app.tpl.yaml index 750d99d30..e4b9025ac 100644 --- a/workflow-templates/build-app.tpl.yaml +++ b/workflow-templates/build-app.tpl.yaml @@ -209,6 +209,11 @@ jobs: timestamp-rfc3161: http://timestamp.acs.microsoft.com timestamp-digest: SHA256 + - name: Fix YML hashes + if: matrix.os == 'windows-2022' + run: | + yarn run fixYmlHashes + - name: Copy artifacts run: | mkdir artifacts From 63665e6e9ccaf43391709698881b9eaf3fde9dbd Mon Sep 17 00:00:00 2001 From: CI workflows Date: Fri, 31 Oct 2025 13:00:53 +0000 Subject: [PATCH 61/79] chore: auto-update github workflows --- .github/workflows/build-app-beta.yaml | 4 ++++ .github/workflows/build-app-check.yaml | 4 ++++ .github/workflows/build-app-pro-beta.yaml | 4 ++++ .github/workflows/build-app-pro.yaml | 4 ++++ .github/workflows/build-app.yaml | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/.github/workflows/build-app-beta.yaml b/.github/workflows/build-app-beta.yaml index b3fdaf413..1b1b60bb6 100644 --- a/.github/workflows/build-app-beta.yaml +++ b/.github/workflows/build-app-beta.yaml @@ -106,6 +106,10 @@ jobs: files-folder-filter: exe timestamp-rfc3161: http://timestamp.acs.microsoft.com timestamp-digest: SHA256 + - name: Fix YML hashes + if: matrix.os == 'windows-2022' + run: | + yarn run fixYmlHashes - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app-check.yaml b/.github/workflows/build-app-check.yaml index f0e43b064..c978302b5 100644 --- a/.github/workflows/build-app-check.yaml +++ b/.github/workflows/build-app-check.yaml @@ -102,6 +102,10 @@ jobs: files-folder-filter: exe timestamp-rfc3161: http://timestamp.acs.microsoft.com timestamp-digest: SHA256 + - name: Fix YML hashes + if: matrix.os == 'windows-2022' + run: | + yarn run fixYmlHashes - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app-pro-beta.yaml b/.github/workflows/build-app-pro-beta.yaml index 1e695829f..1f1fb0798 100644 --- a/.github/workflows/build-app-pro-beta.yaml +++ b/.github/workflows/build-app-pro-beta.yaml @@ -139,6 +139,10 @@ jobs: files-folder-filter: exe timestamp-rfc3161: http://timestamp.acs.microsoft.com timestamp-digest: SHA256 + - name: Fix YML hashes + if: matrix.os == 'windows-2022' + run: | + yarn run fixYmlHashes - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app-pro.yaml b/.github/workflows/build-app-pro.yaml index 62adba165..c8f31b6a2 100644 --- a/.github/workflows/build-app-pro.yaml +++ b/.github/workflows/build-app-pro.yaml @@ -139,6 +139,10 @@ jobs: files-folder-filter: exe timestamp-rfc3161: http://timestamp.acs.microsoft.com timestamp-digest: SHA256 + - name: Fix YML hashes + if: matrix.os == 'windows-2022' + run: | + yarn run fixYmlHashes - name: Copy artifacts run: | mkdir artifacts diff --git a/.github/workflows/build-app.yaml b/.github/workflows/build-app.yaml index 0761e9b7c..08c9460f9 100644 --- a/.github/workflows/build-app.yaml +++ b/.github/workflows/build-app.yaml @@ -105,6 +105,10 @@ jobs: files-folder-filter: exe timestamp-rfc3161: http://timestamp.acs.microsoft.com timestamp-digest: SHA256 + - name: Fix YML hashes + if: matrix.os == 'windows-2022' + run: | + yarn run fixYmlHashes - name: Copy artifacts run: | mkdir artifacts From 45484a43f18fa929dcd215fa1bf46fad52992f24 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 14:00:50 +0100 Subject: [PATCH 62/79] v6.6.8-beta.17 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fe0d62ab2..1e60f9283 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.8.8-beta.14", + "version": "6.6.8-beta.17", "name": "dbgate-all", "workspaces": [ "packages/*", From 8f9a78feb986391e530f4b2335000812ce502e7b Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 14:01:57 +0100 Subject: [PATCH 63/79] v6.6.8-beta.18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1e60f9283..f906d321f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-beta.17", + "version": "6.6.8-beta.18", "name": "dbgate-all", "workspaces": [ "packages/*", From aca4cc0ace051650d5337e25be25d5ab0ad31506 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 14:37:57 +0100 Subject: [PATCH 64/79] fix --- CHANGELOG.md | 4 ++++ common/{fixYamlHashes.js => fixYmlHashes.js} | 0 2 files changed, 4 insertions(+) rename common/{fixYamlHashes.js => fixYmlHashes.js} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5342aa98..f70aa0c0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ Builds: - linux - application for linux - win - application for Windows +## 6.6.8 +- CHANGED: Windows executable now uses Azure trusted signing certificate +- CHANGED: NPM packages now use GitHub OIDC provenance signing for better security + ## 6.6.6 - ADDED: Allow disable/re-enable filter #1174 - ADDED: Close right side tabs #1219 diff --git a/common/fixYamlHashes.js b/common/fixYmlHashes.js similarity index 100% rename from common/fixYamlHashes.js rename to common/fixYmlHashes.js From 1d52cde3b39882579edfc5fba376cfb8b6475daf Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 14:38:07 +0100 Subject: [PATCH 65/79] v6.6.8-beta.19 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f906d321f..b1f7637f1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-beta.18", + "version": "6.6.8-beta.19", "name": "dbgate-all", "workspaces": [ "packages/*", From b19fed41ef139609e6cd9cd5ad2eb4faf502789e Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 15:20:51 +0100 Subject: [PATCH 66/79] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f70aa0c0d..d9eadcdeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Builds: ## 6.6.8 - CHANGED: Windows executable now uses Azure trusted signing certificate - CHANGED: NPM packages now use GitHub OIDC provenance signing for better security +- CHANGED: Some features moved to Premium edition (master/detail views, FK lookups, column expansion, split view, advanced export/import, data archives, grouping, macros) ## 6.6.6 - ADDED: Allow disable/re-enable filter #1174 From 52d2eb3f5966c0a0dbb2cc39bc42bdeda0f20ae0 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 15:22:13 +0100 Subject: [PATCH 67/79] v6.6.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b1f7637f1..d0d642cbf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8-beta.19", + "version": "6.6.8", "name": "dbgate-all", "workspaces": [ "packages/*", From a7703ec99654727b0e7c71b0e8375f59725239cf Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 16:04:46 +0100 Subject: [PATCH 68/79] fix build --- workflow-templates/build-app.tpl.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow-templates/build-app.tpl.yaml b/workflow-templates/build-app.tpl.yaml index e4b9025ac..beae0c799 100644 --- a/workflow-templates/build-app.tpl.yaml +++ b/workflow-templates/build-app.tpl.yaml @@ -203,7 +203,7 @@ jobs: trusted-signing-account-name: DbGate certificate-profile-name: DbGate-Release - files-folder: app/dist + files-folder: <> files-folder-filter: exe timestamp-rfc3161: http://timestamp.acs.microsoft.com @@ -212,6 +212,7 @@ jobs: - name: Fix YML hashes if: matrix.os == 'windows-2022' run: | + <> yarn run fixYmlHashes - name: Copy artifacts From 986c1a7bc8ebd75e9ef6ce3daf6d1bc4e445fc51 Mon Sep 17 00:00:00 2001 From: CI workflows Date: Fri, 31 Oct 2025 15:05:12 +0000 Subject: [PATCH 69/79] chore: auto-update github workflows --- .github/workflows/build-app-beta.yaml | 1 + .github/workflows/build-app-check.yaml | 1 + .github/workflows/build-app-pro-beta.yaml | 5 ++++- .github/workflows/build-app-pro.yaml | 5 ++++- .github/workflows/build-app.yaml | 1 + 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-app-beta.yaml b/.github/workflows/build-app-beta.yaml index 1b1b60bb6..e5948beb2 100644 --- a/.github/workflows/build-app-beta.yaml +++ b/.github/workflows/build-app-beta.yaml @@ -109,6 +109,7 @@ jobs: - name: Fix YML hashes if: matrix.os == 'windows-2022' run: | + yarn run fixYmlHashes - name: Copy artifacts run: | diff --git a/.github/workflows/build-app-check.yaml b/.github/workflows/build-app-check.yaml index c978302b5..173a21fad 100644 --- a/.github/workflows/build-app-check.yaml +++ b/.github/workflows/build-app-check.yaml @@ -105,6 +105,7 @@ jobs: - name: Fix YML hashes if: matrix.os == 'windows-2022' run: | + yarn run fixYmlHashes - name: Copy artifacts run: | diff --git a/.github/workflows/build-app-pro-beta.yaml b/.github/workflows/build-app-pro-beta.yaml index 1f1fb0798..ab87a8b0d 100644 --- a/.github/workflows/build-app-pro-beta.yaml +++ b/.github/workflows/build-app-pro-beta.yaml @@ -135,13 +135,16 @@ jobs: endpoint: https://wus3.codesigning.azure.net/ trusted-signing-account-name: DbGate certificate-profile-name: DbGate-Release - files-folder: app/dist + files-folder: ../dbgate-merged/app/dist files-folder-filter: exe timestamp-rfc3161: http://timestamp.acs.microsoft.com timestamp-digest: SHA256 - name: Fix YML hashes if: matrix.os == 'windows-2022' run: | + cd .. + cd dbgate-merged + yarn run fixYmlHashes - name: Copy artifacts run: | diff --git a/.github/workflows/build-app-pro.yaml b/.github/workflows/build-app-pro.yaml index c8f31b6a2..9e5f06d81 100644 --- a/.github/workflows/build-app-pro.yaml +++ b/.github/workflows/build-app-pro.yaml @@ -135,13 +135,16 @@ jobs: endpoint: https://wus3.codesigning.azure.net/ trusted-signing-account-name: DbGate certificate-profile-name: DbGate-Release - files-folder: app/dist + files-folder: ../dbgate-merged/app/dist files-folder-filter: exe timestamp-rfc3161: http://timestamp.acs.microsoft.com timestamp-digest: SHA256 - name: Fix YML hashes if: matrix.os == 'windows-2022' run: | + cd .. + cd dbgate-merged + yarn run fixYmlHashes - name: Copy artifacts run: | diff --git a/.github/workflows/build-app.yaml b/.github/workflows/build-app.yaml index 08c9460f9..212f72a2b 100644 --- a/.github/workflows/build-app.yaml +++ b/.github/workflows/build-app.yaml @@ -108,6 +108,7 @@ jobs: - name: Fix YML hashes if: matrix.os == 'windows-2022' run: | + yarn run fixYmlHashes - name: Copy artifacts run: | From 6cd3242454ea93ad940c23fe3d579593344ed58c Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 16:05:43 +0100 Subject: [PATCH 70/79] v6.6.9-premium-beta.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d0d642cbf..bad100a8c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.8", + "version": "6.6.9-premium-beta.1", "name": "dbgate-all", "workspaces": [ "packages/*", From 08410ef2099825b07e98c6a4e1f0b1a48bba960c Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 31 Oct 2025 16:32:37 +0100 Subject: [PATCH 71/79] v6.6.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bad100a8c..c5a96e6a2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "6.6.9-premium-beta.1", + "version": "6.6.9", "name": "dbgate-all", "workspaces": [ "packages/*", From fd4cc6a1e8e0364657d06ebfe710ac4e074c5d49 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 3 Nov 2025 15:44:57 +0100 Subject: [PATCH 72/79] #1235 ability to load CSV files --- plugins/dbgate-plugin-mysql/src/backend/drivers.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/dbgate-plugin-mysql/src/backend/drivers.js b/plugins/dbgate-plugin-mysql/src/backend/drivers.js index f684e0b84..1f1494bad 100644 --- a/plugins/dbgate-plugin-mysql/src/backend/drivers.js +++ b/plugins/dbgate-plugin-mysql/src/backend/drivers.js @@ -3,6 +3,7 @@ const stream = require('stream'); const driverBases = require('../frontend/drivers'); const Analyser = require('./Analyser'); const mysql2 = require('mysql2'); +const fs = require('fs'); const { getLogger, createBulkInsertStreamBase, makeUniqueColumnNames, extractErrorLogData } = global.DBGATE_PACKAGES['dbgate-tools']; @@ -53,6 +54,7 @@ const drivers = driverBases.map(driverBase => ({ supportBigNumbers: true, bigNumberStrings: true, dateStrings: true, + infileStreamFactory: path => fs.createReadStream(path), // TODO: test following options // multipleStatements: true, }; From 0919f4c85b0407ad5e4208c8404f99a3470aa91c Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 3 Nov 2025 16:30:56 +0100 Subject: [PATCH 73/79] FEAT: column name collision resolving #1234 (MySQL)) --- packages/tools/src/nameTools.ts | 14 ++++++++++++++ plugins/dbgate-plugin-mysql/src/backend/drivers.js | 1 + 2 files changed, 15 insertions(+) diff --git a/packages/tools/src/nameTools.ts b/packages/tools/src/nameTools.ts index b63922ac9..346d86a85 100644 --- a/packages/tools/src/nameTools.ts +++ b/packages/tools/src/nameTools.ts @@ -1,4 +1,5 @@ import _cloneDeep from 'lodash/cloneDeep'; +import _uniq from 'lodash/uniq'; import _isString from 'lodash/isString'; import type { ColumnInfo, @@ -77,7 +78,20 @@ export function findForeignKeyForColumn(table: TableInfo, column: ColumnInfo | s export function makeUniqueColumnNames(res: ColumnInfo[]) { const usedNames = new Set(); + const conflictingNames = new Set( + _uniq(res.map(x => x.columnName).filter((item, index, arr) => arr.indexOf(item) !== index)) + ); for (let i = 0; i < res.length; i++) { + if ( + conflictingNames.has(res[i].columnName) && + res[i].pureName && + !usedNames.has(`${res[i].pureName}_${res[i].columnName}`) + ) { + res[i].columnName = `${res[i].pureName}_${res[i].columnName}`; + usedNames.add(res[i].columnName); + continue; + } + if (usedNames.has(res[i].columnName)) { let suffix = 2; while (usedNames.has(`${res[i].columnName}${suffix}`)) suffix++; diff --git a/plugins/dbgate-plugin-mysql/src/backend/drivers.js b/plugins/dbgate-plugin-mysql/src/backend/drivers.js index 1f1494bad..2db777679 100644 --- a/plugins/dbgate-plugin-mysql/src/backend/drivers.js +++ b/plugins/dbgate-plugin-mysql/src/backend/drivers.js @@ -15,6 +15,7 @@ function extractColumns(fields) { if (fields) { const res = fields.map(col => ({ columnName: col.name, + pureName: col.orgTable, })); makeUniqueColumnNames(res); return res; From a324cf0fcd872c15b5f2aefe831f2b22245934e4 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 3 Nov 2025 16:56:58 +0100 Subject: [PATCH 74/79] Column name collision resolving #1234 for postgres - commented out (not working) --- packages/tools/src/nameTools.ts | 11 ++++++++--- .../src/backend/drivers.js | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/tools/src/nameTools.ts b/packages/tools/src/nameTools.ts index 346d86a85..e9bf3c26d 100644 --- a/packages/tools/src/nameTools.ts +++ b/packages/tools/src/nameTools.ts @@ -76,11 +76,16 @@ export function findForeignKeyForColumn(table: TableInfo, column: ColumnInfo | s return (table.foreignKeys || []).find(fk => fk.columns.find(col => col.columnName == column.columnName)); } +export function getConflictingColumnNames(columns: ColumnInfo[]): Set { + const conflictingNames = new Set( + _uniq(columns.map(x => x.columnName).filter((item, index, arr) => arr.indexOf(item) !== index)) + ); + return conflictingNames; +} + export function makeUniqueColumnNames(res: ColumnInfo[]) { const usedNames = new Set(); - const conflictingNames = new Set( - _uniq(res.map(x => x.columnName).filter((item, index, arr) => arr.indexOf(item) !== index)) - ); + const conflictingNames = getConflictingColumnNames(res); for (let i = 0; i < res.length; i++) { if ( conflictingNames.has(res[i].columnName) && diff --git a/plugins/dbgate-plugin-postgres/src/backend/drivers.js b/plugins/dbgate-plugin-postgres/src/backend/drivers.js index bf75c1518..4e079f3ea 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/drivers.js +++ b/plugins/dbgate-plugin-postgres/src/backend/drivers.js @@ -13,6 +13,7 @@ const { makeUniqueColumnNames, extractDbNameFromComposite, extractErrorLogData, + getConflictingColumnNames, } = global.DBGATE_PACKAGES['dbgate-tools']; let authProxy; @@ -60,7 +61,23 @@ function extractPostgresColumns(result, dbhan) { columnName: fld.name, dataTypeId: fld.dataTypeID, dataTypeName: typeIdToName[fld.dataTypeID], + tableId: fld.tableID, })); + + // const conflictingNames = getConflictingColumnNames(res); + // if (conflictingNames.size > 0) { + // const requiredTableIds = res.filter(x => conflictingNames.has(x.columnName)).map(x => x.tableId); + // const tableIdResult = await dbhan.client.query( + // `SELECT DISTINCT c.oid AS table_id, c.relname AS table_name + // FROM pg_class c + // WHERE c.oid IN (${requiredTableIds.join(',')})` + // ); + // const tableIdToTableName = _.fromPairs(tableIdResult.rows.map(cur => [cur.table_id, cur.table_name])); + // for (const col of res) { + // col.pureName = tableIdToTableName[col.tableId]; + // } + // } + makeUniqueColumnNames(res); return res; } From a7cfe7fe04df007bcc26d93d7361ce68822817b3 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 4 Nov 2025 08:27:36 +0100 Subject: [PATCH 75/79] fixed possible render error --- packages/datalib/src/TableGridDisplay.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/datalib/src/TableGridDisplay.ts b/packages/datalib/src/TableGridDisplay.ts index 9adbc7a5b..2aadcd9bd 100644 --- a/packages/datalib/src/TableGridDisplay.ts +++ b/packages/datalib/src/TableGridDisplay.ts @@ -103,11 +103,11 @@ export class TableGridDisplay extends GridDisplay { isChecked: this.isColumnChecked(col), hintColumnNames: this.getFkDictionaryDescription(col.isForeignKeyUnique ? col.foreignKey : null)?.columns?.map(columnName => - shortenIdentifier(`hint_${col.uniqueName}_${columnName}`, this.driver.dialect.maxIdentifierLength) + shortenIdentifier(`hint_${col.uniqueName}_${columnName}`, this.driver?.dialect?.maxIdentifierLength) ) || null, hintColumnDelimiter: this.getFkDictionaryDescription(col.isForeignKeyUnique ? col.foreignKey : null) ?.delimiter, - uniqueNameShorten: shortenIdentifier(col.uniqueName, this.driver.dialect.maxIdentifierLength), + uniqueNameShorten: shortenIdentifier(col.uniqueName, this.driver?.dialect?.maxIdentifierLength), isExpandable: !!col.foreignKey, })) || [] ); @@ -118,7 +118,7 @@ export class TableGridDisplay extends GridDisplay { if (this.isExpandedColumn(column.uniqueName)) { const table = this.getFkTarget(column); if (table) { - const childAlias = shortenIdentifier(`${column.uniqueName}_ref`, this.driver.dialect.maxIdentifierLength); + const childAlias = shortenIdentifier(`${column.uniqueName}_ref`, this.driver?.dialect?.maxIdentifierLength); const subcolumns = this.getDisplayColumns(table, column.uniquePath); this.addReferenceToSelect(select, parentAlias, column); @@ -131,8 +131,8 @@ export class TableGridDisplay extends GridDisplay { } addReferenceToSelect(select: Select, parentAlias: string, column: DisplayColumn) { - const childAlias = shortenIdentifier(`${column.uniqueName}_ref`, this.driver.dialect.maxIdentifierLength); if ((select.from.relations || []).find(x => x.alias == childAlias)) return; + const childAlias = shortenIdentifier(`${column.uniqueName}_ref`, this.driver?.dialect?.maxIdentifierLength); const table = this.getFkTarget(column); if (table && table.primaryKey) { select.from.relations = [ @@ -196,11 +196,11 @@ export class TableGridDisplay extends GridDisplay { this.addReferenceToSelect( select, parentUniqueName - ? shortenIdentifier(`${parentUniqueName}_ref`, this.driver.dialect.maxIdentifierLength) + ? shortenIdentifier(`${parentUniqueName}_ref`, this.driver?.dialect?.maxIdentifierLength) : 'basetbl', column ); - const childAlias = shortenIdentifier(`${column.uniqueName}_ref`, this.driver.dialect.maxIdentifierLength); + const childAlias = shortenIdentifier(`${column.uniqueName}_ref`, this.driver?.dialect?.maxIdentifierLength); select.columns.push( ...hintDescription.columns.map( columnName => @@ -209,7 +209,7 @@ export class TableGridDisplay extends GridDisplay { columnName, alias: shortenIdentifier( `hint_${column.uniqueName}_${columnName}`, - this.driver.dialect.maxIdentifierLength + this.driver?.dialect?.maxIdentifierLength ), source: { alias: childAlias }, } as ColumnRefExpression) From 840e3b861f62226a25bb96efe53bf5c216eef3b5 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 4 Nov 2025 08:29:54 +0100 Subject: [PATCH 76/79] fixed horizontal grid scroll on MacOS #453 --- packages/web/src/datagrid/DataGridCore.svelte | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index df5d6da95..a666fbfc5 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -1413,7 +1413,11 @@ function handleGridWheel(event) { if (event.shiftKey) { - scrollHorizontal(event.deltaY, event.deltaX); + if (isMac()) { + scrollHorizontal(event.deltaX, event.deltaY); + } else { + scrollHorizontal(event.deltaY, event.deltaX); + } } else { scrollHorizontal(event.deltaX, event.deltaY); scrollVertical(event.deltaX, event.deltaY); From af69352361672966378266d7cebbb2b87b0719bf Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Tue, 4 Nov 2025 09:09:01 +0100 Subject: [PATCH 77/79] SYNC: fixed references error --- packages/datalib/src/TableGridDisplay.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/datalib/src/TableGridDisplay.ts b/packages/datalib/src/TableGridDisplay.ts index 2aadcd9bd..1453104a3 100644 --- a/packages/datalib/src/TableGridDisplay.ts +++ b/packages/datalib/src/TableGridDisplay.ts @@ -131,8 +131,8 @@ export class TableGridDisplay extends GridDisplay { } addReferenceToSelect(select: Select, parentAlias: string, column: DisplayColumn) { - if ((select.from.relations || []).find(x => x.alias == childAlias)) return; const childAlias = shortenIdentifier(`${column.uniqueName}_ref`, this.driver?.dialect?.maxIdentifierLength); + if ((select.from.relations || []).find(x => x.alias == childAlias)) return; const table = this.getFkTarget(column); if (table && table.primaryKey) { select.from.relations = [ From 1404685296fe7caa2586dd0e0a7ac91f37d62db0 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Tue, 4 Nov 2025 15:20:21 +0100 Subject: [PATCH 78/79] changing current DB handler for MySQL #1237 --- packages/api/src/controllers/sessions.js | 6 ++++++ packages/api/src/utility/handleQueryStream.js | 5 +++++ packages/types/engines.d.ts | 1 + packages/web/src/tabs/QueryTab.svelte | 13 +++++++++++++ plugins/dbgate-plugin-mysql/src/backend/drivers.js | 3 +++ 5 files changed, 28 insertions(+) diff --git a/packages/api/src/controllers/sessions.js b/packages/api/src/controllers/sessions.js index 14c8a7bed..f05034bb9 100644 --- a/packages/api/src/controllers/sessions.js +++ b/packages/api/src/controllers/sessions.js @@ -97,6 +97,12 @@ module.exports = { socket.emit(`session-initialize-file-${jslid}`); }, + handle_changedCurrentDatabase(sesid, props) { + const { database } = props; + this.dispatchMessage(sesid, `Current database changed to ${database}`); + socket.emit(`session-changedb-${sesid}`, { database }); + }, + handle_ping() {}, create_meta: true, diff --git a/packages/api/src/utility/handleQueryStream.js b/packages/api/src/utility/handleQueryStream.js index 617991ea3..063d9bef4 100644 --- a/packages/api/src/utility/handleQueryStream.js +++ b/packages/api/src/utility/handleQueryStream.js @@ -148,6 +148,7 @@ class StreamHandler { // this.error = this.error.bind(this); this.done = this.done.bind(this); this.info = this.info.bind(this); + this.changedCurrentDatabase = this.changedCurrentDatabase.bind(this); // use this for cancelling - not implemented // this.stream = null; @@ -166,6 +167,10 @@ class StreamHandler { } } + changedCurrentDatabase(database) { + process.send({ msgtype: 'changedCurrentDatabase', database, sesid: this.sesid }); + } + recordset(columns) { if (this.rowsLimitOverflow) { return; diff --git a/packages/types/engines.d.ts b/packages/types/engines.d.ts index 0daf4c172..c583ff88a 100644 --- a/packages/types/engines.d.ts +++ b/packages/types/engines.d.ts @@ -21,6 +21,7 @@ export interface StreamOptions { error?: (error) => void; done?: (result) => void; info?: (info) => void; + changedCurrentDatabase?: (database: string) => void; } export type CollectionOperationInfo = diff --git a/packages/web/src/tabs/QueryTab.svelte b/packages/web/src/tabs/QueryTab.svelte index fd55fee86..1b9ae4374 100644 --- a/packages/web/src/tabs/QueryTab.svelte +++ b/packages/web/src/tabs/QueryTab.svelte @@ -265,9 +265,11 @@ if (sid) { apiOn(`session-done-${sid}`, handleSessionDone); apiOn(`session-closed-${sid}`, handleSessionClosed); + apiOn(`session-changedb-${sid}`, handleChangedDatabase); return () => { apiOff(`session-done-${sid}`, handleSessionDone); apiOff(`session-closed-${sid}`, handleSessionClosed); + apiOff(`session-changedb-${sid}`, handleChangedDatabase); }; } return () => {}; @@ -566,6 +568,17 @@ handleSessionDone(); }; + const handleChangedDatabase = async props => { + changeTab(tabid, tab => ({ + ...tab, + props: { + ...tab.props, + conid, + database: props.database, + }, + })); + }; + const { editorState, editorValue, setEditorData } = useEditorData({ tabid, loadFromArgs: diff --git a/plugins/dbgate-plugin-mysql/src/backend/drivers.js b/plugins/dbgate-plugin-mysql/src/backend/drivers.js index 2db777679..6167b719d 100644 --- a/plugins/dbgate-plugin-mysql/src/backend/drivers.js +++ b/plugins/dbgate-plugin-mysql/src/backend/drivers.js @@ -130,6 +130,9 @@ const drivers = driverBases.map(driverBase => ({ time: new Date(), severity: 'info', }); + if (row.stateChanges?.schema) { + options.changedCurrentDatabase(row.stateChanges.schema); + } } else { if (columns) { options.row(zipDataRow(row, columns)); From 75a1d74d9cd4694474495cabafbf6f952e3d256e Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Tue, 4 Nov 2025 15:39:37 +0100 Subject: [PATCH 79/79] handle changed current database for MS SQL #1237 --- plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js b/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js index ac4fd9e45..88c18f15e 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js +++ b/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js @@ -186,7 +186,11 @@ async function tediousStream(dbhan, sql, options) { severity: 'error', }); }; + const handleDatabaseChange = database => { + options.changedCurrentDatabase(database); + }; + dbhan.client.on('databaseChange', handleDatabaseChange); dbhan.client.on('infoMessage', handleInfo); dbhan.client.on('errorMessage', handleError); const request = new tedious.Request(sql, (err, rowCount) => {