diff --git a/packages/web/src/datagrid/DataFilterControl.svelte b/packages/web/src/datagrid/DataFilterControl.svelte index f17b163f5..9bb297600 100644 --- a/packages/web/src/datagrid/DataFilterControl.svelte +++ b/packages/web/src/datagrid/DataFilterControl.svelte @@ -26,6 +26,7 @@ export let foreignKey = null; export let conid = null; export let database = null; + export let driver = null; let value; let isError; @@ -200,8 +201,10 @@ showModal(DictionaryLookupModal, { conid, database, + driver, pureName: foreignKey.refTableName, schemaName: foreignKey.refSchemaName, + onConfirm: setFilter, }); } diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 9b6995057..4d89da9b8 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -1237,6 +1237,7 @@ foreignKey={col.foreignKey} {conid} {database} + driver={display?.driver} filterType={col.filterType || getFilterType(col.dataType)} filter={display.getFilter(col.uniqueName)} setFilter={value => display.setFilter(col.uniqueName, value)} diff --git a/packages/web/src/modals/DefineDictionaryDescriptionModal.svelte b/packages/web/src/modals/DefineDictionaryDescriptionModal.svelte index ce2992b95..899e768c5 100644 --- a/packages/web/src/modals/DefineDictionaryDescriptionModal.svelte +++ b/packages/web/src/modals/DefineDictionaryDescriptionModal.svelte @@ -59,6 +59,7 @@ let:row type="checkbox" slot="1" + disabled={$tableInfo?.primaryKey?.columns?.find(x => x.columnName == row.columnName)} checked={parseDelimitedColumnList($values.columns).includes(row.columnName)} on:change={e => { $values = { diff --git a/packages/web/src/modals/DictionaryLookupModal.svelte b/packages/web/src/modals/DictionaryLookupModal.svelte index 28b3b3dc7..77f6fa631 100644 --- a/packages/web/src/modals/DictionaryLookupModal.svelte +++ b/packages/web/src/modals/DictionaryLookupModal.svelte @@ -5,12 +5,25 @@ import ModalBase from './ModalBase.svelte'; import { closeCurrentModal, showModal } from './modalTools'; import DefineDictionaryDescriptionModal from './DefineDictionaryDescriptionModal.svelte'; + import ScrollableTableControl from '../elements/ScrollableTableControl.svelte'; + import axiosInstance from '../utility/axiosInstance'; + import { getTableInfo } from '../utility/metadataLoaders'; + import { getDictionaryDescription } from '../utility/dictionaryDescriptionTools'; + import { onMount } from 'svelte'; + import { dumpSqlSelect } from 'dbgate-sqltree'; export let onConfirm; export let conid; export let database; export let pureName; export let schemaName; + export let driver; + + let rows = null; + let tableInfo; + let description; + + let checkedKeys = []; function defineDescription() { showModal(DefineDictionaryDescriptionModal, { @@ -22,21 +35,105 @@ }); } - function reload() {} + async function reload() { + tableInfo = await getTableInfo({ conid, database, schemaName, pureName }); + description = getDictionaryDescription(tableInfo, conid, database); + + if (!tableInfo || !description) return; + if (tableInfo?.primaryKey?.columns?.length != 1) return; + + const dmp = driver.createDumper(); + const select = { + commandType: 'select', + topRecords: 100, + from: { + name: { + schemaName, + pureName, + }, + }, + columns: [ + ...tableInfo.primaryKey.columns.map(col => ({ + exprType: 'column', + columnName: col.columnName, + })), + ...description.columns.map(columnName => ({ + exprType: 'column', + columnName, + })), + ], + }; + // @ts-ignore + + dumpSqlSelect(dmp, select); + + const response = await axiosInstance.request({ + url: 'database-connections/query-data', + method: 'post', + params: { + conid, + database, + }, + data: { sql: dmp.s }, + }); + + rows = response.data.rows; + } + + onMount(() => { + reload(); + }); Lookup from {pureName} - {pureName} + {#if tableInfo && description && rows && tableInfo?.primaryKey?.columns?.length == 1} +
+ row[tableInfo.primaryKey.columns[0].columnName], + width: '100px', + }, + { + fieldName: 'description', + header: 'Description', + formatter: row => description.columns.map(col => row[col]).join(description.delimiter || ' '), + }, + ]} + > + { + const value = row[tableInfo.primaryKey.columns[0].columnName]; + if (e.target.checked) checkedKeys = [...checkedKeys, value]; + else checkedKeys = checkedKeys.filter(x => x != value); + }} + /> + +
+ {/if} { closeCurrentModal(); - onConfirm(); + onConfirm(checkedKeys.join(',')); }} /> @@ -44,3 +141,11 @@
+ + diff --git a/packages/web/src/utility/dictionaryDescriptionTools.ts b/packages/web/src/utility/dictionaryDescriptionTools.ts index 4c2a271d5..0454ccc7f 100644 --- a/packages/web/src/utility/dictionaryDescriptionTools.ts +++ b/packages/web/src/utility/dictionaryDescriptionTools.ts @@ -4,7 +4,10 @@ import _ from 'lodash'; import { getLocalStorage, setLocalStorage, removeLocalStorage } from './storageCache'; function checkDescriptionColumns(columns: string[], table: TableInfo) { - return columns.length > 0 && columns.every(x => table.columns.find(y => y.columnName == x)); + if (!columns?.length) return false; + if (!columns.every(x => table.columns.find(y => y.columnName == x))) return false; + if (table.primaryKey?.columns?.find(x => columns.includes(x.columnName))) return false; + return true; } export function getDictionaryDescription(