diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 36b3dccac..cbf888055 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -143,6 +143,15 @@ onClick: () => getCurrentDataGrid().clearFilter(), }); + registerCommand({ + id: 'dataGrid.generateSqlFromData', + category: 'Data grid', + name: 'Generate SQL', + keyText: 'Ctrl+G', + testEnabled: () => getCurrentDataGrid()?.generateSqlFromDataEnabled(), + onClick: () => getCurrentDataGrid().generateSqlFromData(), + }); + registerCommand({ id: 'dataGrid.openFreeTable', category: 'Data grid', @@ -233,6 +242,8 @@ import { editJsonRowDocument } from '../jsonview/CollectionJsonRow.svelte'; import createActivator, { getActiveComponent } from '../utility/createActivator'; import CollapseButton from './CollapseButton.svelte'; + import GenerateSqlFromDataModal from '../modals/GenerateSqlFromDataModal.svelte'; + import { showModal } from '../modals/modalTools'; export let onLoadNextData = undefined; export let grider = undefined; @@ -528,6 +539,26 @@ // selectedCells = [currentCell]; } + export function generateSqlFromDataEnabled() { + return !!display?.baseTable; + } + + export function generateSqlFromData() { + const columnIndexes = _.uniq(selectedCells.map(x => x[1])); + columnIndexes.sort(); + + showModal(GenerateSqlFromDataModal, { + rows: getSelectedRowData(), + allColumns: display.baseTable.columns.map(x => x.columnName), + selectedColumns: columnIndexes.map(x => realColumnUniqueNames[x]), + keyColumns: display?.baseTable?.primaryKey?.columns?.map(x => x.columnName) || [ + display.baseTable.columns[0].columnName, + ], + engineDriver: display?.driver, + tableInfo: display.baseTable, + }); + } + $: autofillMarkerCell = selectedCells && selectedCells.length > 0 && _.uniq(selectedCells.map(x => x[0])).length == 1 ? [_.max(selectedCells.map(x => x[0])), _.max(selectedCells.map(x => x[1]))] diff --git a/packages/web/src/forms/FormSubmit.svelte b/packages/web/src/forms/FormSubmit.svelte index 3c4aa3b00..e9fcb7765 100644 --- a/packages/web/src/forms/FormSubmit.svelte +++ b/packages/web/src/forms/FormSubmit.svelte @@ -3,7 +3,7 @@ import { getFormContext } from './FormProviderCore.svelte'; import { createEventDispatcher } from 'svelte'; - export let disabled; + export let disabled = false; const dispatch = createEventDispatcher(); diff --git a/packages/web/src/modals/GenerateSqlFromDataModal.svelte b/packages/web/src/modals/GenerateSqlFromDataModal.svelte new file mode 100644 index 000000000..248023002 --- /dev/null +++ b/packages/web/src/modals/GenerateSqlFromDataModal.svelte @@ -0,0 +1,153 @@ + + + + + Generate SQL from data + +
+
+
Choose query type
+ + ({ name }))} + bind:selectedIndex={queryTypeIndex} + bind:domTable={domQueryType} + focusOnCreate + selectable + columns={[{ fieldName: 'name', header: 'Query type' }]} + /> +
+ +
+
Value columns
+ + {#each allColumns as column} +
+ { + if (valueColumns.includes(column)) valueColumns = valueColumns.filter(x => x != column); + else valueColumns = [...valueColumns, column]; + }} + /> + {column} +
+ {/each} +
+ +
+
WHERE columns
+ + {#each allColumns as column} +
+ { + if (whereColumns.includes(column)) whereColumns = whereColumns.filter(x => x != column); + else whereColumns = [...whereColumns, column]; + }} + /> + {column} +
+ {/each} +
+
+ +
+ +
+ + + { + newQuery({ initialData: sqlPreview }); + closeCurrentModal(); + }} + /> + + +
+
+ + diff --git a/packages/web/src/modals/InsertJoinModal.svelte b/packages/web/src/modals/InsertJoinModal.svelte index bc0687bf1..737629982 100644 --- a/packages/web/src/modals/InsertJoinModal.svelte +++ b/packages/web/src/modals/InsertJoinModal.svelte @@ -104,7 +104,7 @@ Insert join
-
+
Existing table
-
+
New table
-
+
Join