@itwin/presentation-components
Version:
React components based on iTwin.js Presentation library
123 lines • 7.59 kB
JavaScript
;
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