option to skip table save confirmation #329

This commit is contained in:
Jan Prochazka
2022-08-07 11:21:08 +02:00
parent 04c37c2b4f
commit f3a7e3af74
7 changed files with 109 additions and 26 deletions

View File

@@ -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';

View 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>

View File

@@ -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"

View File

@@ -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"

View File

@@ -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>

View File

@@ -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);
} }

View File

@@ -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);