UNPKG

@itwin/presentation-components

Version:

React components based on iTwin.js Presentation library

117 lines 6.89 kB
"use strict"; 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