diff --git a/cspell.json b/cspell.json index e6c9712be..2e1efae27 100644 --- a/cspell.json +++ b/cspell.json @@ -79,6 +79,7 @@ "Menlo", "minima", "mininal", + "Morty", "Muertos", "Nahua", "Neue", diff --git a/packages/skeleton/src/lib/components/TreeView/TreeView.svelte b/packages/skeleton/src/lib/components/TreeView/TreeView.svelte index d54e87097..9e4b2dd98 100644 --- a/packages/skeleton/src/lib/components/TreeView/TreeView.svelte +++ b/packages/skeleton/src/lib/components/TreeView/TreeView.svelte @@ -46,6 +46,68 @@ /** Provide the ARIA labelledby value. */ export let labelledby = ''; + // Functionality + /** + * expands all tree view items. + * @type {() => void} + */ + export function expandAll(): void { + const detailsElements = [...tree.querySelectorAll('details.tree-item')] as HTMLDetailsElement[]; + detailsElements.forEach((details) => { + if (!details.open) { + const summary: HTMLElement | null = details.querySelector('summary.tree-item-summary'); + if (summary) summary.click(); + } + }); + } + /** + * collapses all tree view items. + * @type {() => void} + */ + export function collapseAll() { + const detailsElements = [...tree.querySelectorAll('details.tree-item')] as HTMLDetailsElement[]; + detailsElements.forEach((details) => { + if (details.open) { + const summary: HTMLElement | null = details.querySelector('summary.tree-item-summary'); + if (summary) summary.click(); + } + }); + } + /** + * select all tree view items. Only available in Multiple selection mode. + * @type {() => void} + */ + export function selectAll() { + const detailsElements = [...tree.querySelectorAll('details.tree-item')] as HTMLDetailsElement[]; + detailsElements.forEach((details) => { + const input: HTMLInputElement | null = details.querySelector('input[type="checkbox"].tree-item-checkbox'); + if (!input) return; + if (!input.checked) { + // needs delay + setTimeout(() => { + input.click(); + }, 5); + } + }); + } + /** + * deselect all tree view items. Only available in Multiple selection mode. + * @type {() => void} + */ + export function deselectAll() { + const detailsElements = [...tree.querySelectorAll('details.tree-item')] as HTMLDetailsElement[]; + detailsElements.forEach((details) => { + const input: HTMLInputElement | null = details.querySelector('input[type="checkbox"].tree-item-checkbox'); + if (!input) return; + if (input.checked) { + // needs delay + setTimeout(() => { + input.click(); + }, 5); + } + }); + } + // Context API setContext('selection', selection); setContext('multiple', multiple); @@ -63,8 +125,19 @@ // Reactive $: classesBase = `${width} ${spacing} ${$$props.class ?? ''}`; + + // Locals + let tree: HTMLDivElement; -
+
diff --git a/packages/skeleton/src/lib/components/TreeView/TreeViewItem.svelte b/packages/skeleton/src/lib/components/TreeView/TreeViewItem.svelte index f9f81370d..19a1c22e1 100644 --- a/packages/skeleton/src/lib/components/TreeView/TreeViewItem.svelte +++ b/packages/skeleton/src/lib/components/TreeView/TreeViewItem.svelte @@ -234,9 +234,9 @@ {#if selection && name && group} {#if multiple} - + {:else} - + {/if} {/if} diff --git a/sites/skeleton.dev/src/routes/(inner)/components/tree-views/+page.svelte b/sites/skeleton.dev/src/routes/(inner)/components/tree-views/+page.svelte index 26c3c4c8f..bf715e38d 100644 --- a/sites/skeleton.dev/src/routes/(inner)/components/tree-views/+page.svelte +++ b/sites/skeleton.dev/src/routes/(inner)/components/tree-views/+page.svelte @@ -40,6 +40,10 @@ let relationalMediumMultiple = ['movies']; let relationalBooksMultiple: string[] = []; let childrenMultiple: TreeViewItem[] = []; + + let expandTree: TreeView; + + let selectMultiple: string[] = []; @@ -168,7 +172,7 @@

Single

- + @@ -211,7 +215,7 @@ let booksSingle: string = 'Clean Code'; + (icon) @@ -253,7 +257,7 @@ let booksSingle: string = 'Clean Code';

Multiple

- + @@ -296,7 +300,7 @@ let booksMultiple = ['Clean Code', 'The Art of Unix Programming'] + (icon) @@ -348,7 +352,7 @@ let booksMultiple = ['Clean Code', 'The Art of Unix Programming']

- + @@ -397,7 +401,7 @@ let children: TreeViewItem[] = []; + (icon) @@ -426,7 +430,7 @@ let children: TreeViewItem[] = []; - + @@ -475,7 +479,7 @@ let children: TreeViewItem[] = []; + (icon) @@ -572,8 +576,151 @@ let children: TreeViewItem[] = []; `} /> + + + +
+

Expand/Collapse all

+

+ By binding to the tree we can call the functions expandAll(), + collapseAll(). +

+ + + + + + + +

Books

+ + +

Clean Code

+
+ +

The Clean Coder

+
+ +

The Art of Unix Programming

+
+
+
+ + + + +

Movies

+ + +

The Flash

+
+ +

Guardians of the Galaxy

+
+ +

Black Panther

+
+
+
+ + + + +

TV

+ + +

The Simpsons

+
+ +

Rick and Morty

+
+ +

Family Guy

+
+
+
+
+
-

Select children of Books to see relational checking.

+ + +
+ + + + + + `} + /> + +
+
+ +
+

Select/Deselect all

+

+ By binding to the tree we can call the functions selectAll(), + deselectAll(). +

+

Note: These functions are excecuted only in multiple selection mode.

+ + + + + + + +

Books

+
+ + + + +

Movies

+
+ + + + +

TV

+
+
+
+ + + + + + + + + + `} + />