diff --git a/packages/tools/src/dbKeysLoader.ts b/packages/tools/src/dbKeysLoader.ts
index aafb591c4..428ca10ab 100644
--- a/packages/tools/src/dbKeysLoader.ts
+++ b/packages/tools/src/dbKeysLoader.ts
@@ -175,3 +175,23 @@ export function dbKeys_reloadFolder(tree: DbKeysTreeModel, root: string): DbKeys
},
};
}
+
+function addFlatItems(tree: DbKeysTreeModel, root: string, res: DbKeysNodeModel[]) {
+ const item = tree.dirsByKey[root];
+ if (!item.isExpanded) {
+ return false;
+ }
+ const children = tree.childrenByKey[root] || [];
+ for (const child of children) {
+ res.push(child);
+ if (child.type == 'dir') {
+ addFlatItems(tree, child.root, res);
+ }
+ }
+}
+
+export function dbKeys_getFlatList(tree: DbKeysTreeModel) {
+ const res: DbKeysNodeModel[] = [];
+ addFlatItems(tree, '', res);
+ return res;
+}
diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts
index 623db1fa8..730580d45 100644
--- a/packages/web/src/stores.ts
+++ b/packages/web/src/stores.ts
@@ -161,6 +161,8 @@ export const lastUsedDefaultActions = writableWithStorage({}, 'lastUsedDefaultAc
export const selectedDatabaseObjectAppObject = writable(null);
export const focusedConnectionOrDatabase = writable<{ conid: string; database?: string; connection: any }>(null);
+export const focusedTreeDbKey = writable<{ key: string; root: string; type: string; text: string }>(null);
+
export const DEFAULT_OBJECT_SEARCH_SETTINGS = {
pureName: true,
schemaName: false,
@@ -408,3 +410,9 @@ connectionAppObjectSearchSettings.subscribe(value => {
connectionAppObjectSearchSettingsValue = value;
});
export const getConnectionAppObjectSearchSettings = () => connectionAppObjectSearchSettingsValue;
+
+let focusedTreeDbKeyValue = null;
+focusedTreeDbKey.subscribe(value => {
+ focusedTreeDbKeyValue = value;
+});
+export const getFocusedTreeDbKey = () => focusedTreeDbKeyValue;
diff --git a/packages/web/src/tabs/DbKeyDetailTab.svelte b/packages/web/src/tabs/DbKeyDetailTab.svelte
index 1e1319e1b..92ebc7a0f 100644
--- a/packages/web/src/tabs/DbKeyDetailTab.svelte
+++ b/packages/web/src/tabs/DbKeyDetailTab.svelte
@@ -7,6 +7,7 @@
export const allowAddToFavorites = props => false;
function getKeyText(key) {
+ if (!key) return '(no name)';
const keySplit = key.split(':');
if (keySplit.length > 1) return keySplit[keySplit.length - 1];
return key || '(no name)';
diff --git a/packages/web/src/widgets/AppObjectListHandler.svelte b/packages/web/src/widgets/AppObjectListHandler.svelte
index 9cda24d58..fa64c0336 100644
--- a/packages/web/src/widgets/AppObjectListHandler.svelte
+++ b/packages/web/src/widgets/AppObjectListHandler.svelte
@@ -1,8 +1,7 @@
-
+ {
+ domListHandler?.focusFirst();
+ }}
+ />
@@ -98,6 +127,48 @@
{#if differentFocusedDb}
{/if}
-
-
+
+ o1?.key == o2?.key && o1?.type == o2?.type && o1?.root == o2?.root}
+ handleObjectClick={(data, clickAction) => {
+ focusedTreeDbKey.set(data);
+
+ const openDetailOnArrows = getOpenDetailOnArrowsSettings();
+
+ if (data.key && ((openDetailOnArrows && clickAction == 'keyArrow') || clickAction == 'keyEnter')) {
+ openNewTab({
+ tabComponent: 'DbKeyDetailTab',
+ title: data.text || '(no name)',
+ icon: 'img keydb',
+ props: {
+ isDefaultBrowser: true,
+ conid,
+ database,
+ },
+ });
+ $activeDbKeysStore = {
+ ...$activeDbKeysStore,
+ [`${conid}:${database}`]: data.key,
+ };
+ }
+ if (data.root && clickAction == 'keyEnter') {
+ changeModel(model => dbKeys_markNodeExpanded(model, data.root, !model.dirsByKey[data.root]?.isExpanded));
+ }
+ }}
+ handleExpansion={(data, value) => {
+ changeModel(model => dbKeys_markNodeExpanded(model, data.root, value));
+ }}
+ onScrollTop={() => {
+ domContainer?.scrollTop();
+ }}
+ onFocusFilterBox={text => {
+ domFilter?.focus(text);
+ }}
+ >
+
+
diff --git a/packages/web/src/widgets/DbKeysTreeNode.svelte b/packages/web/src/widgets/DbKeysTreeNode.svelte
index 7de1a7e06..afb968be6 100644
--- a/packages/web/src/widgets/DbKeysTreeNode.svelte
+++ b/packages/web/src/widgets/DbKeysTreeNode.svelte
@@ -13,9 +13,10 @@
import InputTextModal from '../modals/InputTextModal.svelte';
import { showModal } from '../modals/modalTools';
import newQuery from '../query/newQuery';
- import { activeDbKeysStore } from '../stores';
+ import { activeDbKeysStore, focusedTreeDbKey } from '../stores';
import { apiCall } from '../utility/api';
import { getConnectionInfo } from '../utility/metadataLoaders';
+ import _ from 'lodash';
import openNewTab from '../utility/openNewTab';
import { showSnackbarError } from '../utility/snackbar';
@@ -162,9 +163,16 @@
};
}
}}
+ on:mousedown={() => {
+ $focusedTreeDbKey = _.pick(item, ['type', 'key', 'root', 'text']);
+ }}
extInfo={item.count ? `(${item.count})` : null}
{indentLevel}
menu={createMenu}
+ isChoosed={$focusedTreeDbKey &&
+ item.key == $focusedTreeDbKey.key &&
+ item.root == $focusedTreeDbKey.root &&
+ item.type == $focusedTreeDbKey.type}
/>