diff --git a/packages/web/src/appobj/AppObjectCore.svelte b/packages/web/src/appobj/AppObjectCore.svelte index 02ed23eaa..c008f0e20 100644 --- a/packages/web/src/appobj/AppObjectCore.svelte +++ b/packages/web/src/appobj/AppObjectCore.svelte @@ -66,6 +66,11 @@ } // $: console.log(title, indentLevel); + let domDiv; + + $: if (isBold && domDiv) { + domDiv.scrollIntoView({ block: 'nearest', inline: 'nearest' }); + }
{#if checkedObjectsStore} switchCurrentDatabase(data)} on:dragstart on:dragenter diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index 0465b5f35..59d287a13 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -853,6 +853,7 @@ getExtensions, openedConnections, pinnedTables, + selectedDatabaseObjectAppObject, } from '../stores'; import openNewTab from '../utility/openNewTab'; import { @@ -880,11 +881,13 @@ import { getDefaultFileFormat } from '../plugins/fileformats'; import hasPermission from '../utility/hasPermission'; import { openImportExportTab } from '../utility/importExportTools'; + import { matchDatabaseObjectAppObject } from './appObjectMatchers'; export let data; export let passProps; function handleClick(forceNewTab = false, preventPreviewMode = false) { + $selectedDatabaseObjectAppObject = data; handleDatabaseObjectClick(data, forceNewTab, preventPreviewMode); } @@ -918,6 +921,7 @@ onPin={isPinned ? null : () => pinnedTables.update(list => [...list, data])} onUnpin={isPinned ? () => pinnedTables.update(list => list.filter(x => !testEqual(x, data))) : null} extInfo={getExtInfo(data)} + isBold={matchDatabaseObjectAppObject($selectedDatabaseObjectAppObject, data)} on:click={() => handleClick()} on:middleclick={() => handleClick(true)} on:dblclick={() => handleClick(false, true)} diff --git a/packages/web/src/appobj/appObjectMatchers.ts b/packages/web/src/appobj/appObjectMatchers.ts new file mode 100644 index 000000000..12daa26d8 --- /dev/null +++ b/packages/web/src/appobj/appObjectMatchers.ts @@ -0,0 +1,9 @@ +export function matchDatabaseObjectAppObject(obj1, obj2) { + return ( + obj1?.objectTypeField == obj2?.objectTypeField && + obj1?.conid == obj2?.conid && + obj1?.database == obj2?.database && + obj1?.pureName == obj2?.pureName && + obj1?.schemaName == obj2?.schemaName + ); +} diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts index cb2d8fabb..847b6168c 100644 --- a/packages/web/src/stores.ts +++ b/packages/web/src/stores.ts @@ -153,6 +153,8 @@ export const activeDbKeysStore = writableWithStorage({}, 'activeDbKeysStore'); export const appliedCurrentSchema = writable(null); export const loadingSchemaLists = writable({}); // dict [`${conid}::${database}`]: true +export const selectedDatabaseObjectAppObject = writable(null); + export const currentThemeDefinition = derived([currentTheme, extensions], ([$currentTheme, $extensions]) => $extensions.themes.find(x => x.themeClassName == $currentTheme) ); @@ -321,3 +323,9 @@ appliedCurrentSchema.subscribe(value => { appliedCurrentSchemaValue = value; }); export const getAppliedCurrentSchema = () => appliedCurrentSchemaValue; + +let selectedDatabaseObjectAppObjectValue = null; +selectedDatabaseObjectAppObject.subscribe(value => { + selectedDatabaseObjectAppObjectValue = value; +}); +export const getSelectedDatabaseObjectAppObject = () => selectedDatabaseObjectAppObjectValue; \ No newline at end of file diff --git a/packages/web/src/widgets/AppObjectListHandler.svelte b/packages/web/src/widgets/AppObjectListHandler.svelte new file mode 100644 index 000000000..555f5679b --- /dev/null +++ b/packages/web/src/widgets/AppObjectListHandler.svelte @@ -0,0 +1,37 @@ + + +
+ +
+ + diff --git a/packages/web/src/widgets/SqlObjectList.svelte b/packages/web/src/widgets/SqlObjectList.svelte index 8704e94b7..59a9a030a 100644 --- a/packages/web/src/widgets/SqlObjectList.svelte +++ b/packages/web/src/widgets/SqlObjectList.svelte @@ -36,13 +36,20 @@ import FontIcon from '../icons/FontIcon.svelte'; import CloseSearchButton from '../buttons/CloseSearchButton.svelte'; import { findEngineDriver } from 'dbgate-tools'; - import { currentDatabase, extensions } from '../stores'; + import { + currentDatabase, + extensions, + getSelectedDatabaseObjectAppObject, + selectedDatabaseObjectAppObject, + } from '../stores'; import newQuery from '../query/newQuery'; import runCommand from '../commands/runCommand'; import { apiCall } from '../utility/api'; import { filterAppsForDatabase } from '../utility/appTools'; import SchemaSelector from './SchemaSelector.svelte'; import { appliedCurrentSchema } from '../stores'; + import AppObjectListHandler from './AppObjectListHandler.svelte'; + import { matchDatabaseObjectAppObject } from '../appobj/appObjectMatchers'; export let conid; export let database; @@ -172,23 +179,32 @@ {#if ($status && ($status.name == 'pending' || $status.name == 'checkStructure' || $status.name == 'loadStructure') && $objects) || !$objects} {:else} - ($appliedCurrentSchema ? x.schemaName == $appliedCurrentSchema : true)) .map(x => ({ ...x, conid, database }))} - module={databaseObjectAppObject} - groupFunc={data => getObjectTypeFieldLabel(data.objectTypeField, driver)} - subItemsComponent={SubColumnParamList} - isExpandable={data => - data.objectTypeField == 'tables' || data.objectTypeField == 'views' || data.objectTypeField == 'matviews'} - expandIconFunc={chevronExpandIcon} - {filter} - passProps={{ - showPinnedInsteadOfUnpin: true, - connection: $connection, - hideSchemaName: !!$appliedCurrentSchema, - }} - /> + selectedObjectStore={selectedDatabaseObjectAppObject} + getSelectedObject={getSelectedDatabaseObjectAppObject} + selectedObjectMatcher={matchDatabaseObjectAppObject} + > + ($appliedCurrentSchema ? x.schemaName == $appliedCurrentSchema : true)) + .map(x => ({ ...x, conid, database }))} + module={databaseObjectAppObject} + groupFunc={data => getObjectTypeFieldLabel(data.objectTypeField, driver)} + subItemsComponent={SubColumnParamList} + isExpandable={data => + data.objectTypeField == 'tables' || data.objectTypeField == 'views' || data.objectTypeField == 'matviews'} + expandIconFunc={chevronExpandIcon} + {filter} + passProps={{ + showPinnedInsteadOfUnpin: true, + connection: $connection, + hideSchemaName: !!$appliedCurrentSchema, + }} + /> + {/if} {/if}