@itwin/presentation-components
Version:
React components based on iTwin.js Presentation library
117 lines • 6.89 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useFilterablePresentationTree = useFilterablePresentationTree;
exports.PresentationTreeRenderer = PresentationTreeRenderer;
const jsx_runtime_1 = require("react/jsx-runtime");
/*---------------------------------------------------------------------------------------------
* 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
*/
const react_1 = require("react");
const components_react_1 = require("@itwin/components-react");
const presentation_common_1 = require("@itwin/presentation-common");
const presentation_frontend_1 = require("@itwin/presentation-frontend");
const Utils_js_1 = require("../../common/Utils.js");
const PresentationFilterBuilder_js_1 = require("../../instance-filter-builder/PresentationFilterBuilder.js");
const PresentationInstanceFilterDialog_js_1 = require("../../instance-filter-builder/PresentationInstanceFilterDialog.js");
const PresentationTreeNodeItem_js_1 = require("../PresentationTreeNodeItem.js");
const PresentationTreeNodeRenderer_js_1 = require("./PresentationTreeNodeRenderer.js");
const UseHierarchyLevelFiltering_js_1 = require("./UseHierarchyLevelFiltering.js");
/**
* Hook that enables hierarchy level filtering with action handlers for setting and clearing filters.
* @public
* @deprecated in 5.7. All tree-related APIs have been deprecated in favor of the new generation hierarchy
* building APIs (see https://github.com/iTwin/presentation/blob/33e79ee8d77f30580a9bab81a72884bda008db25/README.md#the-packages).
*/
function useFilterablePresentationTree({ nodeLoader, onFilterApplied }) {
const { applyFilter, clearFilter } = (0, UseHierarchyLevelFiltering_js_1.useHierarchyLevelFiltering)({ nodeLoader, modelSource: nodeLoader.modelSource });
const [filterNode, setFilterNode] = (0, react_1.useState)();
const filterDialog = filterNode && (0, PresentationTreeNodeItem_js_1.isFilterablePresentationTreeNodeItem)(filterNode) ? ((0, jsx_runtime_1.jsx)(TreeNodeFilterBuilderDialog, { dataProvider: nodeLoader.dataProvider, onApply: (info) => {
if (info === undefined) {
clearFilter(filterNode.id);
}
else {
applyFilter(filterNode.id, info);
onFilterApplied?.();
}
setFilterNode(undefined);
}, onClose: () => {
setFilterNode(undefined);
}, filterNode: filterNode })) : null;
return {
onFilterClick: (nodeId) => {
const node = nodeLoader.modelSource.getModel().getNode(nodeId);
if ((0, components_react_1.isTreeModelNode)(node) && (0, PresentationTreeNodeItem_js_1.isPresentationTreeNodeItem)(node.item)) {
setFilterNode(node.item);
}
},
onClearFilterClick: clearFilter,
filterDialog,
};
}
/**
* Tree renderer component that enables hierarchy level filtering in trees using [[PresentationTreeDataProvider]].
* It renders tree nodes with action buttons for setting and clearing filters. [[PresentationInstanceFilterDialog]] is opened
* for creating filters for hierarchy levels.
* @public
* @deprecated in 5.7. All tree-related APIs have been deprecated in favor of the new generation hierarchy
* building APIs (see https://github.com/iTwin/presentation/blob/33e79ee8d77f30580a9bab81a72884bda008db25/README.md#the-packages).
*/
function PresentationTreeRenderer(props) {
const { onClearFilterClick, onFilterClick, filterDialog } = useFilterablePresentationTree({
nodeLoader: props.nodeLoader,
onFilterApplied: props.onFilterApplied,
});
const filterableNodeRenderer = (nodeProps) => {
return (0, jsx_runtime_1.jsx)(PresentationTreeNodeRenderer_js_1.PresentationTreeNodeRenderer, { ...nodeProps, onFilterClick: onFilterClick, onClearFilterClick: onClearFilterClick });
};
return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(components_react_1.TreeRenderer, { ...props, nodeRenderer: filterableNodeRenderer }), filterDialog] }));
}
function TreeNodeFilterBuilderDialog(props) {
const { filterNode, dataProvider, ...restProps } = props;
const filteringInfo = filterNode.filtering;
const imodel = dataProvider.imodel;
const propertiesSource = (0, react_1.useMemo)(() => {
if (typeof filteringInfo.descriptor === "function") {
const descriptorGetter = filteringInfo.descriptor;
return async () => {
const descriptor = await descriptorGetter();
return {
descriptor,
inputKeys: [filterNode.key],
};
};
}
return {
descriptor: filteringInfo.descriptor,
inputKeys: [filterNode.key],
};
}, [filteringInfo.descriptor, filterNode.key]);
return ((0, jsx_runtime_1.jsx)(PresentationInstanceFilterDialog_js_1.PresentationInstanceFilterDialog, { ...restProps, isOpen: true, imodel: imodel, propertiesSource: propertiesSource, initialFilter: filteringInfo.active, filterResultsCountRenderer: (filter) => (0, jsx_runtime_1.jsx)(MatchingInstancesCount, { dataProvider: dataProvider, filter: filter, parentKey: filterNode.key }) }));
}
function MatchingInstancesCount({ filter, dataProvider, parentKey }) {
const { value, inProgress } = (0, components_react_1.useDebouncedAsyncValue)((0, react_1.useCallback)(async () => {
const instanceFilter = await (0, PresentationFilterBuilder_js_1.createInstanceFilterDefinition)(filter, dataProvider.imodel);
const requestOptions = dataProvider.createRequestOptions(parentKey, instanceFilter);
try {
const count = await presentation_frontend_1.Presentation.presentation.getNodesCount(requestOptions);
return `${(0, Utils_js_1.translate)("tree.filter-dialog.results-count")}: ${count}`;
}
catch (e) {
if (e instanceof presentation_common_1.PresentationError && e.errorNumber === presentation_common_1.PresentationStatus.ResultSetTooLarge) {
// ResultSetTooLarge error can't occur if sizeLimit is undefined.
return (0, Utils_js_1.translate)("tree.filter-dialog.result-limit-exceeded", { itemCount: requestOptions.sizeLimit.toString() });
}
}
return undefined;
}, [dataProvider, filter, parentKey]));
if (!value || inProgress) {
return null;
}
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: value });
}
//# sourceMappingURL=PresentationTreeRenderer.js.map