@itwin/presentation-components
Version:
React components based on iTwin.js Presentation library
183 lines • 6.87 kB
JavaScript
;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/* eslint-disable @typescript-eslint/no-deprecated */
/** @packageDocumentation
* @module Tree
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.createTreeNodeItems = createTreeNodeItems;
exports.createTreeNodeItem = createTreeNodeItem;
exports.createPartialTreeNodeItem = createPartialTreeNodeItem;
exports.createTreeNodeId = createTreeNodeId;
exports.customizeTreeNodeItem = customizeTreeNodeItem;
exports.pageOptionsUiToPresentation = pageOptionsUiToPresentation;
exports.toRxjsObservable = toRxjsObservable;
exports.createInfoNode = createInfoNode;
const Observable_1 = require("rxjs/internal/Observable");
const appui_abstract_1 = require("@itwin/appui-abstract");
const core_react_1 = require("@itwin/core-react");
const presentation_common_1 = require("@itwin/presentation-common");
const StyleHelper_js_1 = require("../common/StyleHelper.js");
const Utils_js_1 = require("../common/Utils.js");
const PresentationTreeNodeItem_js_1 = require("./PresentationTreeNodeItem.js");
/** @internal */
function createTreeNodeItems(nodes, parentId, props) {
const list = new Array();
for (const node of nodes) {
list.push(createTreeNodeItem(node, parentId, props));
}
return list;
}
/** @internal */
function createTreeNodeItem(node, parentId, props) {
const item = {
id: createTreeNodeId(node.key),
label: createNodeLabelRecord(node, !!props?.appendChildrenCountForGroupingNodes),
key: node.key,
};
assignOptionalTreeNodeItemFields(item, node, parentId);
const customizeItemCallback = props?.customizeTreeNodeItem ?? customizeTreeNodeItem;
customizeItemCallback(item, node);
return item;
}
/** @internal */
function createPartialTreeNodeItem(node, parentId, props) {
const item = {};
if (node.key !== undefined) {
item.id = createTreeNodeId(node.key);
item.label = createNodeLabelRecord(node, !!props.appendChildrenCountForGroupingNodes);
}
assignOptionalTreeNodeItemFields(item, node, parentId);
const customizeItemCallback = props.customizeTreeNodeItem ?? customizeTreeNodeItem;
customizeItemCallback(item, node);
return item;
}
/** @internal */
function createTreeNodeId(key) {
return [...key.pathFromRoot].reverse().join("/");
}
function assignOptionalTreeNodeItemFields(item, node, parentId) {
if (node.key !== undefined) {
item.key = node.key;
}
if (parentId) {
item.parentId = parentId;
}
if (node.description) {
item.description = node.description;
}
if (node.hasChildren) {
item.hasChildren = true;
}
if (node.isExpanded) {
item.autoExpand = true;
}
if (node.extendedData) {
item.extendedData = node.extendedData;
}
}
/**
* Applies customization from [Node]($presentation-common) to [TreeNodeItem]($components-react).
* @public
* @deprecated in 3.x. This is a temporary function to apply deprecated [Node]($presentation-common) customization attributes on a [TreeNodeItem]($components-react).
* The recommendation is to switch to using a custom customization function that looks at node's [Node.extendedData]($presentation-common) and applies
* [TreeNodeItem]($components-react) customization based on values in extended data.
* See [extended data usage page]($docs/presentation/customization/ExtendedDataUsage.md) for more details.
*/
/* c8 ignore start */
function customizeTreeNodeItem(item, node) {
if (node.imageId) {
item.icon = node.imageId;
}
if (hasCheckboxVisible(node) && node.isCheckboxVisible) {
item.isCheckboxVisible = true;
if (hasIsChecked(node) && node.isChecked) {
item.checkBoxState = core_react_1.CheckBoxState.On;
}
if (hasIsCheckboxEnabled(node) && !node.isCheckboxEnabled) {
item.isCheckboxDisabled = true;
}
}
const style = createTreeNodeItemStyle(node);
if (Object.keys(style).length > 0) {
item.style = style;
}
}
function createTreeNodeItemStyle(node) {
const style = {};
if (StyleHelper_js_1.StyleHelper.isBold(node)) {
style.isBold = true;
}
if (StyleHelper_js_1.StyleHelper.isItalic(node)) {
style.isItalic = true;
}
const colorOverrides = {};
const foreColor = StyleHelper_js_1.StyleHelper.getForeColor(node);
if (foreColor) {
colorOverrides.color = foreColor;
}
const backColor = StyleHelper_js_1.StyleHelper.getBackColor(node);
if (backColor) {
colorOverrides.backgroundColor = backColor;
}
if (Object.keys(colorOverrides).length > 0) {
style.colorOverrides = colorOverrides;
}
return style;
}
/* c8 ignore end */
/** @internal */
function pageOptionsUiToPresentation(pageOptions) {
if (pageOptions) {
return { ...pageOptions };
}
return undefined;
}
function createNodeLabelRecord(node, appendChildrenCountForGroupingNodes) {
let labelDefinition = node.label;
if (appendChildrenCountForGroupingNodes && presentation_common_1.NodeKey.isGroupingNodeKey(node.key)) {
const countDefinition = {
displayValue: `(${node.key.groupedInstancesCount})`,
rawValue: `(${node.key.groupedInstancesCount})`,
typeName: "string",
};
labelDefinition = {
displayValue: `${labelDefinition.displayValue} ${countDefinition.displayValue}`,
rawValue: {
separator: " ",
values: [labelDefinition, countDefinition],
},
typeName: "composite",
};
}
return (0, Utils_js_1.createLabelRecord)(labelDefinition, "node_label");
}
/** @internal */
function toRxjsObservable(source) {
return new Observable_1.Observable((subscriber) => source.subscribe(subscriber));
}
function createInfoNode(parentNode, message, type) {
const id = parentNode ? `${parentNode.id}/info-node` : `/info-node/${message}`;
return {
id,
parentId: parentNode?.id,
label: appui_abstract_1.PropertyRecord.fromString(message),
message,
isSelectionDisabled: true,
children: undefined,
type: type ?? PresentationTreeNodeItem_js_1.InfoTreeNodeItemType.Unset,
};
}
function hasCheckboxVisible(node) {
return "isCheckboxVisible" in node;
}
function hasIsChecked(node) {
return "isChecked" in node;
}
function hasIsCheckboxEnabled(node) {
return "isCheckboxEnabled" in node;
}
//# sourceMappingURL=Utils.js.map