Skip to content

Commit c6c7569

Browse files
committed
feat(treeview): make node slottable
Closes #1660
1 parent 417102d commit c6c7569

File tree

3 files changed

+39
-12
lines changed

3 files changed

+39
-12
lines changed

src/TreeView/TreeView.svelte

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
/**
33
* @typedef {string | number} TreeNodeId
44
* @typedef {{ id: TreeNodeId; text: any; icon?: typeof import("svelte").SvelteComponent<any>; disabled?: boolean; children?: TreeNode[]; }} TreeNode
5+
* @slot {{ node: { id: TreeNodeId; text: string; expanded: boolean, leaf: boolean; disabled: boolean; selected: boolean; } }}
56
* @event {TreeNode & { expanded: boolean; leaf: boolean; }} select
67
* @event {TreeNode & { expanded: boolean; leaf: boolean; }} toggle
78
* @event {TreeNode & { expanded: boolean; leaf: boolean; }} focus
@@ -202,5 +203,9 @@
202203
on:keydown
203204
on:keydown|stopPropagation="{handleKeyDown}"
204205
>
205-
<TreeViewNodeList root children="{children}" />
206+
<TreeViewNodeList root children="{children}" let:node>
207+
<slot node="{node}">
208+
{node.text}
209+
</slot>
210+
</TreeViewNodeList>
206211
</ul>

src/TreeView/TreeViewNode.svelte

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<script>
3535
/**
3636
* @typedef {string | number} TreeNodeId
37+
* @slot {{ node: { id: TreeNodeId; text: string; expanded: false, leaf: boolean; disabled: boolean; selected: boolean; } }}
3738
*/
3839
3940
export let leaf = false;
@@ -68,7 +69,16 @@
6869
prevActiveId = $activeNodeId;
6970
});
7071
71-
$: node = { id, text, expanded: false, leaf };
72+
$: selected = $selectedNodeIds.includes(id);
73+
$: node = {
74+
id,
75+
text,
76+
// A node cannot be expanded.
77+
expanded: false,
78+
leaf,
79+
disabled,
80+
selected,
81+
};
7282
$: if (refLabel) {
7383
refLabel.style.marginLeft = `-${offset()}rem`;
7484
refLabel.style.paddingLeft = `${offset()}rem`;
@@ -82,12 +92,12 @@
8292
id="{id}"
8393
tabindex="{disabled ? undefined : -1}"
8494
aria-current="{id === $activeNodeId || undefined}"
85-
aria-selected="{disabled ? undefined : $selectedNodeIds.includes(id)}"
95+
aria-selected="{disabled ? undefined : selected}"
8696
aria-disabled="{disabled}"
8797
class:bx--tree-node="{true}"
8898
class:bx--tree-leaf-node="{true}"
8999
class:bx--tree-node--active="{id === $activeNodeId}"
90-
class:bx--tree-node--selected="{$selectedNodeIds.includes(id)}"
100+
class:bx--tree-node--selected="{selected}"
91101
class:bx--tree-node--disabled="{disabled}"
92102
class:bx--tree-node--with-icon="{icon}"
93103
on:click|stopPropagation="{() => {
@@ -116,6 +126,8 @@
116126
>
117127
<div bind:this="{refLabel}" class:bx--tree-node__label="{true}">
118128
<svelte:component this="{icon}" class="bx--tree-node__icon" />
119-
{text}
129+
<slot node="{node}">
130+
{text}
131+
</slot>
120132
</div>
121133
</li>

src/TreeView/TreeViewNodeList.svelte

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
/**
33
* @typedef {string | number} TreeNodeId
44
* @typedef {{ id: TreeNodeId; text: string; disabled?: boolean; expanded?: boolean; }} TreeNode
5+
* @slot {{ node: { id: TreeNodeId; text: string; expanded: boolean, leaf: boolean; disabled: boolean; selected: boolean; } }}
56
*/
67
78
/** @type {Array<TreeNode & { children?: TreeNode[] }>} */
@@ -66,25 +67,30 @@
6667
{#if root}
6768
{#each children as child (child.id)}
6869
{#if Array.isArray(child.children)}
69-
<svelte:self {...child} />
70+
<svelte:self {...child} let:node>
71+
<slot node="{node}" />
72+
</svelte:self>
7073
{:else}
71-
<TreeViewNode leaf {...child} />
74+
<TreeViewNode leaf {...child} let:node>
75+
<slot node="{node}" />
76+
</TreeViewNode>
7277
{/if}
7378
{/each}
7479
{:else}
80+
{@const selected = $selectedNodeIds.includes(id)}
7581
<!-- svelte-ignore a11y-no-noninteractive-element-to-interactive-role -->
7682
<li
7783
bind:this="{ref}"
7884
role="treeitem"
7985
id="{id}"
8086
tabindex="{disabled ? undefined : -1}"
8187
aria-current="{id === $activeNodeId || undefined}"
82-
aria-selected="{disabled ? undefined : $selectedNodeIds.includes(id)}"
88+
aria-selected="{disabled ? undefined : selected}"
8389
aria-disabled="{disabled}"
8490
class:bx--tree-node="{true}"
8591
class:bx--tree-parent-node="{true}"
8692
class:bx--tree-node--active="{id === $activeNodeId}"
87-
class:bx--tree-node--selected="{$selectedNodeIds.includes(id)}"
93+
class:bx--tree-node--selected="{selected}"
8894
class:bx--tree-node--disabled="{disabled}"
8995
class:bx--tree-node--with-icon="{icon}"
9096
aria-expanded="{expanded}"
@@ -151,16 +157,20 @@
151157
</span>
152158
<span class:bx--tree-node__label__details="{true}">
153159
<svelte:component this="{icon}" class="bx--tree-node__icon" />
154-
{text}
160+
<slot node="{{ ...node, selected, disabled }}" />
155161
</span>
156162
</div>
157163
{#if expanded}
158164
<ul role="group" class:bx--tree-node__children="{true}">
159165
{#each children as child (child.id)}
160166
{#if Array.isArray(child.children)}
161-
<svelte:self {...child} />
167+
<svelte:self {...child} let:node>
168+
<slot node="{node}" />
169+
</svelte:self>
162170
{:else}
163-
<TreeViewNode leaf {...child} />
171+
<TreeViewNode leaf {...child} let:node>
172+
<slot node="{node}">{node.text}</slot>
173+
</TreeViewNode>
164174
{/if}
165175
{/each}
166176
</ul>

0 commit comments

Comments
 (0)