Skip to content

Commit 1562592

Browse files
anna-lacharecuenco-dsgnDanielleRameau
authored
[Tree] Documentation #1806 (#2498)
* Finetune tree usage tab * tree documentation changes, trying to get the tree example with renderer working * lit virtualizer import * documentation changes, partially working examples, still not ready code part * Code part changes, added missing figma options table to the usage tab, some other improvements * Usage and code part improved * Accessibility part, some other improvements, removing new status from old docs * Some changes after review * tree documentation improvements after review, added missing tree wrapper example * Update usage.md * Background set on the sl-tree * node background changed to transparent * Update usage.md Co-authored-by: Daniëlle Rameau <111998351+DanielleRameau@users.noreply.github.com> * Update usage.md * Update usage.md --------- Co-authored-by: arecuenco-dsgn <alvarorecuenco@icloud.com> Co-authored-by: Daniëlle Rameau <111998351+DanielleRameau@users.noreply.github.com>
1 parent fcc7864 commit 1562592

File tree

23 files changed

+1853
-1363
lines changed

23 files changed

+1853
-1363
lines changed

packages/angular/stories/wrappers.stories.ts

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import { faFileLines, faFolder, faFolderOpen, faPen, faTrash } from '@fortawesome/pro-regular-svg-icons';
12
import { Dialog as DialogElement } from '@sl-design-system/dialog';
3+
import { Icon as SlIcon } from '@sl-design-system/icon';
4+
import { FlatTreeDataSource } from '@sl-design-system/tree';
25
import { type Meta, type StoryObj, moduleMetadata } from '@storybook/angular';
36
import { AccordionItemComponent } from '../src/accordion/accordion-item.component';
47
import { AccordionComponent } from '../src/accordion/accordion.component';
@@ -28,6 +31,7 @@ import { TabComponent } from '../src/tabs/tab.component';
2831
import { TextAreaComponent } from '../src/text-area/text-area.component';
2932
import { TextFieldComponent } from '../src/text-field/text-field.component';
3033
import { TooltipComponent } from '../src/tooltip/tooltip.component';
34+
import { TreeComponent } from '../src/tree/tree.component';
3135

3236
export default {
3337
title: 'Wrappers',
@@ -61,12 +65,15 @@ export default {
6165
TabPanelComponent,
6266
TextFieldComponent,
6367
TextAreaComponent,
64-
TooltipComponent
68+
TooltipComponent,
69+
TreeComponent
6570
]
6671
})
6772
]
6873
} as Meta;
6974

75+
SlIcon.register(faFileLines, faFolder, faFolderOpen, faPen, faTrash);
76+
7077
export const Accordion: StoryObj = {
7178
render: () => ({
7279
template: `
@@ -287,3 +294,52 @@ export const Tooltip: StoryObj = {
287294
`
288295
})
289296
};
297+
298+
export const Tree: StoryObj = {
299+
render: () => {
300+
type Item = { id: number; expandable: boolean; level: number; name: string };
301+
302+
const flatData: Item[] = [
303+
{ id: 0, expandable: true, level: 0, name: 'Mathematics' },
304+
{ id: 1, expandable: true, level: 1, name: 'Algebra' },
305+
{ id: 2, expandable: false, level: 2, name: 'Lesson 1 - Linear equations.md' },
306+
{ id: 3, expandable: false, level: 2, name: 'Lesson 2 - Quadratic equations.md' },
307+
{ id: 4, expandable: true, level: 1, name: 'Geometry' },
308+
{ id: 5, expandable: false, level: 2, name: 'Lesson 1 - Triangles.md' },
309+
{ id: 6, expandable: false, level: 2, name: 'Lesson 2 - Circles.md' },
310+
{ id: 21, expandable: false, level: 1, name: 'Lesson 20 - Statistics and probability.md' },
311+
{ id: 7, expandable: true, level: 0, name: 'Science' },
312+
{ id: 8, expandable: true, level: 1, name: 'Physics' },
313+
{ id: 9, expandable: false, level: 2, name: 'Lesson 1 - Motion.md' },
314+
{ id: 10, expandable: false, level: 2, name: 'Lesson 2 - Forces.md' },
315+
{ id: 11, expandable: true, level: 1, name: 'Chemistry' },
316+
{ id: 12, expandable: false, level: 2, name: 'Lesson 1 - Atoms.md' },
317+
{ id: 13, expandable: false, level: 2, name: 'Lesson 2 - Reactions.md' },
318+
{ id: 14, expandable: true, level: 0, name: 'History' },
319+
{ id: 15, expandable: true, level: 1, name: 'Ancient Civilizations' },
320+
{ id: 16, expandable: false, level: 2, name: 'Egypt.md' },
321+
{ id: 17, expandable: false, level: 2, name: 'Rome.md' },
322+
{ id: 18, expandable: true, level: 1, name: 'Modern History' },
323+
{ id: 19, expandable: false, level: 2, name: 'World War I.md' },
324+
{ id: 20, expandable: false, level: 2, name: 'World War II.md' }
325+
];
326+
327+
const dataSource = new FlatTreeDataSource<Item>(flatData, {
328+
getIcon: ({ name }: Item, expanded: boolean) =>
329+
name.includes('.') ? 'far-file-lines' : `far-folder${expanded ? '-open' : ''}`,
330+
getId: (item: Item) => item.id,
331+
getLabel: ({ name }: Item) => name,
332+
getLevel: ({ level }: Item) => level,
333+
isExpandable: ({ expandable }: Item) => expandable,
334+
isExpanded: ({ name }: Item) => ['tree', 'src'].includes(name),
335+
selects: 'multiple'
336+
});
337+
338+
return {
339+
props: { dataSource },
340+
template: `
341+
<sl-tree [dataSource]="dataSource" aria-label="Subjects structure"></sl-tree>
342+
`
343+
};
344+
}
345+
};

packages/components/tree/src/tree-node.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
:host {
2-
--_bg-color: var(--sl-elevation-surface-base-default);
2+
--_bg-color: transparent;
33
--_bg-mix-color: var(--sl-color-background-neutral-interactive-plain);
44
--_bg-opacity: var(--sl-opacity-interactive-plain-idle);
55

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
:host {
2+
background: var(--sl-elevation-surface-base-default);
23
display: flex;
34
scroll-padding-block: var(--sl-size-100);
45
}

packages/components/tree/src/tree.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ export class Tree<T = any> extends ObserveAttributesMixin(ScopedElementsMixin(Li
6969
return this.#dataSource;
7070
}
7171

72-
/** The model for the tree. */
72+
/**
73+
* The model for the tree.
74+
* @type {TreeDataSource<T> | undefined}
75+
* */
7376
@property({ attribute: false })
7477
set dataSource(dataSource: TreeDataSource<T> | undefined) {
7578
if (this.#dataSource) {
@@ -88,7 +91,7 @@ export class Tree<T = any> extends ObserveAttributesMixin(ScopedElementsMixin(Li
8891
* Use this if you want to wait until lit-virtualizer has finished the rendering
8992
* the tree nodes. This can be useful in unit tests for example.
9093
*/
91-
get layoutComplete() {
94+
get layoutComplete(): Promise<void> {
9295
return this.#virtualizer?.layoutComplete ?? Promise.resolve();
9396
}
9497

@@ -175,6 +178,10 @@ export class Tree<T = any> extends ObserveAttributesMixin(ScopedElementsMixin(Li
175178
`;
176179
}
177180

181+
/**
182+
* @internal
183+
* Renders a single tree item as a virtualized row.
184+
*/
178185
renderItem(item: TreeDataSourceNode<T>): TemplateResult {
179186
const icon = item.expanded ? item.expandedIcon : item.icon;
180187

@@ -217,6 +224,7 @@ export class Tree<T = any> extends ObserveAttributesMixin(ScopedElementsMixin(Li
217224
`;
218225
}
219226

227+
/** @internal */
220228
scrollToNode(node: TreeDataSourceNode<T>, options?: ScrollIntoViewOptions): void {
221229
const index = this.dataSource?.items.indexOf(node) ?? -1;
222230
if (index !== -1) {

0 commit comments

Comments
 (0)