@itwin/components-react 3.3.0-dev.7 → 3.3.0-dev.72

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 (135) hide show
  1. package/CHANGELOG.md +36 -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/CustomNumberEditor.js +3 -3
  11. package/lib/cjs/components-react/editors/CustomNumberEditor.js.map +1 -1
  12. package/lib/cjs/components-react/editors/DateTimeEditor.d.ts.map +1 -1
  13. package/lib/cjs/components-react/editors/DateTimeEditor.js +2 -0
  14. package/lib/cjs/components-react/editors/DateTimeEditor.js.map +1 -1
  15. package/lib/cjs/components-react/filter-builder/FilterBuilder.d.ts +36 -0
  16. package/lib/cjs/components-react/filter-builder/FilterBuilder.d.ts.map +1 -0
  17. package/lib/cjs/components-react/filter-builder/FilterBuilder.js +118 -0
  18. package/lib/cjs/components-react/filter-builder/FilterBuilder.js.map +1 -0
  19. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.d.ts +11 -0
  20. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.d.ts.map +1 -0
  21. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.js +76 -0
  22. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.js.map +1 -0
  23. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.scss +41 -0
  24. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.d.ts +29 -0
  25. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.d.ts.map +1 -0
  26. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.js +79 -0
  27. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.js.map +1 -0
  28. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.scss +73 -0
  29. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.d.ts +12 -0
  30. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.d.ts.map +1 -0
  31. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.js +47 -0
  32. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.js.map +1 -0
  33. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleProperty.d.ts +11 -0
  34. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleProperty.d.ts.map +1 -0
  35. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleProperty.js +52 -0
  36. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleProperty.js.map +1 -0
  37. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleValue.d.ts +11 -0
  38. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleValue.d.ts.map +1 -0
  39. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleValue.js +43 -0
  40. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleValue.js.map +1 -0
  41. package/lib/cjs/components-react/filter-builder/FilterBuilderState.d.ts +43 -0
  42. package/lib/cjs/components-react/filter-builder/FilterBuilderState.d.ts.map +1 -0
  43. package/lib/cjs/components-react/filter-builder/FilterBuilderState.js +152 -0
  44. package/lib/cjs/components-react/filter-builder/FilterBuilderState.js.map +1 -0
  45. package/lib/cjs/components-react/filter-builder/Operators.d.ts +27 -0
  46. package/lib/cjs/components-react/filter-builder/Operators.d.ts.map +1 -0
  47. package/lib/cjs/components-react/filter-builder/Operators.js +113 -0
  48. package/lib/cjs/components-react/filter-builder/Operators.js.map +1 -0
  49. package/lib/cjs/components-react/filter-builder/Types.d.ts +18 -0
  50. package/lib/cjs/components-react/filter-builder/Types.d.ts.map +1 -0
  51. package/lib/cjs/components-react/filter-builder/Types.js +9 -0
  52. package/lib/cjs/components-react/filter-builder/Types.js.map +1 -0
  53. package/lib/cjs/components-react/tree/controlled/TreeHooks.d.ts.map +1 -1
  54. package/lib/cjs/components-react/tree/controlled/TreeHooks.js +5 -8
  55. package/lib/cjs/components-react/tree/controlled/TreeHooks.js.map +1 -1
  56. package/lib/cjs/components-react/tree/controlled/TreeNodeLoader.d.ts +8 -4
  57. package/lib/cjs/components-react/tree/controlled/TreeNodeLoader.d.ts.map +1 -1
  58. package/lib/cjs/components-react/tree/controlled/TreeNodeLoader.js +54 -45
  59. package/lib/cjs/components-react/tree/controlled/TreeNodeLoader.js.map +1 -1
  60. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.d.ts +2 -0
  61. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.d.ts.map +1 -1
  62. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.js +1 -1
  63. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.js.map +1 -1
  64. package/lib/cjs/components-react.d.ts +9 -0
  65. package/lib/cjs/components-react.d.ts.map +1 -1
  66. package/lib/cjs/components-react.js +9 -0
  67. package/lib/cjs/components-react.js.map +1 -1
  68. package/lib/esm/components-react/common/DateUtils.d.ts +12 -2
  69. package/lib/esm/components-react/common/DateUtils.d.ts.map +1 -1
  70. package/lib/esm/components-react/common/DateUtils.js +12 -2
  71. package/lib/esm/components-react/common/DateUtils.js.map +1 -1
  72. package/lib/esm/components-react/common/SubscriptionScheduler.d.ts +6 -8
  73. package/lib/esm/components-react/common/SubscriptionScheduler.d.ts.map +1 -1
  74. package/lib/esm/components-react/common/SubscriptionScheduler.js +18 -52
  75. package/lib/esm/components-react/common/SubscriptionScheduler.js.map +1 -1
  76. package/lib/esm/components-react/editors/CustomNumberEditor.js +3 -3
  77. package/lib/esm/components-react/editors/CustomNumberEditor.js.map +1 -1
  78. package/lib/esm/components-react/editors/DateTimeEditor.d.ts.map +1 -1
  79. package/lib/esm/components-react/editors/DateTimeEditor.js +2 -0
  80. package/lib/esm/components-react/editors/DateTimeEditor.js.map +1 -1
  81. package/lib/esm/components-react/filter-builder/FilterBuilder.d.ts +36 -0
  82. package/lib/esm/components-react/filter-builder/FilterBuilder.d.ts.map +1 -0
  83. package/lib/esm/components-react/filter-builder/FilterBuilder.js +94 -0
  84. package/lib/esm/components-react/filter-builder/FilterBuilder.js.map +1 -0
  85. package/lib/esm/components-react/filter-builder/FilterBuilderRule.d.ts +11 -0
  86. package/lib/esm/components-react/filter-builder/FilterBuilderRule.d.ts.map +1 -0
  87. package/lib/esm/components-react/filter-builder/FilterBuilderRule.js +53 -0
  88. package/lib/esm/components-react/filter-builder/FilterBuilderRule.js.map +1 -0
  89. package/lib/esm/components-react/filter-builder/FilterBuilderRule.scss +41 -0
  90. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.d.ts +29 -0
  91. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.d.ts.map +1 -0
  92. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.js +55 -0
  93. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.js.map +1 -0
  94. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.scss +73 -0
  95. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.d.ts +12 -0
  96. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.d.ts.map +1 -0
  97. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.js +24 -0
  98. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.js.map +1 -0
  99. package/lib/esm/components-react/filter-builder/FilterBuilderRuleProperty.d.ts +11 -0
  100. package/lib/esm/components-react/filter-builder/FilterBuilderRuleProperty.d.ts.map +1 -0
  101. package/lib/esm/components-react/filter-builder/FilterBuilderRuleProperty.js +29 -0
  102. package/lib/esm/components-react/filter-builder/FilterBuilderRuleProperty.js.map +1 -0
  103. package/lib/esm/components-react/filter-builder/FilterBuilderRuleValue.d.ts +11 -0
  104. package/lib/esm/components-react/filter-builder/FilterBuilderRuleValue.d.ts.map +1 -0
  105. package/lib/esm/components-react/filter-builder/FilterBuilderRuleValue.js +20 -0
  106. package/lib/esm/components-react/filter-builder/FilterBuilderRuleValue.js.map +1 -0
  107. package/lib/esm/components-react/filter-builder/FilterBuilderState.d.ts +43 -0
  108. package/lib/esm/components-react/filter-builder/FilterBuilderState.d.ts.map +1 -0
  109. package/lib/esm/components-react/filter-builder/FilterBuilderState.js +127 -0
  110. package/lib/esm/components-react/filter-builder/FilterBuilderState.js.map +1 -0
  111. package/lib/esm/components-react/filter-builder/Operators.d.ts +27 -0
  112. package/lib/esm/components-react/filter-builder/Operators.d.ts.map +1 -0
  113. package/lib/esm/components-react/filter-builder/Operators.js +107 -0
  114. package/lib/esm/components-react/filter-builder/Operators.js.map +1 -0
  115. package/lib/esm/components-react/filter-builder/Types.d.ts +18 -0
  116. package/lib/esm/components-react/filter-builder/Types.d.ts.map +1 -0
  117. package/lib/esm/components-react/filter-builder/Types.js +5 -0
  118. package/lib/esm/components-react/filter-builder/Types.js.map +1 -0
  119. package/lib/esm/components-react/tree/controlled/TreeHooks.d.ts.map +1 -1
  120. package/lib/esm/components-react/tree/controlled/TreeHooks.js +6 -9
  121. package/lib/esm/components-react/tree/controlled/TreeHooks.js.map +1 -1
  122. package/lib/esm/components-react/tree/controlled/TreeNodeLoader.d.ts +8 -4
  123. package/lib/esm/components-react/tree/controlled/TreeNodeLoader.d.ts.map +1 -1
  124. package/lib/esm/components-react/tree/controlled/TreeNodeLoader.js +53 -44
  125. package/lib/esm/components-react/tree/controlled/TreeNodeLoader.js.map +1 -1
  126. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.d.ts +2 -0
  127. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.d.ts.map +1 -1
  128. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.js +1 -1
  129. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.js.map +1 -1
  130. package/lib/esm/components-react.d.ts +9 -0
  131. package/lib/esm/components-react.d.ts.map +1 -1
  132. package/lib/esm/components-react.js +9 -0
  133. package/lib/esm/components-react.js.map +1 -1
  134. package/lib/public/locales/en/UiComponents.json +16 -0
  135. package/package.json +19 -16
@@ -0,0 +1,55 @@
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 * as React from "react";
6
+ import { SvgAdd, SvgDelete } from "@itwin/itwinui-icons-react";
7
+ import { Button, IconButton, Select } from "@itwin/itwinui-react";
8
+ import { UiComponents } from "../UiComponents";
9
+ import { PropertyFilterBuilderContext } from "./FilterBuilder";
10
+ import { PropertyFilterBuilderRuleRenderer } from "./FilterBuilderRule";
11
+ import { isPropertyFilterBuilderRuleGroup } from "./FilterBuilderState";
12
+ import { PropertyFilterRuleGroupOperator } from "./Operators";
13
+ import "./FilterBuilderRuleGroup.scss";
14
+ /** @alpha */
15
+ export const ActiveRuleGroupContext = React.createContext(null);
16
+ /** @alpha */
17
+ export function PropertyFilterBuilderRuleGroupRenderer(props) {
18
+ const { path, group } = props;
19
+ const { actions, ruleGroupDepthLimit } = React.useContext(PropertyFilterBuilderContext);
20
+ const groupRef = React.useRef(null);
21
+ const addRule = () => actions.addItem(path, "RULE");
22
+ const addRuleGroup = () => actions.addItem(path, "RULE_GROUP");
23
+ const removeGroup = () => actions.removeItem(path);
24
+ const onOperatorChange = React.useCallback((operator) => {
25
+ actions.setRuleGroupOperator(path, operator);
26
+ }, [path, actions]);
27
+ const allowToAddGroup = ruleGroupDepthLimit === undefined || path.length < ruleGroupDepthLimit;
28
+ const { activeElement, ...eventHandlers } = React.useContext(ActiveRuleGroupContext);
29
+ return React.createElement("div", { ref: groupRef, className: "rule-group", "data-isactive": groupRef.current === activeElement, ...eventHandlers },
30
+ React.createElement("div", { className: "rule-group-remove-action" }, group.groupId !== undefined && React.createElement(IconButton, { "data-testid": "rule-group-remove", onClick: removeGroup, styleType: "borderless", size: "small" },
31
+ React.createElement(SvgDelete, null))),
32
+ React.createElement("div", { className: "rule-group-content" },
33
+ React.createElement(PropertyFilterBuilderRuleGroupOperator, { operator: group.operator, onChange: onOperatorChange }),
34
+ React.createElement("div", { className: "rule-group-items" }, group.items.map((item) => React.createElement(PropertyFilterBuilderGroupOrRule, { key: item.id, path: path, item: item }))),
35
+ React.createElement("div", { className: "rule-group-actions" },
36
+ React.createElement(Button, { key: "add-rule-button", "data-testid": "rule-group-add-rule", onClick: addRule, styleType: "borderless", size: "small", startIcon: React.createElement(SvgAdd, null) }, UiComponents.translate("filterBuilder.rule")),
37
+ allowToAddGroup && React.createElement(Button, { key: "add-rule-group-button", "data-testid": "rule-group-add-rule-group", onClick: addRuleGroup, styleType: "borderless", size: "small", startIcon: React.createElement(SvgAdd, null) }, UiComponents.translate("filterBuilder.ruleGroup")))));
38
+ }
39
+ /** @alpha */
40
+ export function PropertyFilterBuilderRuleGroupOperator(props) {
41
+ const { operator, onChange } = props;
42
+ const options = React.useMemo(() => ([
43
+ { value: PropertyFilterRuleGroupOperator.And, label: UiComponents.translate("filterBuilder.operators.and") },
44
+ { value: PropertyFilterRuleGroupOperator.Or, label: UiComponents.translate("filterBuilder.operators.or") },
45
+ ]), []);
46
+ return React.createElement("div", { className: "rule-group-operator" },
47
+ React.createElement(Select, { options: options, value: operator, onChange: onChange, size: "small" }));
48
+ }
49
+ const PropertyFilterBuilderGroupOrRule = React.memo(function PropertyFilterBuilderGroupOrRule({ path, item }) {
50
+ const itemPath = [...path, item.id];
51
+ if (isPropertyFilterBuilderRuleGroup(item))
52
+ return React.createElement(PropertyFilterBuilderRuleGroupRenderer, { path: itemPath, group: item });
53
+ return React.createElement(PropertyFilterBuilderRuleRenderer, { path: itemPath, rule: item });
54
+ });
55
+ //# 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,24 @@
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 * as React from "react";
6
+ import { Select } from "@itwin/itwinui-react";
7
+ import { getPropertyFilterOperatorLabel, getPropertyFilterOperators } from "./Operators";
8
+ /** @alpha */
9
+ export function PropertyFilterBuilderRuleOperator(props) {
10
+ var _a;
11
+ const { operator, property, onChange } = props;
12
+ const availableOperators = React.useMemo(() => getPropertyFilterOperators(property), [property]);
13
+ const selectedOperator = (_a = availableOperators.find((op) => op === operator)) !== null && _a !== void 0 ? _a : availableOperators[0];
14
+ React.useEffect(() => {
15
+ onChange(selectedOperator);
16
+ }, [onChange, selectedOperator]);
17
+ const availableOptions = React.useMemo(() => availableOperators.map((op) => ({
18
+ value: op,
19
+ label: getPropertyFilterOperatorLabel(op),
20
+ })), [availableOperators]);
21
+ return React.createElement("div", { className: "rule-operator" },
22
+ React.createElement(Select, { options: availableOptions, value: selectedOperator, onChange: onChange, size: "small" }));
23
+ }
24
+ //# 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,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,8BAA8B,EAAE,0BAA0B,EAA8B,MAAM,aAAa,CAAC;AASrH,aAAa;AACb,MAAM,UAAU,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,0BAA0B,CAAC,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,8BAA8B,CAAC,EAAE,CAAC;KAC1C,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAE3B,OAAO,6BAAK,SAAS,EAAC,eAAe;QACnC,oBAAC,MAAM,IAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAC,OAAO,GAAE,CAC1F,CAAC;AACT,CAAC","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"}
@@ -0,0 +1,29 @@
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 * as React from "react";
6
+ import { ComboBox } from "@itwin/itwinui-react";
7
+ import { UiComponents } from "../UiComponents";
8
+ /** @alpha */
9
+ export function PropertyFilterBuilderRuleProperty(props) {
10
+ const { selectedProperty, properties, onSelectedPropertyChanged } = props;
11
+ const selectOptions = React.useMemo(() => properties.map((property) => ({
12
+ id: property.name,
13
+ label: property.displayLabel,
14
+ value: property.name,
15
+ })), [properties]);
16
+ const onPropertyChanged = React.useCallback((name) => {
17
+ onSelectedPropertyChanged(properties.find((property) => property.name === name));
18
+ }, [properties, onSelectedPropertyChanged]);
19
+ React.useEffect(() => {
20
+ const currentSelectedProperty = properties.find((property) => property.name === (selectedProperty === null || selectedProperty === void 0 ? void 0 : selectedProperty.name));
21
+ if ((currentSelectedProperty === null || currentSelectedProperty === void 0 ? void 0 : currentSelectedProperty.name) !== (selectedProperty === null || selectedProperty === void 0 ? void 0 : selectedProperty.name))
22
+ onSelectedPropertyChanged(currentSelectedProperty);
23
+ }, [properties, selectedProperty, onSelectedPropertyChanged]);
24
+ return React.createElement("div", { className: "rule-property" },
25
+ React.createElement(ComboBox, { options: selectOptions, onChange: onPropertyChanged, value: selectedProperty === null || selectedProperty === void 0 ? void 0 : selectedProperty.name, inputProps: {
26
+ placeholder: UiComponents.translate("filterBuilder.chooseProperty"),
27
+ } }));
28
+ }
29
+ //# sourceMappingURL=FilterBuilderRuleProperty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderRuleProperty.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleProperty.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAgB,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAS/C,aAAa;AACb,MAAM,UAAU,iCAAiC,CAAC,KAA6C;IAC7F,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,yBAAyB,EAAE,GAAG,KAAK,CAAC;IAE1E,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAyB,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC9F,EAAE,EAAE,QAAQ,CAAC,IAAI;QACjB,KAAK,EAAE,QAAQ,CAAC,YAAY;QAC5B,KAAK,EAAE,QAAQ,CAAC,IAAI;KACrB,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEnB,MAAM,iBAAiB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,IAAY,EAAE,EAAE;QAC3D,yBAAyB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;IACnF,CAAC,EAAE,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAE5C,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,uBAAuB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,MAAK,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,CAAA,CAAC,CAAC;QACxG,IAAI,CAAA,uBAAuB,aAAvB,uBAAuB,uBAAvB,uBAAuB,CAAE,IAAI,OAAK,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,CAAA;YAC1D,yBAAyB,CAAC,uBAAuB,CAAC,CAAC;IACvD,CAAC,EAAE,CAAC,UAAU,EAAE,gBAAgB,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAE9D,OAAO,6BAAK,SAAS,EAAC,eAAe;QACnC,oBAAC,QAAQ,IACP,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,EAC7B,UAAU,EAAE;gBACV,WAAW,EAAE,YAAY,CAAC,SAAS,CAAC,8BAA8B,CAAC;aACpE,GACD,CACE,CAAC;AACT,CAAC","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 { ComboBox, SelectOption } from \"@itwin/itwinui-react\";\r\nimport { UiComponents } from \"../UiComponents\";\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderRulePropertyProps {\r\n properties: PropertyDescription[];\r\n selectedProperty?: PropertyDescription;\r\n onSelectedPropertyChanged: (property?: PropertyDescription) => void;\r\n}\r\n\r\n/** @alpha */\r\nexport function PropertyFilterBuilderRuleProperty(props: PropertyFilterBuilderRulePropertyProps) {\r\n const { selectedProperty, properties, onSelectedPropertyChanged } = props;\r\n\r\n const selectOptions = React.useMemo<SelectOption<string>[]>(() => properties.map((property) => ({\r\n id: property.name,\r\n label: property.displayLabel,\r\n value: property.name,\r\n })), [properties]);\r\n\r\n const onPropertyChanged = React.useCallback((name: string) => {\r\n onSelectedPropertyChanged(properties.find((property) => property.name === name));\r\n }, [properties, onSelectedPropertyChanged]);\r\n\r\n React.useEffect(() => {\r\n const currentSelectedProperty = properties.find((property) => property.name === selectedProperty?.name);\r\n if (currentSelectedProperty?.name !== selectedProperty?.name)\r\n onSelectedPropertyChanged(currentSelectedProperty);\r\n }, [properties, selectedProperty, onSelectedPropertyChanged]);\r\n\r\n return <div className=\"rule-property\">\r\n <ComboBox\r\n options={selectOptions}\r\n onChange={onPropertyChanged}\r\n value={selectedProperty?.name}\r\n inputProps={{\r\n placeholder: UiComponents.translate(\"filterBuilder.chooseProperty\"),\r\n }}\r\n />\r\n </div>;\r\n}\r\n"]}
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ import { PropertyDescription, PropertyValue } from "@itwin/appui-abstract";
3
+ /** @alpha */
4
+ export interface PropertyFilterBuilderRuleValueProps {
5
+ value?: PropertyValue;
6
+ property: PropertyDescription;
7
+ onChange: (value: PropertyValue) => void;
8
+ }
9
+ /** @alpha */
10
+ export declare function PropertyFilterBuilderRuleValue(props: PropertyFilterBuilderRuleValueProps): JSX.Element;
11
+ //# sourceMappingURL=FilterBuilderRuleValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderRuleValue.d.ts","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleValue.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,mBAAmB,EAAkB,aAAa,EAAuB,MAAM,uBAAuB,CAAC;AAGhH,aAAa;AACb,MAAM,WAAW,mCAAmC;IAClD,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1C;AAED,aAAa;AACb,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,mCAAmC,eAmBxF"}
@@ -0,0 +1,20 @@
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 * as React from "react";
6
+ import { PropertyRecord, PropertyValueFormat } from "@itwin/appui-abstract";
7
+ import { EditorContainer } from "../editors/EditorContainer";
8
+ /** @alpha */
9
+ export function PropertyFilterBuilderRuleValue(props) {
10
+ const { value, property, onChange } = props;
11
+ const propertyRecord = React.useMemo(() => {
12
+ return new PropertyRecord(value !== null && value !== void 0 ? value : { valueFormat: PropertyValueFormat.Primitive }, property);
13
+ }, [value, property]);
14
+ const onValueChange = React.useCallback(({ newValue }) => {
15
+ onChange(newValue);
16
+ }, [onChange]);
17
+ return React.createElement("div", { className: "rule-value" },
18
+ React.createElement(EditorContainer, { propertyRecord: propertyRecord, onCancel: /* istanbul ignore next */ () => { }, onCommit: onValueChange, setFocus: false }));
19
+ }
20
+ //# sourceMappingURL=FilterBuilderRuleValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderRuleValue.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleValue.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAuB,cAAc,EAAiB,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAChH,OAAO,EAAE,eAAe,EAAuB,MAAM,4BAA4B,CAAC;AASlF,aAAa;AACb,MAAM,UAAU,8BAA8B,CAAC,KAA0C;IACvF,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAE5C,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACxC,OAAO,IAAI,cAAc,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAC,WAAW,EAAE,mBAAmB,CAAC,SAAS,EAAC,EAAE,QAAQ,CAAC,CAAC;IAC7F,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEtB,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,EAAC,QAAQ,EAAsB,EAAE,EAAE;QAC1E,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,6BAAK,SAAS,EAAC,YAAY;QAChC,oBAAC,eAAe,IACd,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,0BAA0B,CAAC,GAAG,EAAE,GAAE,CAAC,EAC7C,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,KAAK,GACf,CACE,CAAC;AACT,CAAC","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, PropertyRecord, PropertyValue, PropertyValueFormat } from \"@itwin/appui-abstract\";\r\nimport { EditorContainer, PropertyUpdatedArgs } from \"../editors/EditorContainer\";\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderRuleValueProps {\r\n value?: PropertyValue;\r\n property: PropertyDescription;\r\n onChange: (value: PropertyValue) => void;\r\n}\r\n\r\n/** @alpha */\r\nexport function PropertyFilterBuilderRuleValue(props: PropertyFilterBuilderRuleValueProps) {\r\n const { value, property, onChange } = props;\r\n\r\n const propertyRecord = React.useMemo(() => {\r\n return new PropertyRecord(value ?? {valueFormat: PropertyValueFormat.Primitive}, property);\r\n }, [value, property]);\r\n\r\n const onValueChange = React.useCallback(({newValue}: PropertyUpdatedArgs) => {\r\n onChange(newValue);\r\n }, [onChange]);\r\n\r\n return <div className=\"rule-value\">\r\n <EditorContainer\r\n propertyRecord={propertyRecord}\r\n onCancel={/* istanbul ignore next */ () => {}}\r\n onCommit={onValueChange}\r\n setFocus={false}\r\n />\r\n </div>;\r\n}\r\n"]}
@@ -0,0 +1,43 @@
1
+ import { PropertyDescription, PropertyValue } from "@itwin/appui-abstract";
2
+ import { PropertyFilterRuleGroupOperator, PropertyFilterRuleOperator } from "./Operators";
3
+ /** @alpha */
4
+ export interface PropertyFilterBuilderState {
5
+ rootGroup: PropertyFilterBuilderRuleGroup;
6
+ }
7
+ /** @alpha */
8
+ export declare type PropertyFilterBuilderRuleGroupItem = PropertyFilterBuilderRuleGroup | PropertyFilterBuilderRule;
9
+ /** @alpha */
10
+ export interface PropertyFilterBuilderRuleGroup {
11
+ id: string;
12
+ groupId?: string;
13
+ operator: PropertyFilterRuleGroupOperator;
14
+ items: PropertyFilterBuilderRuleGroupItem[];
15
+ }
16
+ /** @alpha */
17
+ export interface PropertyFilterBuilderRule {
18
+ id: string;
19
+ groupId: string;
20
+ property?: PropertyDescription;
21
+ operator?: PropertyFilterRuleOperator;
22
+ value?: PropertyValue;
23
+ }
24
+ /** @alpha */
25
+ export declare class PropertyFilterBuilderActions {
26
+ private setState;
27
+ constructor(setState: (setter: (prevState: PropertyFilterBuilderState) => PropertyFilterBuilderState) => void);
28
+ private updateState;
29
+ addItem(path: string[], itemType: "RULE_GROUP" | "RULE"): void;
30
+ removeItem(path: string[]): void;
31
+ setRuleGroupOperator(path: string[], operator: PropertyFilterRuleGroupOperator): void;
32
+ setRuleProperty(path: string[], property?: PropertyDescription): void;
33
+ setRuleOperator(path: string[], operator: PropertyFilterRuleOperator): void;
34
+ setRuleValue(path: string[], value: PropertyValue): void;
35
+ }
36
+ /** @alpha */
37
+ export declare function isPropertyFilterBuilderRuleGroup(item: PropertyFilterBuilderRuleGroupItem): item is PropertyFilterBuilderRuleGroup;
38
+ /** @alpha */
39
+ export declare function usePropertyFilterBuilderState(): {
40
+ state: PropertyFilterBuilderState;
41
+ actions: PropertyFilterBuilderActions;
42
+ };
43
+ //# sourceMappingURL=FilterBuilderState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderState.d.ts","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderState.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3E,OAAO,EAAiC,+BAA+B,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEzH,aAAa;AACb,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,8BAA8B,CAAC;CAC3C;AAED,aAAa;AACb,oBAAY,kCAAkC,GAAG,8BAA8B,GAAG,yBAAyB,CAAC;AAE5G,aAAa;AACb,MAAM,WAAW,8BAA8B;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,+BAA+B,CAAC;IAC1C,KAAK,EAAE,kCAAkC,EAAE,CAAC;CAC7C;AAED,aAAa;AACb,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,CAAC,EAAE,0BAA0B,CAAC;IACtC,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,aAAa;AACb,qBAAa,4BAA4B;IAC3B,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,0BAA0B,KAAK,0BAA0B,KAAK,IAAI;IAErH,OAAO,CAAC,WAAW;IAIZ,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM;IAUvD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE;IAoBzB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,+BAA+B;IAS9E,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,mBAAmB;IAU9D,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,0BAA0B;IAWpE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,aAAa;CAQzD;AAED,aAAa;AACb,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,kCAAkC,GAAG,IAAI,IAAI,8BAA8B,CAEjI;AAED,aAAa;AACb,wBAAgB,6BAA6B;;;EAO5C"}
@@ -0,0 +1,127 @@
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 { produce } from "immer";
6
+ import * as React from "react";
7
+ import { Guid } from "@itwin/core-bentley";
8
+ import { isUnaryPropertyFilterOperator, PropertyFilterRuleGroupOperator } from "./Operators";
9
+ /** @alpha */
10
+ export class PropertyFilterBuilderActions {
11
+ constructor(setState) {
12
+ this.setState = setState;
13
+ }
14
+ updateState(updater) {
15
+ this.setState(produce(updater));
16
+ }
17
+ addItem(path, itemType) {
18
+ this.updateState((state) => {
19
+ const parentGroup = findRuleGroup(state.rootGroup, path);
20
+ if (!parentGroup)
21
+ return;
22
+ const item = itemType === "RULE_GROUP" ? createEmptyRuleGroup(parentGroup.id) : createEmptyRule(parentGroup.id);
23
+ parentGroup.items.push(item);
24
+ });
25
+ }
26
+ removeItem(path) {
27
+ function removeItemFromGroup(state, pathToItem) {
28
+ const pathToParent = pathToItem.slice(0, -1);
29
+ const parentGroup = findRuleGroup(state.rootGroup, pathToParent);
30
+ if (!parentGroup)
31
+ return;
32
+ const itemId = pathToItem[pathToItem.length - 1];
33
+ const itemIndex = parentGroup.items.findIndex((item) => item.id === itemId);
34
+ if (itemIndex === -1)
35
+ return;
36
+ parentGroup.items.splice(itemIndex, 1);
37
+ if (parentGroup.items.length === 0)
38
+ removeItemFromGroup(state, pathToParent);
39
+ }
40
+ this.updateState((state) => {
41
+ removeItemFromGroup(state, path);
42
+ });
43
+ }
44
+ setRuleGroupOperator(path, operator) {
45
+ this.updateState((state) => {
46
+ const group = findRuleGroup(state.rootGroup, path);
47
+ if (!group)
48
+ return;
49
+ group.operator = operator;
50
+ });
51
+ }
52
+ setRuleProperty(path, property) {
53
+ this.updateState((state) => {
54
+ const rule = findRule(state.rootGroup, path);
55
+ if (!rule)
56
+ return;
57
+ rule.property = property;
58
+ rule.value = undefined;
59
+ });
60
+ }
61
+ setRuleOperator(path, operator) {
62
+ this.updateState((state) => {
63
+ const rule = findRule(state.rootGroup, path);
64
+ if (!rule)
65
+ return;
66
+ if (isUnaryPropertyFilterOperator(operator))
67
+ rule.value = undefined;
68
+ rule.operator = operator;
69
+ });
70
+ }
71
+ setRuleValue(path, value) {
72
+ this.updateState((state) => {
73
+ const rule = findRule(state.rootGroup, path);
74
+ if (!rule)
75
+ return;
76
+ rule.value = value;
77
+ });
78
+ }
79
+ }
80
+ /** @alpha */
81
+ export function isPropertyFilterBuilderRuleGroup(item) {
82
+ return item.items !== undefined;
83
+ }
84
+ /** @alpha */
85
+ export function usePropertyFilterBuilderState() {
86
+ const [state, setState] = React.useState(() => ({
87
+ rootGroup: createEmptyRuleGroup(),
88
+ }));
89
+ const [actions] = React.useState(() => new PropertyFilterBuilderActions(setState));
90
+ return { state, actions };
91
+ }
92
+ function createEmptyRule(groupId) {
93
+ return {
94
+ id: Guid.createValue(),
95
+ groupId,
96
+ };
97
+ }
98
+ function createEmptyRuleGroup(groupId) {
99
+ const id = Guid.createValue();
100
+ return {
101
+ id,
102
+ groupId,
103
+ operator: PropertyFilterRuleGroupOperator.And,
104
+ items: [createEmptyRule(id)],
105
+ };
106
+ }
107
+ function findRuleGroup(rootGroup, path) {
108
+ if (path.length === 0)
109
+ return rootGroup;
110
+ const [currentItemId, ...rest] = path;
111
+ const currentItem = rootGroup.items.find((item) => item.id === currentItemId);
112
+ if (!currentItem || !isPropertyFilterBuilderRuleGroup(currentItem))
113
+ return undefined;
114
+ return findRuleGroup(currentItem, rest);
115
+ }
116
+ function findRule(rootGroup, path) {
117
+ if (path.length === 0)
118
+ return undefined;
119
+ const [currentItemId, ...rest] = path;
120
+ const currentItem = rootGroup.items.find((item) => item.id === currentItemId);
121
+ if (!currentItem)
122
+ return undefined;
123
+ if (isPropertyFilterBuilderRuleGroup(currentItem))
124
+ return findRule(currentItem, rest);
125
+ return currentItem;
126
+ }
127
+ //# sourceMappingURL=FilterBuilderState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilderState.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderState.ts"],"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 { Draft, produce } from \"immer\";\r\nimport * as React from \"react\";\r\nimport { PropertyDescription, PropertyValue } from \"@itwin/appui-abstract\";\r\nimport { Guid } from \"@itwin/core-bentley\";\r\nimport { isUnaryPropertyFilterOperator, PropertyFilterRuleGroupOperator, PropertyFilterRuleOperator } from \"./Operators\";\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderState {\r\n rootGroup: PropertyFilterBuilderRuleGroup;\r\n}\r\n\r\n/** @alpha */\r\nexport type PropertyFilterBuilderRuleGroupItem = PropertyFilterBuilderRuleGroup | PropertyFilterBuilderRule;\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderRuleGroup {\r\n id: string;\r\n groupId?: string;\r\n operator: PropertyFilterRuleGroupOperator;\r\n items: PropertyFilterBuilderRuleGroupItem[];\r\n}\r\n\r\n/** @alpha */\r\nexport interface PropertyFilterBuilderRule {\r\n id: string;\r\n groupId: string;\r\n property?: PropertyDescription;\r\n operator?: PropertyFilterRuleOperator;\r\n value?: PropertyValue;\r\n}\r\n\r\n/** @alpha */\r\nexport class PropertyFilterBuilderActions {\r\n constructor(private setState: (setter: (prevState: PropertyFilterBuilderState) => PropertyFilterBuilderState) => void) {}\r\n\r\n private updateState(updater: (state: Draft<PropertyFilterBuilderState>) => void) {\r\n this.setState(produce(updater));\r\n }\r\n\r\n public addItem(path: string[], itemType: \"RULE_GROUP\" | \"RULE\") {\r\n this.updateState((state) => {\r\n const parentGroup = findRuleGroup(state.rootGroup, path);\r\n if (!parentGroup)\r\n return;\r\n const item = itemType === \"RULE_GROUP\" ? createEmptyRuleGroup(parentGroup.id) : createEmptyRule(parentGroup.id);\r\n parentGroup.items.push(item);\r\n });\r\n }\r\n\r\n public removeItem(path: string[]) {\r\n function removeItemFromGroup(state: Draft<PropertyFilterBuilderState>, pathToItem: string[]) {\r\n const pathToParent = pathToItem.slice(0, -1);\r\n const parentGroup = findRuleGroup(state.rootGroup, pathToParent);\r\n if (!parentGroup)\r\n return;\r\n const itemId = pathToItem[pathToItem.length - 1];\r\n const itemIndex = parentGroup.items.findIndex((item) => item.id === itemId);\r\n if (itemIndex === -1)\r\n return;\r\n parentGroup.items.splice(itemIndex, 1);\r\n if (parentGroup.items.length === 0)\r\n removeItemFromGroup(state, pathToParent);\r\n }\r\n\r\n this.updateState((state) => {\r\n removeItemFromGroup(state, path);\r\n });\r\n }\r\n\r\n public setRuleGroupOperator(path: string[], operator: PropertyFilterRuleGroupOperator) {\r\n this.updateState((state) => {\r\n const group = findRuleGroup(state.rootGroup, path);\r\n if (!group)\r\n return;\r\n group.operator = operator;\r\n });\r\n }\r\n\r\n public setRuleProperty(path: string[], property?: PropertyDescription) {\r\n this.updateState((state) => {\r\n const rule = findRule(state.rootGroup, path);\r\n if (!rule)\r\n return;\r\n rule.property = property;\r\n rule.value = undefined;\r\n });\r\n }\r\n\r\n public setRuleOperator(path: string[], operator: PropertyFilterRuleOperator) {\r\n this.updateState((state) => {\r\n const rule = findRule(state.rootGroup, path);\r\n if (!rule)\r\n return;\r\n if (isUnaryPropertyFilterOperator(operator))\r\n rule.value = undefined;\r\n rule.operator = operator;\r\n });\r\n }\r\n\r\n public setRuleValue(path: string[], value: PropertyValue) {\r\n this.updateState((state) => {\r\n const rule = findRule(state.rootGroup, path);\r\n if (!rule)\r\n return;\r\n rule.value = value;\r\n });\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport function isPropertyFilterBuilderRuleGroup(item: PropertyFilterBuilderRuleGroupItem): item is PropertyFilterBuilderRuleGroup {\r\n return (item as any).items !== undefined;\r\n}\r\n\r\n/** @alpha */\r\nexport function usePropertyFilterBuilderState() {\r\n const [state, setState] = React.useState<PropertyFilterBuilderState>(() => ({\r\n rootGroup: createEmptyRuleGroup(),\r\n }));\r\n const [actions] = React.useState(() => new PropertyFilterBuilderActions(setState));\r\n\r\n return { state, actions };\r\n}\r\n\r\nfunction createEmptyRule(groupId: string): PropertyFilterBuilderRule {\r\n return {\r\n id: Guid.createValue(),\r\n groupId,\r\n };\r\n}\r\n\r\nfunction createEmptyRuleGroup(groupId?: string): PropertyFilterBuilderRuleGroup {\r\n const id = Guid.createValue();\r\n return {\r\n id,\r\n groupId,\r\n operator: PropertyFilterRuleGroupOperator.And,\r\n items: [createEmptyRule(id)],\r\n };\r\n}\r\n\r\nfunction findRuleGroup(rootGroup: PropertyFilterBuilderRuleGroup, path: string[]): PropertyFilterBuilderRuleGroup | undefined {\r\n if (path.length === 0)\r\n return rootGroup;\r\n\r\n const [currentItemId, ...rest] = path;\r\n const currentItem = rootGroup.items.find((item) => item.id === currentItemId);\r\n if (!currentItem || !isPropertyFilterBuilderRuleGroup(currentItem))\r\n return undefined;\r\n\r\n return findRuleGroup(currentItem, rest);\r\n}\r\n\r\nfunction findRule(rootGroup: PropertyFilterBuilderRuleGroup, path: string[]): PropertyFilterBuilderRule | undefined {\r\n if (path.length === 0)\r\n return undefined;\r\n\r\n const [currentItemId, ...rest] = path;\r\n const currentItem = rootGroup.items.find((item) => item.id === currentItemId);\r\n if (!currentItem)\r\n return undefined;\r\n\r\n if (isPropertyFilterBuilderRuleGroup(currentItem))\r\n return findRule(currentItem, rest);\r\n\r\n return currentItem;\r\n}\r\n"]}
@@ -0,0 +1,27 @@
1
+ import { PropertyDescription } from "@itwin/appui-abstract";
2
+ /** @alpha */
3
+ export declare enum PropertyFilterRuleGroupOperator {
4
+ And = 0,
5
+ Or = 1
6
+ }
7
+ /** @alpha */
8
+ export declare enum PropertyFilterRuleOperator {
9
+ IsTrue = 0,
10
+ IsFalse = 1,
11
+ IsEqual = 2,
12
+ IsNotEqual = 3,
13
+ Greater = 4,
14
+ GreaterOrEqual = 5,
15
+ Less = 6,
16
+ LessOrEqual = 7,
17
+ Like = 8,
18
+ IsNull = 9,
19
+ IsNotNull = 10
20
+ }
21
+ /** @alpha */
22
+ export declare function getPropertyFilterOperators(property: PropertyDescription): PropertyFilterRuleOperator[];
23
+ /** @alpha */
24
+ export declare function getPropertyFilterOperatorLabel(operator: PropertyFilterRuleOperator): string;
25
+ /** @alpha */
26
+ export declare function isUnaryPropertyFilterOperator(operator: PropertyFilterRuleOperator): boolean;
27
+ //# sourceMappingURL=Operators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Operators.d.ts","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/Operators.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAqB,MAAM,uBAAuB,CAAC;AAG/E,aAAa;AACb,oBAAY,+BAA+B;IACzC,GAAG,IAAA;IACH,EAAE,IAAA;CACH;AAED,aAAa;AACb,oBAAY,0BAA0B;IACpC,MAAM,IAAA;IACN,OAAO,IAAA;IAEP,OAAO,IAAA;IACP,UAAU,IAAA;IAEV,OAAO,IAAA;IACP,cAAc,IAAA;IACd,IAAI,IAAA;IACJ,WAAW,IAAA;IAEX,IAAI,IAAA;IAEJ,MAAM,IAAA;IACN,SAAS,KAAA;CACV;AAED,aAAa;AACb,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,mBAAmB,gCA2CvE;AAGD,aAAa;AACb,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,0BAA0B,UAyBlF;AAED,aAAa;AACb,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,0BAA0B,WASjF"}