UNPKG

@itwin/presentation-components

Version:

React components based on iTwin.js Presentation library

123 lines 7.59 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isPresentationInstanceFilterConditionGroup = isPresentationInstanceFilterConditionGroup; exports.convertToInstanceFilterDefinition = convertToInstanceFilterDefinition; exports.useInstanceFilterPropertyInfos = useInstanceFilterPropertyInfos; exports.PresentationFilterBuilderValueRenderer = PresentationFilterBuilderValueRenderer; exports.PresentationInstanceFilterBuilder = PresentationInstanceFilterBuilder; exports.createInstanceFilterDefinition = createInstanceFilterDefinition; 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. *--------------------------------------------------------------------------------------------*/ /** @packageDocumentation * @module InstancesFilter */ const react_1 = require("react"); const components_react_1 = require("@itwin/components-react"); const core_bentley_1 = require("@itwin/core-bentley"); const NavigationPropertyEditorContext_js_1 = require("../properties/editors/NavigationPropertyEditorContext.js"); const UniquePropertyValuesSelector_js_1 = require("../properties/inputs/UniquePropertyValuesSelector.js"); const InstanceFilterBuilder_js_1 = require("./InstanceFilterBuilder.js"); const InstanceFilterConverter_js_1 = require("./InstanceFilterConverter.js"); const PresentationInstanceFilter_js_1 = require("./PresentationInstanceFilter.js"); const PresentationInstanceFilterProperty_js_1 = require("./PresentationInstanceFilterProperty.js"); const Utils_js_1 = require("./Utils.js"); /** * Function that checks if supplied [[PresentationInstanceFilter]] is [[PresentationInstanceFilterConditionGroup]]. * @beta * @deprecated in 5.0. Use `PresentationInstanceFilter.isConditionGroup` instead. */ /* c8 ignore next 3 */ function isPresentationInstanceFilterConditionGroup(filter) { return PresentationInstanceFilter_js_1.PresentationInstanceFilter.isConditionGroup(filter); } /** * Converts [[PresentationInstanceFilter]] into [InstanceFilterDefinition]($presentation-common) that can be passed * to [PresentationManager]($presentation-frontend) through request options in order to filter results. * @beta * @deprecated in 5.0. Use `createInstanceFilterDefinition` instead. */ /* c8 ignore next 3 */ async function convertToInstanceFilterDefinition(filter, imodel) { return (0, InstanceFilterConverter_js_1.createInstanceFilterDefinitionBase)(filter, imodel); } /** * Custom hook that collects properties from descriptor for filter building. * @public */ function useInstanceFilterPropertyInfos({ descriptor }) { const propertyInfos = (0, react_1.useMemo)(() => (0, Utils_js_1.createInstanceFilterPropertyInfos)(descriptor), [descriptor]); const propertyRenderer = (0, react_1.useCallback)((name) => { const instanceFilterPropertyInfo = propertyInfos.find((info) => info.propertyDescription.name === name); (0, core_bentley_1.assert)(instanceFilterPropertyInfo !== undefined); return ((0, jsx_runtime_1.jsx)(PresentationInstanceFilterProperty_js_1.PresentationInstanceFilterProperty, { propertyDescription: instanceFilterPropertyInfo.propertyDescription, fullClassName: instanceFilterPropertyInfo.className, categoryLabel: instanceFilterPropertyInfo.categoryLabel })); }, [propertyInfos]); return { propertyInfos, propertyRenderer, }; } /** * Custom renderer of the filter rule value input. It extends default value input functionality: * - For `IsEqual` and `IsNotEqual` operators it renders a selector with unique property values. Unique values are collected from * the instances described by the descriptor ([[PresentationFilterBuilderValueRendererProps.descriptor]] and [[PresentationFilterBuilderValueRendererProps.descriptorInputKeys]]). * - For kind of quantity properties it renders input with units support. * * @public */ function PresentationFilterBuilderValueRenderer({ imodel, descriptor, descriptorInputKeys, selectedClasses, ...props }) { const navigationPropertyContextProviderProps = (0, Utils_js_1.useFilterBuilderNavigationPropertyEditorContextProviderProps)(imodel, descriptor); if (props.operator === "is-equal" || props.operator === "is-not-equal") { return ((0, jsx_runtime_1.jsx)(UniquePropertyValuesSelector_js_1.UniquePropertyValuesSelector, { ...props, imodel: imodel, descriptor: descriptor, descriptorInputKeys: descriptorInputKeys, selectedClasses: selectedClasses })); } return ((0, jsx_runtime_1.jsx)(NavigationPropertyEditorContext_js_1.NavigationPropertyEditorContextProvider, { ...navigationPropertyContextProviderProps, children: (0, jsx_runtime_1.jsx)(components_react_1.PropertyFilterBuilderRuleValue, { ...props }) })); } /** * Component for building complex instance filters for filtering content and nodes produced * by [PresentationManager]($presentation-frontend). * * @public */ function PresentationInstanceFilterBuilder(props) { const { imodel, descriptor, onInstanceFilterChanged, initialFilter } = props; const { rootGroup, actions, buildFilter } = (0, components_react_1.usePropertyFilterBuilder)({ initialFilter: initialFilter?.filter ? PresentationInstanceFilter_js_1.PresentationInstanceFilter.toComponentsPropertyFilter(descriptor, initialFilter.filter) : undefined, }); const filteringProps = (0, InstanceFilterBuilder_js_1.usePresentationInstanceFilteringProps)(descriptor, imodel, initialFilter?.usedClasses); (0, react_1.useEffect)(() => { const filter = buildFilter({ ignoreErrors: true }); onInstanceFilterChanged(filter ? { filter: PresentationInstanceFilter_js_1.PresentationInstanceFilter.fromComponentsPropertyFilter(descriptor, filter), usedClasses: filteringProps.selectedClasses } : undefined); }, [descriptor, buildFilter, onInstanceFilterChanged, filteringProps.selectedClasses]); const onSelectedClassesChanged = (classIds) => { filteringProps.onSelectedClassesChanged(classIds); actions.removeAllItems(); }; return ((0, jsx_runtime_1.jsx)(InstanceFilterBuilder_js_1.InstanceFilterBuilder, { ...filteringProps, onSelectedClassesChanged: onSelectedClassesChanged, rootGroup: rootGroup, actions: actions, imodel: imodel, descriptor: descriptor })); } /** * Creates [InstanceFilterDefinition]($presentation-common) from [[PresentationInstanceFilterInfo]]. Created definition * can be passed to [PresentationManager]($presentation-frontend) through request options in order to filter results. * @public */ async function createInstanceFilterDefinition(info, imodel) { if (!info.filter) { return { expression: (0, InstanceFilterConverter_js_1.createFilterClassExpression)(info.usedClasses), selectClassName: "" }; } const instanceFilter = await (0, InstanceFilterConverter_js_1.createInstanceFilterDefinitionBase)(info.filter, imodel); if (info.usedClasses.length === 0) { return instanceFilter; } return { ...instanceFilter, expression: `${wrap(instanceFilter.expression)} AND ${(0, InstanceFilterConverter_js_1.createFilterClassExpression)(info.usedClasses)}`, }; } function wrap(expression) { if (expression.startsWith("(") && expression.endsWith(")")) { return expression; } return `(${expression})`; } //# sourceMappingURL=PresentationFilterBuilder.js.map