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' },
+ ],
+ ];
+ }
@@ -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 @@
+
+
-
dispatch('close')}>
+ dispatch('close')}
+ bind:this={element}
+>
{#each items as item}
{#if item.divider}
diff --git a/packages/web/src/utility/fullDisplayName.js b/packages/web/src/utility/fullDisplayName.js
new file mode 100644
index 000000000..49574a291
--- /dev/null
+++ b/packages/web/src/utility/fullDisplayName.js
@@ -0,0 +1,4 @@
+export default function fullDisplayName({ schemaName, pureName }) {
+ if (schemaName) return `${schemaName}.${pureName}`;
+ return pureName;
+}