Added new settings components, added wrapper to all setting components

This commit is contained in:
Stela Augustinova
2025-11-27 14:42:24 +01:00
parent 765551988a
commit 21eb27f6e3
11 changed files with 333 additions and 259 deletions

View File

@@ -101,7 +101,7 @@
height: 100%; height: 100%;
width: 100%; width: 100%;
background-color: var(--theme-bg-2); background-color: var(--theme-bg-2);
overflow-y: auto; overflow-x: auto;
} }
.menu::-webkit-scrollbar { .menu::-webkit-scrollbar {
@@ -111,7 +111,6 @@
.menu-item { .menu-item {
white-space: nowrap; white-space: nowrap;
padding: 12px 20px; padding: 12px 20px;
width: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
cursor: pointer; cursor: pointer;

View File

@@ -5,6 +5,7 @@
import FormValues from "../forms/FormValues.svelte"; import FormValues from "../forms/FormValues.svelte";
</script> </script>
<div class="wrapper">
<FormValues let:values> <FormValues let:values>
<div class="heading">{_t('settings.behaviour', { defaultMessage: 'Behaviour' })}</div> <div class="heading">{_t('settings.behaviour', { defaultMessage: 'Behaviour' })}</div>
@@ -52,6 +53,7 @@
})} })}
/> />
</FormValues> </FormValues>
</div>
<style> <style>
.heading { .heading {

View File

@@ -11,6 +11,7 @@
</script> </script>
<div class="wrapper">
<FormValues let:values> <FormValues let:values>
<div class="heading">{_t('settings.connection', { defaultMessage: 'Connection' })}</div> <div class="heading">{_t('settings.connection', { defaultMessage: 'Connection' })}</div>
@@ -72,6 +73,8 @@
disabled={values['session.autoClose'] === false} disabled={values['session.autoClose'] === false}
/> />
</FormValues> </FormValues>
</div>
<style> <style>
.heading { .heading {

View File

@@ -0,0 +1,100 @@
<script lang="ts">
import FormCheckboxField from "../forms/FormCheckboxField.svelte";
import FormSelectField from "../forms/FormSelectField.svelte";
import FormTextField from "../forms/FormTextField.svelte";
import { _t } from "../translations";
import { isProApp } from "../utility/proTools";
</script>
<div class="wrapper">
<div class="heading">{_t('settings.dataGrid.title', { defaultMessage: 'Data grid' })}</div>
<FormTextField
name="dataGrid.pageSize"
label={_t('settings.dataGrid.pageSize', {
defaultMessage: 'Page size (number of rows for incremental loading, must be between 5 and 50000)',
})}
defaultValue="100"
/>
{#if isProApp()}
<FormCheckboxField
name="dataGrid.showHintColumns"
label={_t('settings.dataGrid.showHintColumns', { defaultMessage: 'Show foreign key hints' })}
defaultValue={true}
/>
{/if}
<!-- <FormCheckboxField name="dataGrid.showHintColumns" label="Show foreign key hints" defaultValue={true} /> -->
<FormCheckboxField
name="dataGrid.thousandsSeparator"
label={_t('settings.dataGrid.thousandsSeparator', {
defaultMessage: 'Use thousands separator for numbers',
})}
/>
<FormTextField
name="dataGrid.defaultAutoRefreshInterval"
label={_t('settings.dataGrid.defaultAutoRefreshInterval', {
defaultMessage: 'Default grid auto refresh interval in seconds',
})}
defaultValue="10"
/>
<FormCheckboxField
name="dataGrid.alignNumbersRight"
label={_t('settings.dataGrid.alignNumbersRight', { defaultMessage: 'Align numbers to right' })}
defaultValue={false}
/>
<FormTextField
name="dataGrid.collectionPageSize"
label={_t('settings.dataGrid.collectionPageSize', {
defaultMessage: 'Collection page size (for MongoDB JSON view, must be between 5 and 1000)',
})}
defaultValue="50"
/>
<FormSelectField
label={_t('settings.dataGrid.coloringMode', { defaultMessage: 'Row coloring mode' })}
name="dataGrid.coloringMode"
isNative
defaultValue="36"
options={[
{
value: '36',
label: _t('settings.dataGrid.coloringMode.36', { defaultMessage: 'Every 3rd and 6th row' }),
},
{
value: '2-primary',
label: _t('settings.dataGrid.coloringMode.2-primary', {
defaultMessage: 'Every 2-nd row, primary color',
}),
},
{
value: '2-secondary',
label: _t('settings.dataGrid.coloringMode.2-secondary', {
defaultMessage: 'Every 2-nd row, secondary color',
}),
},
{ value: 'none', label: _t('settings.dataGrid.coloringMode.none', { defaultMessage: 'None' }) },
]}
/>
<FormCheckboxField
name="dataGrid.showAllColumnsWhenSearch"
label={_t('settings.dataGrid.showAllColumnsWhenSearch', {
defaultMessage: 'Show all columns when searching',
})}
defaultValue={false}
/>
</div>
<style>
.heading {
font-size: 20px;
margin: 5px;
margin-left: var(--dim-large-form-margin);
margin-top: var(--dim-large-form-margin);
}
</style>

View File

@@ -8,6 +8,7 @@
</script> </script>
<div class="wrapper">
<FormValues let:values> <FormValues let:values>
<div class="heading">{_t('settings.defaultActions', { defaultMessage: 'Default actions' })}</div> <div class="heading">{_t('settings.defaultActions', { defaultMessage: 'Default actions' })}</div>
@@ -88,6 +89,8 @@
disabled={values['defaultAction.useLastUsedAction'] !== false} disabled={values['defaultAction.useLastUsedAction'] !== false}
/> />
</FormValues> </FormValues>
</div>
<style> <style>
.heading { .heading {

View File

@@ -3,6 +3,7 @@
import { _t } from "../translations"; import { _t } from "../translations";
</script> </script>
<div class="wrapper">
<div class="heading">{_t('settings.externalTools', { defaultMessage: 'External tools' })}</div> <div class="heading">{_t('settings.externalTools', { defaultMessage: 'External tools' })}</div>
<FormTextField <FormTextField
name="externalTools.mysqldump" name="externalTools.mysqldump"
@@ -36,6 +37,7 @@
label={_t('settings.other.externalTools.psql', { defaultMessage: 'psql (restore PostgreSQL database)' })} label={_t('settings.other.externalTools.psql', { defaultMessage: 'psql (restore PostgreSQL database)' })}
defaultValue="psql" defaultValue="psql"
/> />
</div>
<style> <style>
.heading { .heading {

View File

@@ -19,7 +19,8 @@
const electron = getElectron(); const electron = getElectron();
let restartWarning = false; let restartWarning = false;
</script> </script>
<div class="heading">{_t('settings.general', { defaultMessage: 'General' })}</div> <div class="wrapper">
<div class="heading">{_t('settings.general', { defaultMessage: 'General' })}</div>
{#if electron} {#if electron}
<div class="heading">{_t('settings.appearance', { defaultMessage: 'Appearance' })}</div> <div class="heading">{_t('settings.appearance', { defaultMessage: 'Appearance' })}</div>
<FormCheckboxField <FormCheckboxField
@@ -86,162 +87,7 @@ type="combo"
}} }}
/> />
</FormFieldTemplateLarge> </FormFieldTemplateLarge>
<div class="heading">{_t('settings.dataGrid.title', { defaultMessage: 'Data grid' })}</div>
<FormTextField
name="dataGrid.pageSize"
label={_t('settings.dataGrid.pageSize', {
defaultMessage: 'Page size (number of rows for incremental loading, must be between 5 and 50000)',
})}
defaultValue="100"
/>
{#if isProApp()}
<FormCheckboxField
name="dataGrid.showHintColumns"
label={_t('settings.dataGrid.showHintColumns', { defaultMessage: 'Show foreign key hints' })}
defaultValue={true}
/>
{/if}
<!-- <FormCheckboxField name="dataGrid.showHintColumns" label="Show foreign key hints" defaultValue={true} /> -->
<FormCheckboxField
name="dataGrid.thousandsSeparator"
label={_t('settings.dataGrid.thousandsSeparator', {
defaultMessage: 'Use thousands separator for numbers',
})}
/>
<FormTextField
name="dataGrid.defaultAutoRefreshInterval"
label={_t('settings.dataGrid.defaultAutoRefreshInterval', {
defaultMessage: 'Default grid auto refresh interval in seconds',
})}
defaultValue="10"
/>
<FormCheckboxField
name="dataGrid.alignNumbersRight"
label={_t('settings.dataGrid.alignNumbersRight', { defaultMessage: 'Align numbers to right' })}
defaultValue={false}
/>
<FormTextField
name="dataGrid.collectionPageSize"
label={_t('settings.dataGrid.collectionPageSize', {
defaultMessage: 'Collection page size (for MongoDB JSON view, must be between 5 and 1000)',
})}
defaultValue="50"
/>
<FormSelectField
label={_t('settings.dataGrid.coloringMode', { defaultMessage: 'Row coloring mode' })}
name="dataGrid.coloringMode"
isNative
defaultValue="36"
options={[
{
value: '36',
label: _t('settings.dataGrid.coloringMode.36', { defaultMessage: 'Every 3rd and 6th row' }),
},
{
value: '2-primary',
label: _t('settings.dataGrid.coloringMode.2-primary', {
defaultMessage: 'Every 2-nd row, primary color',
}),
},
{
value: '2-secondary',
label: _t('settings.dataGrid.coloringMode.2-secondary', {
defaultMessage: 'Every 2-nd row, secondary color',
}),
},
{ value: 'none', label: _t('settings.dataGrid.coloringMode.none', { defaultMessage: 'None' }) },
]}
/>
<FormCheckboxField
name="dataGrid.showAllColumnsWhenSearch"
label={_t('settings.dataGrid.showAllColumnsWhenSearch', {
defaultMessage: 'Show all columns when searching',
})}
defaultValue={false}
/>
<div class="heading">{_t('settings.sqlEditor', { defaultMessage: 'SQL editor' })}</div>
<div class="flex">
<div class="col-3">
<FormSelectField
label={_t('settings.sqlEditor.sqlCommandsCase', { defaultMessage: 'SQL commands case' })}
name="sqlEditor.sqlCommandsCase"
isNative
defaultValue="upperCase"
options={[
{ value: 'upperCase', label: 'UPPER CASE' },
{ value: 'lowerCase', label: 'lower case' },
]}
/>
</div> </div>
<div class="col-3">
<FormFieldTemplateLarge
label={_t('settings.editor.keybinds', { defaultMessage: 'Editor keybinds' })}
type="combo"
>
<SelectField
isNative
defaultValue="default"
options={EDITOR_KEYBINDINGS_MODES.map(mode => ({ label: mode.label, value: mode.value }))}
value={$currentEditorKeybindigMode}
on:change={e => ($currentEditorKeybindigMode = e.detail)}
/>
</FormFieldTemplateLarge>
</div>
<div class="col-3">
<FormFieldTemplateLarge
label={_t('settings.editor.wordWrap', { defaultMessage: 'Enable word wrap' })}
type="combo"
>
<CheckboxField
checked={$currentEditorWrapEnabled}
on:change={e => ($currentEditorWrapEnabled = e.target.checked)}
/>
</FormFieldTemplateLarge>
</div>
</div>
<FormTextField
name="sqlEditor.limitRows"
label={_t('settings.sqlEditor.limitRows', { defaultMessage: 'Return only N rows from query' })}
placeholder={_t('settings.sqlEditor.limitRowsPlaceholder', { defaultMessage: '(No rows limit)' })}
/>
<FormCheckboxField
name="sqlEditor.showTableAliasesInCodeCompletion"
label={_t('settings.sqlEditor.showTableAliasesInCodeCompletion', {
defaultMessage: 'Show table aliases in code completion',
})}
defaultValue={false}
/>
<FormCheckboxField
name="sqlEditor.disableSplitByEmptyLine"
label={_t('settings.sqlEditor.disableSplitByEmptyLine', { defaultMessage: 'Disable split by empty line' })}
defaultValue={false}
/>
<FormCheckboxField
name="sqlEditor.disableExecuteCurrentLine"
label={_t('settings.sqlEditor.disableExecuteCurrentLine', {
defaultMessage: 'Disable current line execution (Execute current)',
})}
defaultValue={false}
/>
<FormCheckboxField
name="sqlEditor.hideColumnsPanel"
label={_t('settings.sqlEditor.hideColumnsPanel', { defaultMessage: 'Hide Columns/Filters panel by default' })}
defaultValue={false}
/>
<style> <style>
.heading { .heading {

View File

@@ -8,6 +8,7 @@
</script> </script>
<div class="wrapper">
<div class="heading">{_t('settings.other', { defaultMessage: 'Other' })}</div> <div class="heading">{_t('settings.other', { defaultMessage: 'Other' })}</div>
<FormTextField <FormTextField
@@ -50,6 +51,8 @@ options={[
defaultValue={false} defaultValue={false}
/> />
{/if} {/if}
</div>
<style> <style>
.heading { .heading {

View File

@@ -0,0 +1,100 @@
<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 SelectField from "../forms/SelectField.svelte";
import { EDITOR_KEYBINDINGS_MODES } from "../query/AceEditor.svelte";
import { currentEditorKeybindigMode, currentEditorWrapEnabled } from "../stores";
import { _t } from "../translations";
</script>
<div class="wrapper">
<div class="heading">{_t('settings.sqlEditor', { defaultMessage: 'SQL editor' })}</div>
<div class="flex">
<div class="col-3">
<FormSelectField
label={_t('settings.sqlEditor.sqlCommandsCase', { defaultMessage: 'SQL commands case' })}
name="sqlEditor.sqlCommandsCase"
isNative
defaultValue="upperCase"
options={[
{ value: 'upperCase', label: 'UPPER CASE' },
{ value: 'lowerCase', label: 'lower case' },
]}
/>
</div>
<div class="col-3">
<FormFieldTemplateLarge
label={_t('settings.editor.keybinds', { defaultMessage: 'Editor keybinds' })}
type="combo"
>
<SelectField
isNative
defaultValue="default"
options={EDITOR_KEYBINDINGS_MODES.map(mode => ({ label: mode.label, value: mode.value }))}
value={$currentEditorKeybindigMode}
on:change={e => ($currentEditorKeybindigMode = e.detail)}
/>
</FormFieldTemplateLarge>
</div>
<div class="col-3">
<FormFieldTemplateLarge
label={_t('settings.editor.wordWrap', { defaultMessage: 'Enable word wrap' })}
type="combo"
>
<CheckboxField
checked={$currentEditorWrapEnabled}
on:change={e => ($currentEditorWrapEnabled = e.target.checked)}
/>
</FormFieldTemplateLarge>
</div>
</div>
<FormTextField
name="sqlEditor.limitRows"
label={_t('settings.sqlEditor.limitRows', { defaultMessage: 'Return only N rows from query' })}
placeholder={_t('settings.sqlEditor.limitRowsPlaceholder', { defaultMessage: '(No rows limit)' })}
/>
<FormCheckboxField
name="sqlEditor.showTableAliasesInCodeCompletion"
label={_t('settings.sqlEditor.showTableAliasesInCodeCompletion', {
defaultMessage: 'Show table aliases in code completion',
})}
defaultValue={false}
/>
<FormCheckboxField
name="sqlEditor.disableSplitByEmptyLine"
label={_t('settings.sqlEditor.disableSplitByEmptyLine', { defaultMessage: 'Disable split by empty line' })}
defaultValue={false}
/>
<FormCheckboxField
name="sqlEditor.disableExecuteCurrentLine"
label={_t('settings.sqlEditor.disableExecuteCurrentLine', {
defaultMessage: 'Disable current line execution (Execute current)',
})}
defaultValue={false}
/>
<FormCheckboxField
name="sqlEditor.hideColumnsPanel"
label={_t('settings.sqlEditor.hideColumnsPanel', { defaultMessage: 'Hide Columns/Filters panel by default' })}
defaultValue={false}
/>
</div>
<style>
.heading {
font-size: 20px;
margin: 5px;
margin-left: var(--dim-large-form-margin);
margin-top: var(--dim-large-form-margin);
}
</style>

View File

@@ -35,12 +35,13 @@ ORDER BY
`; `;
</script> </script>
<div class="heading">{_t('settings.appearance', { defaultMessage: 'Application theme' })}</div> <div class="wrapper">
<div class="heading">{_t('settings.appearance', { defaultMessage: 'Application theme' })}</div>
<FormFieldTemplateLarge <FormFieldTemplateLarge
label={_t('settings.appearance.useSystemTheme', { defaultMessage: 'Use system theme' })} label={_t('settings.appearance.useSystemTheme', { defaultMessage: 'Use system theme' })}
type="checkbox" type="checkbox"
labelProps={{ labelProps={{
onClick: () => { onClick: () => {
if ($currentTheme) { if ($currentTheme) {
$currentTheme = null; $currentTheme = null;
@@ -48,9 +49,9 @@ labelProps={{
$currentTheme = getSystemTheme(); $currentTheme = getSystemTheme();
} }
}, },
}} }}
> >
<CheckboxField <CheckboxField
checked={!$currentTheme} checked={!$currentTheme}
on:change={e => { on:change={e => {
if (e.target['checked']) { if (e.target['checked']) {
@@ -59,29 +60,29 @@ labelProps={{
$currentTheme = getSystemTheme(); $currentTheme = getSystemTheme();
} }
}} }}
/> />
</FormFieldTemplateLarge> </FormFieldTemplateLarge>
<div class="themes"> <div class="themes">
{#each $extensions.themes as theme} {#each $extensions.themes as theme}
<ThemeSkeleton {theme} /> <ThemeSkeleton {theme} />
{/each} {/each}
</div> </div>
<div class="m-5"> <div class="m-5">
{_t('settings.appearance.moreThemes', { defaultMessage: 'More themes are available as' })} {_t('settings.appearance.moreThemes', { defaultMessage: 'More themes are available as' })}
<Link onClick={openThemePlugins}>plugins</Link> <Link onClick={openThemePlugins}>plugins</Link>
<br /> <br />
{_t('settings.appearance.afterInstalling', { {_t('settings.appearance.afterInstalling', {
defaultMessage: defaultMessage:
'After installing theme plugin (try search "theme" in available extensions) new themes will be available here.', 'After installing theme plugin (try search "theme" in available extensions) new themes will be available here.',
})} })}
</div> </div>
<div class="heading">{_t('settings.appearance.editorTheme', { defaultMessage: 'Editor theme' })}</div> <div class="heading">{_t('settings.appearance.editorTheme', { defaultMessage: 'Editor theme' })}</div>
<div class="flex"> <div class="flex">
<div class="col-3"> <div class="col-3">
<FormFieldTemplateLarge <FormFieldTemplateLarge
label={_t('settings.appearance.editorTheme', { defaultMessage: 'Theme' })} label={_t('settings.appearance.editorTheme', { defaultMessage: 'Theme' })}
type="combo" type="combo"
@@ -94,9 +95,9 @@ labelProps={{
on:change={e => ($currentEditorTheme = e.detail)} on:change={e => ($currentEditorTheme = e.detail)}
/> />
</FormFieldTemplateLarge> </FormFieldTemplateLarge>
</div> </div>
<div class="col-3"> <div class="col-3">
<FormFieldTemplateLarge <FormFieldTemplateLarge
label={_t('settings.appearance.fontSize', { defaultMessage: 'Font size' })} label={_t('settings.appearance.fontSize', { defaultMessage: 'Font size' })}
type="combo" type="combo"
@@ -109,9 +110,9 @@ labelProps={{
on:change={e => ($currentEditorFontSize = e.detail)} on:change={e => ($currentEditorFontSize = e.detail)}
/> />
</FormFieldTemplateLarge> </FormFieldTemplateLarge>
</div> </div>
<div class="col-3"> <div class="col-3">
<FormFieldTemplateLarge <FormFieldTemplateLarge
label={_t('settings.appearance.customSize', { defaultMessage: 'Custom size' })} label={_t('settings.appearance.customSize', { defaultMessage: 'Custom size' })}
type="text" type="text"
@@ -123,21 +124,21 @@ labelProps={{
$currentEditorFontSize != 'custom'} $currentEditorFontSize != 'custom'}
/> />
</FormFieldTemplateLarge> </FormFieldTemplateLarge>
</div> </div>
<div class="col-3"> <div class="col-3">
<FormTextField <FormTextField
name="editor.fontFamily" name="editor.fontFamily"
label={_t('settings.appearance.fontFamily', { defaultMessage: 'Editor font family' })} label={_t('settings.appearance.fontFamily', { defaultMessage: 'Editor font family' })}
/> />
</div> </div>
</div> </div>
<div class="editor"> <div class="editor">
<SqlEditor value={sqlPreview} readOnly /> <SqlEditor value={sqlPreview} readOnly />
</div>
</div> </div>
<style> <style>
.heading { .heading {
font-size: 20px; font-size: 20px;
@@ -159,8 +160,7 @@ labelProps={{
.editor { .editor {
position: relative; position: relative;
height: 400px; height: 250px;
min-height: 200px;
width: 400px; width: 400px;
margin-left: var(--dim-large-form-margin); margin-left: var(--dim-large-form-margin);
margin-top: var(--dim-large-form-margin); margin-top: var(--dim-large-form-margin);

View File

@@ -13,6 +13,8 @@
import { isProApp } from "../utility/proTools"; import { isProApp } from "../utility/proTools";
import { _t } from "../translations"; import { _t } from "../translations";
import CommandListTab from "./CommandListTab.svelte"; import CommandListTab from "./CommandListTab.svelte";
import DataGridSettings from "../settings/DataGridSettings.svelte";
import SQLEditorSettings from "../settings/SQLEditorSettings.svelte";
const menuItems = [ const menuItems = [
{ {
@@ -29,6 +31,20 @@
props: {}, props: {},
testid: 'settings-connection', 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' }), label: _t('settings.theme', { defaultMessage: 'Themes' }),
identifier: 'theme', identifier: 'theme',