UNPKG

@intuitionrobotics/thunderstorm

Version:
205 lines 7.04 kB
import * as React from "react"; import {} from "react"; import { _keys, } from "@intuitionrobotics/ts-common"; import { SimpleNodeRenderer, SimpleTreeNodeRenderer } from "../tree/SimpleTreeNodeRenderer.js"; import {} from "./BaseRenderer.js"; import {} from "../tree/types.js"; export class BaseAdapter { data; constructor(data) { this.data = data; } setData(data) { this.data = data; return this; } filter(_obj, _key) { return true; } getChildren = (obj) => _keys(obj); isParent = (_obj) => true; getFilteredChildren(obj) { if (obj === undefined || obj === null) return []; if (typeof obj !== "object" && !Array.isArray(obj)) return []; return this.getChildren(obj).filter((__key) => this.filter(obj, __key)); } adjust(obj) { return { data: obj, deltaPath: "" }; } clone(baseAdapter) { _keys(this).forEach(k => { baseAdapter[k] = this[k]; }); return baseAdapter; } } export class Adapter extends BaseAdapter { hideRoot = false; treeNodeRenderer = SimpleTreeNodeRenderer; setTreeNodeRenderer(renderer) { this.treeNodeRenderer = renderer; return this; } resolveRenderer(_propKey) { return (_pah) => null; } } class BaseAdapterBuilder { data; treeNodeRenderer; getChildrenKeys = (obj) => _keys(obj); isParent = (_obj) => true; adjust = (obj) => ({ data: obj, deltaPath: "" }); setData(data) { this.data = data; return this; } } class ListSingleAdapterBuilder extends BaseAdapterBuilder { renderer; constructor(renderer) { super(); this.renderer = renderer; this.treeNodeRenderer = (props) => { const _Renderer = this.renderer; return React.createElement("div", { id: props.node.path, onClick: props.node.onClick }, React.createElement(_Renderer, { item: props.item, node: props.node })); }; this.isParent = (obj) => obj === this.data; } nested() { this.getChildrenKeys = (obj) => { if (typeof obj !== "object") return []; if (Array.isArray(obj)) return _keys(obj); if (!obj._children) return []; return ["_children"]; }; this.treeNodeRenderer = (props) => { const item = props.item; const _Renderer = this.renderer; return React.createElement("div", { id: props.node.path, onClick: props.node.onClick }, React.createElement(_Renderer, { item: typeof props.item === "object" ? item.item : props.item, node: props.node })); }; return this; } build() { const adapter = new Adapter(this.data); adapter.hideRoot = true; adapter.treeNodeRenderer = this.treeNodeRenderer; adapter.getChildren = this.getChildrenKeys; adapter.isParent = this.isParent; adapter.adjust = this.adjust; // @ts-expect-error TS struggles with this dynamic typing adapter.itemRenderer = this.renderer; return adapter; } } class ListMultiAdapterBuilder extends BaseAdapterBuilder { rendererMap; constructor(rendererMap) { super(); this.rendererMap = rendererMap; this.getChildrenKeys = (obj) => { if (typeof obj !== "object") return []; if (Array.isArray(obj)) return _keys(obj); if (!obj._children) return []; return ["_children"]; }; this.treeNodeRenderer = (props) => { if (props.node.propKey === "_children") return null; const _Renderer = this.rendererMap[props.item.type]; return React.createElement("div", { id: props.node.path, onClick: props.node.onClick }, React.createElement(_Renderer, { item: props.item.item, node: props.node })); }; } nested() { return this; } noGeneralOnClick() { this.treeNodeRenderer = (props) => { if (props.node.propKey === "_children") return null; const _Renderer = this.rendererMap[props.item.type]; return React.createElement("div", { id: props.node.path }, React.createElement(_Renderer, { item: props.item.item, node: props.node })); }; return this; } build() { const adapter = new Adapter(this.data); adapter.hideRoot = true; adapter.adjust = this.adjust; adapter.treeNodeRenderer = this.treeNodeRenderer; adapter.getChildren = this.getChildrenKeys; return adapter; } } class TreeSingleAdapterBuilder extends BaseAdapterBuilder { renderer; constructor(renderer) { super(); this.renderer = renderer; } treeNodeRenderer = (props) => { const item = props.item; const _Renderer = this.renderer; return React.createElement("div", { id: props.node.path, onClick: props.node.onClick }, React.createElement(_Renderer, { item: typeof props.item === "object" ? item.item : props.item, node: props.node })); }; build() { const adapter = new Adapter(this.data); adapter.treeNodeRenderer = (props) => { const renderCollapse = () => { let toDisplay; if (typeof props.item !== "object") toDisplay = ""; else if (Object.keys(props.item).length === 0) toDisplay = ""; else if (props.node.expanded) toDisplay = "-"; else toDisplay = "+"; return React.createElement("div", { className: `clickable`, id: props.node.path, onClick: props.node.expandToggler, style: { width: "15px" } }, toDisplay); }; return (React.createElement("div", { className: "ll_h_c" }, renderCollapse(), React.createElement("div", { id: props.node.path, className: 'clickable', onClick: props.node.onClick, style: { backgroundColor: props.node.focused ? "red" : "salmon", userSelect: "none" } }, React.createElement(SimpleNodeRenderer, { ...props })))); }; return adapter; } } class ListAdapterBuilder { singleRender(renderer) { return new ListSingleAdapterBuilder(renderer); } multiRender(rendererMap) { return new ListMultiAdapterBuilder(rendererMap); } } class TreeAdapterBuilder { singleRender(renderer) { return new TreeSingleAdapterBuilder(renderer); } } class MainAdapterBuilder { list() { return new ListAdapterBuilder(); } tree() { return new TreeAdapterBuilder(); } } export function AdapterBuilder() { return new MainAdapterBuilder(); } //# sourceMappingURL=Adapter.js.map