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}