From 408f4eb17da99765d930cf0ef45072f92af1d6f7 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 27 Mar 2023 12:05:44 +0200 Subject: [PATCH] add tree docs scaffold --- .../src/stories/extending/tree.mdx | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/stories/extending/tree.mdx diff --git a/src/Umbraco.Web.UI.Client/src/stories/extending/tree.mdx b/src/Umbraco.Web.UI.Client/src/stories/extending/tree.mdx new file mode 100644 index 0000000000..eb0e1c810d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/stories/extending/tree.mdx @@ -0,0 +1,127 @@ +import { Meta } from '@storybook/addon-docs'; + + + +# Trees + +// TODO: add description of trees. +Rough notes: +The tree is a hierarchical structure of nodes. The tree is registered in the Backoffice extension registry. A tree can be rendered anywhere in the Backoffice with the help of the umb-tree element. + +## Registering a tree + +Tree Manifest + +```json +// TODO: add interface +{ + "type": "tree", + "alias": "My.Tree.Alias", + "name": "My Tree", + "meta": { + "repositoryAlias": "My.Repository.Alias" + } +}, +{ + "type": "treeItem", + "kind": "entity", + "alias": "My.TreeItem.Alias", + "name": "My Tree Item", + "conditions": { + "entityType": "my-entity-type", + }, +} +``` + +The backoffice comes with two different tree item kinds out of the box: +entity and fileSystem + +## Rendering a tree + +```html + +``` + +## Render a Custom Tree Item + +The Tree Item Manifest + +```json +{ + "type": "treeItem", + "alias": "Umb.TreeItem.Alias", + "name": "My Tree Item", + "js": "./my-tree-item.element.js", + "conditions": { + "entityType": "my-entity-type", + }, +}; +``` + +### The Tree Item Element + +```typescript +import { css, html, nothing } from 'lit'; +import { customElement, property } from 'lit/decorators.js'; +import { UmbElementMixin } from '@umbraco-cms/backoffice/element'; +import { UmbMyTreeItemContext, MyTreeItemDataModel } from './my-tree-item.context'; + +@customElement('my-tree-item') +export class MyTreeItemElement extends UmbElementMixin(LitElement) { + @property({ type: Object, attribute: false }) + public item?: MyTreeItemDataModel; + + render() { + if (!this.item) return nothing; + new UmbMyTreeItemContext(this, this.item); + return html` Some custom markup `; + } +} + +export default MyTreeItemElement; +``` + +### The Tree Item Context + +```typescript +// TODO: auto generate this from the interface +export interface UmbTreeItemContext { + host: UmbControllerHostInterface; + treeItem: T; + unique: string; + type: string; + + hasChildren: Observable; + isLoading: Observable; + isSelectable: Observable; + isSelected: Observable; + isActive: Observable; + hasActions: Observable; + path: Observable; + + requestChildren(): Promise<{ + data: PagedResponse | undefined; + error: ProblemDetailsModel | undefined; + asObservable?: () => Observable; + }>; + + toggleContextMenu(): void; + select(): void; + deselect(): void; + constructPath(pathname: string, entityType: string, unique: string): string; +} +``` + +### Extending the Tree Item Context base + +We provide a base class for the tree item context. This class provides some default implementations for the context. You can extend this class to overwrite any of the default implementations. + +```typescript +export class UmbMyTreeItemContext extends UmbTreeItemContextBase { + constructor(host: UmbControllerHostInterface, treeItem: MyTreeItemDataModel) { + super(host, treeItem, (x: MyTreeItemDataModel) => x.unique); + } + + // overwrite any methods or properties here if needed +} +```