@itwin/presentation-common
Version:
Common pieces for iModel.js presentation packages
212 lines • 7.25 kB
JavaScript
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module RPC
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.createElementPropertiesBuilder = void 0;
const core_bentley_1 = require("@itwin/core-bentley");
const ContentTraverser_js_1 = require("./content/ContentTraverser.js");
const TypeDescription_js_1 = require("./content/TypeDescription.js");
/** @internal */
const createElementPropertiesBuilder = () => {
const builder = new ElementPropertiesBuilder();
const traverseContent = (0, ContentTraverser_js_1.createContentTraverser)(builder);
return (descriptor, item) => {
traverseContent(descriptor, [item]);
return builder.items[0];
};
};
exports.createElementPropertiesBuilder = createElementPropertiesBuilder;
class ElementPropertiesAppender {
_item;
_onItemFinished;
_propertyItems = {};
_categoryItemAppenders = {};
constructor(_item, _onItemFinished) {
this._item = _item;
this._onItemFinished = _onItemFinished;
}
append(label, item) {
this._propertyItems[label] = item;
}
finish() {
// eslint-disable-next-line guard-for-in
for (const categoryName in this._categoryItemAppenders) {
const appender = this._categoryItemAppenders[categoryName];
appender.finish();
}
this._onItemFinished({
class: this._item.classInfo?.label ?? "",
id: this._item.primaryKeys[0]?.id ?? core_bentley_1.Id64.invalid,
label: this._item.label.displayValue,
items: this._propertyItems,
});
}
getCategoryAppender(parentAppender, category) {
let appender = this._categoryItemAppenders[category.name];
if (!appender) {
appender = new CategoryItemAppender(parentAppender, category);
this._categoryItemAppenders[category.name] = appender;
}
return appender;
}
}
class CategoryItemAppender {
_parentAppender;
_category;
_items = {};
constructor(_parentAppender, _category) {
this._parentAppender = _parentAppender;
this._category = _category;
}
append(label, item) {
this._items[label] = item;
}
finish() {
if (Object.keys(this._items).length === 0) {
return;
}
this._parentAppender.append(this._category.label, {
type: "category",
items: this._items,
});
}
}
class ArrayItemAppender {
_parentAppender;
_props;
_items = [];
constructor(_parentAppender, _props) {
this._parentAppender = _parentAppender;
this._props = _props;
}
append(_label, item) {
(0, core_bentley_1.assert)(item.type !== "category");
this._items.push(item);
}
finish() {
(0, core_bentley_1.assert)(this._props.valueType.valueFormat === TypeDescription_js_1.PropertyValueFormat.Array);
if (this._props.valueType.memberType.valueFormat === TypeDescription_js_1.PropertyValueFormat.Primitive) {
this._parentAppender.append(this._props.hierarchy.field.label, this.createPrimitivesArray());
}
else {
this._parentAppender.append(this._props.hierarchy.field.label, this.createStructsArray());
}
}
createPrimitivesArray() {
return {
type: "array",
valueType: "primitive",
values: this._items.map((item) => {
(0, core_bentley_1.assert)(item.type === "primitive");
return item.value;
}),
};
}
createStructsArray() {
return {
type: "array",
valueType: "struct",
values: this._items.map((item) => {
(0, core_bentley_1.assert)(item.type === "struct");
return item.members;
}),
};
}
}
class StructItemAppender {
_parentAppender;
_props;
_members = {};
constructor(_parentAppender, _props) {
this._parentAppender = _parentAppender;
this._props = _props;
}
append(label, item) {
(0, core_bentley_1.assert)(item.type !== "category");
this._members[label] = item;
}
finish() {
(0, core_bentley_1.assert)(this._props.valueType.valueFormat === TypeDescription_js_1.PropertyValueFormat.Struct);
this._parentAppender.append(this._props.hierarchy.field.label, {
type: "struct",
members: this._members,
});
}
}
class ElementPropertiesBuilder {
_appendersStack = [];
_items = [];
_elementPropertiesAppender;
get items() {
return this._items;
}
get _currentAppender() {
const appender = this._appendersStack[this._appendersStack.length - 1];
(0, core_bentley_1.assert)(appender !== undefined);
return appender;
}
startContent(_props) {
this._appendersStack = [];
this._items = [];
this._elementPropertiesAppender = undefined;
return true;
}
finishContent() { }
processFieldHierarchies(_props) { }
startItem(props) {
this._elementPropertiesAppender = new ElementPropertiesAppender(props.item, (item) => this._items.push(item));
this._appendersStack.push(this._elementPropertiesAppender);
return true;
}
finishItem() {
this._appendersStack.pop();
(0, core_bentley_1.assert)(this._elementPropertiesAppender !== undefined);
this._elementPropertiesAppender.finish();
this._elementPropertiesAppender = undefined;
}
startCategory(props) {
(0, core_bentley_1.assert)(this._elementPropertiesAppender !== undefined);
this._appendersStack.push(this._elementPropertiesAppender.getCategoryAppender(this._currentAppender, props.category));
return true;
}
finishCategory() {
this._appendersStack.pop();
}
startField(_props) {
return true;
}
finishField() { }
startStruct(props) {
this._appendersStack.push(new StructItemAppender(this._currentAppender, props));
return true;
}
finishStruct() {
this._appendersStack.pop().finish();
}
startArray(props) {
this._appendersStack.push(new ArrayItemAppender(this._currentAppender, props));
return true;
}
finishArray() {
this._appendersStack.pop().finish();
}
processMergedValue(props) {
this._currentAppender.append(props.mergedField.label, {
type: "primitive",
value: "",
});
}
processPrimitiveValue(props) {
this._currentAppender.append(props.field.label, {
type: "primitive",
// eslint-disable-next-line @typescript-eslint/no-base-to-string
value: props.displayValue?.toString() ?? "",
});
}
}
//# sourceMappingURL=ElementProperties.js.map