diff --git a/packages/tools/src/dbKeysLoader.ts b/packages/tools/src/dbKeysLoader.ts index 4aa5c711b..21be3681d 100644 --- a/packages/tools/src/dbKeysLoader.ts +++ b/packages/tools/src/dbKeysLoader.ts @@ -19,6 +19,12 @@ export interface DbKeysLeafNodeModel extends DbKeysNodeModelBase { export interface DbKeysFolderNodeModel extends DbKeysNodeModelBase { // root: string; type: 'dir'; + // visibleCount?: number; + // isExpanded?: boolean; +} + +export interface DbKeysFolderStateMode { + key: string; visibleCount?: number; isExpanded?: boolean; } @@ -27,6 +33,7 @@ export interface DbKeysTreeModel { treeKeySeparator: string; root: DbKeysFolderNodeModel; dirsByKey: { [key: string]: DbKeysFolderNodeModel }; + dirStateByKey: { [key: string]: DbKeysFolderStateMode }; childrenByKey: { [key: string]: DbKeysNodeModel[] }; keyObjectsByKey: { [key: string]: DbKeysNodeModel }; scannedKeys: number; @@ -54,7 +61,10 @@ export interface DbKeysLoadResult { // export type DbKeysLoadFunction = (root: string, limit: number) => Promise; -export type DbKeysChangeModelFunction = (func: (model: DbKeysTreeModel) => DbKeysTreeModel) => void; +export type DbKeysChangeModelFunction = ( + func: (model: DbKeysTreeModel) => DbKeysTreeModel, + loadNextPage: boolean +) => void; // function dbKeys_findFolderNode(node: DbKeysNodeModel, root: string) { // if (node.type != 'dir') { @@ -174,13 +184,11 @@ export function dbKeys_mergeNextPage(tree: DbKeysTreeModel, nextPage: DbKeysLoad const newDirKey = newDirPath.join(tree.treeKeySeparator); if (!dirsByKey[newDirKey]) { dirsByKey[newDirKey] = { - isExpanded: tree.dirsByKey[newDirKey]?.isExpanded ?? false, level: keyObj.level - 1, keyPath: newDirPath, parentKey: newDirPath.slice(0, -1).join(tree.treeKeySeparator), type: 'dir', key: newDirKey, - visibleCount: tree.dirsByKey[newDirKey]?.visibleCount ?? SHOW_INCREMENT, text: `${newDirPath[newDirPath.length - 1]}${tree.treeKeySeparator}*`, }; } @@ -204,6 +212,9 @@ export function dbKeys_mergeNextPage(tree: DbKeysTreeModel, nextPage: DbKeysLoad childrenByKey[dirObj.parentKey] = []; } childrenByKey[dirObj.parentKey].push(dirObj); + + // set key count + dirsByKey[dirObj.key].count = childrenByKey[dirObj.key].length; } for (const key in childrenByKey) { @@ -223,14 +234,11 @@ export function dbKeys_mergeNextPage(tree: DbKeysTreeModel, nextPage: DbKeysLoad } export function dbKeys_markNodeExpanded(tree: DbKeysTreeModel, root: string, isExpanded: boolean): DbKeysTreeModel { - const node = tree.dirsByKey[root]; - if (!node) { - return tree; - } + const node = tree.dirStateByKey[root]; return { ...tree, - dirsByKey: { - ...tree.dirsByKey, + dirStateByKey: { + ...tree.dirStateByKey, [root]: { ...node, isExpanded, @@ -239,24 +247,28 @@ export function dbKeys_markNodeExpanded(tree: DbKeysTreeModel, root: string, isE }; } -export function dbKeys_refreshAll(treeKeySeparator: string, tree?: DbKeysTreeModel): DbKeysTreeModel { +export function dbKeys_createNewModel(treeKeySeparator: string): DbKeysTreeModel { const root: DbKeysFolderNodeModel = { - isExpanded: true, level: 0, type: 'dir', keyPath: [], parentKey: '', key: '', - visibleCount: SHOW_INCREMENT, }; return { - ...tree, treeKeySeparator, childrenByKey: {}, keyObjectsByKey: {}, dirsByKey: { '': root, }, + dirStateByKey: { + '': { + key: '', + visibleCount: SHOW_INCREMENT, + isExpanded: true, + }, + }, scannedKeys: 0, dbsize: 0, loadCount: 2000, @@ -266,6 +278,21 @@ export function dbKeys_refreshAll(treeKeySeparator: string, tree?: DbKeysTreeMod }; } +export function dbKeys_clearLoadedData(tree: DbKeysTreeModel): DbKeysTreeModel { + return { + ...tree, + childrenByKey: {}, + keyObjectsByKey: {}, + dirsByKey: { + '': tree.root, + }, + scannedKeys: 0, + dbsize: 0, + cursor: '0', + loadedAll: false, + }; +} + // export function dbKeys_reloadFolder(tree: DbKeysTreeModel, root: string): DbKeysTreeModel { // return { // ...tree, @@ -282,8 +309,8 @@ export function dbKeys_refreshAll(treeKeySeparator: string, tree?: DbKeysTreeMod // } function addFlatItems(tree: DbKeysTreeModel, root: string, res: DbKeysNodeModel[], visitedRoots: string[] = []) { - const item = tree.dirsByKey[root]; - if (!item.isExpanded) { + const item = tree.dirStateByKey[root]; + if (!item?.isExpanded) { return false; } const children = tree.childrenByKey[root] || []; diff --git a/packages/web/src/widgets/DbKeysSubTree.svelte b/packages/web/src/widgets/DbKeysSubTree.svelte index 6a1f3959b..8da6fe199 100644 --- a/packages/web/src/widgets/DbKeysSubTree.svelte +++ b/packages/web/src/widgets/DbKeysSubTree.svelte @@ -46,7 +46,7 @@ icon="icon dots-horizontal" expandIcon="icon invisible-box" on:click={() => { - changeModel(model => dbKeys_markNodeExpanded(model, key, true)); + changeModel(model => dbKeys_markNodeExpanded(model, key, true), false); }} /> {/if} diff --git a/packages/web/src/widgets/DbKeysTree.svelte b/packages/web/src/widgets/DbKeysTree.svelte index 3e25d2ea9..8512a9c71 100644 --- a/packages/web/src/widgets/DbKeysTree.svelte +++ b/packages/web/src/widgets/DbKeysTree.svelte @@ -1,9 +1,10 @@ @@ -126,20 +125,32 @@ - + -
- {#if model} -
- Scanned {Math.min(model?.scannedKeys, model?.dbsize) ?? '???'}/{model?.dbsize ?? '???'} -
- {/if} - - Scan more - -
+{#if !model?.loadedAll} +
+ {#if model} +
+ {#if isLoading} + Loading... + {:else} + Scanned {Math.min(model?.scannedKeys, model?.dbsize) ?? '???'}/{model?.dbsize ?? '???'} + {/if} +
+ {/if} + {#if isLoading} +
+ +
+ {:else} + + Scan more + + {/if} +
+{/if} {#if differentFocusedDb} {/if} @@ -172,11 +183,11 @@ }; } if (data.key && clickAction == 'keyEnter') { - changeModel(model => dbKeys_markNodeExpanded(model, data.key, !model.dirsByKey[data.key]?.isExpanded)); + changeModel(model => dbKeys_markNodeExpanded(model, data.key, !model.dirsByKey[data.key]?.isExpanded), false); } }} handleExpansion={(data, value) => { - changeModel(model => dbKeys_markNodeExpanded(model, data.key, value)); + changeModel(model => dbKeys_markNodeExpanded(model, data.key, value), false); }} onScrollTop={() => { domContainer?.scrollTop(); diff --git a/packages/web/src/widgets/DbKeysTreeNode.svelte b/packages/web/src/widgets/DbKeysTreeNode.svelte index ed00b0f1e..162fbf820 100644 --- a/packages/web/src/widgets/DbKeysTreeNode.svelte +++ b/packages/web/src/widgets/DbKeysTreeNode.svelte @@ -1,7 +1,7 @@