@itwin/components-react 3.3.0-dev.8 → 3.3.0-dev.82

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/lib/cjs/components-react/common/DateUtils.d.ts +12 -2
  3. package/lib/cjs/components-react/common/DateUtils.d.ts.map +1 -1
  4. package/lib/cjs/components-react/common/DateUtils.js +14 -4
  5. package/lib/cjs/components-react/common/DateUtils.js.map +1 -1
  6. package/lib/cjs/components-react/common/SubscriptionScheduler.d.ts +6 -8
  7. package/lib/cjs/components-react/common/SubscriptionScheduler.d.ts.map +1 -1
  8. package/lib/cjs/components-react/common/SubscriptionScheduler.js +18 -52
  9. package/lib/cjs/components-react/common/SubscriptionScheduler.js.map +1 -1
  10. package/lib/cjs/components-react/editors/DateTimeEditor.d.ts.map +1 -1
  11. package/lib/cjs/components-react/editors/DateTimeEditor.js +2 -0
  12. package/lib/cjs/components-react/editors/DateTimeEditor.js.map +1 -1
  13. package/lib/cjs/components-react/filter-builder/FilterBuilder.d.ts +36 -0
  14. package/lib/cjs/components-react/filter-builder/FilterBuilder.d.ts.map +1 -0
  15. package/lib/cjs/components-react/filter-builder/FilterBuilder.js +118 -0
  16. package/lib/cjs/components-react/filter-builder/FilterBuilder.js.map +1 -0
  17. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.d.ts +11 -0
  18. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.d.ts.map +1 -0
  19. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.js +76 -0
  20. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.js.map +1 -0
  21. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.scss +41 -0
  22. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.d.ts +29 -0
  23. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.d.ts.map +1 -0
  24. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.js +79 -0
  25. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.js.map +1 -0
  26. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.scss +73 -0
  27. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.d.ts +12 -0
  28. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.d.ts.map +1 -0
  29. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.js +47 -0
  30. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.js.map +1 -0
  31. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleProperty.d.ts +11 -0
  32. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleProperty.d.ts.map +1 -0
  33. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleProperty.js +52 -0
  34. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleProperty.js.map +1 -0
  35. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleValue.d.ts +11 -0
  36. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleValue.d.ts.map +1 -0
  37. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleValue.js +43 -0
  38. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleValue.js.map +1 -0
  39. package/lib/cjs/components-react/filter-builder/FilterBuilderState.d.ts +43 -0
  40. package/lib/cjs/components-react/filter-builder/FilterBuilderState.d.ts.map +1 -0
  41. package/lib/cjs/components-react/filter-builder/FilterBuilderState.js +152 -0
  42. package/lib/cjs/components-react/filter-builder/FilterBuilderState.js.map +1 -0
  43. package/lib/cjs/components-react/filter-builder/Operators.d.ts +27 -0
  44. package/lib/cjs/components-react/filter-builder/Operators.d.ts.map +1 -0
  45. package/lib/cjs/components-react/filter-builder/Operators.js +113 -0
  46. package/lib/cjs/components-react/filter-builder/Operators.js.map +1 -0
  47. package/lib/cjs/components-react/filter-builder/Types.d.ts +18 -0
  48. package/lib/cjs/components-react/filter-builder/Types.d.ts.map +1 -0
  49. package/lib/cjs/components-react/filter-builder/Types.js +9 -0
  50. package/lib/cjs/components-react/filter-builder/Types.js.map +1 -0
  51. package/lib/cjs/components-react/tree/controlled/TreeHooks.d.ts.map +1 -1
  52. package/lib/cjs/components-react/tree/controlled/TreeHooks.js +5 -8
  53. package/lib/cjs/components-react/tree/controlled/TreeHooks.js.map +1 -1
  54. package/lib/cjs/components-react/tree/controlled/TreeNodeLoader.d.ts +8 -4
  55. package/lib/cjs/components-react/tree/controlled/TreeNodeLoader.d.ts.map +1 -1
  56. package/lib/cjs/components-react/tree/controlled/TreeNodeLoader.js +54 -45
  57. package/lib/cjs/components-react/tree/controlled/TreeNodeLoader.js.map +1 -1
  58. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.d.ts +2 -0
  59. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.d.ts.map +1 -1
  60. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.js +1 -1
  61. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.js.map +1 -1
  62. package/lib/cjs/components-react.d.ts +9 -0
  63. package/lib/cjs/components-react.d.ts.map +1 -1
  64. package/lib/cjs/components-react.js +9 -0
  65. package/lib/cjs/components-react.js.map +1 -1
  66. package/lib/esm/components-react/common/DateUtils.d.ts +12 -2
  67. package/lib/esm/components-react/common/DateUtils.d.ts.map +1 -1
  68. package/lib/esm/components-react/common/DateUtils.js +12 -2
  69. package/lib/esm/components-react/common/DateUtils.js.map +1 -1
  70. package/lib/esm/components-react/common/SubscriptionScheduler.d.ts +6 -8
  71. package/lib/esm/components-react/common/SubscriptionScheduler.d.ts.map +1 -1
  72. package/lib/esm/components-react/common/SubscriptionScheduler.js +18 -52
  73. package/lib/esm/components-react/common/SubscriptionScheduler.js.map +1 -1
  74. package/lib/esm/components-react/editors/DateTimeEditor.d.ts.map +1 -1
  75. package/lib/esm/components-react/editors/DateTimeEditor.js +2 -0
  76. package/lib/esm/components-react/editors/DateTimeEditor.js.map +1 -1
  77. package/lib/esm/components-react/filter-builder/FilterBuilder.d.ts +36 -0
  78. package/lib/esm/components-react/filter-builder/FilterBuilder.d.ts.map +1 -0
  79. package/lib/esm/components-react/filter-builder/FilterBuilder.js +94 -0
  80. package/lib/esm/components-react/filter-builder/FilterBuilder.js.map +1 -0
  81. package/lib/esm/components-react/filter-builder/FilterBuilderRule.d.ts +11 -0
  82. package/lib/esm/components-react/filter-builder/FilterBuilderRule.d.ts.map +1 -0
  83. package/lib/esm/components-react/filter-builder/FilterBuilderRule.js +53 -0
  84. package/lib/esm/components-react/filter-builder/FilterBuilderRule.js.map +1 -0
  85. package/lib/esm/components-react/filter-builder/FilterBuilderRule.scss +41 -0
  86. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.d.ts +29 -0
  87. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.d.ts.map +1 -0
  88. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.js +55 -0
  89. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.js.map +1 -0
  90. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.scss +73 -0
  91. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.d.ts +12 -0
  92. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.d.ts.map +1 -0
  93. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.js +24 -0
  94. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.js.map +1 -0
  95. package/lib/esm/components-react/filter-builder/FilterBuilderRuleProperty.d.ts +11 -0
  96. package/lib/esm/components-react/filter-builder/FilterBuilderRuleProperty.d.ts.map +1 -0
  97. package/lib/esm/components-react/filter-builder/FilterBuilderRuleProperty.js +29 -0
  98. package/lib/esm/components-react/filter-builder/FilterBuilderRuleProperty.js.map +1 -0
  99. package/lib/esm/components-react/filter-builder/FilterBuilderRuleValue.d.ts +11 -0
  100. package/lib/esm/components-react/filter-builder/FilterBuilderRuleValue.d.ts.map +1 -0
  101. package/lib/esm/components-react/filter-builder/FilterBuilderRuleValue.js +20 -0
  102. package/lib/esm/components-react/filter-builder/FilterBuilderRuleValue.js.map +1 -0
  103. package/lib/esm/components-react/filter-builder/FilterBuilderState.d.ts +43 -0
  104. package/lib/esm/components-react/filter-builder/FilterBuilderState.d.ts.map +1 -0
  105. package/lib/esm/components-react/filter-builder/FilterBuilderState.js +127 -0
  106. package/lib/esm/components-react/filter-builder/FilterBuilderState.js.map +1 -0
  107. package/lib/esm/components-react/filter-builder/Operators.d.ts +27 -0
  108. package/lib/esm/components-react/filter-builder/Operators.d.ts.map +1 -0
  109. package/lib/esm/components-react/filter-builder/Operators.js +107 -0
  110. package/lib/esm/components-react/filter-builder/Operators.js.map +1 -0
  111. package/lib/esm/components-react/filter-builder/Types.d.ts +18 -0
  112. package/lib/esm/components-react/filter-builder/Types.d.ts.map +1 -0
  113. package/lib/esm/components-react/filter-builder/Types.js +5 -0
  114. package/lib/esm/components-react/filter-builder/Types.js.map +1 -0
  115. package/lib/esm/components-react/tree/controlled/TreeHooks.d.ts.map +1 -1
  116. package/lib/esm/components-react/tree/controlled/TreeHooks.js +6 -9
  117. package/lib/esm/components-react/tree/controlled/TreeHooks.js.map +1 -1
  118. package/lib/esm/components-react/tree/controlled/TreeNodeLoader.d.ts +8 -4
  119. package/lib/esm/components-react/tree/controlled/TreeNodeLoader.d.ts.map +1 -1
  120. package/lib/esm/components-react/tree/controlled/TreeNodeLoader.js +53 -44
  121. package/lib/esm/components-react/tree/controlled/TreeNodeLoader.js.map +1 -1
  122. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.d.ts +2 -0
  123. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.d.ts.map +1 -1
  124. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.js +1 -1
  125. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.js.map +1 -1
  126. package/lib/esm/components-react.d.ts +9 -0
  127. package/lib/esm/components-react.d.ts.map +1 -1
  128. package/lib/esm/components-react.js +9 -0
  129. package/lib/esm/components-react.js.map +1 -1
  130. package/lib/public/locales/en/UiComponents.json +16 -0
  131. package/package.json +19 -16
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.buildPropertyFilter = exports.PropertyFilterBuilder = exports.PropertyFilterBuilderRuleRenderingContext = exports.PropertyFilterBuilderContext = void 0;
23
+ /*---------------------------------------------------------------------------------------------
24
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
25
+ * See LICENSE.md in the project root for license terms and full copyright notice.
26
+ *--------------------------------------------------------------------------------------------*/
27
+ const React = __importStar(require("react"));
28
+ const appui_abstract_1 = require("@itwin/appui-abstract");
29
+ const FilterBuilderRuleGroup_1 = require("./FilterBuilderRuleGroup");
30
+ const FilterBuilderState_1 = require("./FilterBuilderState");
31
+ const Operators_1 = require("./Operators");
32
+ /** @alpha */
33
+ exports.PropertyFilterBuilderContext = React.createContext(null);
34
+ /** @alpha */
35
+ exports.PropertyFilterBuilderRuleRenderingContext = React.createContext({});
36
+ const ROOT_GROUP_PATH = [];
37
+ /** @alpha */
38
+ function PropertyFilterBuilder(props) {
39
+ const { properties, onFilterChanged, onRulePropertySelected, ruleOperatorRenderer, ruleValueRenderer, ruleGroupDepthLimit } = props;
40
+ const { state, actions } = (0, FilterBuilderState_1.usePropertyFilterBuilderState)();
41
+ const rootRef = React.useRef(null);
42
+ const filter = React.useMemo(() => buildPropertyFilter(state.rootGroup), [state]);
43
+ React.useEffect(() => {
44
+ onFilterChanged(filter);
45
+ }, [filter, onFilterChanged]);
46
+ const contextValue = React.useMemo(() => ({ actions, properties, onRulePropertySelected, ruleGroupDepthLimit }), [actions, properties, onRulePropertySelected, ruleGroupDepthLimit]);
47
+ const renderingContextValue = React.useMemo(() => ({ ruleOperatorRenderer, ruleValueRenderer }), [ruleOperatorRenderer, ruleValueRenderer]);
48
+ return (React.createElement(exports.PropertyFilterBuilderRuleRenderingContext.Provider, { value: renderingContextValue },
49
+ React.createElement(exports.PropertyFilterBuilderContext.Provider, { value: contextValue },
50
+ React.createElement(FilterBuilderRuleGroup_1.ActiveRuleGroupContext.Provider, { value: useActiveRuleGroupContextProps(rootRef) },
51
+ React.createElement("div", { ref: rootRef, className: "filter-builder" },
52
+ React.createElement(FilterBuilderRuleGroup_1.PropertyFilterBuilderRuleGroupRenderer, { path: ROOT_GROUP_PATH, group: state.rootGroup }))))));
53
+ }
54
+ exports.PropertyFilterBuilder = PropertyFilterBuilder;
55
+ /** @internal */
56
+ function buildPropertyFilter(groupItem) {
57
+ if ((0, FilterBuilderState_1.isPropertyFilterBuilderRuleGroup)(groupItem))
58
+ return buildPropertyFilterFromRuleGroup(groupItem);
59
+ return buildPropertyFilterFromRule(groupItem);
60
+ }
61
+ exports.buildPropertyFilter = buildPropertyFilter;
62
+ function buildPropertyFilterFromRuleGroup(rootGroup) {
63
+ if (rootGroup.items.length === 0)
64
+ return undefined;
65
+ const rules = new Array();
66
+ for (const item of rootGroup.items) {
67
+ const rule = buildPropertyFilter(item);
68
+ if (!rule)
69
+ return undefined;
70
+ rules.push(rule);
71
+ }
72
+ if (rules.length === 1)
73
+ return rules[0];
74
+ return {
75
+ operator: rootGroup.operator,
76
+ rules,
77
+ };
78
+ }
79
+ function buildPropertyFilterFromRule(rule) {
80
+ const { property, operator, value } = rule;
81
+ if (!property || operator === undefined)
82
+ return undefined;
83
+ if (!(0, Operators_1.isUnaryPropertyFilterOperator)(operator) && (value === undefined || value.valueFormat !== appui_abstract_1.PropertyValueFormat.Primitive || value.value === undefined))
84
+ return undefined;
85
+ return { property, operator, value };
86
+ }
87
+ function useActiveRuleGroupContextProps(rootElementRef) {
88
+ const [activeElement, setActiveElement] = React.useState();
89
+ const onFocus = React.useCallback((e) => {
90
+ e.stopPropagation();
91
+ setActiveElement(e.currentTarget);
92
+ }, []);
93
+ const onBlur = React.useCallback((e) => {
94
+ e.stopPropagation();
95
+ if (activeElement !== e.currentTarget || (rootElementRef.current && rootElementRef.current.contains(e.relatedTarget)))
96
+ return;
97
+ setActiveElement(undefined);
98
+ }, [activeElement, rootElementRef]);
99
+ const onMouseOver = React.useCallback((e) => {
100
+ e.stopPropagation();
101
+ setActiveElement(e.currentTarget);
102
+ }, []);
103
+ const onMouseOut = React.useCallback((e) => {
104
+ e.stopPropagation();
105
+ // istanbul ignore if
106
+ if (activeElement !== e.currentTarget)
107
+ return;
108
+ setActiveElement(undefined);
109
+ }, [activeElement]);
110
+ return React.useMemo(() => ({
111
+ activeElement,
112
+ onFocus,
113
+ onBlur,
114
+ onMouseOver,
115
+ onMouseOut,
116
+ }), [activeElement, onFocus, onBlur, onMouseOver, onMouseOut]);
117
+ }
118
+ //# sourceMappingURL=FilterBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilder.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilder.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport * as React from \"react\";\r\nimport { PropertyDescription, PropertyValueFormat } from \"@itwin/appui-abstract\";\r\nimport { ActiveRuleGroupContext, PropertyFilterBuilderRuleGroupRenderer } from \"./FilterBuilderRuleGroup\";\r\nimport { PropertyFilterBuilderRuleOperatorProps } from \"./FilterBuilderRuleOperator\";\r\nimport { PropertyFilterBuilderRuleValueProps } from \"./FilterBuilderRuleValue\";\r\nimport {\r\n isPropertyFilterBuilderRuleGroup, PropertyFilterBuilderActions, PropertyFilterBuilderRule, PropertyFilterBuilderRuleGroup,\r\n PropertyFilterBuilderRuleGroupItem, usePropertyFilterBuilderState,\r\n} from \"./FilterBuilderState\";\r\nimport { isUnaryPropertyFilterOperator } from \"./Operators\";\r\nimport { PropertyFilter } from \"./Types\";\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderProps {\r\n properties: PropertyDescription[];\r\n onFilterChanged: (filter?: PropertyFilter) => void;\r\n onRulePropertySelected?: (property: PropertyDescription) => void;\r\n ruleOperatorRenderer?: (props: PropertyFilterBuilderRuleOperatorProps) => React.ReactNode;\r\n ruleValueRenderer?: (props: PropertyFilterBuilderRuleValueProps) => React.ReactNode;\r\n ruleGroupDepthLimit?: number;\r\n}\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderContextProps {\r\n actions: PropertyFilterBuilderActions;\r\n properties: PropertyDescription[];\r\n onRulePropertySelected?: (property: PropertyDescription) => void;\r\n ruleGroupDepthLimit?: number;\r\n}\r\n\r\n/** @alpha */\r\nexport const PropertyFilterBuilderContext = React.createContext<PropertyFilterBuilderContextProps>(null!);\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderRuleRenderingContextProps {\r\n ruleOperatorRenderer?: (props: PropertyFilterBuilderRuleOperatorProps) => React.ReactNode;\r\n ruleValueRenderer?: (props: PropertyFilterBuilderRuleValueProps) => React.ReactNode;\r\n}\r\n\r\n/** @alpha */\r\nexport const PropertyFilterBuilderRuleRenderingContext = React.createContext<PropertyFilterBuilderRuleRenderingContextProps>({});\r\n\r\nconst ROOT_GROUP_PATH: string[] = [];\r\n\r\n/** @alpha */\r\nexport function PropertyFilterBuilder(props: PropertyFilterBuilderProps) {\r\n const { properties, onFilterChanged, onRulePropertySelected, ruleOperatorRenderer, ruleValueRenderer, ruleGroupDepthLimit } = props;\r\n const { state, actions } = usePropertyFilterBuilderState();\r\n const rootRef = React.useRef<HTMLDivElement>(null);\r\n\r\n const filter = React.useMemo(() => buildPropertyFilter(state.rootGroup), [state]);\r\n React.useEffect(() => {\r\n onFilterChanged(filter);\r\n }, [filter, onFilterChanged]);\r\n\r\n const contextValue = React.useMemo<PropertyFilterBuilderContextProps>(\r\n () => ({actions, properties, onRulePropertySelected, ruleGroupDepthLimit}),\r\n [actions, properties, onRulePropertySelected, ruleGroupDepthLimit]\r\n );\r\n const renderingContextValue = React.useMemo<PropertyFilterBuilderRuleRenderingContextProps>(\r\n () => ({ruleOperatorRenderer, ruleValueRenderer}),\r\n [ruleOperatorRenderer, ruleValueRenderer]\r\n );\r\n return (\r\n <PropertyFilterBuilderRuleRenderingContext.Provider value={renderingContextValue}>\r\n <PropertyFilterBuilderContext.Provider value={contextValue}>\r\n <ActiveRuleGroupContext.Provider value={useActiveRuleGroupContextProps(rootRef)}>\r\n <div ref={rootRef} className=\"filter-builder\">\r\n <PropertyFilterBuilderRuleGroupRenderer path={ROOT_GROUP_PATH} group={state.rootGroup} />\r\n </div>\r\n </ActiveRuleGroupContext.Provider>\r\n </PropertyFilterBuilderContext.Provider>\r\n </PropertyFilterBuilderRuleRenderingContext.Provider>\r\n );\r\n}\r\n\r\n/** @internal */\r\nexport function buildPropertyFilter(groupItem: PropertyFilterBuilderRuleGroupItem): PropertyFilter | undefined {\r\n if (isPropertyFilterBuilderRuleGroup(groupItem))\r\n return buildPropertyFilterFromRuleGroup(groupItem);\r\n return buildPropertyFilterFromRule(groupItem);\r\n}\r\n\r\nfunction buildPropertyFilterFromRuleGroup(rootGroup: PropertyFilterBuilderRuleGroup): PropertyFilter | undefined {\r\n if (rootGroup.items.length === 0)\r\n return undefined;\r\n\r\n const rules = new Array<PropertyFilter>();\r\n for (const item of rootGroup.items) {\r\n const rule = buildPropertyFilter(item);\r\n if (!rule)\r\n return undefined;\r\n rules.push(rule);\r\n }\r\n\r\n if (rules.length === 1)\r\n return rules[0];\r\n\r\n return {\r\n operator: rootGroup.operator,\r\n rules,\r\n };\r\n}\r\n\r\nfunction buildPropertyFilterFromRule(rule: PropertyFilterBuilderRule): PropertyFilter | undefined {\r\n const { property, operator, value } = rule;\r\n if (!property || operator === undefined)\r\n return undefined;\r\n\r\n if (!isUnaryPropertyFilterOperator(operator) && (value === undefined || value.valueFormat !== PropertyValueFormat.Primitive || value.value === undefined))\r\n return undefined;\r\n\r\n return { property, operator, value };\r\n}\r\n\r\nfunction useActiveRuleGroupContextProps(rootElementRef: React.RefObject<HTMLElement>) {\r\n const [activeElement, setActiveElement] = React.useState<HTMLElement | undefined>();\r\n\r\n const onFocus: React.FocusEventHandler<HTMLElement> = React.useCallback((e) => {\r\n e.stopPropagation();\r\n setActiveElement(e.currentTarget);\r\n }, []);\r\n\r\n const onBlur: React.FocusEventHandler<HTMLElement> = React.useCallback((e) => {\r\n e.stopPropagation();\r\n if (activeElement !== e.currentTarget || (rootElementRef.current && rootElementRef.current.contains(e.relatedTarget)))\r\n return;\r\n\r\n setActiveElement(undefined);\r\n }, [activeElement, rootElementRef]);\r\n\r\n const onMouseOver: React.MouseEventHandler<HTMLElement> = React.useCallback((e) => {\r\n e.stopPropagation();\r\n setActiveElement(e.currentTarget);\r\n }, []);\r\n\r\n const onMouseOut: React.MouseEventHandler<HTMLElement> = React.useCallback((e) => {\r\n e.stopPropagation();\r\n // istanbul ignore if\r\n if (activeElement !== e.currentTarget)\r\n return;\r\n\r\n setActiveElement(undefined);\r\n }, [activeElement]);\r\n\r\n return React.useMemo(() => ({\r\n activeElement,\r\n onFocus,\r\n onBlur,\r\n onMouseOver,\r\n onMouseOut,\r\n }), [activeElement, onFocus, onBlur, onMouseOver, onMouseOut]);\r\n}\r\n"]}
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ import { PropertyFilterBuilderRule } from "./FilterBuilderState";
3
+ import "./FilterBuilderRule.scss";
4
+ /** @alpha */
5
+ export interface PropertyFilterBuilderRuleRendererProps {
6
+ path: string[];
7
+ rule: PropertyFilterBuilderRule;
8
+ }
9
+ /** @alpha */
10
+ export declare function PropertyFilterBuilderRuleRenderer(props: PropertyFilterBuilderRuleRendererProps): JSX.Element;
11
+ //# sourceMappingURL=FilterBuilderRule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderRule.d.ts","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRule.tsx"],"names":[],"mappings":";AAYA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,0BAA0B,CAAC;AAElC,aAAa;AACb,MAAM,WAAW,sCAAsC;IACrD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,yBAAyB,CAAC;CACjC;AAED,aAAa;AACb,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,sCAAsC,eAoD9F"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.PropertyFilterBuilderRuleRenderer = void 0;
23
+ /*---------------------------------------------------------------------------------------------
24
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
25
+ * See LICENSE.md in the project root for license terms and full copyright notice.
26
+ *--------------------------------------------------------------------------------------------*/
27
+ const React = __importStar(require("react"));
28
+ const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
29
+ const itwinui_react_1 = require("@itwin/itwinui-react");
30
+ const FilterBuilder_1 = require("./FilterBuilder");
31
+ const FilterBuilderRuleOperator_1 = require("./FilterBuilderRuleOperator");
32
+ const FilterBuilderRuleProperty_1 = require("./FilterBuilderRuleProperty");
33
+ const FilterBuilderRuleValue_1 = require("./FilterBuilderRuleValue");
34
+ const Operators_1 = require("./Operators");
35
+ require("./FilterBuilderRule.scss");
36
+ /** @alpha */
37
+ function PropertyFilterBuilderRuleRenderer(props) {
38
+ const { path, rule } = props;
39
+ const { properties, actions, onRulePropertySelected } = React.useContext(FilterBuilder_1.PropertyFilterBuilderContext);
40
+ const { ruleOperatorRenderer, ruleValueRenderer } = React.useContext(FilterBuilder_1.PropertyFilterBuilderRuleRenderingContext);
41
+ const { property, operator, value } = rule;
42
+ const onSelectedPropertyChanged = React.useCallback((newProperty) => {
43
+ actions.setRuleProperty(path, newProperty);
44
+ // invoke 'onRulePropertySelected' when new property is selected. There is no way to deselect property
45
+ // so 'newProperty' will be 'undefined' only if selected property is no longer in 'properties' list.
46
+ if (onRulePropertySelected && newProperty)
47
+ onRulePropertySelected(newProperty);
48
+ }, [path, onRulePropertySelected, actions]);
49
+ const onRuleOperatorChange = React.useCallback((newOperator) => {
50
+ actions.setRuleOperator(path, newOperator);
51
+ }, [path, actions]);
52
+ const onRuleValueChange = React.useCallback((newValue) => {
53
+ actions.setRuleValue(path, newValue);
54
+ }, [path, actions]);
55
+ const removeRule = () => actions.removeItem(path);
56
+ const operatorRenderer = React.useCallback((prop) => {
57
+ if (ruleOperatorRenderer)
58
+ return ruleOperatorRenderer({ property: prop, operator, onChange: onRuleOperatorChange });
59
+ return React.createElement(FilterBuilderRuleOperator_1.PropertyFilterBuilderRuleOperator, { property: prop, onChange: onRuleOperatorChange, operator: operator });
60
+ }, [operator, ruleOperatorRenderer, onRuleOperatorChange]);
61
+ const valueRenderer = React.useCallback((prop) => {
62
+ if (ruleValueRenderer)
63
+ return ruleValueRenderer({ property: prop, value, onChange: onRuleValueChange });
64
+ return React.createElement(FilterBuilderRuleValue_1.PropertyFilterBuilderRuleValue, { property: prop, onChange: onRuleValueChange, value: value });
65
+ }, [value, ruleValueRenderer, onRuleValueChange]);
66
+ return React.createElement("div", { className: "rule" },
67
+ React.createElement("div", { className: "rule-remove-action" },
68
+ React.createElement(itwinui_react_1.IconButton, { onClick: removeRule, styleType: "borderless", size: "small" },
69
+ React.createElement(itwinui_icons_react_1.SvgDelete, null))),
70
+ React.createElement("div", { className: "rule-condition" },
71
+ React.createElement(FilterBuilderRuleProperty_1.PropertyFilterBuilderRuleProperty, { properties: properties, selectedProperty: rule.property, onSelectedPropertyChanged: onSelectedPropertyChanged }),
72
+ property && operatorRenderer(property),
73
+ property && operator && !(0, Operators_1.isUnaryPropertyFilterOperator)(operator) && valueRenderer(property)));
74
+ }
75
+ exports.PropertyFilterBuilderRuleRenderer = PropertyFilterBuilderRuleRenderer;
76
+ //# sourceMappingURL=FilterBuilderRule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderRule.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRule.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport * as React from \"react\";\r\nimport { PropertyDescription, PropertyValue } from \"@itwin/appui-abstract\";\r\nimport { SvgDelete } from \"@itwin/itwinui-icons-react\";\r\nimport { IconButton } from \"@itwin/itwinui-react\";\r\nimport { PropertyFilterBuilderContext, PropertyFilterBuilderRuleRenderingContext } from \"./FilterBuilder\";\r\nimport { PropertyFilterBuilderRuleOperator } from \"./FilterBuilderRuleOperator\";\r\nimport { PropertyFilterBuilderRuleProperty } from \"./FilterBuilderRuleProperty\";\r\nimport { PropertyFilterBuilderRuleValue } from \"./FilterBuilderRuleValue\";\r\nimport { PropertyFilterBuilderRule } from \"./FilterBuilderState\";\r\nimport { isUnaryPropertyFilterOperator, PropertyFilterRuleOperator } from \"./Operators\";\r\nimport \"./FilterBuilderRule.scss\";\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderRuleRendererProps {\r\n path: string[];\r\n rule: PropertyFilterBuilderRule;\r\n}\r\n\r\n/** @alpha */\r\nexport function PropertyFilterBuilderRuleRenderer(props: PropertyFilterBuilderRuleRendererProps) {\r\n const { path, rule} = props;\r\n const { properties, actions, onRulePropertySelected } = React.useContext(PropertyFilterBuilderContext);\r\n const { ruleOperatorRenderer, ruleValueRenderer } = React.useContext(PropertyFilterBuilderRuleRenderingContext);\r\n const { property, operator, value } = rule;\r\n\r\n const onSelectedPropertyChanged = React.useCallback((newProperty?: PropertyDescription) => {\r\n actions.setRuleProperty(path, newProperty);\r\n // invoke 'onRulePropertySelected' when new property is selected. There is no way to deselect property\r\n // so 'newProperty' will be 'undefined' only if selected property is no longer in 'properties' list.\r\n if (onRulePropertySelected && newProperty)\r\n onRulePropertySelected(newProperty);\r\n }, [path, onRulePropertySelected, actions]);\r\n\r\n const onRuleOperatorChange = React.useCallback((newOperator: PropertyFilterRuleOperator) => {\r\n actions.setRuleOperator(path, newOperator);\r\n }, [path, actions]);\r\n\r\n const onRuleValueChange = React.useCallback((newValue: PropertyValue) => {\r\n actions.setRuleValue(path, newValue);\r\n }, [path, actions]);\r\n\r\n const removeRule = () => actions.removeItem(path);\r\n\r\n const operatorRenderer = React.useCallback((prop: PropertyDescription) => {\r\n if (ruleOperatorRenderer)\r\n return ruleOperatorRenderer({property: prop, operator, onChange: onRuleOperatorChange});\r\n return <PropertyFilterBuilderRuleOperator property={prop} onChange={onRuleOperatorChange} operator={operator} />;\r\n }, [ operator,ruleOperatorRenderer, onRuleOperatorChange]);\r\n\r\n const valueRenderer = React.useCallback((prop: PropertyDescription) => {\r\n if (ruleValueRenderer)\r\n return ruleValueRenderer({property: prop, value, onChange: onRuleValueChange});\r\n return <PropertyFilterBuilderRuleValue property={prop} onChange={onRuleValueChange} value={value} />;\r\n }, [value, ruleValueRenderer, onRuleValueChange]);\r\n\r\n return <div className=\"rule\">\r\n <div className=\"rule-remove-action\">\r\n <IconButton onClick={removeRule} styleType=\"borderless\" size=\"small\">\r\n <SvgDelete />\r\n </IconButton>\r\n </div>\r\n <div className=\"rule-condition\">\r\n <PropertyFilterBuilderRuleProperty\r\n properties={properties}\r\n selectedProperty={rule.property}\r\n onSelectedPropertyChanged={onSelectedPropertyChanged}\r\n />\r\n {property && operatorRenderer(property)}\r\n {property && operator && !isUnaryPropertyFilterOperator(operator) && valueRenderer(property)}\r\n </div>\r\n </div>;\r\n}\r\n"]}
@@ -0,0 +1,41 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ @import "~@itwin/itwinui-css/scss/style/index";
6
+
7
+ .rule {
8
+ display: grid;
9
+ grid-template-columns: min-content auto;
10
+ padding: 3px 0;
11
+
12
+ .rule-condition {
13
+ display: grid;
14
+ grid-template-columns: minmax(auto, 500px) 150px minmax(auto, 300px);
15
+ grid-column-gap: $iui-m;
16
+
17
+ .rule-property .iui-input {
18
+ padding-top: 1.5px;
19
+ padding-bottom: 1.5px;
20
+ min-height: 27px;
21
+ }
22
+ }
23
+
24
+ .rule-remove-action {
25
+ padding-right: $iui-sm;
26
+ visibility: hidden;
27
+ }
28
+
29
+ &:focus-within .rule-remove-action,
30
+ &:hover .rule-remove-action {
31
+ visibility: visible;
32
+ }
33
+ }
34
+
35
+ .rule-group-items > .rule {
36
+ padding-bottom: 14px;
37
+
38
+ &:first-child {
39
+ padding-top: 14px;
40
+ }
41
+ }
@@ -0,0 +1,29 @@
1
+ import * as React from "react";
2
+ import { PropertyFilterBuilderRuleGroup } from "./FilterBuilderState";
3
+ import { PropertyFilterRuleGroupOperator } from "./Operators";
4
+ import "./FilterBuilderRuleGroup.scss";
5
+ /** @alpha */
6
+ export interface ActiveRuleGroupContextProps {
7
+ activeElement: HTMLElement | undefined;
8
+ onFocus: React.FocusEventHandler<HTMLElement>;
9
+ onBlur: React.FocusEventHandler<HTMLElement>;
10
+ onMouseOver: React.MouseEventHandler<HTMLElement>;
11
+ onMouseOut: React.MouseEventHandler<HTMLElement>;
12
+ }
13
+ /** @alpha */
14
+ export declare const ActiveRuleGroupContext: React.Context<ActiveRuleGroupContextProps>;
15
+ /** @alpha */
16
+ export interface PropertyFilterBuilderRuleGroupRendererProps {
17
+ path: string[];
18
+ group: PropertyFilterBuilderRuleGroup;
19
+ }
20
+ /** @alpha */
21
+ export declare function PropertyFilterBuilderRuleGroupRenderer(props: PropertyFilterBuilderRuleGroupRendererProps): JSX.Element;
22
+ /** @alpha */
23
+ export interface PropertyFilterBuilderRuleGroupOperatorProps {
24
+ operator: PropertyFilterRuleGroupOperator;
25
+ onChange: (operator: PropertyFilterRuleGroupOperator) => void;
26
+ }
27
+ /** @alpha */
28
+ export declare function PropertyFilterBuilderRuleGroupOperator(props: PropertyFilterBuilderRuleGroupOperatorProps): JSX.Element;
29
+ //# sourceMappingURL=FilterBuilderRuleGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderRuleGroup.d.ts","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleGroup.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAAoC,8BAA8B,EAAsC,MAAM,sBAAsB,CAAC;AAC5I,OAAO,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,+BAA+B,CAAC;AAEvC,aAAa;AACb,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC;IACvC,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC7C,WAAW,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAClD,UAAU,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;CAClD;AAED,aAAa;AACb,eAAO,MAAM,sBAAsB,4CAA0D,CAAC;AAE9F,aAAa;AACb,MAAM,WAAW,2CAA2C;IAC1D,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,8BAA8B,CAAC;CACvC;AAED,aAAa;AACb,wBAAgB,sCAAsC,CAAC,KAAK,EAAE,2CAA2C,eAwCxG;AAED,aAAa;AACb,MAAM,WAAW,2CAA2C;IAC1D,QAAQ,EAAE,+BAA+B,CAAC;IAC1C,QAAQ,EAAE,CAAC,QAAQ,EAAE,+BAA+B,KAAK,IAAI,CAAC;CAC/D;AAED,aAAa;AACb,wBAAgB,sCAAsC,CAAC,KAAK,EAAE,2CAA2C,eAWxG"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.PropertyFilterBuilderRuleGroupOperator = exports.PropertyFilterBuilderRuleGroupRenderer = exports.ActiveRuleGroupContext = void 0;
23
+ /*---------------------------------------------------------------------------------------------
24
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
25
+ * See LICENSE.md in the project root for license terms and full copyright notice.
26
+ *--------------------------------------------------------------------------------------------*/
27
+ const React = __importStar(require("react"));
28
+ const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
29
+ const itwinui_react_1 = require("@itwin/itwinui-react");
30
+ const UiComponents_1 = require("../UiComponents");
31
+ const FilterBuilder_1 = require("./FilterBuilder");
32
+ const FilterBuilderRule_1 = require("./FilterBuilderRule");
33
+ const FilterBuilderState_1 = require("./FilterBuilderState");
34
+ const Operators_1 = require("./Operators");
35
+ require("./FilterBuilderRuleGroup.scss");
36
+ /** @alpha */
37
+ exports.ActiveRuleGroupContext = React.createContext(null);
38
+ /** @alpha */
39
+ function PropertyFilterBuilderRuleGroupRenderer(props) {
40
+ const { path, group } = props;
41
+ const { actions, ruleGroupDepthLimit } = React.useContext(FilterBuilder_1.PropertyFilterBuilderContext);
42
+ const groupRef = React.useRef(null);
43
+ const addRule = () => actions.addItem(path, "RULE");
44
+ const addRuleGroup = () => actions.addItem(path, "RULE_GROUP");
45
+ const removeGroup = () => actions.removeItem(path);
46
+ const onOperatorChange = React.useCallback((operator) => {
47
+ actions.setRuleGroupOperator(path, operator);
48
+ }, [path, actions]);
49
+ const allowToAddGroup = ruleGroupDepthLimit === undefined || path.length < ruleGroupDepthLimit;
50
+ const { activeElement, ...eventHandlers } = React.useContext(exports.ActiveRuleGroupContext);
51
+ return React.createElement("div", { ref: groupRef, className: "rule-group", "data-isactive": groupRef.current === activeElement, ...eventHandlers },
52
+ React.createElement("div", { className: "rule-group-remove-action" }, group.groupId !== undefined && React.createElement(itwinui_react_1.IconButton, { "data-testid": "rule-group-remove", onClick: removeGroup, styleType: "borderless", size: "small" },
53
+ React.createElement(itwinui_icons_react_1.SvgDelete, null))),
54
+ React.createElement("div", { className: "rule-group-content" },
55
+ React.createElement(PropertyFilterBuilderRuleGroupOperator, { operator: group.operator, onChange: onOperatorChange }),
56
+ React.createElement("div", { className: "rule-group-items" }, group.items.map((item) => React.createElement(PropertyFilterBuilderGroupOrRule, { key: item.id, path: path, item: item }))),
57
+ React.createElement("div", { className: "rule-group-actions" },
58
+ React.createElement(itwinui_react_1.Button, { key: "add-rule-button", "data-testid": "rule-group-add-rule", onClick: addRule, styleType: "borderless", size: "small", startIcon: React.createElement(itwinui_icons_react_1.SvgAdd, null) }, UiComponents_1.UiComponents.translate("filterBuilder.rule")),
59
+ allowToAddGroup && React.createElement(itwinui_react_1.Button, { key: "add-rule-group-button", "data-testid": "rule-group-add-rule-group", onClick: addRuleGroup, styleType: "borderless", size: "small", startIcon: React.createElement(itwinui_icons_react_1.SvgAdd, null) }, UiComponents_1.UiComponents.translate("filterBuilder.ruleGroup")))));
60
+ }
61
+ exports.PropertyFilterBuilderRuleGroupRenderer = PropertyFilterBuilderRuleGroupRenderer;
62
+ /** @alpha */
63
+ function PropertyFilterBuilderRuleGroupOperator(props) {
64
+ const { operator, onChange } = props;
65
+ const options = React.useMemo(() => ([
66
+ { value: Operators_1.PropertyFilterRuleGroupOperator.And, label: UiComponents_1.UiComponents.translate("filterBuilder.operators.and") },
67
+ { value: Operators_1.PropertyFilterRuleGroupOperator.Or, label: UiComponents_1.UiComponents.translate("filterBuilder.operators.or") },
68
+ ]), []);
69
+ return React.createElement("div", { className: "rule-group-operator" },
70
+ React.createElement(itwinui_react_1.Select, { options: options, value: operator, onChange: onChange, size: "small" }));
71
+ }
72
+ exports.PropertyFilterBuilderRuleGroupOperator = PropertyFilterBuilderRuleGroupOperator;
73
+ const PropertyFilterBuilderGroupOrRule = React.memo(function PropertyFilterBuilderGroupOrRule({ path, item }) {
74
+ const itemPath = [...path, item.id];
75
+ if ((0, FilterBuilderState_1.isPropertyFilterBuilderRuleGroup)(item))
76
+ return React.createElement(PropertyFilterBuilderRuleGroupRenderer, { path: itemPath, group: item });
77
+ return React.createElement(FilterBuilderRule_1.PropertyFilterBuilderRuleRenderer, { path: itemPath, rule: item });
78
+ });
79
+ //# sourceMappingURL=FilterBuilderRuleGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderRuleGroup.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleGroup.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport * as React from \"react\";\r\nimport { SvgAdd, SvgDelete } from \"@itwin/itwinui-icons-react\";\r\nimport { Button, IconButton, Select, SelectOption } from \"@itwin/itwinui-react\";\r\nimport { UiComponents } from \"../UiComponents\";\r\nimport { PropertyFilterBuilderContext } from \"./FilterBuilder\";\r\nimport { PropertyFilterBuilderRuleRenderer } from \"./FilterBuilderRule\";\r\nimport { isPropertyFilterBuilderRuleGroup, PropertyFilterBuilderRuleGroup, PropertyFilterBuilderRuleGroupItem } from \"./FilterBuilderState\";\r\nimport { PropertyFilterRuleGroupOperator } from \"./Operators\";\r\nimport \"./FilterBuilderRuleGroup.scss\";\r\n\r\n/** @alpha */\r\nexport interface ActiveRuleGroupContextProps {\r\n activeElement: HTMLElement | undefined;\r\n onFocus: React.FocusEventHandler<HTMLElement>;\r\n onBlur: React.FocusEventHandler<HTMLElement>;\r\n onMouseOver: React.MouseEventHandler<HTMLElement>;\r\n onMouseOut: React.MouseEventHandler<HTMLElement>;\r\n}\r\n\r\n/** @alpha */\r\nexport const ActiveRuleGroupContext = React.createContext<ActiveRuleGroupContextProps>(null!);\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderRuleGroupRendererProps {\r\n path: string[];\r\n group: PropertyFilterBuilderRuleGroup;\r\n}\r\n\r\n/** @alpha */\r\nexport function PropertyFilterBuilderRuleGroupRenderer(props: PropertyFilterBuilderRuleGroupRendererProps) {\r\n const { path, group } = props;\r\n const { actions, ruleGroupDepthLimit } = React.useContext(PropertyFilterBuilderContext);\r\n const groupRef = React.useRef<HTMLDivElement>(null);\r\n\r\n const addRule = () => actions.addItem(path, \"RULE\");\r\n const addRuleGroup = () => actions.addItem(path, \"RULE_GROUP\");\r\n const removeGroup = () => actions.removeItem(path);\r\n\r\n const onOperatorChange = React.useCallback((operator) => {\r\n actions.setRuleGroupOperator(path, operator);\r\n }, [path, actions]);\r\n\r\n const allowToAddGroup = ruleGroupDepthLimit === undefined || path.length < ruleGroupDepthLimit;\r\n const { activeElement, ...eventHandlers } = React.useContext(ActiveRuleGroupContext);\r\n\r\n return <div\r\n ref={groupRef}\r\n className=\"rule-group\"\r\n data-isactive={groupRef.current === activeElement}\r\n {...eventHandlers}\r\n >\r\n <div className=\"rule-group-remove-action\">\r\n {group.groupId !== undefined && <IconButton data-testid=\"rule-group-remove\" onClick={removeGroup} styleType=\"borderless\" size=\"small\"><SvgDelete /></IconButton>}\r\n </div>\r\n <div className=\"rule-group-content\">\r\n <PropertyFilterBuilderRuleGroupOperator operator={group.operator} onChange={onOperatorChange}/>\r\n <div className=\"rule-group-items\">\r\n {group.items.map((item) => <PropertyFilterBuilderGroupOrRule key={item.id} path={path} item={item} />)}\r\n </div>\r\n <div className=\"rule-group-actions\">\r\n <Button key=\"add-rule-button\" data-testid=\"rule-group-add-rule\" onClick={addRule} styleType=\"borderless\" size=\"small\" startIcon={<SvgAdd />}>\r\n {UiComponents.translate(\"filterBuilder.rule\")}\r\n </Button>\r\n {allowToAddGroup && <Button key=\"add-rule-group-button\" data-testid=\"rule-group-add-rule-group\" onClick={addRuleGroup} styleType=\"borderless\" size=\"small\" startIcon={<SvgAdd />}>\r\n {UiComponents.translate(\"filterBuilder.ruleGroup\")}\r\n </Button>}\r\n </div>\r\n </div>\r\n </div>;\r\n}\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderRuleGroupOperatorProps {\r\n operator: PropertyFilterRuleGroupOperator;\r\n onChange: (operator: PropertyFilterRuleGroupOperator) => void;\r\n}\r\n\r\n/** @alpha */\r\nexport function PropertyFilterBuilderRuleGroupOperator(props: PropertyFilterBuilderRuleGroupOperatorProps) {\r\n const { operator, onChange } = props;\r\n\r\n const options = React.useMemo<Array<SelectOption<PropertyFilterRuleGroupOperator>>>(() => ([\r\n { value: PropertyFilterRuleGroupOperator.And, label: UiComponents.translate(\"filterBuilder.operators.and\") },\r\n { value: PropertyFilterRuleGroupOperator.Or, label: UiComponents.translate(\"filterBuilder.operators.or\") },\r\n ]), []);\r\n\r\n return <div className=\"rule-group-operator\">\r\n <Select options={options} value={operator} onChange={onChange} size=\"small\" />\r\n </div>;\r\n}\r\ninterface PropertyFilterBuilderGroupOrRuleProps {\r\n path: string[];\r\n item: PropertyFilterBuilderRuleGroupItem;\r\n}\r\n\r\nconst PropertyFilterBuilderGroupOrRule = React.memo(\r\n function PropertyFilterBuilderGroupOrRule({path, item}: PropertyFilterBuilderGroupOrRuleProps) {\r\n const itemPath = [...path, item.id];\r\n\r\n if (isPropertyFilterBuilderRuleGroup(item))\r\n return <PropertyFilterBuilderRuleGroupRenderer path={itemPath} group={item} />;\r\n return <PropertyFilterBuilderRuleRenderer path={itemPath} rule={item} />;\r\n }\r\n);\r\n"]}
@@ -0,0 +1,73 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ @import "~@itwin/itwinui-css/scss/style/index";
6
+ @import "~@itwin/itwinui-css/scss/button/disabled";
7
+
8
+ .filter-builder > .rule-group {
9
+ & > .rule-group-content {
10
+ border-left: 0;
11
+ padding-left: 0;
12
+ }
13
+
14
+ & > .rule-group-remove-action {
15
+ padding-right: 0;
16
+ }
17
+ }
18
+
19
+ .rule-group {
20
+ display: grid;
21
+ grid-template-columns: min-content auto;
22
+ padding: 11px 0;
23
+
24
+ &[data-isactive=true] > .rule-group-remove-action {
25
+ visibility: visible;
26
+ }
27
+
28
+ &[data-isactive=true] > .rule-group-content {
29
+ @include themed {
30
+ border-color: t(iui-color-background-1--light);
31
+ }
32
+ }
33
+
34
+ &[data-isactive=false] > .rule-group-content > .rule-group-actions .iui-button {
35
+ @include themed {
36
+ color: t(iui-icons-color);
37
+ }
38
+ }
39
+
40
+ .rule-group-remove-action {
41
+ padding: 3px $iui-sm 3px 0;
42
+ visibility: hidden;
43
+ }
44
+
45
+ .rule-group-content {
46
+ padding-left: $iui-sm;
47
+ border-left: 1px solid;
48
+ box-sizing: border-box;
49
+ @include themed {
50
+ border-color: t(iui-color-background-border);
51
+ }
52
+
53
+ .rule-group-operator {
54
+ padding: 3px 0;
55
+ width: max-content;
56
+ }
57
+
58
+ .rule-group-actions {
59
+ padding: 3px 0;
60
+ display: grid;
61
+ grid-template-columns: min-content min-content;
62
+ gap: 8px;
63
+ }
64
+ }
65
+ }
66
+
67
+ .rule-group-items > .rule-group {
68
+ padding-bottom: 22px;
69
+
70
+ &:last-child {
71
+ padding-bottom: 11px;
72
+ }
73
+ }
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import { PropertyDescription } from "@itwin/appui-abstract";
3
+ import { PropertyFilterRuleOperator } from "./Operators";
4
+ /** @alpha */
5
+ export interface PropertyFilterBuilderRuleOperatorProps {
6
+ operator?: PropertyFilterRuleOperator;
7
+ property: PropertyDescription;
8
+ onChange: (operator: PropertyFilterRuleOperator) => void;
9
+ }
10
+ /** @alpha */
11
+ export declare function PropertyFilterBuilderRuleOperator(props: PropertyFilterBuilderRuleOperatorProps): JSX.Element;
12
+ //# sourceMappingURL=FilterBuilderRuleOperator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderRuleOperator.d.ts","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleOperator.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAA8D,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAErH,aAAa;AACb,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,EAAE,0BAA0B,CAAC;IACtC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,IAAI,CAAC;CAC1D;AAED,aAAa;AACb,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,sCAAsC,eAkB9F"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.PropertyFilterBuilderRuleOperator = void 0;
23
+ /*---------------------------------------------------------------------------------------------
24
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
25
+ * See LICENSE.md in the project root for license terms and full copyright notice.
26
+ *--------------------------------------------------------------------------------------------*/
27
+ const React = __importStar(require("react"));
28
+ const itwinui_react_1 = require("@itwin/itwinui-react");
29
+ const Operators_1 = require("./Operators");
30
+ /** @alpha */
31
+ function PropertyFilterBuilderRuleOperator(props) {
32
+ var _a;
33
+ const { operator, property, onChange } = props;
34
+ const availableOperators = React.useMemo(() => (0, Operators_1.getPropertyFilterOperators)(property), [property]);
35
+ const selectedOperator = (_a = availableOperators.find((op) => op === operator)) !== null && _a !== void 0 ? _a : availableOperators[0];
36
+ React.useEffect(() => {
37
+ onChange(selectedOperator);
38
+ }, [onChange, selectedOperator]);
39
+ const availableOptions = React.useMemo(() => availableOperators.map((op) => ({
40
+ value: op,
41
+ label: (0, Operators_1.getPropertyFilterOperatorLabel)(op),
42
+ })), [availableOperators]);
43
+ return React.createElement("div", { className: "rule-operator" },
44
+ React.createElement(itwinui_react_1.Select, { options: availableOptions, value: selectedOperator, onChange: onChange, size: "small" }));
45
+ }
46
+ exports.PropertyFilterBuilderRuleOperator = PropertyFilterBuilderRuleOperator;
47
+ //# sourceMappingURL=FilterBuilderRuleOperator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderRuleOperator.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleOperator.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,6CAA+B;AAE/B,wDAA8C;AAC9C,2CAAqH;AASrH,aAAa;AACb,SAAgB,iCAAiC,CAAC,KAA6C;;IAC7F,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAE/C,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAA,sCAA0B,EAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjG,MAAM,gBAAgB,GAAG,MAAA,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,mCAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAEnG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC7B,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEjC,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3E,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,IAAA,0CAA8B,EAAC,EAAE,CAAC;KAC1C,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAE3B,OAAO,6BAAK,SAAS,EAAC,eAAe;QACnC,oBAAC,sBAAM,IAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAC,OAAO,GAAE,CAC1F,CAAC;AACT,CAAC;AAlBD,8EAkBC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport * as React from \"react\";\r\nimport { PropertyDescription } from \"@itwin/appui-abstract\";\r\nimport { Select } from \"@itwin/itwinui-react\";\r\nimport { getPropertyFilterOperatorLabel, getPropertyFilterOperators, PropertyFilterRuleOperator } from \"./Operators\";\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderRuleOperatorProps {\r\n operator?: PropertyFilterRuleOperator;\r\n property: PropertyDescription;\r\n onChange: (operator: PropertyFilterRuleOperator) => void;\r\n}\r\n\r\n/** @alpha */\r\nexport function PropertyFilterBuilderRuleOperator(props: PropertyFilterBuilderRuleOperatorProps) {\r\n const { operator, property, onChange } = props;\r\n\r\n const availableOperators = React.useMemo(() => getPropertyFilterOperators(property), [property]);\r\n const selectedOperator = availableOperators.find((op) => op === operator) ?? availableOperators[0];\r\n\r\n React.useEffect(() => {\r\n onChange(selectedOperator);\r\n }, [onChange, selectedOperator]);\r\n\r\n const availableOptions = React.useMemo(() => availableOperators.map((op) => ({\r\n value: op,\r\n label: getPropertyFilterOperatorLabel(op),\r\n })), [availableOperators]);\r\n\r\n return <div className=\"rule-operator\">\r\n <Select options={availableOptions} value={selectedOperator} onChange={onChange} size=\"small\"/>\r\n </div>;\r\n}\r\n"]}
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ import { PropertyDescription } from "@itwin/appui-abstract";
3
+ /** @alpha */
4
+ export interface PropertyFilterBuilderRulePropertyProps {
5
+ properties: PropertyDescription[];
6
+ selectedProperty?: PropertyDescription;
7
+ onSelectedPropertyChanged: (property?: PropertyDescription) => void;
8
+ }
9
+ /** @alpha */
10
+ export declare function PropertyFilterBuilderRuleProperty(props: PropertyFilterBuilderRulePropertyProps): JSX.Element;
11
+ //# sourceMappingURL=FilterBuilderRuleProperty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderRuleProperty.d.ts","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleProperty.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAI5D,aAAa;AACb,MAAM,WAAW,sCAAsC;IACrD,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC,yBAAyB,EAAE,CAAC,QAAQ,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACrE;AAED,aAAa;AACb,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,sCAAsC,eA6B9F"}