mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-03 21:03:59 +00:00
option to skip table save confirmation #329
This commit is contained in:
@@ -105,19 +105,13 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { changeSetToSql, createChangeSet } from 'dbgate-datalib';
|
|
||||||
import { parseFilter } from 'dbgate-filterparser';
|
import { parseFilter } from 'dbgate-filterparser';
|
||||||
import { scriptToSql } from 'dbgate-sqltree';
|
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import { registerQuickExportHandler } from '../buttons/ToolStripExportButton.svelte';
|
import { registerQuickExportHandler } from '../buttons/ToolStripExportButton.svelte';
|
||||||
import registerCommand from '../commands/registerCommand';
|
import registerCommand from '../commands/registerCommand';
|
||||||
import ErrorInfo from '../elements/ErrorInfo.svelte';
|
|
||||||
import { extractShellConnection } from '../impexp/createImpExpScript';
|
import { extractShellConnection } from '../impexp/createImpExpScript';
|
||||||
import ConfirmNoSqlModal from '../modals/ConfirmNoSqlModal.svelte';
|
|
||||||
import ErrorMessageModal from '../modals/ErrorMessageModal.svelte';
|
|
||||||
import ImportExportModal from '../modals/ImportExportModal.svelte';
|
import ImportExportModal from '../modals/ImportExportModal.svelte';
|
||||||
import { showModal } from '../modals/modalTools';
|
import { showModal } from '../modals/modalTools';
|
||||||
import { extensions } from '../stores';
|
|
||||||
import { apiCall } from '../utility/api';
|
import { apiCall } from '../utility/api';
|
||||||
|
|
||||||
import { registerMenu } from '../utility/contextMenu';
|
import { registerMenu } from '../utility/contextMenu';
|
||||||
|
|||||||
36
packages/web/src/forms/TemplatedCheckboxField.svelte
Normal file
36
packages/web/src/forms/TemplatedCheckboxField.svelte
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { getFormContext } from './FormProviderCore.svelte';
|
||||||
|
import { createEventDispatcher } from 'svelte';
|
||||||
|
|
||||||
|
export let label;
|
||||||
|
export let name;
|
||||||
|
export let disabled = false;
|
||||||
|
export let templateProps = {};
|
||||||
|
export let checked: boolean;
|
||||||
|
|
||||||
|
let refInput;
|
||||||
|
|
||||||
|
const { template, setFieldValue, values } = getFormContext();
|
||||||
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
|
function handleChange() {
|
||||||
|
dispatch('change', refInput.checked);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<svelte:component
|
||||||
|
this={template}
|
||||||
|
type="checkbox"
|
||||||
|
{label}
|
||||||
|
{disabled}
|
||||||
|
{...templateProps}
|
||||||
|
labelProps={disabled
|
||||||
|
? { disabled: true }
|
||||||
|
: {
|
||||||
|
onClick: () => {
|
||||||
|
dispatch('change', !refInput.checked);
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<input bind:this={refInput} {checked} type="checkbox" {...$$restProps} on:change={handleChange} />
|
||||||
|
</svelte:component>
|
||||||
@@ -2,15 +2,19 @@
|
|||||||
import FormStyledButton from '../buttons/FormStyledButton.svelte';
|
import FormStyledButton from '../buttons/FormStyledButton.svelte';
|
||||||
import FormProvider from '../forms/FormProvider.svelte';
|
import FormProvider from '../forms/FormProvider.svelte';
|
||||||
import FormSubmit from '../forms/FormSubmit.svelte';
|
import FormSubmit from '../forms/FormSubmit.svelte';
|
||||||
import JSONTree from '../jsontree/JSONTree.svelte';
|
import TemplatedCheckboxField from '../forms/TemplatedCheckboxField.svelte';
|
||||||
import AceEditor from '../query/AceEditor.svelte';
|
import AceEditor from '../query/AceEditor.svelte';
|
||||||
import newQuery from '../query/newQuery';
|
import newQuery from '../query/newQuery';
|
||||||
|
import { apiCall } from '../utility/api';
|
||||||
|
|
||||||
import ModalBase from './ModalBase.svelte';
|
import ModalBase from './ModalBase.svelte';
|
||||||
import { closeCurrentModal } from './modalTools';
|
import { closeCurrentModal } from './modalTools';
|
||||||
|
|
||||||
export let script;
|
export let script;
|
||||||
export let onConfirm;
|
export let onConfirm;
|
||||||
|
export let skipConfirmSettingKey = null;
|
||||||
|
|
||||||
|
let dontAskAgain;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<FormProvider>
|
<FormProvider>
|
||||||
@@ -21,6 +25,20 @@ import newQuery from '../query/newQuery';
|
|||||||
<AceEditor mode="javascript" readOnly value={script} />
|
<AceEditor mode="javascript" readOnly value={script} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{#if skipConfirmSettingKey}
|
||||||
|
<div class="mt-2">
|
||||||
|
<TemplatedCheckboxField
|
||||||
|
label="Don't ask again"
|
||||||
|
templateProps={{ noMargin: true }}
|
||||||
|
checked={dontAskAgain}
|
||||||
|
on:change={e => {
|
||||||
|
dontAskAgain = e.detail;
|
||||||
|
apiCall('config/update-settings', { [skipConfirmSettingKey]: e.detail });
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<div slot="footer">
|
<div slot="footer">
|
||||||
<FormSubmit
|
<FormSubmit
|
||||||
value="OK"
|
value="OK"
|
||||||
|
|||||||
@@ -17,12 +17,13 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import _, { startsWith } from 'lodash';
|
import _ from 'lodash';
|
||||||
import { writable } from 'svelte/store';
|
import { writable } from 'svelte/store';
|
||||||
import FormStyledButton from '../buttons/FormStyledButton.svelte';
|
import FormStyledButton from '../buttons/FormStyledButton.svelte';
|
||||||
import FormCheckboxField from '../forms/FormCheckboxField.svelte';
|
import FormCheckboxField from '../forms/FormCheckboxField.svelte';
|
||||||
import FormProviderCore from '../forms/FormProviderCore.svelte';
|
import FormProviderCore from '../forms/FormProviderCore.svelte';
|
||||||
import FormSubmit from '../forms/FormSubmit.svelte';
|
import FormSubmit from '../forms/FormSubmit.svelte';
|
||||||
|
import TemplatedCheckboxField from '../forms/TemplatedCheckboxField.svelte';
|
||||||
import FontIcon from '../icons/FontIcon.svelte';
|
import FontIcon from '../icons/FontIcon.svelte';
|
||||||
import newQuery from '../query/newQuery';
|
import newQuery from '../query/newQuery';
|
||||||
import SqlEditor from '../query/SqlEditor.svelte';
|
import SqlEditor from '../query/SqlEditor.svelte';
|
||||||
@@ -38,6 +39,9 @@
|
|||||||
export let engine;
|
export let engine;
|
||||||
export let recreates;
|
export let recreates;
|
||||||
export let deleteCascadesScripts;
|
export let deleteCascadesScripts;
|
||||||
|
export let skipConfirmSettingKey = null;
|
||||||
|
|
||||||
|
let dontAskAgain;
|
||||||
|
|
||||||
$: isRecreated = _.sum(_.values(recreates || {})) > 0;
|
$: isRecreated = _.sum(_.values(recreates || {})) > 0;
|
||||||
const values = writable({});
|
const values = writable({});
|
||||||
@@ -122,6 +126,20 @@
|
|||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
{#if skipConfirmSettingKey}
|
||||||
|
<div class="mt-2">
|
||||||
|
<TemplatedCheckboxField
|
||||||
|
label="Don't ask again"
|
||||||
|
templateProps={{ noMargin: true }}
|
||||||
|
checked={dontAskAgain}
|
||||||
|
on:change={e => {
|
||||||
|
dontAskAgain = e.detail;
|
||||||
|
apiCall('config/update-settings', { [skipConfirmSettingKey]: e.detail });
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<div slot="footer">
|
<div slot="footer">
|
||||||
<FormSubmit
|
<FormSubmit
|
||||||
value="OK"
|
value="OK"
|
||||||
|
|||||||
@@ -60,7 +60,8 @@ ORDER BY
|
|||||||
tabs={[
|
tabs={[
|
||||||
{ label: 'General', slot: 1 },
|
{ label: 'General', slot: 1 },
|
||||||
{ label: 'Themes', slot: 2 },
|
{ label: 'Themes', slot: 2 },
|
||||||
{ label: 'Actions', slot: 3 },
|
{ label: 'Default Actions', slot: 3 },
|
||||||
|
{ label: 'Confirmations', slot: 4 },
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<svelte:fragment slot="1">
|
<svelte:fragment slot="1">
|
||||||
@@ -224,6 +225,15 @@ ORDER BY
|
|||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
</svelte:fragment>
|
</svelte:fragment>
|
||||||
|
<svelte:fragment slot="4">
|
||||||
|
<div class="heading">Confirmations</div>
|
||||||
|
|
||||||
|
<FormCheckboxField name="skipConfirm.tableDataSave" label="Skip confirmation when saving table data (SQL)" />
|
||||||
|
<FormCheckboxField
|
||||||
|
name="skipConfirm.collectionDataSave"
|
||||||
|
label="Skip confirmation when saving collection data (NoSQL)"
|
||||||
|
/>
|
||||||
|
</svelte:fragment>
|
||||||
</TabControl>
|
</TabControl>
|
||||||
</FormValues>
|
</FormValues>
|
||||||
|
|
||||||
|
|||||||
@@ -25,8 +25,6 @@
|
|||||||
import {
|
import {
|
||||||
createChangeSet,
|
createChangeSet,
|
||||||
createGridCache,
|
createGridCache,
|
||||||
createGridConfig,
|
|
||||||
TableFormViewDisplay,
|
|
||||||
CollectionGridDisplay,
|
CollectionGridDisplay,
|
||||||
changeSetContainsChanges,
|
changeSetContainsChanges,
|
||||||
runMacroOnChangeSet,
|
runMacroOnChangeSet,
|
||||||
@@ -45,8 +43,6 @@
|
|||||||
import ConfirmNoSqlModal from '../modals/ConfirmNoSqlModal.svelte';
|
import ConfirmNoSqlModal from '../modals/ConfirmNoSqlModal.svelte';
|
||||||
import registerCommand from '../commands/registerCommand';
|
import registerCommand from '../commands/registerCommand';
|
||||||
import { registerMenu } from '../utility/contextMenu';
|
import { registerMenu } from '../utility/contextMenu';
|
||||||
import EditJsonModal from '../modals/EditJsonModal.svelte';
|
|
||||||
import ChangeSetGrider from '../datagrid/ChangeSetGrider';
|
|
||||||
import { setContext } from 'svelte';
|
import { setContext } from 'svelte';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import { apiCall } from '../utility/api';
|
import { apiCall } from '../utility/api';
|
||||||
@@ -54,6 +50,7 @@
|
|||||||
import ToolStripContainer from '../buttons/ToolStripContainer.svelte';
|
import ToolStripContainer from '../buttons/ToolStripContainer.svelte';
|
||||||
import ToolStripCommandButton from '../buttons/ToolStripCommandButton.svelte';
|
import ToolStripCommandButton from '../buttons/ToolStripCommandButton.svelte';
|
||||||
import ToolStripExportButton, { createQuickExportHandlerRef } from '../buttons/ToolStripExportButton.svelte';
|
import ToolStripExportButton, { createQuickExportHandlerRef } from '../buttons/ToolStripExportButton.svelte';
|
||||||
|
import { getBoolSettingsValue } from '../settings/settingsTools';
|
||||||
|
|
||||||
export let tabid;
|
export let tabid;
|
||||||
export let conid;
|
export let conid;
|
||||||
@@ -119,11 +116,16 @@
|
|||||||
const driver = findEngineDriver($connection, $extensions);
|
const driver = findEngineDriver($connection, $extensions);
|
||||||
const script = driver.getCollectionUpdateScript ? driver.getCollectionUpdateScript(json) : null;
|
const script = driver.getCollectionUpdateScript ? driver.getCollectionUpdateScript(json) : null;
|
||||||
if (script) {
|
if (script) {
|
||||||
|
if (getBoolSettingsValue('skipConfirm.collectionDataSave', false)) {
|
||||||
|
handleConfirmChange(json);
|
||||||
|
} else {
|
||||||
showModal(ConfirmNoSqlModal, {
|
showModal(ConfirmNoSqlModal, {
|
||||||
script,
|
script,
|
||||||
onConfirm: () => handleConfirmChange(json),
|
onConfirm: () => handleConfirmChange(json),
|
||||||
engine: display.engine,
|
engine: display.engine,
|
||||||
|
skipConfirmSettingKey: 'skipConfirm.collectionDataSave',
|
||||||
});
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
handleConfirmChange(json);
|
handleConfirmChange(json);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@
|
|||||||
import ToolStripCommandButton from '../buttons/ToolStripCommandButton.svelte';
|
import ToolStripCommandButton from '../buttons/ToolStripCommandButton.svelte';
|
||||||
import ToolStripExportButton, { createQuickExportHandlerRef } from '../buttons/ToolStripExportButton.svelte';
|
import ToolStripExportButton, { createQuickExportHandlerRef } from '../buttons/ToolStripExportButton.svelte';
|
||||||
import ToolStripCommandSplitButton from '../buttons/ToolStripCommandSplitButton.svelte';
|
import ToolStripCommandSplitButton from '../buttons/ToolStripCommandSplitButton.svelte';
|
||||||
import { getIntSettingsValue } from '../settings/settingsTools';
|
import { getBoolSettingsValue, getIntSettingsValue } from '../settings/settingsTools';
|
||||||
|
|
||||||
export let tabid;
|
export let tabid;
|
||||||
export let conid;
|
export let conid;
|
||||||
@@ -142,13 +142,18 @@
|
|||||||
script: scriptToSql(driver, commands),
|
script: scriptToSql(driver, commands),
|
||||||
}));
|
}));
|
||||||
// console.log('deleteCascadesScripts', deleteCascadesScripts);
|
// console.log('deleteCascadesScripts', deleteCascadesScripts);
|
||||||
|
if (getBoolSettingsValue('skipConfirm.tableDataSave', false) && !deleteCascadesScripts?.length) {
|
||||||
|
handleConfirmSql(sql);
|
||||||
|
} else {
|
||||||
showModal(ConfirmSqlModal, {
|
showModal(ConfirmSqlModal, {
|
||||||
sql,
|
sql,
|
||||||
onConfirm: sqlOverride => handleConfirmSql(sqlOverride || sql),
|
onConfirm: sqlOverride => handleConfirmSql(sqlOverride || sql),
|
||||||
engine: driver.engine,
|
engine: driver.engine,
|
||||||
deleteCascadesScripts,
|
deleteCascadesScripts,
|
||||||
|
skipConfirmSettingKey: deleteCascadesScripts?.length ? null : 'skipConfirm.tableDataSave',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function canSave() {
|
export function canSave() {
|
||||||
return changeSetContainsChanges($changeSetStore?.value);
|
return changeSetContainsChanges($changeSetStore?.value);
|
||||||
|
|||||||
Reference in New Issue
Block a user