@intuitionrobotics/thunderstorm
Version:
205 lines • 7.04 kB
JavaScript
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