sql generator

This commit is contained in:
Jan Prochazka
2021-04-01 08:09:22 +02:00
parent a1993214e2
commit d62177d996
10 changed files with 175 additions and 44 deletions

View File

@@ -1,4 +1,6 @@
<script>
import Link from '../elements/Link.svelte';
import { plusExpandIcon } from '../icons/expandIcons';
import FontIcon from '../icons/FontIcon.svelte';
@@ -6,6 +8,7 @@
import AppObjectListItem from './AppObjectListItem.svelte';
export let group;
export let groupFunc;
export let items;
export let module;
export let checkedObjectsStore = null;
@@ -14,6 +17,20 @@
$: filtered = items.filter(x => x.isMatched);
$: countText = filtered.length < items.length ? `${filtered.length}/${items.length}` : `${items.length}`;
function handleCheckAll(isChecked) {
checkedObjectsStore.update(checkList => {
const res = isChecked
? [
...checkList,
...filtered
.filter(x => !checkList.find(y => module.extractKey(x.data) == module.extractKey(y)))
.map(x => x.data),
]
: checkList.filter(x => groupFunc(x) != group);
return res;
});
}
</script>
<div class="group" on:click={() => (isExpanded = !isExpanded)}>
@@ -26,6 +43,14 @@
</div>
{#if isExpanded}
{#if checkedObjectsStore}
<div class="ml-2">
<Link onClick={() => handleCheckAll(true)}>Check all</Link>
|
<Link onClick={() => handleCheckAll(false)}>Uncheck all</Link>
</div>
{/if}
{#each filtered as item (module.extractKey(item.data))}
<AppObjectListItem {...$$restProps} {module} data={item.data} {checkedObjectsStore} on:objectClick />
{/each}

View File

@@ -45,6 +45,7 @@
{isExpandable}
{subItemsComponent}
{checkedObjectsStore}
{groupFunc}
/>
{/each}
{:else}

View File

@@ -1,12 +1,17 @@
<script lang="ts">
import getElectron from '../utility/getElectron';
export let href;
export let href = undefined;
export let onClick = undefined;
const electron = getElectron();
</script>
{#if electron}
{#if onClick}
<a on:click={onClick}>
<slot />
</a>
{:else if electron}
<a on:click={() => electron.shell.openExternal(href)}>
<slot />
</a>

View File

@@ -9,7 +9,7 @@
<div class="largeFormMarker" class:noMargin>
{#if type == 'checkbox'}
<slot />
<span {...labelProps} on:click={labelProps.onClick} class:disabled>{label}</span>
<span {...labelProps} on:click={labelProps.onClick} class:disabled class='checkLabel'>{label}</span>
{:else}
<div class="label" {...labelProps} on:click={labelProps.onClick}>
<span {...labelProps} on:click={labelProps.onClick} class:disabled>{label}</span>
@@ -23,6 +23,10 @@
margin-bottom: 3px;
color: var(--theme-font-3);
}
.checkLabel {
cursor: default;
user-select: none;
}
.largeFormMarker:not(.noMargin) {
margin: var(--dim-large-form-margin);
}

View File

@@ -9,7 +9,7 @@
<div class="row">
{#if type == 'checkbox'}
<slot />
<span {...labelProps} on:click={labelProps.onClick} class:disabled>{label}</span>
<span {...labelProps} on:click={labelProps.onClick} class:disabled class="checkLabel">{label}</span>
{:else}
<div class="label" {...labelProps} on:click={labelProps.onClick}>
<div class="label">
@@ -30,6 +30,10 @@
margin-bottom: 3px;
color: var(--theme-font-3);
}
.checkLabel {
cursor: default;
user-select: none;
}
.disabled {
color: var(--theme-font-3);
}

View File

@@ -15,7 +15,7 @@
<ModalBase {...$$restProps}>
<svelte:fragment slot="header">About DbGate</svelte:fragment>
<div class="flex">
<img src="/logo192.png" />
<img src="logo192.png" />
<div>
<div class="m-1">
Version: <span>{version}</span>

View File

@@ -32,28 +32,44 @@
export let conid;
export let database;
export let initialConfig = {
checkIfTableExists: true,
disableConstraints: true,
createTables: true,
createForeignKeys: true,
createViews: true,
createProcedures: true,
createFunctions: true,
createTriggers: true,
};
export let initialObjects = null;
let busy = false;
let managerSize;
let objectsFilter = '';
let sqlPreview = '';
let initialized = false;
const checkedObjectsStore = writable([]);
const valuesStore = writable({
checkIfTableExists: true,
disableConstraints: true,
});
$: dbinfo = useDatabaseInfo({ conid, database });
const checkedObjectsStore = writable(initialObjects || ($dbinfo && $dbinfo.tables) || []);
const valuesStore = writable(initialConfig);
const loadRef = createRef(null);
$: console.log('checkedObjectsStore', $checkedObjectsStore);
// $: console.log('checkedObjectsStore', $checkedObjectsStore);
$: objects = useDatabaseInfo({ conid, database });
$: if ($dbinfo && !initialized && !initialObjects) {
initialized = true;
$checkedObjectsStore = $dbinfo.tables;
}
$: generatePreview($valuesStore, $checkedObjectsStore);
$: objectList = _.flatten(
['tables', 'views', 'procedures', 'functions'].map(objectTypeField =>
_.sortBy(
(($objects || {})[objectTypeField] || []).map(obj => ({ ...obj, objectTypeField })),
(($dbinfo || {})[objectTypeField] || []).map(obj => ({ ...obj, objectTypeField })),
['schemaName', 'pureName']
)
)
@@ -91,7 +107,7 @@
<HorizontalSplitter initialValue="300px" bind:size={managerSize}>
<svelte:fragment slot="1">
<div>
<div class="flexcol flex1">
<WidgetTitle>Choose objects</WidgetTitle>
<SearchBoxWrapper>
<SearchInput placeholder="Search tables or objects" bind:value={objectsFilter} />
@@ -116,40 +132,54 @@
<SqlEditor readOnly value={sqlPreview} />
</svelte:fragment>
<svelte:fragment slot="2">
<WidgetsInnerContainer>
<FormValues let:values>
<FormCheckboxField label="Drop tables" name="dropTables" />
{#if values.dropTables}
<div class="ml-2">
<FormCheckboxField label="Test if exists" name="checkIfTableExists" />
</div>
{/if}
<FormCheckboxField label="Drop references" name="dropReferences" />
<div class="flexcol flex1">
<WidgetTitle>Generator settings</WidgetTitle>
<WidgetsInnerContainer>
<FormValues let:values>
<div class="obj-heading">Tables</div>
<FormCheckboxField label="Drop tables" name="dropTables" />
{#if values.dropTables}
<div class="ml-2">
<FormCheckboxField label="Test if exists" name="checkIfTableExists" />
</div>
{/if}
<FormCheckboxField label="Drop references" name="dropReferences" />
<FormCheckboxField label="Create tables" name="createTables" />
<FormCheckboxField label="Create references" name="createReferences" />
<FormCheckboxField label="Create foreign keys" name="createForeignKeys" />
<FormCheckboxField label="Create indexes" name="createIndexes" />
<FormCheckboxField label="Create tables" name="createTables" />
<FormCheckboxField label="Create references" name="createReferences" />
<FormCheckboxField label="Create foreign keys" name="createForeignKeys" />
<FormCheckboxField label="Create indexes" name="createIndexes" />
<FormCheckboxField label="Insert" name="insert" />
{#if values.insert}
<div class="ml-2">
<FormCheckboxField label="Skip autoincrement column" name="skipAutoincrementColumn" />
<FormCheckboxField label="Disable constraints" name="disableConstraints" />
<FormCheckboxField label="Omit NULL values" name="omitNulls" />
</div>
{/if}
<FormCheckboxField label="Insert" name="insert" />
{#if values.insert}
<div class="ml-2">
<FormCheckboxField label="Skip autoincrement column" name="skipAutoincrementColumn" />
<FormCheckboxField label="Disable constraints" name="disableConstraints" />
<FormCheckboxField label="Omit NULL values" name="omitNulls" />
</div>
{/if}
<FormCheckboxField label="Truncate tables (delete all rows)" name="truncate" />
<FormCheckboxField label="Truncate tables (delete all rows)" name="truncate" />
<!-- <HashCheckBox label='Drop' hashName={`gensql.drop${objTypePascal}`} onChange={onChange} />
{#each ['View', 'Procedure', 'Function', 'Trigger'] as objtype}
<div class="obj-heading">{objtype}s</div>
<FormCheckboxField label="Create" name={`create${objtype}s`} />
<FormCheckboxField label="Drop" name={`drop${objtype}s`} />
{#if values[`drop${objtype}s`]}
<div class="ml-2">
<FormCheckboxField label="Check if exists" name={`checkIf${objtype}Exists`} />
</div>
{/if}
{/each}
<!-- <HashCheckBox label='Drop' hashName={`gensql.drop${objTypePascal}`} onChange={onChange} />
{
getHashValue(`gensql.drop${objTypePascal}`) == '1' &&
<HashCheckBox label='Test if exists' hashName={`gensql.checkIf${objTypePascal}Exists`} indent={1} onChange={onChange} defaultChecked />
}
<HashCheckBox label='Create' hashName={`gensql.create${objTypePascal}`} onChange={onChange} /> -->
</FormValues>
</WidgetsInnerContainer>
</FormValues>
</WidgetsInnerContainer>
</div>
</svelte:fragment>
</HorizontalSplitter>
</svelte:fragment>
@@ -162,3 +192,11 @@
</svelte:fragment>
</ModalBase>
</FormProviderCore>
<style>
.obj-heading {
font-size: 20px;
margin: 5px;
margin-top: 20px;
}
</style>