Compare commits

...

21 Commits

Author SHA1 Message Date
Jan Prochazka b75ff99e4c v6.7.2 2025-12-03 13:44:35 +01:00
Jan Prochazka 780dd8ade9 language icon 2025-12-03 13:37:13 +01:00
Jan Prochazka e1c10b7653 v6.7.2-beta.7 2025-12-03 12:57:52 +01:00
Jan Prochazka be9505f8fe SYNC: translations 2025-12-03 11:55:53 +00:00
Jan Prochazka d6bcd4f94f changelog 2025-12-03 12:52:40 +01:00
Jan Prochazka 7d2196f4c3 v6.7.2-premium-beta.6 2025-12-03 12:42:25 +01:00
Jan Prochazka 0539174317 SYNC: fixed e2e test 2025-12-03 11:34:55 +00:00
Jan Prochazka b4b52e12d5 SYNC: try to fix test 2025-12-03 10:13:16 +00:00
CI workflows f2e0b1cfa2 chore: auto-update github workflows 2025-12-03 10:10:08 +00:00
CI workflows 8020e2a263 Update pro ref 2025-12-03 10:09:55 +00:00
Jan Prochazka 6112d9b1b0 SYNC: settings storage changed 2025-12-03 10:09:42 +00:00
CI workflows 0218bb4990 chore: auto-update github workflows 2025-12-03 07:43:56 +00:00
CI workflows 3769c03565 Update pro ref 2025-12-03 07:43:40 +00:00
SPRINX0\prochazka d96cb10476 behaviour settings changed 2025-12-02 18:14:55 +01:00
SPRINX0\prochazka b6b6123434 refresh DB - don't offer incremental analysis when not supported 2025-12-02 18:07:28 +01:00
SPRINX0\prochazka b40877fcc1 fix - don't show update mode in web 2025-12-02 17:59:41 +01:00
SPRINX0\prochazka af5ae29b73 changelog 2025-12-02 17:51:44 +01:00
SPRINX0\prochazka 082fceebbe v6.7.2-premium-beta.5 2025-12-02 17:29:27 +01:00
CI workflows f1dab80a06 chore: auto-update github workflows 2025-12-02 15:10:33 +00:00
CI workflows cbf2fac2cf Update pro ref 2025-12-02 15:10:16 +00:00
Jan Prochazka 4564bd7180 SYNC: Merge pull request #17 from dbgate/feature/settings-test 2025-12-02 15:10:00 +00:00
44 changed files with 489 additions and 317 deletions
+1 -1
View File
@@ -43,7 +43,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: ca69c4857d7d93c4b066018e8a9a0a0ece2300e7
ref: ae1fcf6e61c6f7dfbb21005daa259c68e899a80a
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+1 -1
View File
@@ -43,7 +43,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: ca69c4857d7d93c4b066018e8a9a0a0ece2300e7
ref: ae1fcf6e61c6f7dfbb21005daa259c68e899a80a
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+1 -1
View File
@@ -39,7 +39,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: ca69c4857d7d93c4b066018e8a9a0a0ece2300e7
ref: ae1fcf6e61c6f7dfbb21005daa259c68e899a80a
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+1 -1
View File
@@ -44,7 +44,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: ca69c4857d7d93c4b066018e8a9a0a0ece2300e7
ref: ae1fcf6e61c6f7dfbb21005daa259c68e899a80a
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+1 -1
View File
@@ -35,7 +35,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: ca69c4857d7d93c4b066018e8a9a0a0ece2300e7
ref: ae1fcf6e61c6f7dfbb21005daa259c68e899a80a
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: ca69c4857d7d93c4b066018e8a9a0a0ece2300e7
ref: ae1fcf6e61c6f7dfbb21005daa259c68e899a80a
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro
+9
View File
@@ -8,6 +8,15 @@ Builds:
- linux - application for linux
- win - application for Windows
## 6.7.2 - not released
- CHANGED: Settings modal redesign - now is settings opened in tab instead of modal, similarily as in VSCode
- FIXED: Fixed search in table shortcuts #1273
- CHANGED: Improved foreign key editor UX
- FIXED: Fixed incremental DB structure refresh for PostgreSQL, optimalized slow loading primary keys in PostgreSQL
- CHANGED: You could now choose, how to refresh structure, added ability to disconnect or reconnect
- ADDED: Better processing of table backups, generate table restore script #1274
- CHANGED: Improved storage of settings, especially for Team Premium edition
## 6.7.1
- ADDED: LANGUAGE environment variable for the web version. #1266
- ADDED: New localizations (Italian, Portugese (Brazil), Japanese)
+70
View File
@@ -198,4 +198,74 @@ describe('Charts', () => {
cy.testid('ConfirmModal_okButton').click();
cy.testid('WidgetIconPanel_settings');
});
it('Settings', () => {
cy.testid('WidgetIconPanel_settings').click();
cy.themeshot('app-settings-general');
cy.contains('Behaviour').click();
cy.themeshot('app-settings-behaviour');
cy.get('[data-testid=BehaviourSettings_useTabPreviewMode]').uncheck();
// SQL Editor
cy.contains('SQL Editor').click();
cy.get('[data-testid=SQLEditorSettings_sqlCommandsCase]').select('lowerCase');
cy.contains('MySql-connection').click();
cy.contains('charts_sample').click();
cy.contains('employees').click();
cy.contains('MyChinook').click();
cy.contains('Customer').rightclick();
cy.contains('SQL template').click();
cy.contains('CREATE TABLE').click();
cy.contains('create table');
// Default Actions
cy.testid('WidgetIconPanel_settings').click();
cy.contains('Default Actions').click();
cy.get('[data-testid=DefaultActionsSettings_useLastUsedAction]').uncheck();
// Themes
cy.contains('Themes').click();
cy.themeshot('app-settings-themes');
cy.contains('Dark').click();
cy.get('body').find('.theme-dark').should('exist');
cy.contains('Light').click();
cy.get('body').find('.theme-light').should('exist');
// General
cy.contains(/^General$/).click();
cy.contains('charts_sample');
cy.get('[data-testid=GeneralSettings_lockedDatabaseMode]').check();
cy.contains('Connections').click();
cy.contains('charts_sample').should('not.exist');
// Datagrid
cy.contains('Data grid').click();
cy.get('[data-testid=DataGridSettings_showHintColumns]').uncheck();
cy.wait(500);
cy.contains('Album').click();
cy.contains('AC/DC').should('not.exist');
cy.testid('WidgetIconPanel_settings').click();
cy.contains('Keyboard shortcuts').click();
cy.themeshot('app-settings-keyboard-shortcuts');
cy.contains('Chart').click();
cy.testid('CommandModal_keyboardButton').click();
cy.realPress(['Control', 'g']);
cy.realPress('Enter');
cy.contains('OK').click();
cy.contains('Ctrl+G');
cy.contains('AI').click();
cy.themeshot('app-settings-ai');
cy.get('[data-testid=AISettings_addProviderButton]').click();
cy.contains('Provider 1');
cy.get('[data-testid=AiProviderCard_removeButton]').click();
cy.contains('Are you sure you want to remove Provider 1 provider?');
cy.contains('OK').click();
cy.contains('Provider 1').should('not.exist');
});
});
+2 -1
View File
@@ -210,7 +210,8 @@ describe('Import CSV', () => {
cy.testid('ImportExportConfigurator_tableMappingSection').contains('20 rows written').should('be.visible');
cy.testid('SqlObjectList_refreshButton').click();
cy.contains('Refresh DB structure (incremental)').click();
cy.testid('DatabasStatusMenu_refreshFull').click();
// cy.contains('Refresh DB structure (incremental)').click();
cy.testid('SqlObjectList_container').contains('customers-20').click();
cy.contains('Rows: 20').should('be.visible');
+1 -1
View File
@@ -1,6 +1,6 @@
{
"private": true,
"version": "6.7.2-premium-beta.4",
"version": "6.7.2",
"name": "dbgate-all",
"workspaces": [
"packages/*",
+4 -9
View File
@@ -289,16 +289,11 @@ module.exports = {
const res = await lock.acquire('settings', async () => {
const currentValue = await this.loadSettings();
try {
let updated = currentValue;
let updated = {
...currentValue,
...values,
};
if (process.env.STORAGE_DATABASE) {
updated = {
...currentValue,
..._.mapValues(values, v => {
if (v === true) return 'true';
if (v === false) return 'false';
return v;
}),
};
await storage.writeConfig({
group: 'settings',
config: updated,
+6
View File
@@ -360,6 +360,12 @@ module.exports = {
"columnName": "value",
"dataType": "varchar(1000)",
"notNull": false
},
{
"pureName": "config",
"columnName": "valueType",
"dataType": "varchar(50)",
"notNull": false
}
],
"foreignKeys": [],
+1
View File
@@ -238,6 +238,7 @@ export interface EngineDriver<TClient = any, TDataBase = any> extends FilterBeha
supportsDatabaseRestore?: boolean;
supportsServerSummary?: boolean;
supportsDatabaseProfiler?: boolean;
supportsIncrementalAnalysis?: boolean;
requiresDefaultSortCriteria?: boolean;
profilerFormatterFunction?: string;
profilerTimestampFunction?: string;
@@ -1,10 +1,11 @@
import _ from 'lodash';
import { currentDatabase, getCurrentDatabase } from '../stores';
import { currentDatabase, getCurrentDatabase, getExtensions } from '../stores';
import getElectron from '../utility/getElectron';
import registerCommand from './registerCommand';
import { apiCall } from '../utility/api';
import { getDatabasStatusMenu, switchCurrentDatabase } from '../utility/common';
import { __t } from '../translations';
import { findEngineDriver } from 'dbgate-tools';
registerCommand({
id: 'database.changeState',
@@ -18,7 +19,8 @@ registerCommand({
conid: connection._id,
database: name,
};
const driver = findEngineDriver(connection, getExtensions());
return getDatabasStatusMenu(dbid);
return getDatabasStatusMenu(dbid, driver);
},
});
+4 -7
View File
@@ -40,8 +40,6 @@ import { getSettings } from '../utility/metadataLoaders';
import { isMac, switchCurrentDatabase } from '../utility/common';
import { doLogout } from '../clientAuth';
import { disconnectServerConnection } from '../appobj/ConnectionAppObject.svelte';
import UploadErrorModal from '../modals/UploadErrorModal.svelte';
import ErrorMessageModal from '../modals/ErrorMessageModal.svelte';
import NewCollectionModal from '../modals/NewCollectionModal.svelte';
import ConfirmModal from '../modals/ConfirmModal.svelte';
import localforage from 'localforage';
@@ -73,7 +71,8 @@ registerCommand({
category: __t('command.theme', { defaultMessage: 'Theme' }),
name: __t('command.theme.change', { defaultMessage: 'Change' }),
toolbarName: __t('command.theme.changeToolbar', { defaultMessage: 'Change theme' }),
onClick: () => openNewTab({
onClick: () =>
openNewTab({
title: 'Settings',
icon: 'icon settings',
tabComponent: 'SettingsTab',
@@ -1230,8 +1229,7 @@ registerCommand({
},
});
if ( hasPermission('application-log'))
{
if (hasPermission('application-log')) {
registerCommand({
id: 'app.showLogs',
category: __t('command.application', { defaultMessage: 'Application' }),
@@ -1246,8 +1244,7 @@ if ( hasPermission('application-log'))
});
}
if (hasPermission('widgets/plugins'))
{
if (hasPermission('widgets/plugins')) {
registerCommand({
id: 'app.managePlugins',
category: __t('command.application', { defaultMessage: 'Application' }),
@@ -137,6 +137,7 @@
position: relative;
overflow: hidden;
height: 100%;
background-color: var(--theme-bg-0);
}
.scrollableContentContainer {
@@ -1,9 +1,12 @@
<script lang="ts">
import FontIcon from "../icons/FontIcon.svelte";
export let type;
export let label;
export let noMargin = false;
export let disabled = false;
export let labelProps: any = {};
export let labelIcon = null;
</script>
<div class="largeFormMarker" class:noMargin>
@@ -12,6 +15,9 @@
<span {...labelProps} on:click={labelProps.onClick} class:disabled class='checkLabel'>{label}</span>
{:else}
<div class="label" {...labelProps} on:click={labelProps.onClick}>
{#if labelIcon}
<FontIcon icon={labelIcon} padRight />
{/if}
<span {...labelProps} on:click={labelProps.onClick} class:disabled>{label}</span>
</div>
<slot />
+6 -1
View File
@@ -164,7 +164,12 @@
changeActiveSubmenu();
}}
>
<a on:click={e => handleClick(e, item)} class:disabled={item.disabled} class:bold={item.isBold}>
<a
on:click={e => handleClick(e, item)}
class:disabled={item.disabled}
class:bold={item.isBold}
data-testid={item.testid}
>
<span>
{#if item.switchValue && item.switchStoreGetter}
{#key switchIndex}
@@ -1,58 +1,61 @@
<script lang="ts">
import FormCheckboxField from "../forms/FormCheckboxField.svelte";
import { _t } from "../translations";
import FontIcon from '../icons/FontIcon.svelte';
import FormValues from "../forms/FormValues.svelte";
import FormCheckboxField from '../forms/FormCheckboxField.svelte';
import { _t } from '../translations';
import FontIcon from '../icons/FontIcon.svelte';
import FormValues from '../forms/FormValues.svelte';
</script>
<div class="wrapper">
<FormValues let:values>
<FormValues let:values>
<div class="heading">{_t('settings.behaviour', { defaultMessage: 'Behaviour' })}</div>
<FormCheckboxField
name="behaviour.useTabPreviewMode"
label={_t('settings.behaviour.useTabPreviewMode', { defaultMessage: 'Use tab preview mode' })}
defaultValue={true}
name="behaviour.jsonPreviewWrap"
label={_t('settings.behaviour.jsonPreviewWrap', { defaultMessage: 'Wrap JSON in preview' })}
defaultValue={false}
/>
<FormCheckboxField
name="behaviour.jsonPreviewWrap"
label={_t('settings.behaviour.jsonPreviewWrap', { defaultMessage: 'Wrap JSON in preview' })}
defaultValue={false}
name="behaviour.openDetailOnArrows"
label={_t('settings.behaviour.openDetailOnArrows', {
defaultMessage: 'Open detail on keyboard navigation',
})}
defaultValue={true}
disabled={values['behaviour.useTabPreviewMode'] === false}
/>
<div class="heading">{_t('settings.tabPreviewMode', { defaultMessage: 'Tab Preview Mode' })}</div>
<div class="tip">
<FontIcon icon="img tip" />
{_t('settings.behaviour.singleClickPreview', {
<FontIcon icon="img tip" />
{_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.',
})}
'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.',
})}
</div>
<FormCheckboxField
name="behaviour.openDetailOnArrows"
label={_t('settings.behaviour.openDetailOnArrows', {
defaultMessage: 'Open detail on keyboard navigation',
})}
defaultValue={true}
disabled={values['behaviour.useTabPreviewMode'] === false}
name="behaviour.useTabPreviewMode"
label={_t('settings.behaviour.useTabPreviewMode', { defaultMessage: 'Use tab preview mode' })}
defaultValue={true}
data-testid="BehaviourSettings_useTabPreviewMode"
/>
<div class="heading">{_t('settings.confirmations', { defaultMessage: 'Confirmations' })}</div>
<FormCheckboxField
name="skipConfirm.tableDataSave"
label={_t('settings.confirmations.skipConfirm.tableDataSave', {
name="skipConfirm.tableDataSave"
label={_t('settings.confirmations.skipConfirm.tableDataSave', {
defaultMessage: 'Skip confirmation when saving table data (SQL)',
})}
})}
/>
<FormCheckboxField
name="skipConfirm.collectionDataSave"
label={_t('settings.confirmations.skipConfirm.collectionDataSave', {
name="skipConfirm.collectionDataSave"
label={_t('settings.confirmations.skipConfirm.collectionDataSave', {
defaultMessage: 'Skip confirmation when saving collection data (NoSQL)',
})}
})}
/>
</FormValues>
</FormValues>
</div>
<style>
@@ -67,4 +70,4 @@
margin-left: var(--dim-large-form-margin);
margin-top: var(--dim-large-form-margin);
}
</style>
</style>
@@ -1,81 +1,64 @@
<script lang="ts">
import CheckboxField from "../forms/CheckboxField.svelte";
import FormCheckboxField from "../forms/FormCheckboxField.svelte";
import FormFieldTemplateLarge from "../forms/FormFieldTemplateLarge.svelte";
import FormSelectField from "../forms/FormSelectField.svelte";
import FormTextField from "../forms/FormTextField.svelte";
import FormValues from "../forms/FormValues.svelte";
import { lockedDatabaseMode } from "../stores";
import { _t } from "../translations";
import CheckboxField from '../forms/CheckboxField.svelte';
import FormCheckboxField from '../forms/FormCheckboxField.svelte';
import FormFieldTemplateLarge from '../forms/FormFieldTemplateLarge.svelte';
import FormSelectField from '../forms/FormSelectField.svelte';
import FormTextField from '../forms/FormTextField.svelte';
import FormValues from '../forms/FormValues.svelte';
import { lockedDatabaseMode } from '../stores';
import { _t } from '../translations';
</script>
<div class="wrapper">
<FormValues let:values>
<FormValues let:values>
<div class="heading">{_t('settings.connection', { defaultMessage: 'Connection' })}</div>
<FormFieldTemplateLarge
label={_t('settings.connection.showOnlyTabsFromSelectedDatabase', {
defaultMessage: 'Show only tabs from selected database',
})}
type="checkbox"
labelProps={{
onClick: () => {
$lockedDatabaseMode = !$lockedDatabaseMode;
},
}}
>
<CheckboxField checked={$lockedDatabaseMode} on:change={e => ($lockedDatabaseMode = e.target.checked)} />
</FormFieldTemplateLarge>
<FormCheckboxField
name="connection.autoRefresh"
label={_t('settings.connection.autoRefresh', {
name="connection.autoRefresh"
label={_t('settings.connection.autoRefresh', {
defaultMessage: 'Automatic refresh of database model on background',
})}
defaultValue={false}
})}
defaultValue={false}
/>
<FormTextField
name="connection.autoRefreshInterval"
label={_t('settings.connection.autoRefreshInterval', {
name="connection.autoRefreshInterval"
label={_t('settings.connection.autoRefreshInterval', {
defaultMessage: 'Interval between automatic DB structure reloads in seconds',
})}
defaultValue="30"
disabled={values['connection.autoRefresh'] === false}
})}
defaultValue="30"
disabled={values['connection.autoRefresh'] === false}
/>
<FormSelectField
label={_t('settings.connection.sshBindHost', { defaultMessage: 'Local host address for SSH connections' })}
name="connection.sshBindHost"
isNative
defaultValue="127.0.0.1"
options={[
label={_t('settings.connection.sshBindHost', { defaultMessage: 'Local host address for SSH connections' })}
name="connection.sshBindHost"
isNative
defaultValue="127.0.0.1"
options={[
{ value: '127.0.0.1', label: '127.0.0.1 (IPv4)' },
{ value: '::1', label: '::1 (IPv6)' },
{ value: 'localhost', label: 'localhost (domain name)' },
]}
]}
/>
<div class="heading">{_t('settings.session', { defaultMessage: 'Query sessions' })}</div>
<FormCheckboxField
name="session.autoClose"
label={_t('settings.session.autoClose', {
name="session.autoClose"
label={_t('settings.session.autoClose', {
defaultMessage: 'Automatic close query sessions after period without any activity',
})}
defaultValue={true}
})}
defaultValue={true}
/>
<FormTextField
name="session.autoCloseTimeout"
label={_t('settings.session.autoCloseTimeout', {
name="session.autoCloseTimeout"
label={_t('settings.session.autoCloseTimeout', {
defaultMessage: 'Interval, after which query session without activity is closed (in minutes)',
})}
defaultValue="15"
disabled={values['session.autoClose'] === false}
})}
defaultValue="15"
disabled={values['session.autoClose'] === false}
/>
</FormValues>
</FormValues>
</div>
<style>
.heading {
font-size: 20px;
@@ -84,4 +67,11 @@
margin-top: var(--dim-large-form-margin);
}
</style>
.wrapper :global(input) {
max-width: 400px;
}
.wrapper :global(select) {
max-width: 400px;
}
</style>
@@ -22,6 +22,7 @@ defaultValue="100"
name="dataGrid.showHintColumns"
label={_t('settings.dataGrid.showHintColumns', { defaultMessage: 'Show foreign key hints' })}
defaultValue={true}
data-testid="DataGridSettings_showHintColumns"
/>
{/if}
<!-- <FormCheckboxField name="dataGrid.showHintColumns" label="Show foreign key hints" defaultValue={true} /> -->
@@ -97,4 +98,12 @@ defaultValue={false}
margin-left: var(--dim-large-form-margin);
margin-top: var(--dim-large-form-margin);
}
.wrapper :global(select){
max-width: 400px;
}
.wrapper :global(input){
max-width: 400px;
}
</style>
@@ -56,6 +56,7 @@
name="defaultAction.useLastUsedAction"
label={_t('settings.defaultActions.useLastUsedAction', { defaultMessage: 'Use last used action' })}
defaultValue={true}
data-testid="DefaultActionsSettings_useLastUsedAction"
/>
<FormDefaultActionField
@@ -100,4 +101,8 @@
margin-top: var(--dim-large-form-margin);
}
.wrapper :global(select){
max-width: 400px;
}
</style>
+126 -100
View File
@@ -1,115 +1,138 @@
<script lang="ts">
import { internalRedirectTo } from '../clientAuth';
import FormCheckboxField from '../forms/FormCheckboxField.svelte';
import FormFieldTemplateLarge from '../forms/FormFieldTemplateLarge.svelte';
import FormSelectField from '../forms/FormSelectField.svelte';
import SelectField from '../forms/SelectField.svelte';
import FontIcon from '../icons/FontIcon.svelte';
import { showModal } from '../modals/modalTools';
import { _t, getSelectedLanguage, setSelectedLanguage } from '../translations';
import { isMac } from '../utility/common';
import getElectron from '../utility/getElectron';
import ConfirmModal from '../modals/ConfirmModal.svelte';
import { internalRedirectTo } from '../clientAuth';
import FormCheckboxField from '../forms/FormCheckboxField.svelte';
import FormFieldTemplateLarge from '../forms/FormFieldTemplateLarge.svelte';
import FormSelectField from '../forms/FormSelectField.svelte';
import SelectField from '../forms/SelectField.svelte';
import FontIcon from '../icons/FontIcon.svelte';
import { showModal } from '../modals/modalTools';
import { _t, getSelectedLanguage, setSelectedLanguage } from '../translations';
import { isMac } from '../utility/common';
import getElectron from '../utility/getElectron';
import ConfirmModal from '../modals/ConfirmModal.svelte';
import hasPermission from '../utility/hasPermission';
import CheckboxField from '../forms/CheckboxField.svelte';
import { lockedDatabaseMode } from '../stores';
const electron = getElectron();
let restartWarning = false;
const electron = getElectron();
let restartWarning = false;
</script>
<div class="wrapper">
<div class="heading">{_t('settings.application', { defaultMessage: 'Application' })}</div>
<FormFieldTemplateLarge
label={_t('settings.localization.language', { defaultMessage: 'Language' })}
type="combo"
>
<SelectField
isNative
data-testid="SettingsModal_languageSelect"
options={[
{ value: 'cs', label: 'Čeština' },
{ value: 'de', label: 'Deutsch' },
{ value: 'en', label: 'English' },
{ value: 'es', label: 'Español' },
{ value: 'fr', label: 'Français' },
{ value: 'it', label: 'Italiano' },
{ value: 'pt', label: 'Português (Brasil)' },
{ value: 'sk', label: 'Slovenčina' },
{ value: 'ja', label: '日本語' },
{ value: 'zh', label: '中文' },
]}
defaultValue={getSelectedLanguage()}
value={getSelectedLanguage()}
on:change={e => {
setSelectedLanguage(e.detail);
showModal(ConfirmModal, {
message: _t('settings.localization.reloadWarning', {
defaultMessage: 'Application will be reloaded to apply new language settings',
}),
onConfirm: () => {
setTimeout(() => {
internalRedirectTo(electron ? '/index.html' : '/');
}, 100);
},
});
}}
/>
</FormFieldTemplateLarge>
<FormSelectField
label={_t('settings.other.autoUpdateApplication', { defaultMessage: 'Auto update application' })}
name="app.autoUpdateMode"
isNative
defaultValue=""
options={[
{
value: 'skip',
label: _t('settings.other.autoUpdateApplication.skip', {
defaultMessage: 'Do not check for new versions',
}),
},
{
value: '',
label: _t('settings.other.autoUpdateApplication.check', { defaultMessage: 'Check for new versions' }),
},
{
value: 'download',
label: _t('settings.other.autoUpdateApplication.download', {
defaultMessage: 'Check and download new versions',
}),
},
]}
<div class="heading">{_t('settings.application', { defaultMessage: 'Application' })}</div>
<FormFieldTemplateLarge
label={_t('settings.localization.language', { defaultMessage: 'Language' })}
type="combo"
labelIcon="mdi mdi-translate"
>
<SelectField
isNative
data-testid="SettingsModal_languageSelect"
options={[
{ value: 'cs', label: 'Čeština' },
{ value: 'de', label: 'Deutsch' },
{ value: 'en', label: 'English' },
{ value: 'es', label: 'Español' },
{ value: 'fr', label: 'Français' },
{ value: 'it', label: 'Italiano' },
{ value: 'pt', label: 'Português (Brasil)' },
{ value: 'sk', label: 'Slovenčina' },
{ value: 'ja', label: '日本語' },
{ value: 'zh', label: '中文' },
]}
defaultValue={getSelectedLanguage()}
value={getSelectedLanguage()}
on:change={e => {
setSelectedLanguage(e.detail);
showModal(ConfirmModal, {
message: _t('settings.localization.reloadWarning', {
defaultMessage: 'Application will be reloaded to apply new language settings',
}),
onConfirm: () => {
setTimeout(() => {
internalRedirectTo(electron ? '/index.html' : '/');
}, 100);
},
});
}}
/>
</FormFieldTemplateLarge>
<div class="heading">{_t('settings.appearance', { defaultMessage: 'Appearance' })}</div>
{#if electron}
<FormSelectField
label={_t('settings.other.autoUpdateApplication', { defaultMessage: 'Auto update application' })}
name="app.autoUpdateMode"
isNative
defaultValue=""
options={[
{
value: 'skip',
label: _t('settings.other.autoUpdateApplication.skip', {
defaultMessage: 'Do not check for new versions',
}),
},
{
value: '',
label: _t('settings.other.autoUpdateApplication.check', { defaultMessage: 'Check for new versions' }),
},
{
value: 'download',
label: _t('settings.other.autoUpdateApplication.download', {
defaultMessage: 'Check and download new versions',
}),
},
]}
/>
{/if}
{#if electron}
<FormCheckboxField
name="app.useNativeMenu"
label={isMac()
? _t('settings.useNativeWindowTitle', { defaultMessage: 'Use native window title' })
: _t('settings.useSystemNativeMenu', { defaultMessage: 'Use system native menu' })}
on:change={() => {
restartWarning = true;
}}
/>
{#if restartWarning}
<div class="ml-5 mb-3">
<FontIcon icon="img warn" />
{_t('settings.nativeMenuRestartWarning', {
defaultMessage: 'Native menu settings will be applied after app restart',
})}
</div>
{/if}
{/if}
<FormFieldTemplateLarge
label={_t('settings.connection.showOnlyTabsFromSelectedDatabase', {
defaultMessage: 'Show only tabs from selected database',
})}
type="checkbox"
labelProps={{
onClick: () => {
$lockedDatabaseMode = !$lockedDatabaseMode;
},
}}
>
<CheckboxField
checked={$lockedDatabaseMode}
on:change={e => ($lockedDatabaseMode = e.target['checked'])}
data-testid="GeneralSettings_lockedDatabaseMode"
/>
</FormFieldTemplateLarge>
<div class="heading">{_t('settings.appearance', { defaultMessage: 'Appearance' })}</div>
{#if electron}
<FormCheckboxField
name="app.useNativeMenu"
label={isMac()
? _t('settings.useNativeWindowTitle', { defaultMessage: 'Use native window title' })
: _t('settings.useSystemNativeMenu', { defaultMessage: 'Use system native menu' })}
on:change={() => {
restartWarning = true;
}}
/>
{#if restartWarning}
<div class="ml-5 mb-3">
<FontIcon icon="img warn" />
{_t('settings.nativeMenuRestartWarning', {
defaultMessage: 'Native menu settings will be applied after app restart',
})}
</div>
{/if}
{/if}
<FormCheckboxField
name="tabGroup.showServerName"
label={_t('settings.tabGroup.showServerName', {
defaultMessage: 'Show server name alongside database name in title of the tab group',
defaultMessage: 'Show server name alongside database name in title of the tab group',
})}
defaultValue={false}
/>
disabled={!hasPermission('settings/change')}
/>
</div>
<style>
@@ -120,4 +143,7 @@
margin-top: var(--dim-large-form-margin);
}
</style>
.wrapper :global(select) {
max-width: 400px;
}
</style>
@@ -26,6 +26,7 @@
{ value: 'upperCase', label: 'UPPER CASE' },
{ value: 'lowerCase', label: 'lower case' },
]}
data-testid="SQLEditorSettings_sqlCommandsCase"
/>
</div>
<div class="col-3">
@@ -97,4 +98,8 @@ defaultValue={false}
margin-left: var(--dim-large-form-margin);
margin-top: var(--dim-large-form-margin);
}
.wrapper :global(input){
max-width: 400px;
}
</style>
@@ -29,6 +29,13 @@ export function getStringSettingsValue(name, defaultValue) {
return res;
}
export function getObjectSettingsValue(name, defaultValue) {
const settings = getCurrentSettings();
const res = settings[name];
if (res == null) return defaultValue;
return res;
}
export function getConnectionClickActionSetting(): 'connect' | 'openDetails' | 'none' {
return getStringSettingsValue('defaultAction.connectionClick', 'connect');
}
+105 -102
View File
@@ -3,111 +3,114 @@
</script>
<script lang="ts">
import SettingsMenuControl from "../elements/SettingsMenuControl.svelte";
import GeneralSettings from "../settings/GeneralSettings.svelte";
import SettingsFormProvider from "../forms/SettingsFormProvider.svelte";
import ConnectionSettings from "../settings/ConnectionSettings.svelte";
import ThemeSettings from "../settings/ThemeSettings.svelte";
import DefaultActionsSettings from "../settings/DefaultActionsSettings.svelte";
import BehaviourSettings from "../settings/BehaviourSettings.svelte";
import ExternalToolsSettings from "../settings/ExternalToolsSettings.svelte";
import LicenseSettings from "../settings/LicenseSettings.svelte";
import { isProApp } from "../utility/proTools";
import { _t } from "../translations";
import CommandListTab from "./CommandListTab.svelte";
import DataGridSettings from "../settings/DataGridSettings.svelte";
import SQLEditorSettings from "../settings/SQLEditorSettings.svelte";
import AiSettingsTab from "../settings/AiSettingsTab.svelte";
import SettingsMenuControl from '../elements/SettingsMenuControl.svelte';
import GeneralSettings from '../settings/GeneralSettings.svelte';
import SettingsFormProvider from '../forms/SettingsFormProvider.svelte';
import ConnectionSettings from '../settings/ConnectionSettings.svelte';
import ThemeSettings from '../settings/ThemeSettings.svelte';
import DefaultActionsSettings from '../settings/DefaultActionsSettings.svelte';
import BehaviourSettings from '../settings/BehaviourSettings.svelte';
import ExternalToolsSettings from '../settings/ExternalToolsSettings.svelte';
import LicenseSettings from '../settings/LicenseSettings.svelte';
import { isProApp } from '../utility/proTools';
import { _t } from '../translations';
import CommandListTab from './CommandListTab.svelte';
import DataGridSettings from '../settings/DataGridSettings.svelte';
import SQLEditorSettings from '../settings/SQLEditorSettings.svelte';
import AiSettingsTab from '../settings/AiSettingsTab.svelte';
import hasPermission from '../utility/hasPermission';
export let selectedItem = 'general';
export let selectedItem = 'general';
const menuItems = [
{
label: _t('settings.general', { defaultMessage: 'General' }),
identifier: 'general',
component: GeneralSettings,
props: {},
testid: 'settings-general',
},
{
label: _t('settings.connection', { defaultMessage: 'Connection' }),
identifier: 'connection',
component: ConnectionSettings,
props: {},
testid: 'settings-connection',
},
{
label: _t('settings.dataGrid.title', { defaultMessage: 'Data grid' }),
identifier: 'data-grid',
component: DataGridSettings,
props: {},
testid: 'settings-data-grid',
},
{
label: _t('settings.sqlEditor.title', { defaultMessage: 'SQL Editor' }),
identifier: 'sql-editor',
component: SQLEditorSettings,
props: {},
testid: 'settings-sql-editor',
},
{
label: _t('settings.theme', { defaultMessage: 'Themes' }),
identifier: 'theme',
component: ThemeSettings,
props: {},
testid: 'settings-themes',
},
{
label: _t('settings.defaultActions', { defaultMessage: 'Default Actions' }),
identifier: 'default-actions',
component: DefaultActionsSettings,
props: {},
testid: 'settings-default-actions',
},
{
label: _t('settings.behaviour', { defaultMessage: 'Behaviour' }),
identifier: 'behaviour',
component: BehaviourSettings,
props: {},
testid: 'settings-behaviour',
},
{
label: _t('settings.externalTools', { defaultMessage: 'External Tools' }),
identifier: 'external-tools',
component: ExternalToolsSettings,
props: {},
testid: 'settings-external-tools',
},
{
label: _t('command.settings.shortcuts', { defaultMessage: 'Keyboard shortcuts' }),
identifier: 'shortcuts',
component: CommandListTab,
props: {},
testid: 'settings-shortcuts',
},
isProApp() && {
label: _t('settings.license', { defaultMessage: 'License' }),
identifier: 'license',
component: LicenseSettings,
props: {},
testid: 'settings-license',
},
isProApp() && {
label: _t('settings.AI', { defaultMessage: 'AI'}),
identifier: 'ai',
component: AiSettingsTab,
props: {},
testid: 'settings-ai',
},
];
const menuItems = [
{
label: _t('settings.general', { defaultMessage: 'General' }),
identifier: 'general',
component: GeneralSettings,
props: {},
testid: 'settings-general',
},
hasPermission('settings/change') && {
label: _t('settings.connection', { defaultMessage: 'Connection' }),
identifier: 'connection',
component: ConnectionSettings,
props: {},
testid: 'settings-connection',
},
hasPermission('settings/change') && {
label: _t('settings.dataGrid.title', { defaultMessage: 'Data grid' }),
identifier: 'data-grid',
component: DataGridSettings,
props: {},
testid: 'settings-data-grid',
},
hasPermission('settings/change') && {
label: _t('settings.sqlEditor.title', { defaultMessage: 'SQL Editor' }),
identifier: 'sql-editor',
component: SQLEditorSettings,
props: {},
testid: 'settings-sql-editor',
},
{
label: _t('settings.theme', { defaultMessage: 'Themes' }),
identifier: 'theme',
component: ThemeSettings,
props: {},
testid: 'settings-themes',
},
hasPermission('settings/change') && {
label: _t('settings.defaultActions', { defaultMessage: 'Default Actions' }),
identifier: 'default-actions',
component: DefaultActionsSettings,
props: {},
testid: 'settings-default-actions',
},
hasPermission('settings/change') && {
label: _t('settings.behaviour', { defaultMessage: 'Behaviour' }),
identifier: 'behaviour',
component: BehaviourSettings,
props: {},
testid: 'settings-behaviour',
},
hasPermission('settings/change') && {
label: _t('settings.externalTools', { defaultMessage: 'External Tools' }),
identifier: 'external-tools',
component: ExternalToolsSettings,
props: {},
testid: 'settings-external-tools',
},
hasPermission('settings/change') && {
label: _t('command.settings.shortcuts', { defaultMessage: 'Keyboard shortcuts' }),
identifier: 'shortcuts',
component: CommandListTab,
props: {},
testid: 'settings-shortcuts',
},
hasPermission('settings/change') &&
isProApp() && {
label: _t('settings.license', { defaultMessage: 'License' }),
identifier: 'license',
component: LicenseSettings,
props: {},
testid: 'settings-license',
},
hasPermission('settings/change') &&
isProApp() && {
label: _t('settings.AI', { defaultMessage: 'AI' }),
identifier: 'ai',
component: AiSettingsTab,
props: {},
testid: 'settings-ai',
},
];
</script>
<SettingsFormProvider>
<SettingsMenuControl
items={menuItems}
bind:value={selectedItem}
flex1={true}
flexColContainer={true}
scrollableContentContainer={true}
<SettingsMenuControl
items={menuItems}
bind:value={selectedItem}
flex1={true}
flexColContainer={true}
scrollableContentContainer={true}
/>
</SettingsFormProvider>
</SettingsFormProvider>
+11 -5
View File
@@ -155,24 +155,28 @@ export function getKeyTextFromEvent(e) {
return keyText;
}
export function getDatabasStatusMenu(dbid) {
export function getDatabasStatusMenu(dbid, driver = null) {
function callSchemalListChanged() {
apiCall('database-connections/dispatch-database-changed-event', { event: 'schema-list-changed', ...dbid });
}
return [
{
return _.compact([
driver?.supportsIncrementalAnalysis && {
text: _t('command.database.refreshIncremental', { defaultMessage: 'Refresh DB structure (incremental)' }),
onClick: () => {
apiCall('database-connections/sync-model', dbid);
callSchemalListChanged();
},
testid: 'DatabasStatusMenu_refreshIncremental',
},
{
text: _t('command.database.refreshFull', { defaultMessage: 'Refresh DB structure (full)' }),
text: driver?.supportsIncrementalAnalysis
? _t('command.database.refreshFull', { defaultMessage: 'Refresh DB structure (full)' })
: _t('command.database.refresh', { defaultMessage: 'Refresh DB structure' }),
onClick: () => {
apiCall('database-connections/sync-model', { ...dbid, isFullRefresh: true });
callSchemalListChanged();
},
testid: 'DatabasStatusMenu_refreshFull',
},
{
text: _t('command.database.reopenConnection', { defaultMessage: 'Reopen connection' }),
@@ -180,6 +184,7 @@ export function getDatabasStatusMenu(dbid) {
apiCall('database-connections/refresh', dbid);
callSchemalListChanged();
},
testid: 'DatabasStatusMenu_reopenConnection',
},
{
text: _t('command.database.disconnect', { defaultMessage: 'Disconnect' }),
@@ -188,6 +193,7 @@ export function getDatabasStatusMenu(dbid) {
if (electron) apiCall('database-connections/disconnect', dbid);
switchCurrentDatabase(null);
},
testid: 'DatabasStatusMenu_disconnect',
},
];
]);
}
@@ -143,7 +143,7 @@
}
function createRefreshDatabaseMenu() {
return getDatabasStatusMenu({ conid, database });
return getDatabasStatusMenu({ conid, database }, driver);
}
function handleFullRefreshDatabase() {
@@ -147,6 +147,7 @@ const driver = {
dialect,
engine: 'clickhouse@dbgate-plugin-clickhouse',
title: 'ClickHouse',
supportsIncrementalAnalysis: true,
showConnectionField: (field, values) => {
return ['databaseUrl', 'defaultDatabase', 'singleDatabase', 'isReadOnly', 'user', 'password'].includes(field);
},
@@ -171,6 +171,7 @@ const driver = {
defaultPort: 1433,
defaultAuthTypeName: 'tedious',
supportsTransactions: true,
supportsIncrementalAnalysis: true,
// databaseUrlPlaceholder: 'e.g. server=localhost&authentication.type=default&authentication.type.user=myuser&authentication.type.password=pwd&options.database=mydb',
getNewObjectTemplates() {
@@ -184,6 +184,7 @@ const mysqlDriverBase = {
defaultAuthTypeName: 'hostPort',
defaultSocketPath: '/var/run/mysqld/mysqld.sock',
supportsTransactions: true,
supportsIncrementalAnalysis: true,
getNewObjectTemplates() {
return [
@@ -121,6 +121,7 @@ const dialect = {
const postgresDriverBase = {
...driverBase,
supportsTransactions: true,
supportsIncrementalAnalysis: true,
dumperClass: Dumper,
dialect,
// showConnectionField: (field, values) =>
@@ -48,6 +48,7 @@ const sqliteDriverBase = {
dialect,
readOnlySessions: true,
supportsTransactions: true,
supportsIncrementalAnalysis: true,
getQuerySplitterOptions: (usage) =>
usage == 'editor'
+2
View File
@@ -171,6 +171,7 @@
"command.database.databaseSearch": "Vyhledávání v databázi",
"command.database.disconnect": "Odpojit",
"command.database.export": "Exportovat databázi",
"command.database.refresh": "Obnovit strukturu DB",
"command.database.refreshFull": "Obnovit strukturu DB (úplně)",
"command.database.refreshIncremental": "Obnovit strukturu DB (inkrementálně)",
"command.database.reopenConnection": "Znovu otevřít připojení",
@@ -1198,6 +1199,7 @@
"settings.sqlEditor.sqlCommandsCase": "Velikost písmen SQL příkazů",
"settings.sqlEditor.title": "SQL editor",
"settings.tabGroup.showServerName": "Zobrazit název serveru vedle názvu databáze v záhlaví skupiny karet",
"settings.tabPreviewMode": "Režim náhledu karet",
"settings.theme": "Vzhled",
"settings.title": "Nastavení",
"settings.useNativeWindowTitle": "Použít nativní titulek okna",
+2
View File
@@ -171,6 +171,7 @@
"command.database.databaseSearch": "Datenbanksuche",
"command.database.disconnect": "Trennen",
"command.database.export": "Datenbank exportieren",
"command.database.refresh": "DB-Struktur aktualisieren",
"command.database.refreshFull": "DB-Struktur aktualisieren (vollständig)",
"command.database.refreshIncremental": "DB-Struktur aktualisieren (inkrementell)",
"command.database.reopenConnection": "Verbindung erneut öffnen",
@@ -1198,6 +1199,7 @@
"settings.sqlEditor.sqlCommandsCase": "Groß-/Kleinschreibung der SQL-Befehle",
"settings.sqlEditor.title": "SQL-Editor",
"settings.tabGroup.showServerName": "Servername neben Datenbankname im Titel der Tab-Gruppe anzeigen",
"settings.tabPreviewMode": "Tab-Vorschaumodus",
"settings.theme": "Designs",
"settings.title": "Einstellungen",
"settings.useNativeWindowTitle": "Nativen Fenstertitel verwenden",
+2
View File
@@ -167,6 +167,7 @@
"command.database.databaseSearch": "Database search",
"command.database.disconnect": "Disconnect",
"command.database.export": "Export database",
"command.database.refresh": "Refresh DB structure",
"command.database.refreshFull": "Refresh DB structure (full)",
"command.database.refreshIncremental": "Refresh DB structure (incremental)",
"command.database.reopenConnection": "Reopen connection",
@@ -1190,6 +1191,7 @@
"settings.sqlEditor.sqlCommandsCase": "SQL commands case",
"settings.sqlEditor.title": "SQL Editor",
"settings.tabGroup.showServerName": "Show server name alongside database name in title of the tab group",
"settings.tabPreviewMode": "Tab Preview Mode",
"settings.theme": "Themes",
"settings.useNativeWindowTitle": "Use native window title",
"settings.useSystemNativeMenu": "Use system native menu",
+2
View File
@@ -171,6 +171,7 @@
"command.database.databaseSearch": "Búsqueda en base de datos",
"command.database.disconnect": "Desconectar",
"command.database.export": "Exportar base de datos",
"command.database.refresh": "Refrescar estructura de BD",
"command.database.refreshFull": "Refrescar estructura de BD (completa)",
"command.database.refreshIncremental": "Refrescar estructura de BD (incremental)",
"command.database.reopenConnection": "Reabrir conexión",
@@ -1198,6 +1199,7 @@
"settings.sqlEditor.sqlCommandsCase": "Mayúsculas/minúsculas de comandos SQL",
"settings.sqlEditor.title": "Editor SQL",
"settings.tabGroup.showServerName": "Mostrar nombre del servidor junto con nombre de base de datos en el título del grupo de pestañas",
"settings.tabPreviewMode": "Modo de vista previa de pestaña",
"settings.theme": "Temas",
"settings.title": "Configuración",
"settings.useNativeWindowTitle": "Usar título de ventana nativo",
+2
View File
@@ -171,6 +171,7 @@
"command.database.databaseSearch": "Recherche dans la base de données",
"command.database.disconnect": "Déconnecter",
"command.database.export": "Exporter la base de données",
"command.database.refresh": "Rafraîchir la structure de BD",
"command.database.refreshFull": "Rafraîchir la structure de BD (complète)",
"command.database.refreshIncremental": "Rafraîchir la structure de BD (incrémentale)",
"command.database.reopenConnection": "Rouvrir la connexion",
@@ -1198,6 +1199,7 @@
"settings.sqlEditor.sqlCommandsCase": "Casse des commandes SQL",
"settings.sqlEditor.title": "Éditeur SQL",
"settings.tabGroup.showServerName": "Afficher le nom du serveur à côté du nom de la base de données dans le titre du groupe d'onglets",
"settings.tabPreviewMode": "Mode aperçu d'onglet",
"settings.theme": "Thèmes",
"settings.title": "Paramètres",
"settings.useNativeWindowTitle": "Utiliser le titre de fenêtre natif",
+2
View File
@@ -171,6 +171,7 @@
"command.database.databaseSearch": "Ricerca database",
"command.database.disconnect": "Disconnetti",
"command.database.export": "Esporta database",
"command.database.refresh": "Aggiorna struttura DB",
"command.database.refreshFull": "Aggiorna struttura DB (completo)",
"command.database.refreshIncremental": "Aggiorna struttura DB (incrementale)",
"command.database.reopenConnection": "Riapri connessione",
@@ -1198,6 +1199,7 @@
"settings.sqlEditor.sqlCommandsCase": "Maiuscole/minuscole comandi SQL",
"settings.sqlEditor.title": "Editor SQL",
"settings.tabGroup.showServerName": "Mostra nome server accanto al nome database nel titolo del gruppo schede",
"settings.tabPreviewMode": "Modalità anteprima scheda",
"settings.theme": "Temi",
"settings.title": "Impostazioni",
"settings.useNativeWindowTitle": "Usa titolo finestra nativo",
+2
View File
@@ -171,6 +171,7 @@
"command.database.databaseSearch": "データベース検索",
"command.database.disconnect": "切断",
"command.database.export": "データベースをエクスポート",
"command.database.refresh": "DB構造を更新",
"command.database.refreshFull": "DB構造を更新(フル)",
"command.database.refreshIncremental": "DB構造を更新(増分)",
"command.database.reopenConnection": "接続を再度開く",
@@ -1198,6 +1199,7 @@
"settings.sqlEditor.sqlCommandsCase": "SQLコマンドの大文字小文字",
"settings.sqlEditor.title": "SQLエディター",
"settings.tabGroup.showServerName": "タブグループのタイトルにデータベース名と並んでサーバー名を表示",
"settings.tabPreviewMode": "タブプレビューモード",
"settings.theme": "テーマ",
"settings.title": "設定",
"settings.useNativeWindowTitle": "ネイティブウィンドウタイトルを使用",
+2
View File
@@ -171,6 +171,7 @@
"command.database.databaseSearch": "Pesquisar banco de dados",
"command.database.disconnect": "Desconectar",
"command.database.export": "Exportar banco de dados",
"command.database.refresh": "Atualizar estrutura do BD",
"command.database.refreshFull": "Atualizar estrutura do BD (completa)",
"command.database.refreshIncremental": "Atualizar estrutura do BD (incremental)",
"command.database.reopenConnection": "Reabrir conexão",
@@ -1198,6 +1199,7 @@
"settings.sqlEditor.sqlCommandsCase": "Maiúsculas/minúsculas de comandos SQL",
"settings.sqlEditor.title": "Editor SQL",
"settings.tabGroup.showServerName": "Mostrar nome do servidor junto ao nome do banco de dados no título do grupo de abas",
"settings.tabPreviewMode": "Modo de visualização de aba",
"settings.theme": "Temas",
"settings.title": "Configurações",
"settings.useNativeWindowTitle": "Usar título de janela nativo",
+2
View File
@@ -171,6 +171,7 @@
"command.database.databaseSearch": "Hľadanie v databáze",
"command.database.disconnect": "Odpojiť",
"command.database.export": "Exportovať databázu",
"command.database.refresh": "Obnoviť štruktúru DB",
"command.database.refreshFull": "Obnoviť štruktúru DB (úplne)",
"command.database.refreshIncremental": "Obnoviť štruktúru DB (inkrementálne)",
"command.database.reopenConnection": "Znovu otvoriť pripojenie",
@@ -1198,6 +1199,7 @@
"settings.sqlEditor.sqlCommandsCase": "Veľkosť písmen",
"settings.sqlEditor.title": "SQL editor",
"settings.tabGroup.showServerName": "Zobraziť názov servera vedľa názvu databázy v názve skupiny kariet",
"settings.tabPreviewMode": "Režim náhľadu kariet",
"settings.theme": "Vzhľad",
"settings.title": "Nastavenia",
"settings.useNativeWindowTitle": "Použiť natívne menu",
+2
View File
@@ -171,6 +171,7 @@
"command.database.databaseSearch": "数据库搜索",
"command.database.disconnect": "断开连接",
"command.database.export": "导出数据库",
"command.database.refresh": "刷新数据库结构",
"command.database.refreshFull": "刷新数据库结构(完整)",
"command.database.refreshIncremental": "刷新数据库结构(增量)",
"command.database.reopenConnection": "重新打开连接",
@@ -1198,6 +1199,7 @@
"settings.sqlEditor.sqlCommandsCase": "SQL命令大小写",
"settings.sqlEditor.title": "SQL 编辑器",
"settings.tabGroup.showServerName": "在标签页组标题中显示服务器名称和数据库名称",
"settings.tabPreviewMode": "标签页预览模式",
"settings.theme": "主题",
"settings.title": "设置",
"settings.useNativeWindowTitle": "使用原生窗口标题",
+1 -1
View File
@@ -7,7 +7,7 @@ checkout-and-merge-pro:
repository: dbgate/dbgate-pro
token: ${{ secrets.GH_TOKEN }}
path: dbgate-pro
ref: ca69c4857d7d93c4b066018e8a9a0a0ece2300e7
ref: ae1fcf6e61c6f7dfbb21005daa259c68e899a80a
- name: Merge dbgate/dbgate-pro
run: |
mkdir ../dbgate-pro