From b094207455dae33f0193a0ee16523c2166bcbc52 Mon Sep 17 00:00:00 2001 From: Yann Amsellem Date: Fri, 6 Jun 2025 15:53:44 +0200 Subject: [PATCH] feat(datasets): add collapse all button --- src/lib/components/Datasets/Datasets.svelte | 57 +++++++++++++++++++-- src/lib/components/Datasets/Tree.svelte | 12 ++--- src/lib/components/Datasets/emitter.ts | 22 ++++++++ src/lib/icons/CollapseAll.svelte | 18 +++++++ 4 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 src/lib/icons/CollapseAll.svelte diff --git a/src/lib/components/Datasets/Datasets.svelte b/src/lib/components/Datasets/Datasets.svelte index 6c70ae1..c5a674a 100644 --- a/src/lib/components/Datasets/Datasets.svelte +++ b/src/lib/components/Datasets/Datasets.svelte @@ -2,6 +2,8 @@ import type { Table } from '$lib/olap-engine'; import SearchBar from '$lib/components/SearchBar.svelte'; + import CollapseAll from '$lib/icons/CollapseAll.svelte'; + import { collapseAll, expandAll } from './emitter'; import Tree from './Tree.svelte'; import { buildTree, filter } from './utils'; @@ -14,19 +16,68 @@ let search = $state(''); const filtered = $derived(filter(tables, search)); const tree = $derived(buildTree(filtered)); + + $effect(() => { + if (search) expandAll(); + else collapseAll(); + }); -
+
+
+ +
{#each tree as node} - + {/each}
diff --git a/src/lib/components/Datasets/Tree.svelte b/src/lib/components/Datasets/Tree.svelte index 81c2c3f..8bb1a4e 100644 --- a/src/lib/components/Datasets/Tree.svelte +++ b/src/lib/components/Datasets/Tree.svelte @@ -4,23 +4,21 @@ import Table from '$lib/icons/Table.svelte'; import { tick } from 'svelte'; import Columns from './Columns.svelte'; - import { onExpand } from './emitter'; + import { onCollapseAll, onExpand, onExpandAll } from './emitter'; import Tree from './Tree.svelte'; import { findNodeInTree, type TreeNode } from './utils'; interface Props { node: TreeNode; level?: number; - expanded?: boolean; } - let { node, level = 0, expanded: forceExpanded }: Props = $props(); + let { node, level = 0 }: Props = $props(); let expanded = $state(false); - $effect(() => { - if (typeof forceExpanded === 'boolean') expanded = forceExpanded; - }); + $effect(() => onCollapseAll(() => (expanded = false))); + $effect(() => onExpandAll(() => (expanded = true))); function toggleExpanded() { expanded = !expanded; @@ -78,7 +76,7 @@ {#if node.type === 'group'}
{#each node.children as child} - + {/each}
{/if} diff --git a/src/lib/components/Datasets/emitter.ts b/src/lib/components/Datasets/emitter.ts index 28a8c78..90a6338 100644 --- a/src/lib/components/Datasets/emitter.ts +++ b/src/lib/components/Datasets/emitter.ts @@ -3,6 +3,8 @@ import mitt from 'mitt'; type Events = { expand: Table['name']; + 'expand-all': void; + 'collapse-all': void; }; const emitter = mitt(); @@ -16,3 +18,23 @@ export function onExpand(handler: (tableName: string) => void) { return () => emitter.off('expand', handler); } + +export function expandAll() { + emitter.emit('expand-all'); +} + +export function onExpandAll(handler: () => void) { + emitter.on('expand-all', handler); + + return () => emitter.off('expand-all', handler); +} + +export function collapseAll() { + emitter.emit('collapse-all'); +} + +export function onCollapseAll(handler: () => void) { + emitter.on('collapse-all', handler); + + return () => emitter.off('collapse-all', handler); +} diff --git a/src/lib/icons/CollapseAll.svelte b/src/lib/icons/CollapseAll.svelte new file mode 100644 index 0000000..c3d615a --- /dev/null +++ b/src/lib/icons/CollapseAll.svelte @@ -0,0 +1,18 @@ + + + + + +