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} />