diff --git a/packages/web/public/global.css b/packages/web/public/global.css index 0cb25a624..9e186f5d2 100644 --- a/packages/web/public/global.css +++ b/packages/web/public/global.css @@ -32,6 +32,7 @@ body { visibility: hidden; } .space-between { + display: flex; justify-content: space-between; } .flex { diff --git a/packages/web/src/datagrid/DataGrid.svelte b/packages/web/src/datagrid/DataGrid.svelte index 1df5d3790..0075d105c 100644 --- a/packages/web/src/datagrid/DataGrid.svelte +++ b/packages/web/src/datagrid/DataGrid.svelte @@ -1,5 +1,6 @@ @@ -94,6 +96,10 @@ {#if hintFieldsAllowed && hintFieldsAllowed.includes(col.uniqueName) && rowData} {rowData[col.hintColumnName]} {/if} + + {#if col.foreignKey && rowData[col.uniqueName]} + onSetFormView(rowData, col)} /> + {/if} {/if} diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 19d40ba4e..ab85c5a40 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -209,6 +209,7 @@ import invalidateCommands from '../commands/invalidateCommands'; import createRef from '../utility/createRef'; import { clearLastFocusedFormView } from '../formview/FormView.svelte'; + import openReferenceForm, { openPrimaryKeyForm } from '../formview/openReferenceForm'; export let onLoadNextData = undefined; export let grider = undefined; @@ -844,6 +845,14 @@ return cells.filter(isRegularCell); } + function handleSetFormView(rowData, column) { + if (column) { + openReferenceForm(rowData, column, conid, database); + } else { + openPrimaryKeyForm(rowData, display.baseTable, conid, database); + } + } + const [inplaceEditorState, dispatchInsplaceEditor] = createReducer((state, action) => { switch (action.type) { case 'show': @@ -1000,6 +1009,7 @@ inplaceEditorState={$inplaceEditorState} {dispatchInsplaceEditor} {frameSelection} + onSetFormView={formViewAvailable && display?.baseTable?.primaryKey ? handleSetFormView : null} /> {/each} diff --git a/packages/web/src/datagrid/DataGridRow.svelte b/packages/web/src/datagrid/DataGridRow.svelte index 1a2ad3f15..458ec1409 100644 --- a/packages/web/src/datagrid/DataGridRow.svelte +++ b/packages/web/src/datagrid/DataGridRow.svelte @@ -1,4 +1,6 @@ - + onSetFormView(rowData, null) : null} /> {#each visibleRealColumns as col (col.uniqueName)} {#if inplaceEditorState.cell && rowIndex == inplaceEditorState.cell[0] && col.colIndex == inplaceEditorState.cell[1]} @@ -58,6 +61,7 @@ (rowStatus.insertedFields && rowStatus.insertedFields.has(col.uniqueName))} isDeleted={rowStatus.status == 'deleted' || (rowStatus.deletedFields && rowStatus.deletedFields.has(col.uniqueName))} + {onSetFormView} /> {/if} {/each} diff --git a/packages/web/src/datagrid/RowHeaderCell.svelte b/packages/web/src/datagrid/RowHeaderCell.svelte index f423bf088..d56fba8e0 100644 --- a/packages/web/src/datagrid/RowHeaderCell.svelte +++ b/packages/web/src/datagrid/RowHeaderCell.svelte @@ -1,9 +1,23 @@ - + (mouseIn = true)} + on:mouseleave={() => (mouseIn = false)} +> {rowIndex + 1} + + {#if mouseIn && onShowForm} + + {/if} diff --git a/packages/web/src/formview/FormViewFilterColumn.svelte b/packages/web/src/formview/FormViewFilterColumn.svelte new file mode 100644 index 000000000..d238f5dde --- /dev/null +++ b/packages/web/src/formview/FormViewFilterColumn.svelte @@ -0,0 +1,34 @@ + + +{#if column} +
+
+ + { + formDisplay.removeFilter(column.uniqueName); + }} + > + + +
+ formDisplay.setFilter(column.uniqueName, value)} + /> +
+{/if} diff --git a/packages/web/src/formview/FormViewFilters.svelte b/packages/web/src/formview/FormViewFilters.svelte new file mode 100644 index 000000000..37795bcb5 --- /dev/null +++ b/packages/web/src/formview/FormViewFilters.svelte @@ -0,0 +1,32 @@ + + +{#if baseTable?.primaryKey} + + {#each baseTable.primaryKey.columns as col} + + {/each} + + {#each allFilterNames as uniqueName} + x.uniqueName == uniqueName)} + {formDisplay} + {filters} + /> + {/each} + +{/if} diff --git a/packages/web/src/formview/PrimaryKeyFilterEditor.svelte b/packages/web/src/formview/PrimaryKeyFilterEditor.svelte new file mode 100644 index 000000000..aaeb67546 --- /dev/null +++ b/packages/web/src/formview/PrimaryKeyFilterEditor.svelte @@ -0,0 +1,51 @@ + + +
+
+
+ + x.columnName == column.columnName)} /> +
+ {#if formDisplay.config.formViewKeyRequested} + + + + {/if} +
+
+ +
+
diff --git a/packages/web/src/formview/ShowFormButton.svelte b/packages/web/src/formview/ShowFormButton.svelte new file mode 100644 index 000000000..6c3fe51ac --- /dev/null +++ b/packages/web/src/formview/ShowFormButton.svelte @@ -0,0 +1,25 @@ + + +
+ +
+ + diff --git a/packages/web/src/formview/SqlFormView.svelte b/packages/web/src/formview/SqlFormView.svelte index afb3b0497..a412809e7 100644 --- a/packages/web/src/formview/SqlFormView.svelte +++ b/packages/web/src/formview/SqlFormView.svelte @@ -38,6 +38,7 @@ export let masterLoadedTime; export let conid; export let database; + export let onReferenceSourceChanged; let isLoadingData = false; let isLoadedData = false; @@ -128,6 +129,8 @@ $: former = new ChangeSetFormer(rowData, changeSetState, dispatchChangeSet, formDisplay); + $: if (onReferenceSourceChanged && rowData) onReferenceSourceChanged([rowData], loadedTime); + async function handleConfirmSql(sql) { const resp = await axiosInstance.request({ url: 'database-connections/query-data', @@ -158,4 +161,12 @@ } - + diff --git a/packages/web/src/formview/openReferenceForm.ts b/packages/web/src/formview/openReferenceForm.ts index 370ba66f5..fe6a7e878 100644 --- a/packages/web/src/formview/openReferenceForm.ts +++ b/packages/web/src/formview/openReferenceForm.ts @@ -29,3 +29,32 @@ export default function openReferenceForm(rowData, column, conid, database) { } ); } + +export function openPrimaryKeyForm(rowData, baseTable, conid, database) { + const formViewKey = _.fromPairs( + baseTable.primaryKey.columns.map(({ columnName }) => [columnName, rowData[columnName]]) + ); + openNewTab( + { + title: baseTable.pureName, + icon: 'img table', + tabComponent: 'TableDataTab', + props: { + schemaName: baseTable.schemaName, + pureName: baseTable.pureName, + conid, + database, + objectTypeField: 'tables', + }, + }, + { + grid: { + isFormView: true, + formViewKey, + }, + }, + { + forceNewTab: true, + } + ); +}