diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index a2a8cfabe..7fa1a3e36 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -1,16 +1,6 @@ - - + + diff --git a/packages/web/src/datagrid/ColumnHeaderControl.svelte b/packages/web/src/datagrid/ColumnHeaderControl.svelte index 13eefbb2b..23f1c51a2 100644 --- a/packages/web/src/datagrid/ColumnHeaderControl.svelte +++ b/packages/web/src/datagrid/ColumnHeaderControl.svelte @@ -4,6 +4,8 @@ import splitterDrag from '../utility/splitterDrag'; import ColumnLabel from './ColumnLabel.svelte'; + import { isTypeDateTime } from 'dbgate-tools'; + import { openDatabaseObjectDetail } from '../appobj/DatabaseObjectAppObject.svelte'; export let column; export let conid = undefined; @@ -12,6 +14,41 @@ export let grouping = undefined; export let order = undefined; export let setGrouping; + + const openReferencedTable = () => { + openDatabaseObjectDetail('TableDataTab', null, { + schemaName: column.foreignKey.refSchemaName, + pureName: column.foreignKey.refTableName, + conid, + database, + objectTypeField: 'tables', + }); + }; + + function getMenu() { + return [ + { onClick: () => setSort('ASC'), text: 'Sort ascending' }, + { onClick: () => setSort('DESC'), text: 'Sort descending' }, + + column.foreignKey && [{ divider: true }, { onClick: openReferencedTable, text: column.foreignKey.refTableName }], + + { divider: true }, + { onClick: () => setGrouping('GROUP'), text: 'Group by' }, + { onClick: () => setGrouping('MAX'), text: 'MAX' }, + { onClick: () => setGrouping('MIN'), text: 'MIN' }, + { onClick: () => setGrouping('SUM'), text: 'SUM' }, + { onClick: () => setGrouping('AVG'), text: 'AVG' }, + { onClick: () => setGrouping('COUNT'), text: 'COUNT' }, + { onClick: () => setGrouping('COUNT DISTINCT'), text: 'COUNT DISTINCT' }, + + isTypeDateTime(column.dataType) && [ + { divider: true }, + { onClick: () => setGrouping('GROUP:YEAR'), text: 'Group by YEAR' }, + { onClick: () => setGrouping('GROUP:MONTH'), text: 'Group by MONTH' }, + { onClick: () => setGrouping('GROUP:DAY'), text: 'Group by DAY' }, + ], + ]; + }
@@ -33,7 +70,7 @@ {/if} - +
@@ -51,6 +88,8 @@ } .icon { margin-left: 3px; + align-self: center; + font-size: 18px; } /* .resizer { background-color: var(--theme-border); diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 35f71dc21..12ad508f0 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -46,6 +46,7 @@ import ColumnHeaderControl from './ColumnHeaderControl.svelte'; import DataGridRow from './DataGridRow.svelte'; import { getFilterType, getFilterValueExpression } from 'dbgate-filterparser'; + import stableStringify from 'json-stable-stringify'; import { tick } from 'svelte'; import { cellIsSelected, @@ -71,6 +72,7 @@ export let isLoading = false; export let allRowCount = undefined; export let onReferenceSourceChanged = undefined; + export let onReferenceClick = undefined; export let isLoadedAll; export let loadedTime; @@ -159,6 +161,22 @@ } } + // $: console.log('DISPLAY.config', display.config); + $: { + if (display.groupColumns && display.baseTable) { + onReferenceClick({ + referenceId: stableStringify(display && display.groupColumns), + schemaName: display.baseTable.schemaName, + pureName: display.baseTable.pureName, + columns: display.groupColumns.map(col => ({ + baseName: col, + refName: col, + dataType: _.get(display.baseTable && display.baseTable.columns.find(x => x.columnName == col), 'dataType'), + })), + }); + } + } + function scrollIntoView(cell) { const [row, col] = cell; diff --git a/packages/web/src/datagrid/TableDataGrid.svelte b/packages/web/src/datagrid/TableDataGrid.svelte index eafe0a352..75e02f871 100644 --- a/packages/web/src/datagrid/TableDataGrid.svelte +++ b/packages/web/src/datagrid/TableDataGrid.svelte @@ -98,6 +98,7 @@ }; const handleCloseReference = () => { + display.clearGrouping(); setChildConfig(null, null); }; @@ -112,7 +113,13 @@ gridCoreComponent={SqlDataGridCore} {display} onReferenceSourceChanged={reference ? handleReferenceSourceChanged : null} - onReferenceClick={reference => setChildConfig(createGridConfig(), reference)} + onReferenceClick={value => { + if (value && value.referenceId && reference && reference.referenceId == value.referenceId) { + // reference not changed + return; + } + setChildConfig(createGridConfig(), value); + }} />
diff --git a/packages/web/src/modals/DropDownMenu.svelte b/packages/web/src/modals/DropDownMenu.svelte index c56424e9e..09e719beb 100644 --- a/packages/web/src/modals/DropDownMenu.svelte +++ b/packages/web/src/modals/DropDownMenu.svelte @@ -1,20 +1,60 @@ + + -