translation-table editor, query, table structure

This commit is contained in:
Stela Augustinova
2025-11-04 16:52:45 +01:00
parent 0ebed9b46f
commit e378fc3cfb
23 changed files with 566 additions and 152 deletions

View File

@@ -5,6 +5,7 @@
import ObjectListControl from '../elements/ObjectListControl.svelte';
import Link from './Link.svelte';
import { _t } from '../translations';
export let collection;
export let title;
@@ -24,18 +25,18 @@
columns={[
{
fieldName: 'baseColumns',
header: 'Base columns',
header: _t('foreignKey.baseColumns', { defaultMessage: 'Base columns' }),
slot: 0,
sortable: true,
},
{
fieldName: 'refTableName',
header: 'Referenced table',
header: _t('foreignKey.refTableName', { defaultMessage: 'Referenced table' }),
sortable: true,
},
{
fieldName: 'refColumns',
header: 'Referenced columns',
header: _t('foreignKey.refColumns', { defaultMessage: 'Referenced columns' }),
slot: 1,
sortable: true,
},
@@ -60,5 +61,5 @@
<svelte:fragment slot="name" let:row><ConstraintLabel {...row} /></svelte:fragment>
<svelte:fragment slot="0" let:row>{row?.columns.map(x => x.columnName).join(', ')}</svelte:fragment>
<svelte:fragment slot="1" let:row>{row?.columns.map(x => x.refColumnName).join(', ')}</svelte:fragment>
<svelte:fragment slot="2" let:row><Link onClick={() => onRemove(row)}>Remove</Link></svelte:fragment>
<svelte:fragment slot="2" let:row><Link onClick={() => onRemove(row)}>{_t('common.remove', { defaultMessage: 'Remove' })}</Link></svelte:fragment>
</ObjectListControl>

View File

@@ -4,6 +4,7 @@
import Link from './Link.svelte';
import TableControl from './TableControl.svelte';
import { writable } from 'svelte/store';
import { _t } from '../translations';
export let title;
export let collection;
@@ -39,7 +40,7 @@
</span>
<span class="title mr-1">{title}</span>
{#if onAddNew}
<Link onClick={onAddNew}><FontIcon icon="icon add" /> Add new</Link>
<Link onClick={onAddNew}><FontIcon icon="icon add" />{_t('common.addNew', { defaultMessage: 'Add new' })}</Link>
{/if}
{#if multipleItemsActions && activeMultipleSelection && activeMultipleSelection?.length > 0}
{#each multipleItemsActions as item}
@@ -65,7 +66,7 @@
columns={_.compact([
!hideDisplayName && {
fieldName: displayNameFieldName || 'displayName',
header: 'Name',
header: _t('common.name', { defaultMessage: 'Name' }),
slot: -1,
sortable: true,
filterable: !!displayNameFieldName,

View File

@@ -37,7 +37,7 @@
{#if isFormView}
<div class="m-1">
<div>Column name filter</div>
<div>{_t('datagrid.columnNameFilter', { defaultMessage: 'Column name filter' })}</div>
<div class="flex">
<input
type="text"

View File

@@ -9,6 +9,8 @@
import ModalBase from './ModalBase.svelte';
import { closeCurrentModal } from './modalTools';
import { commandsCustomized } from '../stores';
import { _t } from '../translations';
import _ from 'lodash';
export let tabs;
export let onConfirm;
@@ -27,10 +29,10 @@
<FormProvider>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">Confirm close tabs</svelte:fragment>
<svelte:fragment slot="header">{_t('datagrid.closeTabs.header', { defaultMessage: 'Confirm close tabs' })}</svelte:fragment>
<div>
Following files are modified, really close tabs? After closing, you could reopen them in history
{_t('datagrid.closeTabs.modifiedFiles', { defaultMessage: 'Following files are modified, really close tabs? After closing, you could reopen them in history' })}
<FontIcon icon="icon history" />
widget
</div>
@@ -41,7 +43,7 @@
<svelte:fragment slot="footer">
<FormSubmit
value="Close tabs"
value={_t('datagrid.closeTabs.close', { defaultMessage: 'Close tabs' })}
on:click={() => {
closeCurrentModal();
onConfirm();
@@ -49,7 +51,7 @@
/>
<FormStyledButton
type="button"
value="Cancel"
value={_t('common.cancel', { defaultMessage: 'Cancel' })}
on:click={() => {
closeCurrentModal();
onCancel();

View File

@@ -466,7 +466,7 @@
{#if defaultDatabase && driver?.showConnectionField('singleDatabase', $values, showConnectionFieldArgs)}
<FormCheckboxField
label={_t('connection.singleDatabase', { defaultMessage: `Use only database ${defaultDatabase}` })}
label={_t('connection.singleDatabase', { defaultMessage: 'Use only database {defaultDatabase}', values: { defaultDatabase } })}
name="singleDatabase"
disabled={isConnected}
data-testid="ConnectionDriverFields_singleDatabase"

View File

@@ -95,7 +95,7 @@
</div>
<div class="col-6">
<FormPasswordField
label={_t('connection.password', {defaultMessage: "Password"})}
label={_t('connection.password', {defaultMessage: 'Password'})}
name="sshPassword"
disabled={isConnected || !useSshTunnel}
templateProps={{ noMargin: true }}

View File

@@ -27,41 +27,41 @@
<FormProvider initialValues={fillEditorColumnInfo(columnInfo || {}, tableInfo)}>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header"
>{columnInfo ? 'Edit column' : `Add column ${(tableInfo?.columns || []).length + 1}`}</svelte:fragment
>{columnInfo ? _t('columnEditor.editColumn', { defaultMessage: 'Edit column' }) : _t('columnEditor.addColumn', { defaultMessage: 'Add column {columnNumber}', values: { columnNumber: (tableInfo?.columns || []).length + 1 } })}</svelte:fragment
>
<FormTextField name="columnName" label="Column name" focused disabled={isReadOnly} />
<FormTextField name="columnName" label={_t('columnEditor.columnName', { defaultMessage: 'Column name' })} focused disabled={isReadOnly} />
<DataTypeEditor dialect={driver?.dialect} disabled={isReadOnly} />
{#if !driver?.dialect?.specificNullabilityImplementation}
<FormCheckboxField name="notNull" label="NOT NULL" disabled={isReadOnly} />
{/if}
<FormCheckboxField name="isPrimaryKey" label="Is Primary Key" disabled={isReadOnly} />
<FormCheckboxField name="isPrimaryKey" label={_t('columnEditor.isPrimaryKey', { defaultMessage: 'Is Primary Key' })} disabled={isReadOnly} />
{#if !driver?.dialect?.disableAutoIncrement}
<FormCheckboxField name="autoIncrement" label="Is Autoincrement" disabled={isReadOnly} />
<FormCheckboxField name="autoIncrement" label={_t('columnEditor.autoIncrement', { defaultMessage: 'Is Autoincrement' })} disabled={isReadOnly} />
{/if}
<FormTextField
name="defaultValue"
label="Default value. Please use valid SQL expression, eg. 'Hello World' for string value, '' for empty string"
label={_t('columnEditor.defaultValue', { defaultMessage: "Default value. Please use valid SQL expression, eg. 'Hello World' for string value, '' for empty string" })}
disabled={!setTableInfo}
/>
<FormTextField name="computedExpression" label="Computed expression" disabled={isReadOnly} />
<FormTextField name="computedExpression" label={_t('columnEditor.computedExpression', { defaultMessage: 'Computed expression' })} disabled={isReadOnly} />
{#if driver?.dialect?.columnProperties?.isUnsigned}
<FormCheckboxField name="isUnsigned" label="Unsigned" disabled={isReadOnly} />
<FormCheckboxField name="isUnsigned" label={_t('columnEditor.isUnsigned', { defaultMessage: 'Unsigned' })} disabled={isReadOnly} />
{/if}
{#if driver?.dialect?.columnProperties?.isZerofill}
<FormCheckboxField name="isZerofill" label="Zero fill" disabled={isReadOnly} />
<FormCheckboxField name="isZerofill" label={_t('columnEditor.isZerofill', { defaultMessage: 'Zero fill' })} disabled={isReadOnly} />
{/if}
{#if driver?.dialect?.columnProperties?.columnComment}
<FormTextField name="columnComment" label="Comment" disabled={isReadOnly} />
<FormTextField name="columnComment" label={_t('columnEditor.columnComment', { defaultMessage: 'Comment' })} disabled={isReadOnly} />
{/if}
{#if driver?.dialect?.columnProperties?.isSparse}
<FormCheckboxField name="isSparse" label="Sparse" disabled={isReadOnly} />
<FormCheckboxField name="isSparse" label={_t('columnEditor.isSparse', { defaultMessage: 'Sparse' })} disabled={isReadOnly} />
{/if}
<svelte:fragment slot="footer">
<FormSubmit
value={columnInfo ? 'Save' : 'Save and next'}
value={columnInfo ? _t('common.save', { defaultMessage: 'Save' }) : _t('common.saveAndNext', { defaultMessage: 'Save and next' })}
disabled={isReadOnly}
on:click={e => {
closeCurrentModal();
@@ -85,11 +85,11 @@
/>
{/if}
<FormStyledButton type="button" value="Close" on:click={closeCurrentModal} />
<FormStyledButton type="button" value={_t('common.close', { defaultMessage: 'Close' })} on:click={closeCurrentModal} />
{#if columnInfo}
<FormStyledButton
type="button"
value="Remove"
value={_t('common.remove', { defaultMessage: 'Remove' })}
on:click={() => {
closeCurrentModal();
setTableInfo(tbl => editorDeleteColumn(tbl, columnInfo, addDataCommand));

View File

@@ -9,13 +9,15 @@
import { editorAddConstraint, editorDeleteConstraint, editorModifyConstraint } from 'dbgate-tools';
import TextField from '../forms/TextField.svelte';
import SelectField from '../forms/SelectField.svelte';
import { _t, __t } from '../translations';
import _ from 'lodash';
export let constraintInfo;
export let setTableInfo;
export let tableInfo;
export let constraintLabel;
export let constraintType;
export let constraintNameLabel = 'Constraint name';
export let constraintNameLabel = _t('tableEditor.constraintName', { defaultMessage: 'Constraint name' });
export let getExtractConstraintProps;
export let hideConstraintName = false;
@@ -41,7 +43,7 @@
<FormProvider>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header"
>{constraintInfo ? `Edit ${constraintLabel}` : `Add ${constraintLabel}`}</svelte:fragment
>{constraintInfo ? _t('tableEdit.editConstraintLabel', { defaultMessage: 'Edit {constraintLabel}', values: { constraintLabel: _.isFunction(constraintLabel) ? constraintLabel() : constraintLabel } }) : _t('tableEdit.addConstraintLabel', { defaultMessage: 'Add {constraintLabel}', values: { constraintLabel: _.isFunction(constraintLabel) ? constraintLabel() : constraintLabel } })}</svelte:fragment
>
<div class="largeFormMarker">
@@ -65,7 +67,7 @@
{#each columns as column, index}
<div class="row">
<div class="label col-3">Column {index + 1}</div>
<div class="label col-3">{_t('common.column', { defaultMessage: 'Column ' })}{index + 1}</div>
<div class={$$slots.column ? 'col-3' : 'col-6'}>
{#key column.columnName}
<SelectField
@@ -91,7 +93,7 @@
{/if}
<div class="col-3 button">
<FormStyledButton
value="Delete"
value={_t('common.delete', { defaultMessage: 'Delete' })}
disabled={isReadOnly}
on:click={e => {
const x = [...columns];
@@ -104,11 +106,11 @@
{/each}
<div class="row">
<div class="label col-3">Add new column</div>
<div class="label col-3">{_t('columnsConstraintEditor.addNewColumn', { defaultMessage: 'Add new column' })}</div>
<div class="col-9">
{#key columns.length}
<SelectField
placeholder="Select column"
placeholder={_t('columnsConstraintEditor.selectColumn', { defaultMessage: 'Select column' })}
disabled={isReadOnly}
value={''}
on:change={e => {
@@ -123,7 +125,7 @@
isNative
options={[
{
label: 'Choose column',
label: _t('columnsConstraintEditor.chooseColumn', { defaultMessage: 'Choose column' }) ,
value: '',
},
...(tableInfo?.columns?.map(col => ({
@@ -139,7 +141,7 @@
<svelte:fragment slot="footer">
<FormSubmit
value={'Save'}
value={_t('common.save', { defaultMessage: 'Save' })}
disabled={isReadOnly}
on:click={() => {
closeCurrentModal();
@@ -151,11 +153,11 @@
}}
/>
<FormStyledButton type="button" value="Close" on:click={closeCurrentModal} />
<FormStyledButton type="button" value={_t('common.close', { defaultMessage: 'Close' })} on:click={closeCurrentModal} />
{#if constraintInfo}
<FormStyledButton
type="button"
value="Remove"
value={_t('common.remove', { defaultMessage: 'Remove' })}
disabled={isReadOnly}
on:click={() => {
closeCurrentModal();

View File

@@ -1,6 +1,7 @@
<script lang="ts">
import FormDropDownTextField from '../forms/FormDropDownTextField.svelte';
import { getFormContext } from '../forms/FormProviderCore.svelte';
import { _t } from '../translations';
const { values, setFieldValue } = getFormContext();
@@ -17,4 +18,4 @@
export let disabled = false;
</script>
<FormDropDownTextField name="dataType" label="Data type" menu={createDataTypesMenu} {disabled} />
<FormDropDownTextField name="dataType" label="{_t('tableEditor.dataType', { defaultMessage: 'Data type' })}" menu={createDataTypesMenu} {disabled} />

View File

@@ -60,11 +60,11 @@
<FormProvider>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">{constraintInfo ? `Edit foreign key` : `Add foreign key`}</svelte:fragment>
<svelte:fragment slot="header">{constraintInfo ? _t('foreignKeyEditor.editForeignKey', { defaultMessage: 'Edit foreign key' }) : _t('foreignKeyEditor.addForeignKey', { defaultMessage: 'Add foreign key' })}</svelte:fragment>
<div class="largeFormMarker">
<div class="row">
<div class="label col-3">Constraint name</div>
<div class="label col-3">{_t('tableEditor.constraintName', { defaultMessage: 'Constraint name' })}</div>
<div class="col-9">
<TextField
value={constraintName}
@@ -76,7 +76,7 @@
</div>
<div class="row">
<div class="label col-3">Referenced table</div>
<div class="label col-3">{_t('foreignKeyEditor.referencedTable', { defaultMessage: 'Referenced table' })}</div>
<div class="col-9">
<SelectField
value={fullNameToString({ pureName: refTableName, schemaName: refSchemaName })}
@@ -99,7 +99,7 @@
</div>
<div class="row">
<div class="label col-3">On update action</div>
<div class="label col-3">{_t('foreignKeyEditor.onUpdateAction', { defaultMessage: 'On update action' })}</div>
<div class="col-9">
<SelectField
value={updateAction}
@@ -115,7 +115,7 @@
</div>
<div class="row">
<div class="label col-3">On delete action</div>
<div class="label col-3">{_t('foreignKeyEditor.onDeleteAction', { defaultMessage: 'On delete action' })}</div>
<div class="col-9">
<SelectField
value={deleteAction}
@@ -132,10 +132,10 @@
<div class="row">
<div class="col-5 mr-1">
Base column - {tableInfo.pureName}
{_t('foreignKeyEditor.baseColumn', { defaultMessage: 'Base column - ' })}{tableInfo.pureName}
</div>
<div class="col-5 ml-1">
Ref column - {refTableName || '(table not set)'}
{_t('foreignKeyEditor.refColumn', { defaultMessage: 'Ref column - ' })}{refTableName || _t('foreignKeyEditor.tableNotSet', { defaultMessage: '(table not set)' })}
</div>
</div>
@@ -195,7 +195,7 @@
<FormStyledButton
type="button"
value="Add column"
value={_t('foreignKeyEditor.addColumn', { defaultMessage: 'Add column' })}
disabled={isReadOnly}
on:click={() => {
columns = [...columns, {}];
@@ -217,12 +217,12 @@
}}
/>
<FormStyledButton type="button" value="Close" on:click={closeCurrentModal} />
<FormStyledButton type="button" value={_t('common.close', { defaultMessage: 'Close' })} on:click={closeCurrentModal} />
{#if constraintInfo}
<FormStyledButton
type="button"
disabled={isReadOnly}
value="Remove"
value={_t('common.remove', { defaultMessage: 'Remove' })}
on:click={() => {
closeCurrentModal();
setTableInfo(tbl => editorDeleteConstraint(tbl, constraintInfo));

View File

@@ -3,6 +3,7 @@
import FormCheckboxField from '../forms/FormCheckboxField.svelte';
import SelectField from '../forms/SelectField.svelte';
import TextField from '../forms/TextField.svelte';
import { _t } from '../translations';
import ColumnsConstraintEditorModal from './ColumnsConstraintEditorModal.svelte';
@@ -29,7 +30,7 @@
{...$$restProps}
constraintLabel="index"
constraintType="index"
constraintNameLabel="Index name"
constraintNameLabel={_t('indexEditor.indexName', { defaultMessage: 'Index name' })}
{constraintInfo}
{setTableInfo}
{tableInfo}
@@ -61,15 +62,14 @@
<svelte:fragment slot="constraintProps">
<div class="largeFormMarker">
<div class="row">
<CheckboxField checked={isUnique} on:change={e => (isUnique = e.target.checked)} disabled={isReadOnly} /> Is unique
index
<CheckboxField checked={isUnique} on:change={e => (isUnique = e.target.checked)} disabled={isReadOnly} /> {_t('indexEditor.isUnique', { defaultMessage: 'Is unique index' })}
</div>
</div>
<div class="largeFormMarker">
{#if driver?.dialect?.filteredIndexes}
<div class="row">
<div class="label col-3">Filtered index condition</div>
<div class="label col-3">{_t('indexEditor.filteredIndexCondition', { defaultMessage: 'Filtered index condition' })}</div>
<div class="col-9">
<TextField
value={filterDefinition}

View File

@@ -1,12 +1,13 @@
<script lang="ts">
import ColumnsConstraintEditorModal from './ColumnsConstraintEditorModal.svelte';
import { _t } from '../translations';
export let constraintInfo;
export let setTableInfo;
export let tableInfo;
export let driver;
export let constraintLabel = 'primary key';
export let constraintLabel = _t('tableEditor.primaryKey', { defaultMessage: 'primary key' });
export let constraintType = 'primaryKey';
</script>

View File

@@ -9,13 +9,14 @@
import { showModal } from '../modals/modalTools';
import PrimaryKeyEditorModal from './PrimaryKeyEditorModal.svelte';
import { _t } from '../translations';
export let tableInfo;
export let setTableInfo;
export let isWritable;
export let driver;
export let constraintLabel = 'primary key';
export let constraintLabel = _t('tableEditor.primaryKey', { defaultMessage: 'primary key' });
export let constraintType = 'primaryKey';
$: columns = tableInfo?.columns;
@@ -35,7 +36,12 @@
<ObjectListControl
collection={_.compact([keyConstraint])}
title={_.startCase(constraintLabel)}
emptyMessage={isWritable ? `No ${constraintLabel} defined` : null}
emptyMessage={isWritable
? _t('tableEditor.noConstraintDefined', {
defaultMessage: 'No {constraintLabel} defined',
values: { constraintLabel },
})
: null}
onAddNew={isWritable && !keyConstraint && columns?.length > 0 ? addKeyConstraint : null}
hideDisplayName={driver?.dialect?.anonymousPrimaryKey}
clickable
@@ -51,7 +57,7 @@
columns={[
{
fieldName: 'columns',
header: 'Columns',
header: _t('tableEditor.columns', { defaultMessage: 'Columns' }),
slot: 0,
sortable: true,
},
@@ -70,7 +76,7 @@
onClick={e => {
e.stopPropagation();
setTableInfo(tbl => editorDeleteConstraint(tbl, row));
}}>Remove</Link
}}>{_t('common.remove', { defaultMessage: 'Remove' })}</Link
></svelte:fragment
>
</ObjectListControl>

View File

@@ -3,8 +3,8 @@
registerCommand({
id: 'tableEditor.addColumn',
category: 'Table editor',
name: 'Add column',
category: __t('tableEditor', { defaultMessage: 'Table editor'}),
name: __t('tableEditor.addColumn', { defaultMessage: 'Add column'}),
icon: 'icon add-column',
toolbar: true,
isRelatedToTab: true,
@@ -14,8 +14,8 @@
registerCommand({
id: 'tableEditor.addPrimaryKey',
category: 'Table editor',
name: 'Add primary key',
category: __t('tableEditor', { defaultMessage: 'Table editor'}),
name: __t('tableEditor.addPrimaryKey', { defaultMessage: 'Add primary key'}),
icon: 'icon add-key',
toolbar: true,
isRelatedToTab: true,
@@ -25,8 +25,8 @@
registerCommand({
id: 'tableEditor.addForeignKey',
category: 'Table editor',
name: 'Add foreign key',
category: __t('tableEditor', { defaultMessage: 'Table editor'}),
name: __t('tableEditor.addForeignKey', { defaultMessage: 'Add foreign key'}),
icon: 'icon add-key',
toolbar: true,
isRelatedToTab: true,
@@ -36,8 +36,8 @@
registerCommand({
id: 'tableEditor.addIndex',
category: 'Table editor',
name: 'Add index',
category: __t('tableEditor', { defaultMessage: 'Table editor'}),
name: __t('tableEditor.addIndex', { defaultMessage: 'Add index'}),
icon: 'icon add-key',
toolbar: true,
isRelatedToTab: true,
@@ -47,8 +47,8 @@
registerCommand({
id: 'tableEditor.addUnique',
category: 'Table editor',
name: 'Add unique',
category: __t('tableEditor', { defaultMessage: 'Table editor'}),
name: __t('tableEditor.addUnique', { defaultMessage: 'Add unique'}),
icon: 'icon add-key',
toolbar: true,
isRelatedToTab: true,
@@ -83,6 +83,7 @@
import UniqueEditorModal from './UniqueEditorModal.svelte';
import ObjectFieldsEditor from '../elements/ObjectFieldsEditor.svelte';
import PrimaryKeyLikeListControl from './PrimaryKeyLikeListControl.svelte';
import { __t, _t } from '../translations';
export const activator = createActivator('TableEditor', true);
@@ -171,9 +172,9 @@
{#if tableInfo && (tableFormOptions || isCreateTable)}
{#key resetCounter}
<ObjectFieldsEditor
title="Table properties"
title={_t('tableEditor.tableproperties', { defaultMessage: 'Table properties' })}
fieldDefinitions={tableFormOptions ?? []}
pureNameTitle={isCreateTable ? 'Table name' : null}
pureNameTitle={isCreateTable ? _t('tableEditor.tablename', { defaultMessage: 'Table name' }) : null}
schemaList={isCreateTable && schemaList?.length >= 0 ? schemaList : null}
values={_.pick(tableInfo, ['schemaName', 'pureName', ...(tableFormOptions ?? []).map(x => x.name)])}
onChangeValues={vals => {
@@ -187,15 +188,15 @@
<ObjectListControl
collection={columns?.map((x, index) => ({ ...x, ordinal: index + 1 }))}
title={`Columns (${columns?.length || 0})`}
emptyMessage="No columns defined"
title={_t('tableEditor.columns', { defaultMessage: 'Columns ({columnCount})', values: { columnCount: columns?.length || 0 } })}
emptyMessage={_t('tableEditor.nocolumnsdefined', { defaultMessage: 'No columns defined' })}
clickable
on:clickrow={e => showModal(ColumnEditorModal, { columnInfo: e.detail, tableInfo, setTableInfo, driver })}
onAddNew={isWritable ? addColumn : null}
displayNameFieldName="columnName"
multipleItemsActions={[
{
text: 'Remove',
text: _t('tableEditor.remove', { defaultMessage: 'Remove' }),
icon: 'icon delete',
onClick: selected => {
setTableInfo(tbl => {
@@ -205,7 +206,7 @@
},
},
{
text: 'Copy names',
text: _t('tableEditor.copynames', { defaultMessage: 'Copy names' }),
icon: 'icon copy',
onClick: selected => {
const names = selected.map(x => x.columnName).join('\n');
@@ -213,7 +214,7 @@
},
},
{
text: 'Copy definitions',
text: _t('tableEditor.copydefinitions', { defaultMessage: 'Copy definitions' }),
icon: 'icon copy',
onClick: selected => {
const names = selected
@@ -226,55 +227,55 @@
columns={[
!driver?.dialect?.specificNullabilityImplementation && {
fieldName: 'notNull',
header: 'Nullability',
header: _t('tableEditor.nullability', { defaultMessage: 'Nullability' }),
sortable: true,
slot: 0,
},
{
fieldName: 'dataType',
header: 'Data Type',
header: _t('tableEditor.dataType', { defaultMessage: 'Data type' }),
sortable: true,
filterable: true,
},
{
fieldName: 'defaultValue',
header: 'Default value',
header: _t('tableEditor.defaultValue', { defaultMessage: 'Default value' }),
sortable: true,
filterable: true,
},
driver?.dialect?.columnProperties?.isSparse && {
fieldName: 'isSparse',
header: 'Is Sparse',
header: _t('tableEditor.isSparse', { defaultMessage: 'Is Sparse' }),
sortable: true,
slot: 1,
},
{
fieldName: 'computedExpression',
header: 'Computed Expression',
header: _t('tableEditor.computedExpression', { defaultMessage: 'Computed Expression' }),
sortable: true,
filterable: true,
},
driver?.dialect?.columnProperties?.isPersisted && {
fieldName: 'isPersisted',
header: 'Is Persisted',
header: _t('tableEditor.isPersisted', { defaultMessage: 'Is Persisted' }),
sortable: true,
slot: 2,
},
driver?.dialect?.columnProperties?.isUnsigned && {
fieldName: 'isUnsigned',
header: 'Unsigned',
header: _t('tableEditor.isUnsigned', { defaultMessage: 'Unsigned' }),
sortable: true,
slot: 4,
},
driver?.dialect?.columnProperties?.isZerofill && {
fieldName: 'isZerofill',
header: 'Zero fill',
header: _t('tableEditor.isZeroFill', { defaultMessage: 'Zero fill' }),
sortable: true,
slot: 5,
},
driver?.dialect?.columnProperties?.columnComment && {
fieldName: 'columnComment',
header: 'Comment',
header: _t('tableEditor.columnComment', { defaultMessage: 'Comment' }),
sortable: true,
filterable: true,
},
@@ -287,19 +288,19 @@
: null,
]}
>
<svelte:fragment slot="0" let:row>{row?.notNull ? 'NOT NULL' : 'NULL'}</svelte:fragment>
<svelte:fragment slot="1" let:row>{row?.isSparse ? 'YES' : 'NO'}</svelte:fragment>
<svelte:fragment slot="2" let:row>{row?.isPersisted ? 'YES' : 'NO'}</svelte:fragment>
<svelte:fragment slot="0" let:row>{row?.notNull ? _t('tableEditor.notnull', { defaultMessage: 'NOT NULL' }) : _t('tableEditor.null', { defaultMessage: 'NULL' })}</svelte:fragment>
<svelte:fragment slot="1" let:row>{row?.isSparse ? _t('tableEditor.yes', { defaultMessage: 'YES' }) : _t('tableEditor.no', { defaultMessage: 'NO' })}</svelte:fragment>
<svelte:fragment slot="2" let:row>{row?.isPersisted ? _t('tableEditor.yes', { defaultMessage: 'YES' }) : _t('tableEditor.no', { defaultMessage: 'NO' })}</svelte:fragment>
<svelte:fragment slot="3" let:row
><Link
onClick={e => {
e.stopPropagation();
setTableInfo(tbl => editorDeleteColumn(tbl, row));
}}>Remove</Link
}}>{_t('tableEditor.remove', { defaultMessage: 'Remove' })}</Link
></svelte:fragment
>
<svelte:fragment slot="4" let:row>{row?.isUnsigned ? 'YES' : 'NO'}</svelte:fragment>
<svelte:fragment slot="5" let:row>{row?.isZerofill ? 'YES' : 'NO'}</svelte:fragment>
<svelte:fragment slot="4" let:row>{row?.isUnsigned ? _t('tableEditor.yes', { defaultMessage: 'YES' }) : _t('tableEditor.no', { defaultMessage: 'NO' })}</svelte:fragment>
<svelte:fragment slot="5" let:row>{row?.isZerofill ? _t('tableEditor.yes', { defaultMessage: 'YES' }) : _t('tableEditor.no', { defaultMessage: 'NO' })}</svelte:fragment>
<svelte:fragment slot="name" let:row><ColumnLabel {...row} forceIcon /></svelte:fragment>
</ObjectListControl>
@@ -320,20 +321,20 @@
<ObjectListControl
collection={indexes}
onAddNew={isWritable && columns?.length > 0 ? addIndex : null}
title={`Indexes (${indexes?.length || 0})`}
emptyMessage={isWritable ? 'No index defined' : null}
title={_t('tableEditor.indexes', { defaultMessage: 'Indexes ({indexCount})', values: { indexCount: indexes?.length || 0 } })}
emptyMessage={isWritable ? _t('tableEditor.noindexdefined', { defaultMessage: 'No index defined' }) : null}
clickable
on:clickrow={e => showModal(IndexEditorModal, { constraintInfo: e.detail, tableInfo, setTableInfo, driver })}
columns={[
{
fieldName: 'columns',
header: 'Columns',
header: _t('tableEditor.columns', { defaultMessage: 'Columns' }),
slot: 0,
sortable: true,
},
{
fieldName: 'unique',
header: 'Unique',
header: _t('tableEditor.unique', { defaultMessage: 'Unique' }),
slot: 1,
sortable: true,
},
@@ -347,13 +348,13 @@
>
<svelte:fragment slot="name" let:row><ConstraintLabel {...row} /></svelte:fragment>
<svelte:fragment slot="0" let:row>{row?.columns.map(x => x.columnName).join(', ')}</svelte:fragment>
<svelte:fragment slot="1" let:row>{row?.isUnique ? 'YES' : 'NO'}</svelte:fragment>
<svelte:fragment slot="1" let:row>{row?.isUnique ? _t('tableEditor.yes', { defaultMessage: 'YES' }) : _t('tableEditor.no', { defaultMessage: 'NO' })}</svelte:fragment>
<svelte:fragment slot="2" let:row
><Link
onClick={e => {
e.stopPropagation();
setTableInfo(tbl => editorDeleteConstraint(tbl, row));
}}>Remove</Link
}}>{_t('common.remove', { defaultMessage: 'Remove' })}</Link
></svelte:fragment
>
</ObjectListControl>
@@ -363,14 +364,14 @@
<ObjectListControl
collection={uniques}
onAddNew={isWritable && columns?.length > 0 ? addUnique : null}
title={`Unique constraints (${uniques?.length || 0})`}
emptyMessage={isWritable ? 'No unique defined' : null}
title={_t('tableEditor.uniqueConstraints', { defaultMessage: 'Unique constraints ({constraintCount})', values: { constraintCount: uniques?.length || 0 } })}
emptyMessage={isWritable ? _t('tableEditor.nouniquedefined', { defaultMessage: 'No unique defined' }) : null}
clickable
on:clickrow={e => showModal(UniqueEditorModal, { constraintInfo: e.detail, tableInfo, setTableInfo })}
columns={[
{
fieldName: 'columns',
header: 'Columns',
header: _t('tableEditor.columns', { defaultMessage: 'Columns' }),
slot: 0,
sortable: true,
},
@@ -390,7 +391,7 @@
onClick={e => {
e.stopPropagation();
setTableInfo(tbl => editorDeleteConstraint(tbl, row));
}}>Remove</Link
}}>{_t('common.remove', { defaultMessage: 'Remove' })}</Link
></svelte:fragment
>
</ObjectListControl>
@@ -400,13 +401,13 @@
<ForeignKeyObjectListControl
collection={foreignKeys}
onAddNew={isWritable && columns?.length > 0 ? addForeignKey : null}
title={`Foreign keys (${foreignKeys?.length || 0})`}
emptyMessage={isWritable ? 'No foreign key defined' : null}
title={_t('tableEditor.foreignKeys', { defaultMessage: 'Foreign keys ({foreignKeyCount})', values: { foreignKeyCount: foreignKeys?.length || 0 } })}
emptyMessage={isWritable ? _t('tableEditor.noforeignkeydefined', { defaultMessage: 'No foreign key defined' }) : null}
clickable
onRemove={row => setTableInfo(tbl => editorDeleteConstraint(tbl, row))}
on:clickrow={e => showModal(ForeignKeyEditorModal, { constraintInfo: e.detail, tableInfo, setTableInfo, dbInfo })}
/>
<ForeignKeyObjectListControl collection={dependencies} title="Dependencies" />
<ForeignKeyObjectListControl collection={dependencies} title={_t('tableEditor.dependencies', { defaultMessage: 'Dependencies' })} />
{/if}
</div>

View File

@@ -1,5 +1,6 @@
<script lang="ts">
import ColumnsConstraintEditorModal from './ColumnsConstraintEditorModal.svelte';
import { _t } from '../translations';
export let constraintInfo;
export let setTableInfo;
@@ -9,7 +10,7 @@
<ColumnsConstraintEditorModal
{...$$restProps}
constraintLabel="unique"
constraintLabel={_t('tableEdit.unique', { defaultMessage: "unique" })}
constraintType="unique"
{constraintInfo}
{setTableInfo}

View File

@@ -300,7 +300,7 @@
contentTestId="ConnectionTab_tabControlContent"
tabs={[
{
label: 'General',
label: _t('common.general', { defaultMessage: 'General' }),
component: ConnectionDriverFields,
props: { getDatabaseList, currentConnection },
testid: 'ConnectionTab_tabGeneral',
@@ -316,7 +316,7 @@
testid: 'ConnectionTab_tabSsl',
},
{
label: 'Advanced',
label: _t('common.advanced', { defaultMessage: 'Advanced' }),
component: ConnectionAdvancedDriverFields,
testid: 'ConnectionTab_tabAdvanced',
},
@@ -383,7 +383,7 @@
{/if}
{#if isTesting}
<div>
<FontIcon icon="icon loading" /> Testing connection
<FontIcon icon="icon loading" /> {_t('common.testingConnection', { defaultMessage: 'Testing connection' })}
</div>
{/if}
</div>

View File

@@ -2,21 +2,22 @@
import registerCommand from '../commands/registerCommand';
import { copyTextToClipboard } from '../utility/clipboard';
import yaml from 'js-yaml';
import { __t, _t } from '../translations';
const getCurrentEditor = () => getActiveComponent('QueryTab');
registerCommand({
id: 'query.formatCode',
category: 'Query',
name: 'Format code',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.formatCode', { defaultMessage: 'Format code' }),
keyText: 'Shift+Alt+F',
testEnabled: () => getCurrentEditor()?.isSqlEditor(),
onClick: () => getCurrentEditor().formatCode(),
});
registerCommand({
id: 'query.switchAiAssistant',
category: 'Query',
name: 'AI Assistant',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.AiAssistant', { defaultMessage: 'AI Assistant' }),
keyText: 'Shift+Alt+A',
icon: 'icon ai',
testEnabled: () => isProApp(),
@@ -24,23 +25,23 @@
});
registerCommand({
id: 'query.insertSqlJoin',
category: 'Query',
name: 'Insert SQL Join',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.insertSqlJoin', { defaultMessage: 'Insert SQL Join' }),
keyText: 'CtrlOrCommand+J',
testEnabled: () => getCurrentEditor()?.isSqlEditor(),
onClick: () => getCurrentEditor().insertSqlJoin(),
});
registerCommand({
id: 'query.toggleVisibleResultTabs',
category: 'Query',
name: 'Toggle visible result tabs',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.toggleVisibleResultTabs', { defaultMessage: 'Toggle visible result tabs' }),
keyText: 'CtrlOrCommand+Shift+R',
testEnabled: () => !!getCurrentEditor(),
onClick: () => getCurrentEditor().toggleVisibleResultTabs(),
});
registerFileCommands({
idPrefix: 'query',
category: 'Query',
category: __t('command.query', { defaultMessage: 'Query' }),
getCurrentEditor,
folder: 'sql',
format: 'text',
@@ -54,8 +55,8 @@
});
registerCommand({
id: 'query.executeCurrent',
category: 'Query',
name: 'Execute current',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.executeCurrent', { defaultMessage: 'Execute current' }),
keyText: 'CtrlOrCommand+Shift+Enter',
testEnabled: () =>
getCurrentEditor() != null && !getCurrentEditor()?.isBusy() && getCurrentEditor()?.hasConnection(),
@@ -63,56 +64,56 @@
});
registerCommand({
id: 'query.toggleAutoExecute',
category: 'Query',
name: 'Toggle auto execute',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.toggleAutoExecute', { defaultMessage: 'Toggle auto execute' }),
testEnabled: () => getCurrentEditor() != null,
onClick: () => getCurrentEditor().toggleAutoExecute(),
});
registerCommand({
id: 'query.toggleFixedConnection',
category: 'Query',
name: 'Toggle fixed connection',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.toggleFixedConnection', { defaultMessage: 'Toggle fixed connection' }),
testEnabled: () => getCurrentEditor() != null,
onClick: () => getCurrentEditor().toggleFixedConnection(),
});
registerCommand({
id: 'query.beginTransaction',
category: 'Query',
name: 'Begin transaction',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.beginTransaction', { defaultMessage: 'Begin transaction' }),
icon: 'icon transaction',
testEnabled: () => getCurrentEditor()?.beginTransactionEnabled(),
onClick: () => getCurrentEditor().beginTransaction(),
});
registerCommand({
id: 'query.autocommitOffSwitch',
category: 'Query',
name: 'Auto commit: OFF',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.autocommitOffSwitch', { defaultMessage: 'Auto commit: OFF' }),
icon: 'icon autocommit-off',
testEnabled: () => getCurrentEditor()?.autocommitOffSwitchEnabled(),
onClick: () => getCurrentEditor().autocommitOffSwitch(),
});
registerCommand({
id: 'query.autocommitOnSwitch',
category: 'Query',
name: 'Auto commit: ON',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.autocommitOnSwitch', { defaultMessage: 'Auto commit: ON' }),
icon: 'icon autocommit-on',
testEnabled: () => getCurrentEditor()?.autocommitOnSwitchEnabled(),
onClick: () => getCurrentEditor().autocommitOnSwitch(),
});
registerCommand({
id: 'query.commitTransaction',
category: 'Query',
name: 'Commit transaction',
toolbarName: 'Commit',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.commitTransaction', { defaultMessage: 'Commit transaction' }),
toolbarName: __t('command.query.commitTransactionToolbar', { defaultMessage: 'Commit' }),
icon: 'icon commit',
testEnabled: () => getCurrentEditor()?.endTransactionEnabled(),
onClick: () => getCurrentEditor().commitTransaction(),
});
registerCommand({
id: 'query.rollbackTransaction',
category: 'Query',
name: 'Rollback transaction',
toolbarName: 'Rollback',
category: __t('command.query', { defaultMessage: 'Query' }),
name: __t('command.query.rollbackTransaction', { defaultMessage: 'Rollback transaction' }),
toolbarName: __t('command.query.rollbackTransactionToolbar', { defaultMessage: 'Rollback' }),
icon: 'icon rollback',
testEnabled: () => getCurrentEditor()?.endTransactionEnabled(),
onClick: () => getCurrentEditor().rollbackTransaction(),
@@ -177,27 +178,27 @@
const QUERY_PARAMETER_STYLES = [
{
value: '',
text: '(no parameters)',
text: _t('query.noParameters', { defaultMessage: '(no parameters)' }),
},
{
value: '?',
text: '? (positional)',
text: _t('query.positional', { defaultMessage: '? (positional)' }),
},
{
value: '@',
text: '@variable',
text: _t('query.variable', { defaultMessage: '@variable' }),
},
{
value: ':',
text: ':variable',
text: _t('query.named', { defaultMessage: ':variable' }),
},
{
value: '$',
text: '$variable',
text: _t('query.variable', { defaultMessage: '$variable' }),
},
{
value: '#',
text: '#variable',
text: _t('query.variable', { defaultMessage: '#variable' }),
},
];
@@ -818,11 +819,11 @@
},
})}
>
{queryRowsLimit ? `Limit ${queryRowsLimit} rows` : 'Unlimited rows'}</ToolStripButton
{queryRowsLimit ? _t('query.limitRows', { defaultMessage: 'Limit {queryRowsLimit} rows', values: { queryRowsLimit } }) : _t('query.unlimitedRows', { defaultMessage: 'Unlimited rows' })}</ToolStripButton
>
{/if}
{#if resultCount == 1}
<ToolStripExportButton command="jslTableGrid.export" {quickExportHandlerRef} label="Export result" />
<ToolStripExportButton command="jslTableGrid.export" {quickExportHandlerRef} label={_t('export.result', { defaultMessage: 'Export result' })} />
{/if}
<ToolStripDropDownButton
menu={() =>
@@ -872,7 +873,7 @@
domResultTabs?.openCurrentChart();
}}
>
Open chart</ToolStripButton
{_t('chart.open', { defaultMessage: 'Open chart' })}</ToolStripButton
>
{/if}
{#if isProApp() && !visibleResultTabs && hasPermission('dbops/charts')}
@@ -883,7 +884,7 @@
autoDetectCharts = !autoDetectCharts;
}}
>
Detect chart<FontIcon
{_t('chart.detect', { defaultMessage: 'Detect chart' })}<FontIcon
icon={autoDetectCharts ? 'icon checkbox-marked' : 'icon checkbox-blank'}
padLeft
/></ToolStripButton

View File

@@ -6,8 +6,8 @@
registerCommand({
id: 'tableStructure.save',
group: 'save',
category: 'Table editor',
name: 'Save',
category: __t('command.tableEditor', { defaultMessage: 'Table editor' }),
name: __t('command.tableEditor.save', { defaultMessage: 'Save' }),
toolbar: true,
isRelatedToTab: true,
icon: 'icon save',
@@ -17,8 +17,8 @@
registerCommand({
id: 'tableStructure.reset',
category: 'Table editor',
name: 'Reset changes',
category: __t('command.tableEditor', { defaultMessage: 'Table editor' }),
name: __t('command.tableEditor.reset', { defaultMessage: 'Reset changes' }),
toolbar: true,
isRelatedToTab: true,
icon: 'icon close',
@@ -57,6 +57,7 @@
import hasPermission from '../utility/hasPermission';
import { changeTab, markTabSaved, markTabUnsaved } from '../utility/common';
import { getBoolSettingsValue } from '../settings/settingsTools';
import { _t, __t } from '../translations';
export let tabid;
export let conid;
@@ -197,7 +198,7 @@
defaultActionId: 'openTable',
},
});
}}>Data</ToolStripButton
}}>{_t('common.data', { defaultMessage: 'Data' })}</ToolStripButton
>
<ToolStripButton
@@ -230,7 +231,7 @@
<ToolStripCommandButton
command="tableStructure.save"
buttonLabel={$editorValue?.base ? 'Alter table' : 'Create table'}
buttonLabel={$editorValue?.base ? _t('tableStructure.alter', { defaultMessage: 'Alter table' }) : _t('tableStructure.create', { defaultMessage: 'Create table' })}
/>
<ToolStripCommandButton command="tableStructure.reset" />
<ToolStripCommandButton command="tableEditor.addColumn" />

View File

@@ -113,7 +113,7 @@
? (schemaList?.map(x => ({ label: x.schemaName, value: x.schemaName })) ?? [])
: [
{
label: _t('schema.all_schemas', {
label: _t('schema.allSchemas', {
defaultMessage: 'All schemas ({count})',
values: { count: objectList?.length ?? 0 },
}),

View File

@@ -193,7 +193,7 @@
<WidgetsInnerContainer hideContent={differentFocusedDb}>
<ErrorInfo
message={_t('sqlObject.databaseEmpty', { defaultMessage: `Database ${database} is empty or structure is not loaded, press Refresh button to reload structure` })}
message={_t('sqlObject.databaseEmpty', { defaultMessage: 'Database {database} is empty or structure is not loaded, press Refresh button to reload structure', values: { database } })}
icon="img alert"
/>
<div class="m-1" />