@itwin/components-react 4.16.5 → 4.17.0

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 (138) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/lib/cjs/components-react/common/HighlightedText.d.ts +1 -0
  3. package/lib/cjs/components-react/common/HighlightedText.d.ts.map +1 -1
  4. package/lib/cjs/components-react/common/HighlightedText.js +1 -0
  5. package/lib/cjs/components-react/common/HighlightedText.js.map +1 -1
  6. package/lib/cjs/components-react/editors/EditorContainer.d.ts +1 -0
  7. package/lib/cjs/components-react/editors/EditorContainer.d.ts.map +1 -1
  8. package/lib/cjs/components-react/editors/EditorContainer.js +1 -0
  9. package/lib/cjs/components-react/editors/EditorContainer.js.map +1 -1
  10. package/lib/cjs/components-react/editors/PopupButton.d.ts +1 -0
  11. package/lib/cjs/components-react/editors/PopupButton.d.ts.map +1 -1
  12. package/lib/cjs/components-react/editors/PopupButton.js +1 -0
  13. package/lib/cjs/components-react/editors/PopupButton.js.map +1 -1
  14. package/lib/cjs/components-react/favorite/FavoritePropertyList.d.ts +1 -0
  15. package/lib/cjs/components-react/favorite/FavoritePropertyList.d.ts.map +1 -1
  16. package/lib/cjs/components-react/favorite/FavoritePropertyList.js +1 -0
  17. package/lib/cjs/components-react/favorite/FavoritePropertyList.js.map +1 -1
  18. package/lib/cjs/components-react/filter-builder/FilterBuilder.d.ts +2 -0
  19. package/lib/cjs/components-react/filter-builder/FilterBuilder.d.ts.map +1 -1
  20. package/lib/cjs/components-react/filter-builder/FilterBuilder.js +2 -2
  21. package/lib/cjs/components-react/filter-builder/FilterBuilder.js.map +1 -1
  22. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.d.ts +2 -0
  23. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.d.ts.map +1 -1
  24. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.js +2 -2
  25. package/lib/cjs/components-react/filter-builder/FilterBuilderRule.js.map +1 -1
  26. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.d.ts +2 -0
  27. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.d.ts.map +1 -1
  28. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.js +4 -4
  29. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleGroup.js.map +1 -1
  30. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.d.ts +0 -5
  31. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.d.ts.map +1 -1
  32. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.js +37 -34
  33. package/lib/cjs/components-react/filter-builder/FilterBuilderRuleOperator.js.map +1 -1
  34. package/lib/cjs/components-react/filter-builder/FilterBuilderState.d.ts +7 -1
  35. package/lib/cjs/components-react/filter-builder/FilterBuilderState.d.ts.map +1 -1
  36. package/lib/cjs/components-react/filter-builder/FilterBuilderState.js +50 -27
  37. package/lib/cjs/components-react/filter-builder/FilterBuilderState.js.map +1 -1
  38. package/lib/cjs/components-react/inputs/ParsedInput.d.ts +1 -0
  39. package/lib/cjs/components-react/inputs/ParsedInput.d.ts.map +1 -1
  40. package/lib/cjs/components-react/inputs/ParsedInput.js +1 -0
  41. package/lib/cjs/components-react/inputs/ParsedInput.js.map +1 -1
  42. package/lib/cjs/components-react/properties/LinkHandler.d.ts +1 -0
  43. package/lib/cjs/components-react/properties/LinkHandler.d.ts.map +1 -1
  44. package/lib/cjs/components-react/properties/LinkHandler.js +1 -0
  45. package/lib/cjs/components-react/properties/LinkHandler.js.map +1 -1
  46. package/lib/cjs/components-react/properties/renderers/PropertyRenderer.d.ts +4 -21
  47. package/lib/cjs/components-react/properties/renderers/PropertyRenderer.d.ts.map +1 -1
  48. package/lib/cjs/components-react/properties/renderers/PropertyRenderer.js +47 -60
  49. package/lib/cjs/components-react/properties/renderers/PropertyRenderer.js.map +1 -1
  50. package/lib/cjs/components-react/properties/renderers/value/MergedPropertyValueRenderer.d.ts +2 -1
  51. package/lib/cjs/components-react/properties/renderers/value/MergedPropertyValueRenderer.d.ts.map +1 -1
  52. package/lib/cjs/components-react/properties/renderers/value/MergedPropertyValueRenderer.js +30 -2
  53. package/lib/cjs/components-react/properties/renderers/value/MergedPropertyValueRenderer.js.map +1 -1
  54. package/lib/cjs/components-react/propertygrid/component/VirtualizedPropertyGridWithDataProvider.d.ts +1 -0
  55. package/lib/cjs/components-react/propertygrid/component/VirtualizedPropertyGridWithDataProvider.d.ts.map +1 -1
  56. package/lib/cjs/components-react/propertygrid/component/VirtualizedPropertyGridWithDataProvider.js +3 -1
  57. package/lib/cjs/components-react/propertygrid/component/VirtualizedPropertyGridWithDataProvider.js.map +1 -1
  58. package/lib/cjs/components-react/selectable-content/SelectableContent.d.ts +2 -0
  59. package/lib/cjs/components-react/selectable-content/SelectableContent.d.ts.map +1 -1
  60. package/lib/cjs/components-react/selectable-content/SelectableContent.js +4 -1
  61. package/lib/cjs/components-react/selectable-content/SelectableContent.js.map +1 -1
  62. package/lib/cjs/components-react/tree/controlled/component/NodeContent.d.ts +1 -0
  63. package/lib/cjs/components-react/tree/controlled/component/NodeContent.d.ts.map +1 -1
  64. package/lib/cjs/components-react/tree/controlled/component/NodeContent.js +1 -0
  65. package/lib/cjs/components-react/tree/controlled/component/NodeContent.js.map +1 -1
  66. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.d.ts +1 -0
  67. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.d.ts.map +1 -1
  68. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.js +1 -0
  69. package/lib/cjs/components-react/tree/controlled/component/TreeNodeRenderer.js.map +1 -1
  70. package/lib/esm/components-react/common/HighlightedText.d.ts +1 -0
  71. package/lib/esm/components-react/common/HighlightedText.d.ts.map +1 -1
  72. package/lib/esm/components-react/common/HighlightedText.js +1 -0
  73. package/lib/esm/components-react/common/HighlightedText.js.map +1 -1
  74. package/lib/esm/components-react/editors/EditorContainer.d.ts +1 -0
  75. package/lib/esm/components-react/editors/EditorContainer.d.ts.map +1 -1
  76. package/lib/esm/components-react/editors/EditorContainer.js +1 -0
  77. package/lib/esm/components-react/editors/EditorContainer.js.map +1 -1
  78. package/lib/esm/components-react/editors/PopupButton.d.ts +1 -0
  79. package/lib/esm/components-react/editors/PopupButton.d.ts.map +1 -1
  80. package/lib/esm/components-react/editors/PopupButton.js +1 -0
  81. package/lib/esm/components-react/editors/PopupButton.js.map +1 -1
  82. package/lib/esm/components-react/favorite/FavoritePropertyList.d.ts +1 -0
  83. package/lib/esm/components-react/favorite/FavoritePropertyList.d.ts.map +1 -1
  84. package/lib/esm/components-react/favorite/FavoritePropertyList.js +1 -0
  85. package/lib/esm/components-react/favorite/FavoritePropertyList.js.map +1 -1
  86. package/lib/esm/components-react/filter-builder/FilterBuilder.d.ts +2 -0
  87. package/lib/esm/components-react/filter-builder/FilterBuilder.d.ts.map +1 -1
  88. package/lib/esm/components-react/filter-builder/FilterBuilder.js +2 -2
  89. package/lib/esm/components-react/filter-builder/FilterBuilder.js.map +1 -1
  90. package/lib/esm/components-react/filter-builder/FilterBuilderRule.d.ts +2 -0
  91. package/lib/esm/components-react/filter-builder/FilterBuilderRule.d.ts.map +1 -1
  92. package/lib/esm/components-react/filter-builder/FilterBuilderRule.js +2 -2
  93. package/lib/esm/components-react/filter-builder/FilterBuilderRule.js.map +1 -1
  94. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.d.ts +2 -0
  95. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.d.ts.map +1 -1
  96. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.js +4 -4
  97. package/lib/esm/components-react/filter-builder/FilterBuilderRuleGroup.js.map +1 -1
  98. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.d.ts +0 -5
  99. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.d.ts.map +1 -1
  100. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.js +36 -32
  101. package/lib/esm/components-react/filter-builder/FilterBuilderRuleOperator.js.map +1 -1
  102. package/lib/esm/components-react/filter-builder/FilterBuilderState.d.ts +7 -1
  103. package/lib/esm/components-react/filter-builder/FilterBuilderState.d.ts.map +1 -1
  104. package/lib/esm/components-react/filter-builder/FilterBuilderState.js +48 -26
  105. package/lib/esm/components-react/filter-builder/FilterBuilderState.js.map +1 -1
  106. package/lib/esm/components-react/inputs/ParsedInput.d.ts +1 -0
  107. package/lib/esm/components-react/inputs/ParsedInput.d.ts.map +1 -1
  108. package/lib/esm/components-react/inputs/ParsedInput.js +1 -0
  109. package/lib/esm/components-react/inputs/ParsedInput.js.map +1 -1
  110. package/lib/esm/components-react/properties/LinkHandler.d.ts +1 -0
  111. package/lib/esm/components-react/properties/LinkHandler.d.ts.map +1 -1
  112. package/lib/esm/components-react/properties/LinkHandler.js +1 -0
  113. package/lib/esm/components-react/properties/LinkHandler.js.map +1 -1
  114. package/lib/esm/components-react/properties/renderers/PropertyRenderer.d.ts +4 -21
  115. package/lib/esm/components-react/properties/renderers/PropertyRenderer.d.ts.map +1 -1
  116. package/lib/esm/components-react/properties/renderers/PropertyRenderer.js +47 -60
  117. package/lib/esm/components-react/properties/renderers/PropertyRenderer.js.map +1 -1
  118. package/lib/esm/components-react/properties/renderers/value/MergedPropertyValueRenderer.d.ts +2 -1
  119. package/lib/esm/components-react/properties/renderers/value/MergedPropertyValueRenderer.d.ts.map +1 -1
  120. package/lib/esm/components-react/properties/renderers/value/MergedPropertyValueRenderer.js +7 -2
  121. package/lib/esm/components-react/properties/renderers/value/MergedPropertyValueRenderer.js.map +1 -1
  122. package/lib/esm/components-react/propertygrid/component/VirtualizedPropertyGridWithDataProvider.d.ts +1 -0
  123. package/lib/esm/components-react/propertygrid/component/VirtualizedPropertyGridWithDataProvider.d.ts.map +1 -1
  124. package/lib/esm/components-react/propertygrid/component/VirtualizedPropertyGridWithDataProvider.js +3 -1
  125. package/lib/esm/components-react/propertygrid/component/VirtualizedPropertyGridWithDataProvider.js.map +1 -1
  126. package/lib/esm/components-react/selectable-content/SelectableContent.d.ts +2 -0
  127. package/lib/esm/components-react/selectable-content/SelectableContent.d.ts.map +1 -1
  128. package/lib/esm/components-react/selectable-content/SelectableContent.js +4 -1
  129. package/lib/esm/components-react/selectable-content/SelectableContent.js.map +1 -1
  130. package/lib/esm/components-react/tree/controlled/component/NodeContent.d.ts +1 -0
  131. package/lib/esm/components-react/tree/controlled/component/NodeContent.d.ts.map +1 -1
  132. package/lib/esm/components-react/tree/controlled/component/NodeContent.js +1 -0
  133. package/lib/esm/components-react/tree/controlled/component/NodeContent.js.map +1 -1
  134. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.d.ts +1 -0
  135. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.d.ts.map +1 -1
  136. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.js +1 -0
  137. package/lib/esm/components-react/tree/controlled/component/TreeNodeRenderer.js.map +1 -1
  138. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBuilderRuleGroup.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleGroup.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,+BAA+B,CAAC;AACvC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAKxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,oCAAoC,EAAE,MAAM,gCAAgC,CAAC;AAetF;;;GAGG;AACH,MAAM,UAAU,sCAAsC,CACpD,KAAkD;IAElD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,uBAAuB,EAAE,GAAG,KAAK,CAAC;IACvD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACnE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAE3E,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CACxC,CAAC,QAA8C,EAAE,EAAE;QACjD,OAAO,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC,EACD,CAAC,IAAI,EAAE,OAAO,CAAC,CAChB,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAE5C,OAAO,CACL,oBAAC,IAAI,IACH,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,EAClC,SAAS,EAAC,UAAU,EACpB,GAAG,EAAC,KAAK;QAER,YAAY,CAAC,CAAC,CAAC,CACd,oBAAC,sCAAsC,IACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,gBAAgB,EAC1B,uBAAuB,EAAE,uBAAuB,GAChD,CACH,CAAC,CAAC,CAAC,IAAI;QACR,6BAAK,SAAS,EAAC,YAAY,IACxB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACzB,6BAAK,SAAS,EAAC,QAAQ,EAAC,GAAG,EAAE,IAAI,CAAC,EAAE;YAClC,oBAAC,gCAAgC,IAC/B,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,GACxB,CACE,CACP,CAAC,CACE,CACD,CACR,CAAC;AACJ,CAAC;AAeD;;;GAGG;AACH,MAAM,UAAU,sCAAsC,CACpD,KAAkD;IAElD,MAAM,EAAE,QAAQ,EAAE,uBAAuB,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAE9D,OAAO,CACL,oBAAC,IAAI,CAAC,IAAI,IAAC,SAAS,EAAC,SAAS;QAC5B,oBAAC,oCAAoC,IACnC,SAAS,EAAC,mBAAmB,EAC7B,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,QAAQ,EAC1B,UAAU,EAAE,uBAAuB,GACnC,CACQ,CACb,CAAC;AACJ,CAAC;AAOD,MAAM,gCAAgC,GAAG,KAAK,CAAC,IAAI,CACjD,SAAS,gCAAgC,CAAC,EACxC,IAAI,EACJ,IAAI,EACJ,WAAW,GAC2B;IACtC,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAEpC,IAAI,gCAAgC,CAAC,IAAI,CAAC;QACxC,OAAO,CACL,oBAAC,sCAAsC,IAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,GAAI,CACxE,CAAC;IACJ,OAAO,CACL,oBAAC,iCAAiC,IAChC,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,GACxB,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,uBAA+B,EAAE,EAAE;IAC/D,MAAM,wBAAwB,GAAG,KAAK,CAAC,MAAM,CAAS,CAAC,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAU,KAAK,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IACpD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IACE,cAAc,CAAC,OAAO;YACtB,wBAAwB,CAAC,OAAO,GAAG,uBAAuB;YAC1D,QAAQ,CAAC,OAAO,EAChB,CAAC;YACD,MAAM,cAAc,GAClB,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAC/B,yBAAyB,CAC1B,CAAC;YACJ,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAClD,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC;QACjC,CAAC;QACD,wBAAwB,CAAC,OAAO,GAAG,uBAAuB,CAAC;IAC7D,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAE9B,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC1E,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module PropertyFilterBuilder\n */\n\nimport \"./FilterBuilderRuleGroup.scss\";\nimport * as React from \"react\";\nimport { Flex } from \"@itwin/itwinui-react\";\nimport { PropertyFilterBuilderContext } from \"./FilterBuilderContext\";\nimport { PropertyFilterBuilderRuleRenderer } from \"./FilterBuilderRule\";\nimport type {\n PropertyFilterBuilderRuleGroup,\n PropertyFilterBuilderRuleGroupItem,\n} from \"./FilterBuilderState\";\nimport { isPropertyFilterBuilderRuleGroup } from \"./FilterBuilderState\";\nimport type { PropertyFilterRuleGroupOperator } from \"./Operators\";\nimport { PropertyFilterBuilderLogicalOperator } from \"./FilterBuilderLogicalOperator\";\n\n/**\n * Props for [[PropertyFilterBuilderRuleGroupRenderer]] component.\n * @internal\n */\nexport interface PropertyFilterBuilderRuleGroupRendererProps {\n /** Path from [[PropertyFilterBuilder]] root to this rule group. */\n path: string[];\n /** Rule group to render. */\n group: PropertyFilterBuilderRuleGroup;\n /** Controls whether the group operator is toggle-able. */\n isGroupOperatorDisabled?: boolean;\n}\n\n/**\n * Component that renders group of rules in [[PropertyFilterBuilder]] component.\n * @internal\n */\nexport function PropertyFilterBuilderRuleGroupRenderer(\n props: PropertyFilterBuilderRuleGroupRendererProps\n) {\n const { path, group, isGroupOperatorDisabled } = props;\n const { actions } = React.useContext(PropertyFilterBuilderContext);\n const { onRuleAdded, groupRef } = useRulePropertyFocus(group.items.length);\n\n const onOperatorChange = React.useCallback(\n (operator: `${PropertyFilterRuleGroupOperator}`) => {\n actions.setRuleGroupOperator(path, operator);\n },\n [path, actions]\n );\n\n const showOperator = group.items.length > 1;\n\n return (\n <Flex\n ref={groupRef}\n style={{ alignSelf: \"flex-start\" }}\n className=\"fb-group\"\n gap=\"0px\"\n >\n {showOperator ? (\n <PropertyFilterBuilderRuleGroupOperator\n operator={group.operator}\n onChange={onOperatorChange}\n isGroupOperatorDisabled={isGroupOperatorDisabled}\n />\n ) : null}\n <div className=\"fb-wrapper\">\n {group.items.map((item) => (\n <div className=\"fb-row\" key={item.id}>\n <PropertyFilterBuilderGroupOrRule\n path={path}\n item={item}\n onRuleAdded={onRuleAdded}\n />\n </div>\n ))}\n </div>\n </Flex>\n );\n}\n\n/**\n * Props for [[PropertyFilterBuilderRuleGroupOperator]] component.\n * @internal\n */\nexport interface PropertyFilterBuilderRuleGroupOperatorProps {\n /** Currently selected operator. */\n operator: `${PropertyFilterRuleGroupOperator}`;\n /** Callback that is invoked when selected operator changes. */\n onChange: (operator: `${PropertyFilterRuleGroupOperator}`) => void;\n /** Controls whether the group operator is toggle-able. */\n isGroupOperatorDisabled?: boolean;\n}\n\n/**\n * Component that renders [[PropertyFilterBuilderRuleGroup]] operator selector.\n * @internal\n */\nexport function PropertyFilterBuilderRuleGroupOperator(\n props: PropertyFilterBuilderRuleGroupOperatorProps\n) {\n const { operator, isGroupOperatorDisabled, onChange } = props;\n\n return (\n <Flex.Item alignSelf=\"stretch\">\n <PropertyFilterBuilderLogicalOperator\n className=\"fb-group-operator\"\n operator={operator}\n onOperatorChange={onChange}\n isDisabled={isGroupOperatorDisabled}\n />\n </Flex.Item>\n );\n}\ninterface PropertyFilterBuilderGroupOrRuleProps {\n path: string[];\n item: PropertyFilterBuilderRuleGroupItem;\n onRuleAdded: () => void;\n}\n\nconst PropertyFilterBuilderGroupOrRule = React.memo(\n function PropertyFilterBuilderGroupOrRule({\n path,\n item,\n onRuleAdded,\n }: PropertyFilterBuilderGroupOrRuleProps) {\n const itemPath = [...path, item.id];\n\n if (isPropertyFilterBuilderRuleGroup(item))\n return (\n <PropertyFilterBuilderRuleGroupRenderer path={itemPath} group={item} />\n );\n return (\n <PropertyFilterBuilderRuleRenderer\n path={itemPath}\n rule={item}\n onRuleAdded={onRuleAdded}\n />\n );\n }\n);\n\nconst useRulePropertyFocus = (currentGroupItemsLength: number) => {\n const previousGroupItemsLength = React.useRef<number>(0);\n const isNewRuleAdded = React.useRef<boolean>(false);\n const groupRef = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n if (\n isNewRuleAdded.current &&\n previousGroupItemsLength.current < currentGroupItemsLength &&\n groupRef.current\n ) {\n const ruleProperties =\n groupRef.current.querySelectorAll<HTMLInputElement>(\n \".fb-property-name input\"\n );\n ruleProperties[ruleProperties.length - 1].focus();\n isNewRuleAdded.current = false;\n }\n previousGroupItemsLength.current = currentGroupItemsLength;\n }, [currentGroupItemsLength]);\n\n return { onRuleAdded: () => (isNewRuleAdded.current = true), groupRef };\n};\n"]}
1
+ {"version":3,"file":"FilterBuilderRuleGroup.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleGroup.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module PropertyFilterBuilder\n */\n\nimport \"./FilterBuilderRuleGroup.scss\";\nimport * as React from \"react\";\nimport { Flex } from \"@itwin/itwinui-react\";\nimport { PropertyFilterBuilderContext } from \"./FilterBuilderContext\";\nimport { PropertyFilterBuilderRuleRenderer } from \"./FilterBuilderRule\";\nimport type {\n PropertyFilterBuilderRuleGroup,\n PropertyFilterBuilderRuleGroupItem,\n} from \"./FilterBuilderState\";\nimport { isPropertyFilterBuilderRuleGroup } from \"./FilterBuilderState\";\nimport type { PropertyFilterRuleGroupOperator } from \"./Operators\";\nimport { PropertyFilterBuilderLogicalOperator } from \"./FilterBuilderLogicalOperator\";\n\n/**\n * Props for [[PropertyFilterBuilderRuleGroupRenderer]] component.\n * @internal\n */\nexport interface PropertyFilterBuilderRuleGroupRendererProps {\n /** Path from [[PropertyFilterBuilder]] root to this rule group. */\n path: string[];\n /** Rule group to render. */\n group: PropertyFilterBuilderRuleGroup;\n /** Controls whether the group operator is toggle-able. */\n isGroupOperatorDisabled?: boolean;\n /** Controls whether the last rule remaining in a group is deletable */\n allowLastRuleDelete?: boolean;\n}\n\n/**\n * Component that renders group of rules in [[PropertyFilterBuilder]] component.\n * @internal\n */\nexport function PropertyFilterBuilderRuleGroupRenderer(\n props: PropertyFilterBuilderRuleGroupRendererProps\n) {\n const { path, group, isGroupOperatorDisabled, allowLastRuleDelete } = props;\n const { actions } = React.useContext(PropertyFilterBuilderContext);\n const { onRuleAdded, groupRef } = useRulePropertyFocus(group.items.length);\n\n const onOperatorChange = React.useCallback(\n (operator: `${PropertyFilterRuleGroupOperator}`) => {\n actions.setRuleGroupOperator(path, operator);\n },\n [path, actions]\n );\n\n const showOperator = group.items.length > 1;\n\n return (\n <Flex\n ref={groupRef}\n style={{ alignSelf: \"flex-start\" }}\n className=\"fb-group\"\n gap=\"0px\"\n >\n {showOperator ? (\n <PropertyFilterBuilderRuleGroupOperator\n operator={group.operator}\n onChange={onOperatorChange}\n isGroupOperatorDisabled={isGroupOperatorDisabled}\n />\n ) : null}\n <div className=\"fb-wrapper\">\n {group.items.map((item) => (\n <div className=\"fb-row\" key={item.id}>\n <PropertyFilterBuilderGroupOrRule\n path={path}\n item={item}\n onRuleAdded={onRuleAdded}\n allowLastRuleDelete={allowLastRuleDelete}\n />\n </div>\n ))}\n </div>\n </Flex>\n );\n}\n\n/**\n * Props for [[PropertyFilterBuilderRuleGroupOperator]] component.\n * @internal\n */\nexport interface PropertyFilterBuilderRuleGroupOperatorProps {\n /** Currently selected operator. */\n operator: `${PropertyFilterRuleGroupOperator}`;\n /** Callback that is invoked when selected operator changes. */\n onChange: (operator: `${PropertyFilterRuleGroupOperator}`) => void;\n /** Controls whether the group operator is toggle-able. */\n isGroupOperatorDisabled?: boolean;\n}\n\n/**\n * Component that renders [[PropertyFilterBuilderRuleGroup]] operator selector.\n * @internal\n */\nexport function PropertyFilterBuilderRuleGroupOperator(\n props: PropertyFilterBuilderRuleGroupOperatorProps\n) {\n const { operator, isGroupOperatorDisabled, onChange } = props;\n\n return (\n <Flex.Item alignSelf=\"stretch\">\n <PropertyFilterBuilderLogicalOperator\n className=\"fb-group-operator\"\n operator={operator}\n onOperatorChange={onChange}\n isDisabled={isGroupOperatorDisabled}\n />\n </Flex.Item>\n );\n}\ninterface PropertyFilterBuilderGroupOrRuleProps {\n path: string[];\n item: PropertyFilterBuilderRuleGroupItem;\n onRuleAdded: () => void;\n allowLastRuleDelete?: boolean;\n}\n\nconst PropertyFilterBuilderGroupOrRule = React.memo(\n function PropertyFilterBuilderGroupOrRule({\n path,\n item,\n onRuleAdded,\n allowLastRuleDelete,\n }: PropertyFilterBuilderGroupOrRuleProps) {\n const itemPath = [...path, item.id];\n\n if (isPropertyFilterBuilderRuleGroup(item))\n return (\n <PropertyFilterBuilderRuleGroupRenderer path={itemPath} group={item} />\n );\n return (\n <PropertyFilterBuilderRuleRenderer\n path={itemPath}\n rule={item}\n onRuleAdded={onRuleAdded}\n allowLastRuleDelete={allowLastRuleDelete}\n />\n );\n }\n);\n\nconst useRulePropertyFocus = (currentGroupItemsLength: number) => {\n const previousGroupItemsLength = React.useRef<number>(0);\n const isNewRuleAdded = React.useRef<boolean>(false);\n const groupRef = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n if (\n isNewRuleAdded.current &&\n previousGroupItemsLength.current < currentGroupItemsLength &&\n groupRef.current\n ) {\n const ruleProperties =\n groupRef.current.querySelectorAll<HTMLInputElement>(\n \".fb-property-name input\"\n );\n ruleProperties[ruleProperties.length - 1].focus();\n isNewRuleAdded.current = false;\n }\n previousGroupItemsLength.current = currentGroupItemsLength;\n }, [currentGroupItemsLength]);\n\n return { onRuleAdded: () => (isNewRuleAdded.current = true), groupRef };\n};\n"]}
@@ -21,9 +21,4 @@ export interface PropertyFilterBuilderRuleOperatorProps {
21
21
  * @internal
22
22
  */
23
23
  export declare function PropertyFilterBuilderRuleOperatorRenderer(props: PropertyFilterBuilderRuleOperatorProps): React.JSX.Element;
24
- /**
25
- * Function that returns display label for [[PropertyFilterBuilderRuleOperator]].
26
- * @beta
27
- */
28
- export declare function getPropertyFilterBuilderOperatorLabel(operator: PropertyFilterBuilderRuleOperator): string;
29
24
  //# sourceMappingURL=FilterBuilderRuleOperator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBuilderRuleOperator.d.ts","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleOperator.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAC;AAIrE;;;GAGG;AACH,MAAM,WAAW,sCAAsC;IACrD,mCAAmC;IACnC,QAAQ,CAAC,EAAE,iCAAiC,CAAC;IAC7C,kEAAkE;IAClE,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,EAAE,CAAC,QAAQ,EAAE,iCAAiC,KAAK,IAAI,CAAC;CACjE;AAED;;;GAGG;AACH,wBAAgB,yCAAyC,CACvD,KAAK,EAAE,sCAAsC,qBAkC9C;AAED;;;GAGG;AACH,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,iCAAiC,UA8B5C"}
1
+ {"version":3,"file":"FilterBuilderRuleOperator.d.ts","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleOperator.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAC;AAIrE;;;GAGG;AACH,MAAM,WAAW,sCAAsC;IACrD,mCAAmC;IACnC,QAAQ,CAAC,EAAE,iCAAiC,CAAC;IAC7C,kEAAkE;IAClE,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,EAAE,CAAC,QAAQ,EAAE,iCAAiC,KAAK,IAAI,CAAC;CACjE;AAED;;;GAGG;AACH,wBAAgB,yCAAyC,CACvD,KAAK,EAAE,sCAAsC,qBAkC9C"}
@@ -8,13 +8,14 @@
8
8
  import * as React from "react";
9
9
  import { Select } from "@itwin/itwinui-react";
10
10
  import { getPropertyFilterBuilderOperators } from "./Operators";
11
- import { UiComponents } from "../UiComponents";
11
+ import { useTranslation } from "../l10n/useTranslation";
12
12
  /**
13
13
  * Component that renders [[PropertyFilterBuilderRuleRenderer]] operator selector.
14
14
  * @internal
15
15
  */
16
16
  export function PropertyFilterBuilderRuleOperatorRenderer(props) {
17
17
  const { operator, property, onChange } = props;
18
+ const getLabel = usePropertyFilterBuilderOperatorLabels();
18
19
  const availableOperators = React.useMemo(() => getPropertyFilterBuilderOperators(property), [property]);
19
20
  const selectedOperator = availableOperators.find((op) => op === operator) ?? availableOperators[0];
20
21
  React.useEffect(() => {
@@ -22,8 +23,8 @@ export function PropertyFilterBuilderRuleOperatorRenderer(props) {
22
23
  }, [onChange, selectedOperator]);
23
24
  const availableOptions = React.useMemo(() => availableOperators.map((op) => ({
24
25
  value: op,
25
- label: getPropertyFilterBuilderOperatorLabel(op),
26
- })), [availableOperators]);
26
+ label: getLabel(op),
27
+ })), [availableOperators, getLabel]);
27
28
  return (React.createElement("div", { className: "fb-row-condition" },
28
29
  React.createElement(Select, { options: availableOptions, value: selectedOperator, onChange: onChange, size: "small" })));
29
30
  }
@@ -31,34 +32,37 @@ export function PropertyFilterBuilderRuleOperatorRenderer(props) {
31
32
  * Function that returns display label for [[PropertyFilterBuilderRuleOperator]].
32
33
  * @beta
33
34
  */
34
- export function getPropertyFilterBuilderOperatorLabel(operator) {
35
- switch (operator) {
36
- case "is-true":
37
- return UiComponents.translate("filterBuilder.operators.isTrue");
38
- case "is-false":
39
- return UiComponents.translate("filterBuilder.operators.isFalse");
40
- case "is-equal":
41
- return UiComponents.translate("filterBuilder.operators.equal");
42
- case "is-not-equal":
43
- return UiComponents.translate("filterBuilder.operators.notEqual");
44
- case "greater":
45
- return ">";
46
- case "greater-or-equal":
47
- return ">=";
48
- case "less":
49
- return "<";
50
- case "less-or-equal":
51
- return "<=";
52
- case "like":
53
- return UiComponents.translate("filterBuilder.operators.contains");
54
- case "is-null":
55
- return UiComponents.translate("filterBuilder.operators.isNull");
56
- case "is-not-null":
57
- return UiComponents.translate("filterBuilder.operators.isNotNull");
58
- case "between":
59
- return UiComponents.translate("filterBuilder.operators.between");
60
- case "not-between":
61
- return UiComponents.translate("filterBuilder.operators.notBetween");
62
- }
35
+ function usePropertyFilterBuilderOperatorLabels() {
36
+ const { translate } = useTranslation();
37
+ return React.useCallback((operator) => {
38
+ switch (operator) {
39
+ case "is-true":
40
+ return translate("filterBuilder.operators.isTrue");
41
+ case "is-false":
42
+ return translate("filterBuilder.operators.isFalse");
43
+ case "is-equal":
44
+ return translate("filterBuilder.operators.equal");
45
+ case "is-not-equal":
46
+ return translate("filterBuilder.operators.notEqual");
47
+ case "greater":
48
+ return ">";
49
+ case "greater-or-equal":
50
+ return ">=";
51
+ case "less":
52
+ return "<";
53
+ case "less-or-equal":
54
+ return "<=";
55
+ case "like":
56
+ return translate("filterBuilder.operators.contains");
57
+ case "is-null":
58
+ return translate("filterBuilder.operators.isNull");
59
+ case "is-not-null":
60
+ return translate("filterBuilder.operators.isNotNull");
61
+ case "between":
62
+ return translate("filterBuilder.operators.between");
63
+ case "not-between":
64
+ return translate("filterBuilder.operators.notBetween");
65
+ }
66
+ }, [translate]);
63
67
  }
64
68
  //# sourceMappingURL=FilterBuilderRuleOperator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBuilderRuleOperator.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleOperator.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAe/C;;;GAGG;AACH,MAAM,UAAU,yCAAyC,CACvD,KAA6C;IAE7C,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAE/C,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CACtC,GAAG,EAAE,CAAC,iCAAiC,CAAC,QAAQ,CAAC,EACjD,CAAC,QAAQ,CAAC,CACX,CAAC;IACF,MAAM,gBAAgB,GACpB,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAE5E,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,CACpC,GAAG,EAAE,CACH,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,qCAAqC,CAAC,EAAE,CAAC;KACjD,CAAC,CAAC,EACL,CAAC,kBAAkB,CAAC,CACrB,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAC,kBAAkB;QAC/B,oBAAC,MAAM,IACL,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,OAAO,GACb,CACE,CACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qCAAqC,CACnD,QAA2C;IAE3C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAClE,KAAK,UAAU;YACb,OAAO,YAAY,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QACnE,KAAK,UAAU;YACb,OAAO,YAAY,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACjE,KAAK,cAAc;YACjB,OAAO,YAAY,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QACpE,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC;QACb,KAAK,kBAAkB;YACrB,OAAO,IAAI,CAAC;QACd,KAAK,MAAM;YACT,OAAO,GAAG,CAAC;QACb,KAAK,eAAe;YAClB,OAAO,IAAI,CAAC;QACd,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QACpE,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAClE,KAAK,aAAa;YAChB,OAAO,YAAY,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QACrE,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QACnE,KAAK,aAAa;YAChB,OAAO,YAAY,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;IACxE,CAAC;AACH,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module PropertyFilterBuilder\n */\n\nimport * as React from \"react\";\nimport { type PropertyDescription } from \"@itwin/appui-abstract\";\nimport { Select } from \"@itwin/itwinui-react\";\nimport type { PropertyFilterBuilderRuleOperator } from \"./Operators\";\nimport { getPropertyFilterBuilderOperators } from \"./Operators\";\nimport { UiComponents } from \"../UiComponents\";\n\n/**\n * Props for [[PropertyFilterBuilderRuleOperator]] component.\n * @beta\n */\nexport interface PropertyFilterBuilderRuleOperatorProps {\n /** Currently selected operator. */\n operator?: PropertyFilterBuilderRuleOperator;\n /** Property used in rule for which this operator will be used. */\n property: PropertyDescription;\n /** Callback that is invoked when selected operator changes. */\n onChange: (operator: PropertyFilterBuilderRuleOperator) => void;\n}\n\n/**\n * Component that renders [[PropertyFilterBuilderRuleRenderer]] operator selector.\n * @internal\n */\nexport function PropertyFilterBuilderRuleOperatorRenderer(\n props: PropertyFilterBuilderRuleOperatorProps\n) {\n const { operator, property, onChange } = props;\n\n const availableOperators = React.useMemo(\n () => getPropertyFilterBuilderOperators(property),\n [property]\n );\n const selectedOperator =\n availableOperators.find((op) => op === operator) ?? availableOperators[0];\n\n React.useEffect(() => {\n onChange(selectedOperator);\n }, [onChange, selectedOperator]);\n\n const availableOptions = React.useMemo(\n () =>\n availableOperators.map((op) => ({\n value: op,\n label: getPropertyFilterBuilderOperatorLabel(op),\n })),\n [availableOperators]\n );\n\n return (\n <div className=\"fb-row-condition\">\n <Select\n options={availableOptions}\n value={selectedOperator}\n onChange={onChange}\n size={\"small\"}\n />\n </div>\n );\n}\n\n/**\n * Function that returns display label for [[PropertyFilterBuilderRuleOperator]].\n * @beta\n */\nexport function getPropertyFilterBuilderOperatorLabel(\n operator: PropertyFilterBuilderRuleOperator\n) {\n switch (operator) {\n case \"is-true\":\n return UiComponents.translate(\"filterBuilder.operators.isTrue\");\n case \"is-false\":\n return UiComponents.translate(\"filterBuilder.operators.isFalse\");\n case \"is-equal\":\n return UiComponents.translate(\"filterBuilder.operators.equal\");\n case \"is-not-equal\":\n return UiComponents.translate(\"filterBuilder.operators.notEqual\");\n case \"greater\":\n return \">\";\n case \"greater-or-equal\":\n return \">=\";\n case \"less\":\n return \"<\";\n case \"less-or-equal\":\n return \"<=\";\n case \"like\":\n return UiComponents.translate(\"filterBuilder.operators.contains\");\n case \"is-null\":\n return UiComponents.translate(\"filterBuilder.operators.isNull\");\n case \"is-not-null\":\n return UiComponents.translate(\"filterBuilder.operators.isNotNull\");\n case \"between\":\n return UiComponents.translate(\"filterBuilder.operators.between\");\n case \"not-between\":\n return UiComponents.translate(\"filterBuilder.operators.notBetween\");\n }\n}\n"]}
1
+ {"version":3,"file":"FilterBuilderRuleOperator.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderRuleOperator.tsx"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAexD;;;GAGG;AACH,MAAM,UAAU,yCAAyC,CACvD,KAA6C;IAE7C,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC/C,MAAM,QAAQ,GAAG,sCAAsC,EAAE,CAAC;IAC1D,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CACtC,GAAG,EAAE,CAAC,iCAAiC,CAAC,QAAQ,CAAC,EACjD,CAAC,QAAQ,CAAC,CACX,CAAC;IACF,MAAM,gBAAgB,GACpB,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAE5E,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,CACpC,GAAG,EAAE,CACH,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;KACpB,CAAC,CAAC,EACL,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAC/B,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAC,kBAAkB;QAC/B,oBAAC,MAAM,IACL,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,OAAO,GACb,CACE,CACP,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,sCAAsC;IAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,CAAC;IAEvC,OAAO,KAAK,CAAC,WAAW,CACtB,CAAC,QAA2C,EAAE,EAAE;QAC9C,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,SAAS;gBACZ,OAAO,SAAS,CAAC,gCAAgC,CAAC,CAAC;YACrD,KAAK,UAAU;gBACb,OAAO,SAAS,CAAC,iCAAiC,CAAC,CAAC;YACtD,KAAK,UAAU;gBACb,OAAO,SAAS,CAAC,+BAA+B,CAAC,CAAC;YACpD,KAAK,cAAc;gBACjB,OAAO,SAAS,CAAC,kCAAkC,CAAC,CAAC;YACvD,KAAK,SAAS;gBACZ,OAAO,GAAG,CAAC;YACb,KAAK,kBAAkB;gBACrB,OAAO,IAAI,CAAC;YACd,KAAK,MAAM;gBACT,OAAO,GAAG,CAAC;YACb,KAAK,eAAe;gBAClB,OAAO,IAAI,CAAC;YACd,KAAK,MAAM;gBACT,OAAO,SAAS,CAAC,kCAAkC,CAAC,CAAC;YACvD,KAAK,SAAS;gBACZ,OAAO,SAAS,CAAC,gCAAgC,CAAC,CAAC;YACrD,KAAK,aAAa;gBAChB,OAAO,SAAS,CAAC,mCAAmC,CAAC,CAAC;YACxD,KAAK,SAAS;gBACZ,OAAO,SAAS,CAAC,iCAAiC,CAAC,CAAC;YACtD,KAAK,aAAa;gBAChB,OAAO,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,EACD,CAAC,SAAS,CAAC,CACZ,CAAC;AACJ,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module PropertyFilterBuilder\n */\n\nimport * as React from \"react\";\nimport { type PropertyDescription } from \"@itwin/appui-abstract\";\nimport { Select } from \"@itwin/itwinui-react\";\nimport type { PropertyFilterBuilderRuleOperator } from \"./Operators\";\nimport { getPropertyFilterBuilderOperators } from \"./Operators\";\nimport { useTranslation } from \"../l10n/useTranslation\";\n\n/**\n * Props for [[PropertyFilterBuilderRuleOperator]] component.\n * @beta\n */\nexport interface PropertyFilterBuilderRuleOperatorProps {\n /** Currently selected operator. */\n operator?: PropertyFilterBuilderRuleOperator;\n /** Property used in rule for which this operator will be used. */\n property: PropertyDescription;\n /** Callback that is invoked when selected operator changes. */\n onChange: (operator: PropertyFilterBuilderRuleOperator) => void;\n}\n\n/**\n * Component that renders [[PropertyFilterBuilderRuleRenderer]] operator selector.\n * @internal\n */\nexport function PropertyFilterBuilderRuleOperatorRenderer(\n props: PropertyFilterBuilderRuleOperatorProps\n) {\n const { operator, property, onChange } = props;\n const getLabel = usePropertyFilterBuilderOperatorLabels();\n const availableOperators = React.useMemo(\n () => getPropertyFilterBuilderOperators(property),\n [property]\n );\n const selectedOperator =\n availableOperators.find((op) => op === operator) ?? availableOperators[0];\n\n React.useEffect(() => {\n onChange(selectedOperator);\n }, [onChange, selectedOperator]);\n\n const availableOptions = React.useMemo(\n () =>\n availableOperators.map((op) => ({\n value: op,\n label: getLabel(op),\n })),\n [availableOperators, getLabel]\n );\n\n return (\n <div className=\"fb-row-condition\">\n <Select\n options={availableOptions}\n value={selectedOperator}\n onChange={onChange}\n size={\"small\"}\n />\n </div>\n );\n}\n\n/**\n * Function that returns display label for [[PropertyFilterBuilderRuleOperator]].\n * @beta\n */\nfunction usePropertyFilterBuilderOperatorLabels() {\n const { translate } = useTranslation();\n\n return React.useCallback(\n (operator: PropertyFilterBuilderRuleOperator) => {\n switch (operator) {\n case \"is-true\":\n return translate(\"filterBuilder.operators.isTrue\");\n case \"is-false\":\n return translate(\"filterBuilder.operators.isFalse\");\n case \"is-equal\":\n return translate(\"filterBuilder.operators.equal\");\n case \"is-not-equal\":\n return translate(\"filterBuilder.operators.notEqual\");\n case \"greater\":\n return \">\";\n case \"greater-or-equal\":\n return \">=\";\n case \"less\":\n return \"<\";\n case \"less-or-equal\":\n return \"<=\";\n case \"like\":\n return translate(\"filterBuilder.operators.contains\");\n case \"is-null\":\n return translate(\"filterBuilder.operators.isNull\");\n case \"is-not-null\":\n return translate(\"filterBuilder.operators.isNotNull\");\n case \"between\":\n return translate(\"filterBuilder.operators.between\");\n case \"not-between\":\n return translate(\"filterBuilder.operators.notBetween\");\n }\n },\n [translate]\n );\n}\n"]}
@@ -65,7 +65,7 @@ export declare class PropertyFilterBuilderActions {
65
65
  /** Adds new rule or group of rules to the group specified by path. */
66
66
  addItem(path: string[], item: "RULE_GROUP" | "RULE" | PropertyFilterRule | PropertyFilterRuleGroup): void;
67
67
  /** Removes item specified by path. */
68
- removeItem(path: string[]): void;
68
+ removeItem(path: string[], allowLastRuleDelete?: boolean): void;
69
69
  /** Removes all items from root group. */
70
70
  removeAllItems(): void;
71
71
  /** Sets operator of rule group specified by the path. */
@@ -125,9 +125,15 @@ export interface UsePropertyFilterBuilderResult {
125
125
  * @beta
126
126
  */
127
127
  export declare function usePropertyFilterBuilder(props?: UsePropertyFilterBuilderProps): UsePropertyFilterBuilderResult;
128
+ /**
129
+ * Creates default rule validator.
130
+ * @beta
131
+ */
132
+ export declare function useDefaultPropertyFilterBuilderRuleValidator(): (item: PropertyFilterBuilderRule) => string | undefined;
128
133
  /**
129
134
  * Default rule validator.
130
135
  * @beta
136
+ * @deprecated in 4.17.0. Use `useDefaultPropertyFilterBuilderRuleValidator` instead.
131
137
  */
132
138
  export declare function defaultPropertyFilterBuilderRuleValidator(item: PropertyFilterBuilderRule): string | undefined;
133
139
  /** @internal */
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBuilderState.d.ts","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderState.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FilterBuilderState.d.ts","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderState.ts"],"names":[],"mappings":"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"}
@@ -11,8 +11,8 @@ import { PropertyValueFormat } from "@itwin/appui-abstract";
11
11
  import { Guid } from "@itwin/core-bentley";
12
12
  import { isUnaryPropertyFilterBuilderOperator, isUnaryPropertyFilterOperator, } from "./Operators";
13
13
  import { isPropertyFilterRuleGroup } from "./Types";
14
- import { UiComponents } from "../UiComponents";
15
14
  import { PropertyFilterBuilderRuleRangeValue } from "./FilterBuilderRangeValue";
15
+ import { useTranslation } from "../l10n/useTranslation";
16
16
  /**
17
17
  * Function to check if supplied [[PropertyFilterBuilderRuleGroupItem]] is [[PropertyFilterBuilderRuleGroup]].
18
18
  * @beta
@@ -59,7 +59,7 @@ export class PropertyFilterBuilderActions {
59
59
  });
60
60
  }
61
61
  /** Removes item specified by path. */
62
- removeItem(path) {
62
+ removeItem(path, allowLastRuleDelete = false) {
63
63
  function removeItemFromGroup(state, pathToItem) {
64
64
  const pathToParent = pathToItem.slice(0, -1);
65
65
  const parentGroup = findRuleGroup(state.rootGroup, pathToParent);
@@ -71,7 +71,7 @@ export class PropertyFilterBuilderActions {
71
71
  if (itemIndex === -1) {
72
72
  return;
73
73
  }
74
- if (parentGroup.items.length === 1) {
74
+ if (parentGroup.items.length === 1 && !allowLastRuleDelete) {
75
75
  parentGroup.items[0] = createEmptyRule(parentGroup.id);
76
76
  return;
77
77
  }
@@ -171,39 +171,61 @@ export function usePropertyFilterBuilder(props) {
171
171
  ? convertFilterToState(initialFilter)
172
172
  : { rootGroup: createEmptyRuleGroup() });
173
173
  const [actions] = React.useState(() => new PropertyFilterBuilderActions(setState));
174
+ const validateRules = useRulesValidation(ruleValidator);
174
175
  const buildFilter = React.useCallback((options) => {
175
- const ruleErrors = validateRules(state.rootGroup, ruleValidator);
176
+ const ruleErrors = validateRules(state.rootGroup);
176
177
  if (!options?.ignoreErrors) {
177
178
  actions.setRuleErrorMessages(ruleErrors);
178
179
  }
179
180
  return ruleErrors.size === 0
180
181
  ? buildPropertyFilter(state.rootGroup)
181
182
  : undefined;
182
- }, [state.rootGroup, actions, ruleValidator]);
183
+ }, [state.rootGroup, actions, validateRules]);
183
184
  return { rootGroup: state.rootGroup, actions, buildFilter };
184
185
  }
185
- function validateRules(rule, ruleValidator) {
186
- const ruleIdsAndErrorMessages = new Map();
187
- const validateRulesInner = (item) => {
188
- if (isPropertyFilterBuilderRuleGroup(item)) {
189
- item.items.forEach((itm) => {
190
- validateRulesInner(itm);
191
- });
192
- }
193
- else {
194
- const errorMessage = ruleValidator
195
- ? ruleValidator(item)
196
- : defaultPropertyFilterBuilderRuleValidator(item);
197
- if (errorMessage)
198
- ruleIdsAndErrorMessages.set(item.id, errorMessage);
199
- }
200
- };
201
- validateRulesInner(rule);
202
- return ruleIdsAndErrorMessages;
186
+ function useRulesValidation(ruleValidator) {
187
+ const defaultValidator = useDefaultPropertyFilterBuilderRuleValidator();
188
+ const { translate } = useTranslation();
189
+ return React.useCallback((rootRule) => {
190
+ const ruleIdsAndErrorMessages = new Map();
191
+ const validateRulesInner = (item) => {
192
+ if (isPropertyFilterBuilderRuleGroup(item)) {
193
+ item.items.forEach((itm) => {
194
+ validateRulesInner(itm);
195
+ });
196
+ }
197
+ else {
198
+ const errorMessage = ruleValidator
199
+ ? ruleValidator(item)
200
+ : defaultValidator(item);
201
+ if (errorMessage)
202
+ ruleIdsAndErrorMessages.set(item.id,
203
+ // need to check if error message is a key for translation in case `ruleValidator` is using `defaultPropertyFilterBuilderRuleValidator` internally
204
+ errorMessage.startsWith("filterBuilder.errorMessages")
205
+ ? translate(errorMessage)
206
+ : errorMessage);
207
+ }
208
+ };
209
+ validateRulesInner(rootRule);
210
+ return ruleIdsAndErrorMessages;
211
+ }, [ruleValidator, defaultValidator, translate]);
212
+ }
213
+ /**
214
+ * Creates default rule validator.
215
+ * @beta
216
+ */
217
+ export function useDefaultPropertyFilterBuilderRuleValidator() {
218
+ const { translate } = useTranslation();
219
+ return React.useCallback((item) => {
220
+ // eslint-disable-next-line deprecation/deprecation
221
+ const errorMessage = defaultPropertyFilterBuilderRuleValidator(item);
222
+ return errorMessage ? translate(errorMessage) : undefined;
223
+ }, [translate]);
203
224
  }
204
225
  /**
205
226
  * Default rule validator.
206
227
  * @beta
228
+ * @deprecated in 4.17.0. Use `useDefaultPropertyFilterBuilderRuleValidator` instead.
207
229
  */
208
230
  export function defaultPropertyFilterBuilderRuleValidator(item) {
209
231
  if (item.property === undefined ||
@@ -215,17 +237,17 @@ export function defaultPropertyFilterBuilderRuleValidator(item) {
215
237
  return rangeRuleValidator(item.value);
216
238
  }
217
239
  if (isEmptyValue(item.value)) {
218
- return UiComponents.translate("filterBuilder.errorMessages.emptyValue");
240
+ return "filterBuilder.errorMessages.emptyValue";
219
241
  }
220
242
  return undefined;
221
243
  }
222
244
  function rangeRuleValidator(value) {
223
245
  const range = PropertyFilterBuilderRuleRangeValue.parse(value);
224
246
  if (isEmptyValue(range.from) || isEmptyValue(range.to)) {
225
- return UiComponents.translate("filterBuilder.errorMessages.emptyValue");
247
+ return "filterBuilder.errorMessages.emptyValue";
226
248
  }
227
249
  if (!PropertyFilterBuilderRuleRangeValue.isRangeValid(range)) {
228
- return UiComponents.translate("filterBuilder.errorMessages.invalidRange");
250
+ return "filterBuilder.errorMessages.invalidRange";
229
251
  }
230
252
  return undefined;
231
253
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBuilderState.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderState.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module PropertyFilterBuilder\n */\n\nimport type { Draft } from \"immer\";\nimport { produce } from \"immer\";\nimport * as React from \"react\";\nimport type { PropertyDescription, PropertyValue } from \"@itwin/appui-abstract\";\nimport { PropertyValueFormat } from \"@itwin/appui-abstract\";\nimport { Guid } from \"@itwin/core-bentley\";\nimport type {\n PropertyFilterBuilderRuleOperator,\n PropertyFilterRuleGroupOperator,\n} from \"./Operators\";\nimport {\n isUnaryPropertyFilterBuilderOperator,\n isUnaryPropertyFilterOperator,\n} from \"./Operators\";\nimport type {\n PropertyFilter,\n PropertyFilterRule,\n PropertyFilterRuleGroup,\n} from \"./Types\";\nimport { isPropertyFilterRuleGroup } from \"./Types\";\nimport { UiComponents } from \"../UiComponents\";\nimport { PropertyFilterBuilderRuleRangeValue } from \"./FilterBuilderRangeValue\";\n\n/**\n * Data structure that describes [[PropertyFilterBuilder]] component state.\n * @beta\n */\nexport interface PropertyFilterBuilderState {\n /** Root group of rules in [[PropertyFilterBuilder]] component. */\n rootGroup: PropertyFilterBuilderRuleGroup;\n}\n\n/**\n * Type that describes [[PropertyFilterBuilder]] component group item.\n * @beta\n */\nexport type PropertyFilterBuilderRuleGroupItem =\n | PropertyFilterBuilderRuleGroup\n | PropertyFilterBuilderRule;\n\n/**\n * Data structure that describes [[PropertyFilterBuilder]] component rule group.\n * @beta\n */\nexport interface PropertyFilterBuilderRuleGroup {\n /** Id of this rule group. */\n id: string;\n /** Id of rule group that this group is nested in. */\n groupId?: string;\n /** Operator that should join items in this group. */\n operator: `${PropertyFilterRuleGroupOperator}`;\n /** Items in this group. */\n items: PropertyFilterBuilderRuleGroupItem[];\n}\n\n/**\n * Data structure that describes [[PropertyFilterBuilder]] component single rule.\n * @beta\n */\nexport interface PropertyFilterBuilderRule {\n /** Id of this rule. */\n id: string;\n /** Id of rule group that this rule is nested in. */\n groupId: string;\n /** Property used in this rule. */\n property?: PropertyDescription;\n /** Operator that should be used to compare property value. */\n operator?: PropertyFilterBuilderRuleOperator;\n /** Value that property should be compared to. */\n value?: PropertyValue;\n /** Error message of this rule. */\n errorMessage?: string;\n}\n\n/**\n * Function to check if supplied [[PropertyFilterBuilderRuleGroupItem]] is [[PropertyFilterBuilderRuleGroup]].\n * @beta\n */\nexport function isPropertyFilterBuilderRuleGroup(\n item: PropertyFilterBuilderRuleGroupItem\n): item is PropertyFilterBuilderRuleGroup {\n return (item as any).items !== undefined;\n}\n\n/**\n * Actions for controlling [[PropertyFilterBuilder]] component state.\n * @beta\n */\nexport class PropertyFilterBuilderActions {\n constructor(\n private setState: (\n setter: (\n prevState: PropertyFilterBuilderState\n ) => PropertyFilterBuilderState\n ) => void\n ) {}\n\n private updateState(\n updater: (state: Draft<PropertyFilterBuilderState>) => void\n ) {\n this.setState(produce(updater));\n }\n\n /** Adds new rule or group of rules to the group specified by path. */\n public addItem(\n path: string[],\n item: \"RULE_GROUP\" | \"RULE\" | PropertyFilterRule | PropertyFilterRuleGroup\n ) {\n this.updateState((state) => {\n const parentGroup = findRuleGroup(state.rootGroup, path);\n if (!parentGroup) return;\n\n if (item === \"RULE\" || item === \"RULE_GROUP\") {\n const newItem =\n item === \"RULE_GROUP\"\n ? createEmptyRuleGroup(parentGroup.id)\n : createEmptyRule(parentGroup.id);\n parentGroup.items.push(newItem);\n return;\n }\n\n if (isPropertyFilterRuleGroup(item)) {\n const itemId = Guid.createValue();\n const newItem: PropertyFilterBuilderRuleGroup = {\n id: itemId,\n groupId: parentGroup.id,\n operator: item.operator,\n\n items: item.rules.map((rule) => getRuleGroupItem(rule, itemId)),\n };\n parentGroup.items.push(newItem);\n return;\n }\n\n parentGroup.items.push(getRuleItem(item, parentGroup.id));\n });\n }\n\n /** Removes item specified by path. */\n public removeItem(path: string[]) {\n function removeItemFromGroup(\n state: Draft<PropertyFilterBuilderState>,\n pathToItem: string[]\n ) {\n const pathToParent = pathToItem.slice(0, -1);\n const parentGroup = findRuleGroup(state.rootGroup, pathToParent);\n if (!parentGroup) {\n return;\n }\n\n const itemId = pathToItem[pathToItem.length - 1];\n const itemIndex = parentGroup.items.findIndex(\n (item) => item.id === itemId\n );\n if (itemIndex === -1) {\n return;\n }\n if (parentGroup.items.length === 1) {\n parentGroup.items[0] = createEmptyRule(parentGroup.id);\n return;\n }\n parentGroup.items.splice(itemIndex, 1);\n }\n\n this.updateState((state) => {\n removeItemFromGroup(state, path);\n });\n }\n\n /** Removes all items from root group. */\n public removeAllItems() {\n this.updateState((state) => {\n state.rootGroup = createEmptyRuleGroup();\n });\n }\n\n /** Sets operator of rule group specified by the path. */\n public setRuleGroupOperator(\n path: string[],\n operator: `${PropertyFilterRuleGroupOperator}`\n ) {\n this.updateState((state) => {\n const group = findRuleGroup(state.rootGroup, path);\n if (!group) {\n return;\n }\n group.operator = operator;\n });\n }\n\n /** Sets property of rule specified by the path. */\n public setRuleProperty(path: string[], property?: PropertyDescription) {\n this.updateState((state) => {\n const rule = findRule(state.rootGroup, path);\n if (!rule) {\n return;\n }\n rule.property = property;\n rule.operator = undefined;\n rule.value = undefined;\n rule.errorMessage = undefined;\n });\n }\n\n /** Sets operator of rule specified by the path. */\n public setRuleOperator(\n path: string[],\n operator: PropertyFilterBuilderRuleOperator\n ) {\n this.updateState((state) => {\n const rule = findRule(state.rootGroup, path);\n if (!rule) {\n return;\n }\n if (isUnaryPropertyFilterBuilderOperator(operator)) {\n rule.value = undefined;\n }\n if (\n operator !== rule.operator &&\n !areOperatorsSimilar(operator, rule.operator)\n ) {\n rule.value = undefined;\n }\n rule.operator = operator;\n });\n }\n\n /** Sets value of rule specified by the path. */\n public setRuleValue(path: string[], value: PropertyValue) {\n this.updateState((state) => {\n const rule = findRule(state.rootGroup, path);\n if (!rule) {\n return;\n }\n rule.value = value;\n });\n }\n\n /**\n * Sets error messages of the rules specified by id.\n * If rule id is not present in the map, then its error message will be cleared.\n */\n public setRuleErrorMessages(ruleIdsAndErrorMessages: Map<string, string>) {\n this.updateState((state) => {\n const setErrorMessages = (item: PropertyFilterBuilderRuleGroupItem) => {\n if (isPropertyFilterBuilderRuleGroup(item)) {\n item.items.forEach((itm) => {\n setErrorMessages(itm);\n });\n } else {\n item.errorMessage = ruleIdsAndErrorMessages.get(item.id);\n }\n };\n\n setErrorMessages(state.rootGroup);\n });\n }\n}\n\n/**\n * Props for [[usePropertyFilterBuilder]]\n * @beta\n */\nexport interface UsePropertyFilterBuilderProps {\n /** Initial filter for [[PropertyFilterBuilder]] */\n initialFilter?: PropertyFilter;\n /** Custom rule validator to be used when [[UsePropertyFilterBuilderResult.buildFilter]] is invoked. Should return error message or `undefined`, if rule is valid. */\n ruleValidator?: (rule: PropertyFilterBuilderRule) => string | undefined;\n}\n\n/**\n * Options for [[UsePropertyFilterBuilderResult.buildFilter]].\n * @beta\n */\nexport interface BuildFilterOptions {\n /**\n * Specifies whether errors encountered while validating filter rules should be ignored and not persisted in state.\n * This is useful in case component needs to get filter matching rule validator but does not want to show errors in UI.\n */\n ignoreErrors?: boolean;\n}\n\n/**\n * Type for [[usePropertyFilterBuilder]] return object.\n * @beta\n */\nexport interface UsePropertyFilterBuilderResult {\n /** Root group of the [[PropertyFilterBuilder]]. */\n rootGroup: PropertyFilterBuilderRuleGroup;\n /** Actions for manipulating [[PropertyFilterBuilder]] state. */\n actions: PropertyFilterBuilderActions;\n /**\n * Validates and builds [[PropertyFilter]] based on current state. It uses [[defaultPropertyFilterBuilderRuleValidator]] or\n * custom validator provided through [[UsePropertyFilterBuilderProps]] to validate each rule.\n * @returns [[PropertyFilter]] if all rules are valid, `undefined` otherwise.\n */\n buildFilter: (options?: BuildFilterOptions) => PropertyFilter | undefined;\n}\n\n/**\n * Custom hook that creates state for [[PropertyFilterBuilder]] component. It creates empty state or initializes\n * state from supplied initial filter.\n * @beta\n */\nexport function usePropertyFilterBuilder(\n props?: UsePropertyFilterBuilderProps\n): UsePropertyFilterBuilderResult {\n const { initialFilter, ruleValidator } = props ?? {\n initialFilter: undefined,\n ruleValidator: undefined,\n };\n const [state, setState] = React.useState<PropertyFilterBuilderState>(\n initialFilter\n ? convertFilterToState(initialFilter)\n : { rootGroup: createEmptyRuleGroup() }\n );\n\n const [actions] = React.useState(\n () => new PropertyFilterBuilderActions(setState)\n );\n\n const buildFilter = React.useCallback(\n (options?: BuildFilterOptions) => {\n const ruleErrors = validateRules(state.rootGroup, ruleValidator);\n if (!options?.ignoreErrors) {\n actions.setRuleErrorMessages(ruleErrors);\n }\n\n return ruleErrors.size === 0\n ? buildPropertyFilter(state.rootGroup)\n : undefined;\n },\n [state.rootGroup, actions, ruleValidator]\n );\n return { rootGroup: state.rootGroup, actions, buildFilter };\n}\n\nfunction validateRules(\n rule: PropertyFilterBuilderRuleGroupItem,\n ruleValidator?: (item: PropertyFilterBuilderRule) => string | undefined\n) {\n const ruleIdsAndErrorMessages = new Map<string, string>();\n\n const validateRulesInner = (item: PropertyFilterBuilderRuleGroupItem) => {\n if (isPropertyFilterBuilderRuleGroup(item)) {\n item.items.forEach((itm) => {\n validateRulesInner(itm);\n });\n } else {\n const errorMessage = ruleValidator\n ? ruleValidator(item)\n : defaultPropertyFilterBuilderRuleValidator(item);\n if (errorMessage) ruleIdsAndErrorMessages.set(item.id, errorMessage);\n }\n };\n\n validateRulesInner(rule);\n\n return ruleIdsAndErrorMessages;\n}\n\n/**\n * Default rule validator.\n * @beta\n */\nexport function defaultPropertyFilterBuilderRuleValidator(\n item: PropertyFilterBuilderRule\n): string | undefined {\n if (\n item.property === undefined ||\n item.operator === undefined ||\n isUnaryPropertyFilterBuilderOperator(item.operator)\n ) {\n return undefined;\n }\n if (item.operator === \"between\" || item.operator === \"not-between\") {\n return rangeRuleValidator(item.value);\n }\n if (isEmptyValue(item.value)) {\n return UiComponents.translate(\"filterBuilder.errorMessages.emptyValue\");\n }\n return undefined;\n}\n\nfunction rangeRuleValidator(value?: PropertyValue) {\n const range = PropertyFilterBuilderRuleRangeValue.parse(value);\n if (isEmptyValue(range.from) || isEmptyValue(range.to)) {\n return UiComponents.translate(\"filterBuilder.errorMessages.emptyValue\");\n }\n if (!PropertyFilterBuilderRuleRangeValue.isRangeValid(range)) {\n return UiComponents.translate(\"filterBuilder.errorMessages.invalidRange\");\n }\n return undefined;\n}\n\n/** @internal */\nexport function buildPropertyFilter(\n groupItem: PropertyFilterBuilderRuleGroupItem\n): PropertyFilter | undefined {\n if (isPropertyFilterBuilderRuleGroup(groupItem))\n return buildPropertyFilterFromRuleGroup(groupItem);\n return buildPropertyFilterFromRule(groupItem);\n}\n\nfunction buildPropertyFilterFromRuleGroup(\n rootGroup: PropertyFilterBuilderRuleGroup\n): PropertyFilter | undefined {\n const rules = new Array<PropertyFilter>();\n for (const item of rootGroup.items) {\n const rule = buildPropertyFilter(item);\n if (rule) rules.push(rule);\n }\n\n if (rules.length === 0) return undefined;\n\n if (rules.length === 1 && !isPropertyFilterRuleGroup(rules[0])) {\n return rules[0];\n }\n\n return {\n operator: rootGroup.operator,\n rules,\n };\n}\n\nfunction buildPropertyFilterFromRule(\n rule: PropertyFilterBuilderRule\n): PropertyFilter | undefined {\n const { property, operator, value } = rule;\n if (!property || operator === undefined) {\n return undefined;\n }\n\n if (operator === \"between\" || operator === \"not-between\") {\n return buildPropertyFilterFromRangeRule({\n ...rule,\n property,\n operator,\n value,\n });\n }\n\n if (!isUnaryPropertyFilterOperator(operator) && isEmptyValue(value)) {\n return undefined;\n }\n\n return { property, operator, value };\n}\n\nfunction buildPropertyFilterFromRangeRule(\n rule: PropertyFilterBuilderRule & {\n property: PropertyDescription;\n operator: \"between\" | \"not-between\";\n }\n): PropertyFilter | undefined {\n const { property, operator, value } = rule;\n if (\n !value ||\n value.valueFormat !== PropertyValueFormat.Primitive ||\n typeof value.value !== \"string\"\n ) {\n return undefined;\n }\n\n const { to, from } = PropertyFilterBuilderRuleRangeValue.parse(value);\n if (isEmptyValue(to) || isEmptyValue(from)) {\n return undefined;\n }\n\n return {\n operator: operator === \"between\" ? \"and\" : \"or\",\n rules: [\n {\n property,\n operator: operator === \"between\" ? \"greater-or-equal\" : \"less\",\n value: from,\n },\n {\n property,\n operator: operator === \"between\" ? \"less-or-equal\" : \"greater\",\n value: to,\n },\n ],\n };\n}\n\nfunction createEmptyRule(groupId: string): PropertyFilterBuilderRule {\n return {\n id: Guid.createValue(),\n groupId,\n };\n}\n\nfunction createEmptyRuleGroup(\n groupId?: string\n): PropertyFilterBuilderRuleGroup {\n const id = Guid.createValue();\n return {\n id,\n groupId,\n operator: \"and\",\n items: [createEmptyRule(id)],\n };\n}\n\nfunction findRuleGroup(\n rootGroup: PropertyFilterBuilderRuleGroup,\n path: string[]\n): PropertyFilterBuilderRuleGroup | undefined {\n if (path.length === 0) return rootGroup;\n\n const [currentItemId, ...rest] = path;\n const currentItem = rootGroup.items.find((item) => item.id === currentItemId);\n if (!currentItem || !isPropertyFilterBuilderRuleGroup(currentItem))\n return undefined;\n\n return findRuleGroup(currentItem, rest);\n}\n\nfunction findRule(\n rootGroup: PropertyFilterBuilderRuleGroup,\n path: string[]\n): PropertyFilterBuilderRule | undefined {\n if (path.length === 0) return undefined;\n\n const [currentItemId, ...rest] = path;\n const currentItem = rootGroup.items.find((item) => item.id === currentItemId);\n if (!currentItem) return undefined;\n\n if (isPropertyFilterBuilderRuleGroup(currentItem))\n return findRule(currentItem, rest);\n\n return currentItem;\n}\nfunction getRuleGroupItem(\n filter: PropertyFilter,\n parentId: string\n): PropertyFilterBuilderRuleGroupItem {\n const id = Guid.createValue();\n if (isPropertyFilterRuleGroup(filter)) {\n const rangeRule = getRangeRuleItems(filter, parentId);\n\n return rangeRule\n ? rangeRule\n : {\n id,\n groupId: parentId,\n operator: filter.operator,\n items: filter.rules.map((rule) => getRuleGroupItem(rule, id)),\n };\n }\n return getRuleItem(filter, id);\n}\n\nfunction getRuleItem(filter: PropertyFilterRule, parentId: string) {\n return {\n id: Guid.createValue(),\n groupId: parentId,\n property: filter.property,\n operator: filter.operator,\n value: filter.value,\n };\n}\n\nfunction getRangeRuleItems(\n group: PropertyFilterRuleGroup,\n parentId: string\n): PropertyFilterBuilderRuleGroupItem | undefined {\n if (group.rules.length !== 2) {\n return undefined;\n }\n\n const [from, to] = group.rules;\n if (\n isPropertyFilterRuleGroup(from) ||\n !from.value ||\n from.value.valueFormat !== PropertyValueFormat.Primitive ||\n isPropertyFilterRuleGroup(to) ||\n !to.value ||\n to.value.valueFormat !== PropertyValueFormat.Primitive ||\n from.property.name !== to.property.name\n ) {\n return undefined;\n }\n\n if (\n from.operator === \"greater-or-equal\" &&\n to.operator === \"less-or-equal\" &&\n group.operator === \"and\"\n ) {\n return {\n id: Guid.createValue(),\n groupId: parentId,\n operator: \"between\",\n property: from.property,\n value: PropertyFilterBuilderRuleRangeValue.serialize({\n from: from.value,\n to: to.value,\n }),\n };\n }\n\n if (\n from.operator === \"less\" &&\n to.operator === \"greater\" &&\n group.operator === \"or\"\n ) {\n return {\n id: Guid.createValue(),\n groupId: parentId,\n operator: \"not-between\",\n property: from.property,\n value: PropertyFilterBuilderRuleRangeValue.serialize({\n from: from.value,\n to: to.value,\n }),\n };\n }\n\n return undefined;\n}\n\nfunction convertFilterToState(\n filter: PropertyFilter\n): PropertyFilterBuilderState {\n const id = Guid.createValue();\n if (isPropertyFilterRuleGroup(filter)) {\n return {\n rootGroup: {\n id,\n operator: filter.operator,\n items: filter.rules.map((rule) => getRuleGroupItem(rule, id)),\n },\n };\n }\n return {\n rootGroup: {\n id,\n operator: \"and\",\n items: [getRuleItem(filter, id)],\n },\n };\n}\n\nfunction isEmptyValue(value?: PropertyValue) {\n return (\n value?.valueFormat !== PropertyValueFormat.Primitive ||\n value.value === undefined ||\n value.value === \"\"\n );\n}\n\nfunction areOperatorsSimilar(\n firstOperator?: PropertyFilterBuilderRuleOperator,\n secondOperator?: PropertyFilterBuilderRuleOperator\n) {\n return (\n (isOperatorEqualOrIsNotEqual(firstOperator) &&\n isOperatorEqualOrIsNotEqual(secondOperator)) ||\n (isInequalityOperator(firstOperator) &&\n isInequalityOperator(secondOperator)) ||\n (isRangeOperator(firstOperator) && isRangeOperator(secondOperator))\n );\n}\n\nfunction isOperatorEqualOrIsNotEqual(\n operator?: PropertyFilterBuilderRuleOperator\n) {\n return operator === \"is-equal\" || operator === \"is-not-equal\";\n}\n\nfunction isInequalityOperator(operator?: PropertyFilterBuilderRuleOperator) {\n return (\n operator === \"less\" ||\n operator === \"less-or-equal\" ||\n operator === \"greater\" ||\n operator === \"greater-or-equal\"\n );\n}\n\nfunction isRangeOperator(operator?: PropertyFilterBuilderRuleOperator) {\n return operator === \"between\" || operator === \"not-between\";\n}\n"]}
1
+ {"version":3,"file":"FilterBuilderState.js","sourceRoot":"","sources":["../../../../src/components-react/filter-builder/FilterBuilderState.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module PropertyFilterBuilder\n */\n\nimport type { Draft } from \"immer\";\nimport { produce } from \"immer\";\nimport * as React from \"react\";\nimport type { PropertyDescription, PropertyValue } from \"@itwin/appui-abstract\";\nimport { PropertyValueFormat } from \"@itwin/appui-abstract\";\nimport { Guid } from \"@itwin/core-bentley\";\nimport type {\n PropertyFilterBuilderRuleOperator,\n PropertyFilterRuleGroupOperator,\n} from \"./Operators\";\nimport {\n isUnaryPropertyFilterBuilderOperator,\n isUnaryPropertyFilterOperator,\n} from \"./Operators\";\nimport type {\n PropertyFilter,\n PropertyFilterRule,\n PropertyFilterRuleGroup,\n} from \"./Types\";\nimport { isPropertyFilterRuleGroup } from \"./Types\";\nimport { PropertyFilterBuilderRuleRangeValue } from \"./FilterBuilderRangeValue\";\nimport { useTranslation } from \"../l10n/useTranslation\";\n\n/**\n * Data structure that describes [[PropertyFilterBuilder]] component state.\n * @beta\n */\nexport interface PropertyFilterBuilderState {\n /** Root group of rules in [[PropertyFilterBuilder]] component. */\n rootGroup: PropertyFilterBuilderRuleGroup;\n}\n\n/**\n * Type that describes [[PropertyFilterBuilder]] component group item.\n * @beta\n */\nexport type PropertyFilterBuilderRuleGroupItem =\n | PropertyFilterBuilderRuleGroup\n | PropertyFilterBuilderRule;\n\n/**\n * Data structure that describes [[PropertyFilterBuilder]] component rule group.\n * @beta\n */\nexport interface PropertyFilterBuilderRuleGroup {\n /** Id of this rule group. */\n id: string;\n /** Id of rule group that this group is nested in. */\n groupId?: string;\n /** Operator that should join items in this group. */\n operator: `${PropertyFilterRuleGroupOperator}`;\n /** Items in this group. */\n items: PropertyFilterBuilderRuleGroupItem[];\n}\n\n/**\n * Data structure that describes [[PropertyFilterBuilder]] component single rule.\n * @beta\n */\nexport interface PropertyFilterBuilderRule {\n /** Id of this rule. */\n id: string;\n /** Id of rule group that this rule is nested in. */\n groupId: string;\n /** Property used in this rule. */\n property?: PropertyDescription;\n /** Operator that should be used to compare property value. */\n operator?: PropertyFilterBuilderRuleOperator;\n /** Value that property should be compared to. */\n value?: PropertyValue;\n /** Error message of this rule. */\n errorMessage?: string;\n}\n\n/**\n * Function to check if supplied [[PropertyFilterBuilderRuleGroupItem]] is [[PropertyFilterBuilderRuleGroup]].\n * @beta\n */\nexport function isPropertyFilterBuilderRuleGroup(\n item: PropertyFilterBuilderRuleGroupItem\n): item is PropertyFilterBuilderRuleGroup {\n return (item as any).items !== undefined;\n}\n\n/**\n * Actions for controlling [[PropertyFilterBuilder]] component state.\n * @beta\n */\nexport class PropertyFilterBuilderActions {\n constructor(\n private setState: (\n setter: (\n prevState: PropertyFilterBuilderState\n ) => PropertyFilterBuilderState\n ) => void\n ) {}\n\n private updateState(\n updater: (state: Draft<PropertyFilterBuilderState>) => void\n ) {\n this.setState(produce(updater));\n }\n\n /** Adds new rule or group of rules to the group specified by path. */\n public addItem(\n path: string[],\n item: \"RULE_GROUP\" | \"RULE\" | PropertyFilterRule | PropertyFilterRuleGroup\n ) {\n this.updateState((state) => {\n const parentGroup = findRuleGroup(state.rootGroup, path);\n if (!parentGroup) return;\n\n if (item === \"RULE\" || item === \"RULE_GROUP\") {\n const newItem =\n item === \"RULE_GROUP\"\n ? createEmptyRuleGroup(parentGroup.id)\n : createEmptyRule(parentGroup.id);\n parentGroup.items.push(newItem);\n return;\n }\n\n if (isPropertyFilterRuleGroup(item)) {\n const itemId = Guid.createValue();\n const newItem: PropertyFilterBuilderRuleGroup = {\n id: itemId,\n groupId: parentGroup.id,\n operator: item.operator,\n\n items: item.rules.map((rule) => getRuleGroupItem(rule, itemId)),\n };\n parentGroup.items.push(newItem);\n return;\n }\n\n parentGroup.items.push(getRuleItem(item, parentGroup.id));\n });\n }\n\n /** Removes item specified by path. */\n public removeItem(path: string[], allowLastRuleDelete: boolean = false) {\n function removeItemFromGroup(\n state: Draft<PropertyFilterBuilderState>,\n pathToItem: string[]\n ) {\n const pathToParent = pathToItem.slice(0, -1);\n const parentGroup = findRuleGroup(state.rootGroup, pathToParent);\n if (!parentGroup) {\n return;\n }\n\n const itemId = pathToItem[pathToItem.length - 1];\n const itemIndex = parentGroup.items.findIndex(\n (item) => item.id === itemId\n );\n if (itemIndex === -1) {\n return;\n }\n if (parentGroup.items.length === 1 && !allowLastRuleDelete) {\n parentGroup.items[0] = createEmptyRule(parentGroup.id);\n return;\n }\n parentGroup.items.splice(itemIndex, 1);\n }\n\n this.updateState((state) => {\n removeItemFromGroup(state, path);\n });\n }\n\n /** Removes all items from root group. */\n public removeAllItems() {\n this.updateState((state) => {\n state.rootGroup = createEmptyRuleGroup();\n });\n }\n\n /** Sets operator of rule group specified by the path. */\n public setRuleGroupOperator(\n path: string[],\n operator: `${PropertyFilterRuleGroupOperator}`\n ) {\n this.updateState((state) => {\n const group = findRuleGroup(state.rootGroup, path);\n if (!group) {\n return;\n }\n group.operator = operator;\n });\n }\n\n /** Sets property of rule specified by the path. */\n public setRuleProperty(path: string[], property?: PropertyDescription) {\n this.updateState((state) => {\n const rule = findRule(state.rootGroup, path);\n if (!rule) {\n return;\n }\n rule.property = property;\n rule.operator = undefined;\n rule.value = undefined;\n rule.errorMessage = undefined;\n });\n }\n\n /** Sets operator of rule specified by the path. */\n public setRuleOperator(\n path: string[],\n operator: PropertyFilterBuilderRuleOperator\n ) {\n this.updateState((state) => {\n const rule = findRule(state.rootGroup, path);\n if (!rule) {\n return;\n }\n if (isUnaryPropertyFilterBuilderOperator(operator)) {\n rule.value = undefined;\n }\n if (\n operator !== rule.operator &&\n !areOperatorsSimilar(operator, rule.operator)\n ) {\n rule.value = undefined;\n }\n rule.operator = operator;\n });\n }\n\n /** Sets value of rule specified by the path. */\n public setRuleValue(path: string[], value: PropertyValue) {\n this.updateState((state) => {\n const rule = findRule(state.rootGroup, path);\n if (!rule) {\n return;\n }\n rule.value = value;\n });\n }\n\n /**\n * Sets error messages of the rules specified by id.\n * If rule id is not present in the map, then its error message will be cleared.\n */\n public setRuleErrorMessages(ruleIdsAndErrorMessages: Map<string, string>) {\n this.updateState((state) => {\n const setErrorMessages = (item: PropertyFilterBuilderRuleGroupItem) => {\n if (isPropertyFilterBuilderRuleGroup(item)) {\n item.items.forEach((itm) => {\n setErrorMessages(itm);\n });\n } else {\n item.errorMessage = ruleIdsAndErrorMessages.get(item.id);\n }\n };\n\n setErrorMessages(state.rootGroup);\n });\n }\n}\n\n/**\n * Props for [[usePropertyFilterBuilder]]\n * @beta\n */\nexport interface UsePropertyFilterBuilderProps {\n /** Initial filter for [[PropertyFilterBuilder]] */\n initialFilter?: PropertyFilter;\n /** Custom rule validator to be used when [[UsePropertyFilterBuilderResult.buildFilter]] is invoked. Should return error message or `undefined`, if rule is valid. */\n ruleValidator?: (rule: PropertyFilterBuilderRule) => string | undefined;\n}\n\n/**\n * Options for [[UsePropertyFilterBuilderResult.buildFilter]].\n * @beta\n */\nexport interface BuildFilterOptions {\n /**\n * Specifies whether errors encountered while validating filter rules should be ignored and not persisted in state.\n * This is useful in case component needs to get filter matching rule validator but does not want to show errors in UI.\n */\n ignoreErrors?: boolean;\n}\n\n/**\n * Type for [[usePropertyFilterBuilder]] return object.\n * @beta\n */\nexport interface UsePropertyFilterBuilderResult {\n /** Root group of the [[PropertyFilterBuilder]]. */\n rootGroup: PropertyFilterBuilderRuleGroup;\n /** Actions for manipulating [[PropertyFilterBuilder]] state. */\n actions: PropertyFilterBuilderActions;\n /**\n * Validates and builds [[PropertyFilter]] based on current state. It uses [[defaultPropertyFilterBuilderRuleValidator]] or\n * custom validator provided through [[UsePropertyFilterBuilderProps]] to validate each rule.\n * @returns [[PropertyFilter]] if all rules are valid, `undefined` otherwise.\n */\n buildFilter: (options?: BuildFilterOptions) => PropertyFilter | undefined;\n}\n\n/**\n * Custom hook that creates state for [[PropertyFilterBuilder]] component. It creates empty state or initializes\n * state from supplied initial filter.\n * @beta\n */\nexport function usePropertyFilterBuilder(\n props?: UsePropertyFilterBuilderProps\n): UsePropertyFilterBuilderResult {\n const { initialFilter, ruleValidator } = props ?? {\n initialFilter: undefined,\n ruleValidator: undefined,\n };\n const [state, setState] = React.useState<PropertyFilterBuilderState>(\n initialFilter\n ? convertFilterToState(initialFilter)\n : { rootGroup: createEmptyRuleGroup() }\n );\n\n const [actions] = React.useState(\n () => new PropertyFilterBuilderActions(setState)\n );\n\n const validateRules = useRulesValidation(ruleValidator);\n const buildFilter = React.useCallback(\n (options?: BuildFilterOptions) => {\n const ruleErrors = validateRules(state.rootGroup);\n if (!options?.ignoreErrors) {\n actions.setRuleErrorMessages(ruleErrors);\n }\n\n return ruleErrors.size === 0\n ? buildPropertyFilter(state.rootGroup)\n : undefined;\n },\n [state.rootGroup, actions, validateRules]\n );\n return { rootGroup: state.rootGroup, actions, buildFilter };\n}\n\nfunction useRulesValidation(\n ruleValidator?: (item: PropertyFilterBuilderRule) => string | undefined\n) {\n const defaultValidator = useDefaultPropertyFilterBuilderRuleValidator();\n const { translate } = useTranslation();\n return React.useCallback(\n (rootRule: PropertyFilterBuilderRuleGroupItem) => {\n const ruleIdsAndErrorMessages = new Map<string, string>();\n const validateRulesInner = (item: PropertyFilterBuilderRuleGroupItem) => {\n if (isPropertyFilterBuilderRuleGroup(item)) {\n item.items.forEach((itm) => {\n validateRulesInner(itm);\n });\n } else {\n const errorMessage = ruleValidator\n ? ruleValidator(item)\n : defaultValidator(item);\n if (errorMessage)\n ruleIdsAndErrorMessages.set(\n item.id,\n // need to check if error message is a key for translation in case `ruleValidator` is using `defaultPropertyFilterBuilderRuleValidator` internally\n errorMessage.startsWith(\"filterBuilder.errorMessages\")\n ? translate(errorMessage)\n : errorMessage\n );\n }\n };\n validateRulesInner(rootRule);\n return ruleIdsAndErrorMessages;\n },\n [ruleValidator, defaultValidator, translate]\n );\n}\n\n/**\n * Creates default rule validator.\n * @beta\n */\nexport function useDefaultPropertyFilterBuilderRuleValidator() {\n const { translate } = useTranslation();\n return React.useCallback(\n (item: PropertyFilterBuilderRule) => {\n // eslint-disable-next-line deprecation/deprecation\n const errorMessage = defaultPropertyFilterBuilderRuleValidator(item);\n return errorMessage ? translate(errorMessage) : undefined;\n },\n [translate]\n );\n}\n\n/**\n * Default rule validator.\n * @beta\n * @deprecated in 4.17.0. Use `useDefaultPropertyFilterBuilderRuleValidator` instead.\n */\nexport function defaultPropertyFilterBuilderRuleValidator(\n item: PropertyFilterBuilderRule\n): string | undefined {\n if (\n item.property === undefined ||\n item.operator === undefined ||\n isUnaryPropertyFilterBuilderOperator(item.operator)\n ) {\n return undefined;\n }\n if (item.operator === \"between\" || item.operator === \"not-between\") {\n return rangeRuleValidator(item.value);\n }\n if (isEmptyValue(item.value)) {\n return \"filterBuilder.errorMessages.emptyValue\";\n }\n return undefined;\n}\n\nfunction rangeRuleValidator(value?: PropertyValue) {\n const range = PropertyFilterBuilderRuleRangeValue.parse(value);\n if (isEmptyValue(range.from) || isEmptyValue(range.to)) {\n return \"filterBuilder.errorMessages.emptyValue\";\n }\n if (!PropertyFilterBuilderRuleRangeValue.isRangeValid(range)) {\n return \"filterBuilder.errorMessages.invalidRange\";\n }\n return undefined;\n}\n\n/** @internal */\nexport function buildPropertyFilter(\n groupItem: PropertyFilterBuilderRuleGroupItem\n): PropertyFilter | undefined {\n if (isPropertyFilterBuilderRuleGroup(groupItem))\n return buildPropertyFilterFromRuleGroup(groupItem);\n return buildPropertyFilterFromRule(groupItem);\n}\n\nfunction buildPropertyFilterFromRuleGroup(\n rootGroup: PropertyFilterBuilderRuleGroup\n): PropertyFilter | undefined {\n const rules = new Array<PropertyFilter>();\n for (const item of rootGroup.items) {\n const rule = buildPropertyFilter(item);\n if (rule) rules.push(rule);\n }\n\n if (rules.length === 0) return undefined;\n\n if (rules.length === 1 && !isPropertyFilterRuleGroup(rules[0])) {\n return rules[0];\n }\n\n return {\n operator: rootGroup.operator,\n rules,\n };\n}\n\nfunction buildPropertyFilterFromRule(\n rule: PropertyFilterBuilderRule\n): PropertyFilter | undefined {\n const { property, operator, value } = rule;\n if (!property || operator === undefined) {\n return undefined;\n }\n\n if (operator === \"between\" || operator === \"not-between\") {\n return buildPropertyFilterFromRangeRule({\n ...rule,\n property,\n operator,\n value,\n });\n }\n\n if (!isUnaryPropertyFilterOperator(operator) && isEmptyValue(value)) {\n return undefined;\n }\n\n return { property, operator, value };\n}\n\nfunction buildPropertyFilterFromRangeRule(\n rule: PropertyFilterBuilderRule & {\n property: PropertyDescription;\n operator: \"between\" | \"not-between\";\n }\n): PropertyFilter | undefined {\n const { property, operator, value } = rule;\n if (\n !value ||\n value.valueFormat !== PropertyValueFormat.Primitive ||\n typeof value.value !== \"string\"\n ) {\n return undefined;\n }\n\n const { to, from } = PropertyFilterBuilderRuleRangeValue.parse(value);\n if (isEmptyValue(to) || isEmptyValue(from)) {\n return undefined;\n }\n\n return {\n operator: operator === \"between\" ? \"and\" : \"or\",\n rules: [\n {\n property,\n operator: operator === \"between\" ? \"greater-or-equal\" : \"less\",\n value: from,\n },\n {\n property,\n operator: operator === \"between\" ? \"less-or-equal\" : \"greater\",\n value: to,\n },\n ],\n };\n}\n\nfunction createEmptyRule(groupId: string): PropertyFilterBuilderRule {\n return {\n id: Guid.createValue(),\n groupId,\n };\n}\n\nfunction createEmptyRuleGroup(\n groupId?: string\n): PropertyFilterBuilderRuleGroup {\n const id = Guid.createValue();\n return {\n id,\n groupId,\n operator: \"and\",\n items: [createEmptyRule(id)],\n };\n}\n\nfunction findRuleGroup(\n rootGroup: PropertyFilterBuilderRuleGroup,\n path: string[]\n): PropertyFilterBuilderRuleGroup | undefined {\n if (path.length === 0) return rootGroup;\n\n const [currentItemId, ...rest] = path;\n const currentItem = rootGroup.items.find((item) => item.id === currentItemId);\n if (!currentItem || !isPropertyFilterBuilderRuleGroup(currentItem))\n return undefined;\n\n return findRuleGroup(currentItem, rest);\n}\n\nfunction findRule(\n rootGroup: PropertyFilterBuilderRuleGroup,\n path: string[]\n): PropertyFilterBuilderRule | undefined {\n if (path.length === 0) return undefined;\n\n const [currentItemId, ...rest] = path;\n const currentItem = rootGroup.items.find((item) => item.id === currentItemId);\n if (!currentItem) return undefined;\n\n if (isPropertyFilterBuilderRuleGroup(currentItem))\n return findRule(currentItem, rest);\n\n return currentItem;\n}\nfunction getRuleGroupItem(\n filter: PropertyFilter,\n parentId: string\n): PropertyFilterBuilderRuleGroupItem {\n const id = Guid.createValue();\n if (isPropertyFilterRuleGroup(filter)) {\n const rangeRule = getRangeRuleItems(filter, parentId);\n\n return rangeRule\n ? rangeRule\n : {\n id,\n groupId: parentId,\n operator: filter.operator,\n items: filter.rules.map((rule) => getRuleGroupItem(rule, id)),\n };\n }\n return getRuleItem(filter, id);\n}\n\nfunction getRuleItem(filter: PropertyFilterRule, parentId: string) {\n return {\n id: Guid.createValue(),\n groupId: parentId,\n property: filter.property,\n operator: filter.operator,\n value: filter.value,\n };\n}\n\nfunction getRangeRuleItems(\n group: PropertyFilterRuleGroup,\n parentId: string\n): PropertyFilterBuilderRuleGroupItem | undefined {\n if (group.rules.length !== 2) {\n return undefined;\n }\n\n const [from, to] = group.rules;\n if (\n isPropertyFilterRuleGroup(from) ||\n !from.value ||\n from.value.valueFormat !== PropertyValueFormat.Primitive ||\n isPropertyFilterRuleGroup(to) ||\n !to.value ||\n to.value.valueFormat !== PropertyValueFormat.Primitive ||\n from.property.name !== to.property.name\n ) {\n return undefined;\n }\n\n if (\n from.operator === \"greater-or-equal\" &&\n to.operator === \"less-or-equal\" &&\n group.operator === \"and\"\n ) {\n return {\n id: Guid.createValue(),\n groupId: parentId,\n operator: \"between\",\n property: from.property,\n value: PropertyFilterBuilderRuleRangeValue.serialize({\n from: from.value,\n to: to.value,\n }),\n };\n }\n\n if (\n from.operator === \"less\" &&\n to.operator === \"greater\" &&\n group.operator === \"or\"\n ) {\n return {\n id: Guid.createValue(),\n groupId: parentId,\n operator: \"not-between\",\n property: from.property,\n value: PropertyFilterBuilderRuleRangeValue.serialize({\n from: from.value,\n to: to.value,\n }),\n };\n }\n\n return undefined;\n}\n\nfunction convertFilterToState(\n filter: PropertyFilter\n): PropertyFilterBuilderState {\n const id = Guid.createValue();\n if (isPropertyFilterRuleGroup(filter)) {\n return {\n rootGroup: {\n id,\n operator: filter.operator,\n items: filter.rules.map((rule) => getRuleGroupItem(rule, id)),\n },\n };\n }\n return {\n rootGroup: {\n id,\n operator: \"and\",\n items: [getRuleItem(filter, id)],\n },\n };\n}\n\nfunction isEmptyValue(value?: PropertyValue) {\n return (\n value?.valueFormat !== PropertyValueFormat.Primitive ||\n value.value === undefined ||\n value.value === \"\"\n );\n}\n\nfunction areOperatorsSimilar(\n firstOperator?: PropertyFilterBuilderRuleOperator,\n secondOperator?: PropertyFilterBuilderRuleOperator\n) {\n return (\n (isOperatorEqualOrIsNotEqual(firstOperator) &&\n isOperatorEqualOrIsNotEqual(secondOperator)) ||\n (isInequalityOperator(firstOperator) &&\n isInequalityOperator(secondOperator)) ||\n (isRangeOperator(firstOperator) && isRangeOperator(secondOperator))\n );\n}\n\nfunction isOperatorEqualOrIsNotEqual(\n operator?: PropertyFilterBuilderRuleOperator\n) {\n return operator === \"is-equal\" || operator === \"is-not-equal\";\n}\n\nfunction isInequalityOperator(operator?: PropertyFilterBuilderRuleOperator) {\n return (\n operator === \"less\" ||\n operator === \"less-or-equal\" ||\n operator === \"greater\" ||\n operator === \"greater-or-equal\"\n );\n}\n\nfunction isRangeOperator(operator?: PropertyFilterBuilderRuleOperator) {\n return operator === \"between\" || operator === \"not-between\";\n}\n"]}
@@ -7,6 +7,7 @@ import type { ParseResults } from "@itwin/appui-abstract";
7
7
  import "./ParsedInput.scss";
8
8
  /** Props for [[ParsedInput]] control
9
9
  * @public
10
+ * @deprecated in 4.17.0. Use `React.ComponentProps<typeof ParsedInput>`
10
11
  */
11
12
  export interface ParsedInputProps extends CommonProps {
12
13
  /** InitialValue which is used to restore input field if ESC is pressed */
@@ -1 +1 @@
1
- {"version":3,"file":"ParsedInput.d.ts","sourceRoot":"","sources":["../../../../src/components-react/inputs/ParsedInput.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,oBAAoB,CAAC;AAE5B;;GAEG;AAEH,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,qDAAqD;IACrD,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,YAAY,CAAC;IACnD,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;CACnC;AA0HD;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,KAAK,CAAC,SACtC,CAAC"}
1
+ {"version":3,"file":"ParsedInput.d.ts","sourceRoot":"","sources":["../../../../src/components-react/inputs/ParsedInput.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,oBAAoB,CAAC;AAE5B;;;GAGG;AAEH,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,qDAAqD;IACrD,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,YAAY,CAAC;IACnD,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;CACnC;AA2HD;;GAEG;AAEH,eAAO,MAAM,WAAW,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,KAAK,CAAC,SACtC,CAAC"}
@@ -78,5 +78,6 @@ const ForwardRefParsedInput = React.forwardRef(function ForwardRefParsedInput({
78
78
  /** Generic Input component that requires formatting and parsing functions to be passed in as props.
79
79
  * @public
80
80
  */
81
+ // eslint-disable-next-line deprecation/deprecation
81
82
  export const ParsedInput = ForwardRefParsedInput;
82
83
  //# sourceMappingURL=ParsedInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ParsedInput.js","sourceRoot":"","sources":["../../../../src/components-react/inputs/ParsedInput.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Inputs\n */\n\nimport * as React from \"react\";\nimport classnames from \"classnames\";\nimport { Key } from \"ts-key-enum\";\nimport { Input } from \"@itwin/itwinui-react\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport type { ParseResults } from \"@itwin/appui-abstract\";\nimport \"./ParsedInput.scss\";\n\n/** Props for [[ParsedInput]] control\n * @public\n */\n// eslint-disable-next-line deprecation/deprecation\nexport interface ParsedInputProps extends CommonProps {\n /** InitialValue which is used to restore input field if ESC is pressed */\n initialValue: number;\n /** Function used to format the value */\n formatValue: (value: number) => string;\n /** Function used to parse user input into a value */\n parseString: (stringValue: string) => ParseResults;\n /** Function to call when value is changed */\n onChange?: (newValue: number) => void;\n /** if readonly then only the formatValue function is used. */\n readonly?: boolean;\n /** Provides ability to return reference to HTMLInputElement */\n ref?: React.Ref<HTMLInputElement>;\n}\n\nconst ForwardRefParsedInput = React.forwardRef<\n HTMLInputElement,\n ParsedInputProps\n>(function ForwardRefParsedInput(\n {\n initialValue,\n formatValue,\n parseString,\n readonly,\n className,\n style,\n onChange,\n },\n ref\n) {\n const currentValueRef = React.useRef(initialValue);\n const isMountedRef = React.useRef(false);\n const lastFormattedValueRef = React.useRef(formatValue(initialValue));\n const [formattedValue, setFormattedValue] = React.useState(\n () => lastFormattedValueRef.current\n );\n const [hasBadInput, setHasBadInput] = React.useState(false);\n\n React.useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // See if new initialValue props have changed since component mounted\n React.useEffect(() => {\n currentValueRef.current = initialValue;\n const currentFormattedValue = formatValue(currentValueRef.current);\n if (currentFormattedValue !== lastFormattedValueRef.current) {\n lastFormattedValueRef.current = currentFormattedValue;\n setFormattedValue(lastFormattedValueRef.current);\n setHasBadInput(false);\n }\n }, [formatValue, initialValue]);\n\n const handleChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setFormattedValue(event.currentTarget.value);\n },\n []\n );\n\n const updateValueFromString = React.useCallback(\n (strVal: string) => {\n if (lastFormattedValueRef.current === strVal) return;\n\n const parseResults = parseString(strVal);\n if (!parseResults.parseError) {\n if (\n undefined !== parseResults.value &&\n typeof parseResults.value === \"number\"\n ) {\n const currentValue = parseResults.value;\n if (currentValue !== currentValueRef.current) {\n currentValueRef.current = currentValue;\n onChange && onChange(currentValueRef.current);\n }\n if (isMountedRef.current) {\n lastFormattedValueRef.current = formatValue(currentValue);\n setFormattedValue(lastFormattedValueRef.current);\n setHasBadInput(false);\n }\n }\n } else {\n setHasBadInput(true);\n }\n },\n [formatValue, onChange, parseString]\n );\n\n const handleBlur = React.useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n updateValueFromString(event.target.value);\n },\n [updateValueFromString]\n );\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === Key.Enter.valueOf()) {\n updateValueFromString(event.currentTarget.value);\n event.preventDefault();\n }\n if (event.key === Key.Escape.valueOf()) {\n setFormattedValue(formatValue(currentValueRef.current));\n setHasBadInput(false);\n event.preventDefault();\n }\n },\n [formatValue, updateValueFromString]\n );\n\n const classNames = classnames(\n className,\n \"components-parsed-input\",\n hasBadInput && \"components-parsed-input-has-error\"\n );\n\n return (\n <Input\n data-testid=\"components-parsed-input\"\n ref={ref}\n style={style}\n className={classNames}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onChange={handleChange}\n value={formattedValue}\n disabled={readonly}\n size=\"small\"\n />\n );\n});\n\n/** Generic Input component that requires formatting and parsing functions to be passed in as props.\n * @public\n */\nexport const ParsedInput: (props: ParsedInputProps) => React.ReactNode =\n ForwardRefParsedInput;\n"]}
1
+ {"version":3,"file":"ParsedInput.js","sourceRoot":"","sources":["../../../../src/components-react/inputs/ParsedInput.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Inputs\n */\n\nimport * as React from \"react\";\nimport classnames from \"classnames\";\nimport { Key } from \"ts-key-enum\";\nimport { Input } from \"@itwin/itwinui-react\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport type { ParseResults } from \"@itwin/appui-abstract\";\nimport \"./ParsedInput.scss\";\n\n/** Props for [[ParsedInput]] control\n * @public\n * @deprecated in 4.17.0. Use `React.ComponentProps<typeof ParsedInput>`\n */\n// eslint-disable-next-line deprecation/deprecation\nexport interface ParsedInputProps extends CommonProps {\n /** InitialValue which is used to restore input field if ESC is pressed */\n initialValue: number;\n /** Function used to format the value */\n formatValue: (value: number) => string;\n /** Function used to parse user input into a value */\n parseString: (stringValue: string) => ParseResults;\n /** Function to call when value is changed */\n onChange?: (newValue: number) => void;\n /** if readonly then only the formatValue function is used. */\n readonly?: boolean;\n /** Provides ability to return reference to HTMLInputElement */\n ref?: React.Ref<HTMLInputElement>;\n}\n\nconst ForwardRefParsedInput = React.forwardRef<\n HTMLInputElement,\n /* eslint-disable-next-line deprecation/deprecation */\n ParsedInputProps\n>(function ForwardRefParsedInput(\n {\n initialValue,\n formatValue,\n parseString,\n readonly,\n className,\n style,\n onChange,\n },\n ref\n) {\n const currentValueRef = React.useRef(initialValue);\n const isMountedRef = React.useRef(false);\n const lastFormattedValueRef = React.useRef(formatValue(initialValue));\n const [formattedValue, setFormattedValue] = React.useState(\n () => lastFormattedValueRef.current\n );\n const [hasBadInput, setHasBadInput] = React.useState(false);\n\n React.useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // See if new initialValue props have changed since component mounted\n React.useEffect(() => {\n currentValueRef.current = initialValue;\n const currentFormattedValue = formatValue(currentValueRef.current);\n if (currentFormattedValue !== lastFormattedValueRef.current) {\n lastFormattedValueRef.current = currentFormattedValue;\n setFormattedValue(lastFormattedValueRef.current);\n setHasBadInput(false);\n }\n }, [formatValue, initialValue]);\n\n const handleChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setFormattedValue(event.currentTarget.value);\n },\n []\n );\n\n const updateValueFromString = React.useCallback(\n (strVal: string) => {\n if (lastFormattedValueRef.current === strVal) return;\n\n const parseResults = parseString(strVal);\n if (!parseResults.parseError) {\n if (\n undefined !== parseResults.value &&\n typeof parseResults.value === \"number\"\n ) {\n const currentValue = parseResults.value;\n if (currentValue !== currentValueRef.current) {\n currentValueRef.current = currentValue;\n onChange && onChange(currentValueRef.current);\n }\n if (isMountedRef.current) {\n lastFormattedValueRef.current = formatValue(currentValue);\n setFormattedValue(lastFormattedValueRef.current);\n setHasBadInput(false);\n }\n }\n } else {\n setHasBadInput(true);\n }\n },\n [formatValue, onChange, parseString]\n );\n\n const handleBlur = React.useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n updateValueFromString(event.target.value);\n },\n [updateValueFromString]\n );\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === Key.Enter.valueOf()) {\n updateValueFromString(event.currentTarget.value);\n event.preventDefault();\n }\n if (event.key === Key.Escape.valueOf()) {\n setFormattedValue(formatValue(currentValueRef.current));\n setHasBadInput(false);\n event.preventDefault();\n }\n },\n [formatValue, updateValueFromString]\n );\n\n const classNames = classnames(\n className,\n \"components-parsed-input\",\n hasBadInput && \"components-parsed-input-has-error\"\n );\n\n return (\n <Input\n data-testid=\"components-parsed-input\"\n ref={ref}\n style={style}\n className={classNames}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n onChange={handleChange}\n value={formattedValue}\n disabled={readonly}\n size=\"small\"\n />\n );\n});\n\n/** Generic Input component that requires formatting and parsing functions to be passed in as props.\n * @public\n */\n// eslint-disable-next-line deprecation/deprecation\nexport const ParsedInput: (props: ParsedInputProps) => React.ReactNode =\n ForwardRefParsedInput;\n"]}