@itwin/grouping-mapping-widget 0.9.3 → 0.10.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 (169) hide show
  1. package/lib/cjs/grouping-mapping-widget.d.ts +9 -3
  2. package/lib/cjs/grouping-mapping-widget.js +15 -3
  3. package/lib/cjs/grouping-mapping-widget.js.map +1 -1
  4. package/lib/cjs/test/GroupingMappingCustomUI.test.js +49 -86
  5. package/lib/cjs/test/GroupingMappingCustomUI.test.js.map +1 -1
  6. package/lib/cjs/test/test-utils.d.ts +0 -6
  7. package/lib/cjs/test/test-utils.js +8 -24
  8. package/lib/cjs/test/test-utils.js.map +1 -1
  9. package/lib/cjs/widget/components/ActionPanel.d.ts +1 -1
  10. package/lib/cjs/widget/components/ActionPanel.js +1 -1
  11. package/lib/cjs/widget/components/ActionPanel.js.map +1 -1
  12. package/lib/cjs/widget/components/ConfirmMappingsImport.js +1 -4
  13. package/lib/cjs/widget/components/ConfirmMappingsImport.js.map +1 -1
  14. package/lib/cjs/widget/components/GroupAction.d.ts +13 -9
  15. package/lib/cjs/widget/components/GroupAction.js +56 -58
  16. package/lib/cjs/widget/components/GroupAction.js.map +1 -1
  17. package/lib/cjs/widget/components/GroupPropertyAction.d.ts +1 -1
  18. package/lib/cjs/widget/components/GroupPropertyAction.js.map +1 -1
  19. package/lib/cjs/widget/components/GroupPropertyUtils.js +4 -0
  20. package/lib/cjs/widget/components/GroupPropertyUtils.js.map +1 -1
  21. package/lib/cjs/widget/components/Grouping.d.ts +8 -9
  22. package/lib/cjs/widget/components/Grouping.js +118 -273
  23. package/lib/cjs/widget/components/Grouping.js.map +1 -1
  24. package/lib/cjs/widget/components/Grouping.scss +2 -2
  25. package/lib/cjs/widget/components/GroupingMapping.d.ts +28 -21
  26. package/lib/cjs/widget/components/GroupingMapping.js +59 -38
  27. package/lib/cjs/widget/components/GroupingMapping.js.map +1 -1
  28. package/lib/cjs/widget/components/GroupingMappingContent.d.ts +8 -0
  29. package/lib/cjs/widget/components/GroupingMappingContent.js +47 -0
  30. package/lib/cjs/widget/components/GroupingMappingContent.js.map +1 -0
  31. package/lib/cjs/widget/components/GroupingMappingContext.d.ts +31 -0
  32. package/lib/cjs/widget/components/GroupingMappingContext.js +84 -0
  33. package/lib/cjs/widget/components/GroupingMappingContext.js.map +1 -0
  34. package/lib/cjs/widget/components/GroupingMappingHeader.d.ts +8 -0
  35. package/lib/cjs/widget/components/GroupingMappingHeader.js +17 -0
  36. package/lib/cjs/widget/components/GroupingMappingHeader.js.map +1 -0
  37. package/lib/cjs/widget/components/GroupingMappingRouter.d.ts +8 -0
  38. package/lib/cjs/widget/components/GroupingMappingRouter.js +87 -0
  39. package/lib/cjs/widget/components/GroupingMappingRouter.js.map +1 -0
  40. package/lib/cjs/widget/components/Mapping.d.ts +7 -2
  41. package/lib/cjs/widget/components/Mapping.js +53 -84
  42. package/lib/cjs/widget/components/Mapping.js.map +1 -1
  43. package/lib/cjs/widget/components/MappingAction.d.ts +9 -5
  44. package/lib/cjs/widget/components/MappingAction.js +19 -8
  45. package/lib/cjs/widget/components/MappingAction.js.map +1 -1
  46. package/lib/cjs/widget/components/QueryBuilder.js +2 -7
  47. package/lib/cjs/widget/components/QueryBuilder.js.map +1 -1
  48. package/lib/cjs/widget/components/context/GroupHilitedElementsContext.d.ts +15 -0
  49. package/lib/cjs/widget/components/context/GroupHilitedElementsContext.js +45 -0
  50. package/lib/cjs/widget/components/context/GroupHilitedElementsContext.js.map +1 -0
  51. package/lib/cjs/widget/components/context/GroupingApiConfigContext.d.ts +1 -0
  52. package/lib/cjs/widget/components/context/GroupingApiConfigContext.js +1 -0
  53. package/lib/cjs/widget/components/context/GroupingApiConfigContext.js.map +1 -1
  54. package/lib/cjs/widget/components/context/GroupingMappingCustomUIContext.d.ts +6 -2
  55. package/lib/cjs/widget/components/context/GroupingMappingCustomUIContext.js +5 -5
  56. package/lib/cjs/widget/components/context/GroupingMappingCustomUIContext.js.map +1 -1
  57. package/lib/cjs/widget/components/customUI/DefaultGroupingUI.d.ts +3 -0
  58. package/lib/cjs/widget/components/customUI/DefaultGroupingUI.js +40 -0
  59. package/lib/cjs/widget/components/customUI/DefaultGroupingUI.js.map +1 -0
  60. package/lib/cjs/widget/components/customUI/GroupQueryBuilderCustomUI.d.ts +5 -0
  61. package/lib/cjs/widget/components/{GroupQueryBuilderContainer.js → customUI/GroupQueryBuilderCustomUI.js} +36 -16
  62. package/lib/cjs/widget/components/customUI/GroupQueryBuilderCustomUI.js.map +1 -0
  63. package/lib/cjs/widget/components/customUI/GroupingMappingCustomUI.d.ts +3 -2
  64. package/lib/cjs/widget/components/customUI/GroupingMappingCustomUI.js.map +1 -1
  65. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.d.ts +1 -2
  66. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.js +2 -1
  67. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.js.map +1 -1
  68. package/lib/cjs/widget/components/customUI/SearchGroupingCustomUI.d.ts +1 -2
  69. package/lib/cjs/widget/components/customUI/SearchGroupingCustomUI.js +2 -1
  70. package/lib/cjs/widget/components/customUI/SearchGroupingCustomUI.js.map +1 -1
  71. package/lib/cjs/widget/components/groupsHelpers.d.ts +7 -0
  72. package/lib/cjs/widget/components/groupsHelpers.js +84 -0
  73. package/lib/cjs/widget/components/groupsHelpers.js.map +1 -0
  74. package/lib/cjs/widget/components/property-grid/PropertyGridWrapper.d.ts +1 -1
  75. package/lib/cjs/widget/components/property-grid/PropertyGridWrapper.js +1 -1
  76. package/lib/cjs/widget/components/property-grid/PropertyGridWrapper.js.map +1 -1
  77. package/lib/cjs/widget/components/property-grid/PropertyView.js +29 -15
  78. package/lib/cjs/widget/components/property-grid/PropertyView.js.map +1 -1
  79. package/lib/cjs/widget/components/utils.d.ts +1 -3
  80. package/lib/cjs/widget/components/utils.js +1 -26
  81. package/lib/cjs/widget/components/utils.js.map +1 -1
  82. package/lib/esm/grouping-mapping-widget.d.ts +9 -3
  83. package/lib/esm/grouping-mapping-widget.js +7 -1
  84. package/lib/esm/grouping-mapping-widget.js.map +1 -1
  85. package/lib/esm/test/GroupingMappingCustomUI.test.js +46 -83
  86. package/lib/esm/test/GroupingMappingCustomUI.test.js.map +1 -1
  87. package/lib/esm/test/test-utils.d.ts +0 -6
  88. package/lib/esm/test/test-utils.js +7 -22
  89. package/lib/esm/test/test-utils.js.map +1 -1
  90. package/lib/esm/widget/components/ActionPanel.d.ts +1 -1
  91. package/lib/esm/widget/components/ActionPanel.js +1 -1
  92. package/lib/esm/widget/components/ActionPanel.js.map +1 -1
  93. package/lib/esm/widget/components/ConfirmMappingsImport.js +1 -4
  94. package/lib/esm/widget/components/ConfirmMappingsImport.js.map +1 -1
  95. package/lib/esm/widget/components/GroupAction.d.ts +13 -9
  96. package/lib/esm/widget/components/GroupAction.js +57 -61
  97. package/lib/esm/widget/components/GroupAction.js.map +1 -1
  98. package/lib/esm/widget/components/GroupPropertyAction.d.ts +1 -1
  99. package/lib/esm/widget/components/GroupPropertyAction.js.map +1 -1
  100. package/lib/esm/widget/components/GroupPropertyUtils.js +4 -0
  101. package/lib/esm/widget/components/GroupPropertyUtils.js.map +1 -1
  102. package/lib/esm/widget/components/Grouping.d.ts +8 -9
  103. package/lib/esm/widget/components/Grouping.js +122 -277
  104. package/lib/esm/widget/components/Grouping.js.map +1 -1
  105. package/lib/esm/widget/components/Grouping.scss +2 -2
  106. package/lib/esm/widget/components/GroupingMapping.d.ts +28 -21
  107. package/lib/esm/widget/components/GroupingMapping.js +59 -39
  108. package/lib/esm/widget/components/GroupingMapping.js.map +1 -1
  109. package/lib/esm/widget/components/GroupingMappingContent.d.ts +8 -0
  110. package/lib/esm/widget/components/GroupingMappingContent.js +24 -0
  111. package/lib/esm/widget/components/GroupingMappingContent.js.map +1 -0
  112. package/lib/esm/widget/components/GroupingMappingContext.d.ts +31 -0
  113. package/lib/esm/widget/components/GroupingMappingContext.js +61 -0
  114. package/lib/esm/widget/components/GroupingMappingContext.js.map +1 -0
  115. package/lib/esm/widget/components/GroupingMappingHeader.d.ts +8 -0
  116. package/lib/esm/widget/components/GroupingMappingHeader.js +10 -0
  117. package/lib/esm/widget/components/GroupingMappingHeader.js.map +1 -0
  118. package/lib/esm/widget/components/GroupingMappingRouter.d.ts +8 -0
  119. package/lib/esm/widget/components/GroupingMappingRouter.js +80 -0
  120. package/lib/esm/widget/components/GroupingMappingRouter.js.map +1 -0
  121. package/lib/esm/widget/components/Mapping.d.ts +7 -2
  122. package/lib/esm/widget/components/Mapping.js +55 -86
  123. package/lib/esm/widget/components/Mapping.js.map +1 -1
  124. package/lib/esm/widget/components/MappingAction.d.ts +9 -5
  125. package/lib/esm/widget/components/MappingAction.js +18 -9
  126. package/lib/esm/widget/components/MappingAction.js.map +1 -1
  127. package/lib/esm/widget/components/QueryBuilder.js +2 -7
  128. package/lib/esm/widget/components/QueryBuilder.js.map +1 -1
  129. package/lib/esm/widget/components/context/GroupHilitedElementsContext.d.ts +15 -0
  130. package/lib/esm/widget/components/context/GroupHilitedElementsContext.js +22 -0
  131. package/lib/esm/widget/components/context/GroupHilitedElementsContext.js.map +1 -0
  132. package/lib/esm/widget/components/context/GroupingApiConfigContext.d.ts +1 -0
  133. package/lib/esm/widget/components/context/GroupingApiConfigContext.js +1 -0
  134. package/lib/esm/widget/components/context/GroupingApiConfigContext.js.map +1 -1
  135. package/lib/esm/widget/components/context/GroupingMappingCustomUIContext.d.ts +6 -2
  136. package/lib/esm/widget/components/context/GroupingMappingCustomUIContext.js +5 -5
  137. package/lib/esm/widget/components/context/GroupingMappingCustomUIContext.js.map +1 -1
  138. package/lib/esm/widget/components/customUI/DefaultGroupingUI.d.ts +3 -0
  139. package/lib/esm/widget/components/customUI/DefaultGroupingUI.js +34 -0
  140. package/lib/esm/widget/components/customUI/DefaultGroupingUI.js.map +1 -0
  141. package/lib/esm/widget/components/customUI/GroupQueryBuilderCustomUI.d.ts +5 -0
  142. package/lib/esm/widget/components/{GroupQueryBuilderContainer.js → customUI/GroupQueryBuilderCustomUI.js} +11 -7
  143. package/lib/esm/widget/components/customUI/GroupQueryBuilderCustomUI.js.map +1 -0
  144. package/lib/esm/widget/components/customUI/GroupingMappingCustomUI.d.ts +3 -2
  145. package/lib/esm/widget/components/customUI/GroupingMappingCustomUI.js.map +1 -1
  146. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.d.ts +1 -2
  147. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.js +1 -2
  148. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.js.map +1 -1
  149. package/lib/esm/widget/components/customUI/SearchGroupingCustomUI.d.ts +1 -2
  150. package/lib/esm/widget/components/customUI/SearchGroupingCustomUI.js +1 -2
  151. package/lib/esm/widget/components/customUI/SearchGroupingCustomUI.js.map +1 -1
  152. package/lib/esm/widget/components/groupsHelpers.d.ts +7 -0
  153. package/lib/esm/widget/components/groupsHelpers.js +77 -0
  154. package/lib/esm/widget/components/groupsHelpers.js.map +1 -0
  155. package/lib/esm/widget/components/property-grid/PropertyGridWrapper.d.ts +1 -1
  156. package/lib/esm/widget/components/property-grid/PropertyGridWrapper.js +1 -1
  157. package/lib/esm/widget/components/property-grid/PropertyGridWrapper.js.map +1 -1
  158. package/lib/esm/widget/components/property-grid/PropertyView.js +1 -3
  159. package/lib/esm/widget/components/property-grid/PropertyView.js.map +1 -1
  160. package/lib/esm/widget/components/utils.d.ts +1 -3
  161. package/lib/esm/widget/components/utils.js +0 -24
  162. package/lib/esm/widget/components/utils.js.map +1 -1
  163. package/package.json +3 -3
  164. package/lib/cjs/widget/components/GroupQueryBuilderContainer.d.ts +0 -5
  165. package/lib/cjs/widget/components/GroupQueryBuilderContainer.js.map +0 -1
  166. package/lib/esm/widget/components/GroupQueryBuilderContainer.d.ts +0 -5
  167. package/lib/esm/widget/components/GroupQueryBuilderContainer.js.map +0 -1
  168. /package/lib/cjs/widget/components/{GroupQueryBuilder.scss → customUI/GroupQueryBuilderCustomUI.scss} +0 -0
  169. /package/lib/esm/widget/components/{GroupQueryBuilder.scss → customUI/GroupQueryBuilderCustomUI.scss} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"GroupPropertyUtils.js","sourceRoot":"","sources":["../../../../src/widget/components/GroupPropertyUtils.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*--------------------------------------------------------------------------------------------*/\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport type { ECProperty } from \"@itwin/insights-client\";\nimport { DataType } from \"@itwin/insights-client\";\nimport type {\n ContentDescriptorRequestOptions,\n Field,\n KeySet,\n NestedContentField,\n PropertiesField,\n Ruleset,\n RulesetVariable,\n StructFieldMemberDescription,\n} from \"@itwin/presentation-common\";\nimport {\n ContentSpecificationTypes,\n DefaultContentDisplayTypes,\n PropertyValueFormat,\n RelationshipMeaning,\n RuleTypes,\n} from \"@itwin/presentation-common\";\nimport { Presentation } from \"@itwin/presentation-frontend\";\nimport { deepEqual } from \"fast-equals\";\n\nexport interface PropertyMetaData {\n displayLabel: string;\n sourceSchema: string;\n sourceClassName: string;\n categoryLabel: string;\n propertyType: DataType;\n actualECClassName: string;\n parentPropertyClassName: string | undefined;\n ecPropertyTraversal: string[];\n primitiveNavigationClass: string;\n key: string;\n}\n\nconst convertType = (type: string): DataType => {\n switch (type) {\n case \"int\":\n case \"enum\":\n case \"long\":\n return DataType.Integer;\n case \"boolean\":\n return DataType.Boolean;\n case \"double\":\n return DataType.Double;\n case \"number\":\n return DataType.Number;\n default:\n return DataType.String;\n }\n};\n\nconst extractPrimitives = (\n propertyTraversal: string[],\n propertyField: PropertiesField\n): PropertyMetaData[] => propertyField.properties.map((property) => {\n const propertyName = property.property.name;\n const displayLabel = propertyField.label;\n // It belongs to this parent class\n const parentPropertyClassName = propertyField.parent?.contentClassInfo.name;\n const primitiveNavigationClass = property.property.navigationPropertyInfo?.classInfo.name ?? \"\";\n /* Presentation assigns primitive navigations properties as a long type due to how it stores the\n ECInstanceId of the class in the meta.ECClassDef table on the C++ layer.\n We are handling this special case.\n */\n const propertyType = primitiveNavigationClass ? DataType.String : convertType(property.property.type);\n const actualECClassName = property.property.classInfo.name;\n const newPropertyTraversal = [...propertyTraversal, propertyName];\n\n return (\n {\n displayLabel,\n sourceSchema: \"*\",\n sourceClassName: \"*\",\n ecPropertyTraversal: newPropertyTraversal,\n propertyType,\n primitiveNavigationClass,\n actualECClassName,\n parentPropertyClassName,\n key: `${parentPropertyClassName}|${actualECClassName}|${newPropertyTraversal.join(\"|\")}`,\n categoryLabel: propertyField.category.label,\n }\n );\n});\n\nconst extractPrimitiveStructProperties = (\n propertyTraversal: string[],\n members: StructFieldMemberDescription[],\n categoryLabel: string,\n actualECClassName: string,\n parentPropertyClassName?: string,\n): PropertyMetaData[] => members.flatMap((member) => {\n if (member.type.valueFormat === PropertyValueFormat.Primitive) {\n const propertyName = member.name;\n const displayLabel = member.label;\n const propertyType = convertType(member.type.typeName);\n const newPropertyTraversal = [...propertyTraversal, propertyName];\n\n return ({\n displayLabel,\n sourceSchema: \"*\",\n sourceClassName: \"*\",\n ecPropertyTraversal: newPropertyTraversal,\n propertyType,\n primitiveNavigationClass: \"\",\n actualECClassName,\n parentPropertyClassName,\n key: `${parentPropertyClassName}|${actualECClassName}|${newPropertyTraversal.join(\"|\")}`,\n categoryLabel,\n });\n\n } else if (member.type.valueFormat === PropertyValueFormat.Struct) {\n const structName = member.name;\n return extractPrimitiveStructProperties(\n [...propertyTraversal, structName],\n member.type.members,\n categoryLabel,\n actualECClassName,\n parentPropertyClassName\n );\n }\n\n return [];\n});\n\nconst extractStruct = (property: Field) => {\n if (property.type.valueFormat !== PropertyValueFormat.Struct) {\n return [];\n }\n\n const columnName = (property as PropertiesField).properties[0]\n .property.name;\n const actualECClassName = (property as PropertiesField).properties[0].property.classInfo.name;\n return extractPrimitiveStructProperties(\n [columnName],\n property.type.members,\n property.category.label,\n actualECClassName\n );\n};\n\nconst extractNested = (propertyTraversal: string[], propertyFields: Field[]): PropertyMetaData[] =>\n propertyFields.flatMap((property) => {\n // Generate base ECProperty\n switch (property.type.valueFormat) {\n case PropertyValueFormat.Primitive: {\n return extractPrimitives([...propertyTraversal], property as PropertiesField);\n }\n // Get structs\n case PropertyValueFormat.Struct: {\n const nestedContentField = property as NestedContentField;\n // Only handling single path and not handling nested content fields within navigations\n if (\n nestedContentField.pathToPrimaryClass &&\n nestedContentField.pathToPrimaryClass.length > 1\n ) {\n // Hardcoded navigation to external source repository metadata.\n if (nestedContentField.contentClassInfo.name === \"BisCore:RepositoryLink\") {\n return extractNested([...propertyTraversal, \"Source\", \"Repository\"], nestedContentField.nestedFields);\n }\n break;\n }\n\n switch (nestedContentField.relationshipMeaning) {\n // Aspects are not looked at again. Extraction does not support aspects within navigations.\n // Navigation properties\n case RelationshipMeaning.RelatedInstance: {\n if (\n // Deal with a TypeDefinition\n nestedContentField.pathToPrimaryClass[0].relationshipInfo.name ===\n \"BisCore:GeometricElement3dHasTypeDefinition\"\n ) {\n return extractNested([...propertyTraversal, \"TypeDefinition\"], nestedContentField.nestedFields);\n }\n break;\n }\n default: {\n // Some elements don't have a path to primary class or relationship meaning..\n // Most likely a simple struct property\n if (!nestedContentField.pathToPrimaryClass) {\n return extractStruct(property);\n }\n }\n }\n }\n }\n return [];\n });\n\nexport const convertPresentationFields = (propertyFields: Field[]): PropertyMetaData[] =>\n propertyFields.flatMap((property) => {\n // Generate base ECProperty\n switch (property.type.valueFormat) {\n case PropertyValueFormat.Primitive: {\n const extractedPrimitives = extractPrimitives([], property as PropertiesField);\n for (const extractedPrimitive of extractedPrimitives) {\n extractedPrimitive.sourceSchema = \"*\";\n extractedPrimitive.sourceClassName = \"*\";\n return extractedPrimitive;\n }\n break;\n }\n // Get structs\n case PropertyValueFormat.Struct: {\n const nestedContentField = property as NestedContentField;\n // Only handling single path and not handling nested content fields within navigations\n if (\n nestedContentField.pathToPrimaryClass &&\n nestedContentField.pathToPrimaryClass.length > 1\n ) {\n break;\n }\n switch (nestedContentField.relationshipMeaning) {\n case RelationshipMeaning.SameInstance: {\n // Check for aspects.\n if (\n (nestedContentField.pathToPrimaryClass[0].relationshipInfo\n .name === \"BisCore:ElementOwnsUniqueAspect\" ||\n nestedContentField.pathToPrimaryClass[0].relationshipInfo\n .name === \"BisCore:ElementOwnsMultiAspects\")\n ) {\n const fullClassName = nestedContentField.contentClassInfo.name;\n const sourceSchema = fullClassName.split(\":\")[0];\n const sourceClassName = fullClassName.split(\":\")[1];\n const extractedNested = extractNested([], nestedContentField.nestedFields);\n const aspectExtractedNested = extractedNested.map((ecProperty) => ({ ...ecProperty, sourceSchema, sourceClassName }));\n return aspectExtractedNested;\n }\n break;\n }\n // Navigation properties\n case RelationshipMeaning.RelatedInstance: {\n if (\n // Deal with a TypeDefinition\n nestedContentField.pathToPrimaryClass[0].relationshipInfo.name ===\n \"BisCore:GeometricElement3dHasTypeDefinition\"\n ) {\n return extractNested([\"TypeDefinition\"], nestedContentField.nestedFields);\n }\n break;\n }\n default: {\n // Some elements don't have a path to primary class or relationship meaning..\n // Most likely a simple struct property\n if (!nestedContentField.pathToPrimaryClass) {\n return extractStruct(property);\n }\n }\n }\n }\n }\n return [];\n });\n\nexport const convertToECProperties = (property: PropertyMetaData): ECProperty[] => {\n const ecProperty: ECProperty = {\n ecSchemaName: property.sourceSchema,\n ecClassName: property.sourceClassName,\n ecPropertyType: property.propertyType,\n ecPropertyName: \"\",\n };\n switch (property.primitiveNavigationClass) {\n // Hardcode Models navigation path and label behavior\n case \"BisCore:ModelContainsElements\": {\n return [\n {\n ...ecProperty,\n ecPropertyName: [\n ...property.ecPropertyTraversal,\n \"ModeledElement\",\n \"UserLabel\",\n ].join(\".\"),\n },\n {\n ...ecProperty,\n ecPropertyName: [\n ...property.ecPropertyTraversal,\n \"ModeledElement\",\n \"CodeValue\",\n ].join(\".\"),\n },\n ];\n }\n // Hardcode Category and Physical Material navigation path and label behavior\n case \"BisCore:GeometricElement3dIsInCategory\":\n case \"BisCore:PhysicalElementIsOfPhysicalMaterial\":\n return [\n {\n ...ecProperty,\n ecPropertyName: [\n ...property.ecPropertyTraversal,\n \"UserLabel\",\n ].join(\".\"),\n },\n {\n ...ecProperty,\n ecPropertyName: [\n ...property.ecPropertyTraversal,\n \"CodeValue\",\n ].join(\".\"),\n },\n ];\n default: {\n return [\n {\n ...ecProperty,\n ecPropertyName: property.ecPropertyTraversal.join(\".\"),\n },\n ];\n }\n }\n};\n\nexport const findProperties = (ecProperties: ECProperty[], propertiesMetaData: PropertyMetaData[]) => {\n let ecPropertiesCopy = [...ecProperties];\n const propertiesMetaDataResult: PropertyMetaData[] = new Array<PropertyMetaData>();\n let notFound = false;\n while (ecPropertiesCopy.length !== 0) {\n for (let i = 0; i < propertiesMetaData.length; i++) {\n const generatedProperty = convertToECProperties(propertiesMetaData[i]);\n const slicedEcProperties = ecPropertiesCopy.slice(0, generatedProperty.length);\n if (deepEqual(generatedProperty, slicedEcProperties)) {\n propertiesMetaDataResult.push(propertiesMetaData[i]);\n ecPropertiesCopy = ecPropertiesCopy.slice(generatedProperty.length);\n break;\n }\n if (i === propertiesMetaData.length - 1) {\n notFound = true;\n }\n }\n if (notFound)\n break;\n }\n return notFound ? [] : propertiesMetaDataResult;\n};\n\nexport const fetchPresentationDescriptor = async (iModelConnection: IModelConnection, keySet: KeySet) => {\n const ruleSet: Ruleset = {\n id: \"gmw-element-properties\",\n rules: [\n {\n ruleType: RuleTypes.Content,\n specifications: [\n {\n specType: ContentSpecificationTypes.SelectedNodeInstances,\n },\n ],\n }],\n };\n const requestOptions: ContentDescriptorRequestOptions<IModelConnection, KeySet, RulesetVariable> = {\n imodel: iModelConnection,\n keys: keySet,\n rulesetOrId: ruleSet,\n displayType: DefaultContentDisplayTypes.PropertyPane,\n };\n const descriptor = await Presentation.presentation.getContentDescriptor(\n requestOptions\n );\n return descriptor;\n};\n"]}
1
+ {"version":3,"file":"GroupPropertyUtils.js","sourceRoot":"","sources":["../../../../src/widget/components/GroupPropertyUtils.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*--------------------------------------------------------------------------------------------*/\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport type { ECProperty } from \"@itwin/insights-client\";\nimport { DataType } from \"@itwin/insights-client\";\nimport type {\n ContentDescriptorRequestOptions,\n Field,\n KeySet,\n NestedContentField,\n PropertiesField,\n Ruleset,\n RulesetVariable,\n StructFieldMemberDescription,\n} from \"@itwin/presentation-common\";\nimport {\n ContentSpecificationTypes,\n DefaultContentDisplayTypes,\n PropertyValueFormat,\n RelationshipMeaning,\n RuleTypes,\n} from \"@itwin/presentation-common\";\nimport { Presentation } from \"@itwin/presentation-frontend\";\nimport { deepEqual } from \"fast-equals\";\n\nexport interface PropertyMetaData {\n displayLabel: string;\n sourceSchema: string;\n sourceClassName: string;\n categoryLabel: string;\n propertyType: DataType;\n actualECClassName: string;\n parentPropertyClassName: string | undefined;\n ecPropertyTraversal: string[];\n primitiveNavigationClass: string;\n key: string;\n}\n\nconst convertType = (type: string): DataType => {\n switch (type) {\n case \"int\":\n case \"enum\":\n case \"long\":\n return DataType.Integer;\n case \"boolean\":\n return DataType.Boolean;\n case \"double\":\n return DataType.Double;\n case \"number\":\n return DataType.Number;\n default:\n return DataType.String;\n }\n};\n\nconst extractPrimitives = (\n propertyTraversal: string[],\n propertyField: PropertiesField\n): PropertyMetaData[] => propertyField.properties.map((property) => {\n const propertyName = property.property.name;\n const displayLabel = propertyField.label;\n // It belongs to this parent class\n const parentPropertyClassName = propertyField.parent?.contentClassInfo.name;\n const primitiveNavigationClass = property.property.navigationPropertyInfo?.classInfo.name ?? \"\";\n /* Presentation assigns primitive navigations properties as a long type due to how it stores the\n ECInstanceId of the class in the meta.ECClassDef table on the C++ layer.\n We are handling this special case.\n */\n const propertyType = primitiveNavigationClass ? DataType.String : convertType(property.property.type);\n const actualECClassName = property.property.classInfo.name;\n const newPropertyTraversal = [...propertyTraversal, propertyName];\n\n return (\n {\n displayLabel,\n sourceSchema: \"*\",\n sourceClassName: \"*\",\n ecPropertyTraversal: newPropertyTraversal,\n propertyType,\n primitiveNavigationClass,\n actualECClassName,\n parentPropertyClassName,\n key: `${parentPropertyClassName}|${actualECClassName}|${newPropertyTraversal.join(\"|\")}`,\n categoryLabel: propertyField.category.label,\n }\n );\n});\n\nconst extractPrimitiveStructProperties = (\n propertyTraversal: string[],\n members: StructFieldMemberDescription[],\n categoryLabel: string,\n actualECClassName: string,\n parentPropertyClassName?: string,\n): PropertyMetaData[] => members.flatMap((member) => {\n if (member.type.valueFormat === PropertyValueFormat.Primitive) {\n const propertyName = member.name;\n const displayLabel = member.label;\n const propertyType = convertType(member.type.typeName);\n const newPropertyTraversal = [...propertyTraversal, propertyName];\n\n return ({\n displayLabel,\n sourceSchema: \"*\",\n sourceClassName: \"*\",\n ecPropertyTraversal: newPropertyTraversal,\n propertyType,\n primitiveNavigationClass: \"\",\n actualECClassName,\n parentPropertyClassName,\n key: `${parentPropertyClassName}|${actualECClassName}|${newPropertyTraversal.join(\"|\")}`,\n categoryLabel,\n });\n\n } else if (member.type.valueFormat === PropertyValueFormat.Struct) {\n const structName = member.name;\n return extractPrimitiveStructProperties(\n [...propertyTraversal, structName],\n member.type.members,\n categoryLabel,\n actualECClassName,\n parentPropertyClassName\n );\n }\n\n return [];\n});\n\nconst extractStruct = (property: Field) => {\n if (property.type.valueFormat !== PropertyValueFormat.Struct) {\n return [];\n }\n\n const columnName = (property as PropertiesField).properties[0]\n .property.name;\n const actualECClassName = (property as PropertiesField).properties[0].property.classInfo.name;\n return extractPrimitiveStructProperties(\n [columnName],\n property.type.members,\n property.category.label,\n actualECClassName\n );\n};\n\nconst extractNested = (propertyTraversal: string[], propertyFields: Field[]): PropertyMetaData[] =>\n propertyFields.flatMap((property) => {\n // Generate base ECProperty\n switch (property.type.valueFormat) {\n case PropertyValueFormat.Primitive: {\n return extractPrimitives([...propertyTraversal], property as PropertiesField);\n }\n // Get structs\n case PropertyValueFormat.Struct: {\n const nestedContentField = property as NestedContentField;\n // Only handling single path and not handling nested content fields within navigations\n if (\n nestedContentField.pathToPrimaryClass &&\n nestedContentField.pathToPrimaryClass.length > 1\n ) {\n // Hardcoded navigation to external source repository metadata.\n if (nestedContentField.contentClassInfo.name === \"BisCore:RepositoryLink\") {\n return extractNested([...propertyTraversal, \"Source\", \"Repository\"], nestedContentField.nestedFields);\n }\n break;\n }\n\n switch (nestedContentField.relationshipMeaning) {\n // Aspects are not looked at again. Extraction does not support aspects within navigations.\n // Navigation properties\n case RelationshipMeaning.RelatedInstance: {\n if (\n // Deal with a TypeDefinition\n nestedContentField.pathToPrimaryClass[0].relationshipInfo.name ===\n \"BisCore:GeometricElement3dHasTypeDefinition\"\n ) {\n return extractNested([...propertyTraversal, \"TypeDefinition\"], nestedContentField.nestedFields);\n }\n break;\n }\n default: {\n // Some elements don't have a path to primary class or relationship meaning..\n // Most likely a simple struct property\n if (!nestedContentField.pathToPrimaryClass) {\n return extractStruct(property);\n }\n }\n }\n }\n }\n return [];\n });\n\nexport const convertPresentationFields = (propertyFields: Field[]): PropertyMetaData[] =>\n propertyFields.flatMap((property) => {\n // Generate base ECProperty\n switch (property.type.valueFormat) {\n case PropertyValueFormat.Primitive: {\n const extractedPrimitives = extractPrimitives([], property as PropertiesField);\n for (const extractedPrimitive of extractedPrimitives) {\n extractedPrimitive.sourceSchema = \"*\";\n extractedPrimitive.sourceClassName = \"*\";\n return extractedPrimitive;\n }\n break;\n }\n // Get structs\n case PropertyValueFormat.Struct: {\n const nestedContentField = property as NestedContentField;\n // Only handling single path and not handling nested content fields within navigations\n if (\n nestedContentField.pathToPrimaryClass &&\n nestedContentField.pathToPrimaryClass.length > 1\n ) {\n break;\n }\n switch (nestedContentField.relationshipMeaning) {\n case RelationshipMeaning.SameInstance: {\n // Check for aspects.\n if (\n (nestedContentField.pathToPrimaryClass[0].relationshipInfo\n .name === \"BisCore:ElementOwnsUniqueAspect\" ||\n nestedContentField.pathToPrimaryClass[0].relationshipInfo\n .name === \"BisCore:ElementOwnsMultiAspects\")\n ) {\n const fullClassName = nestedContentField.contentClassInfo.name;\n const sourceSchema = fullClassName.split(\":\")[0];\n const sourceClassName = fullClassName.split(\":\")[1];\n const extractedNested = extractNested([], nestedContentField.nestedFields);\n const aspectExtractedNested = extractedNested.map((ecProperty) => ({ ...ecProperty, sourceSchema, sourceClassName }));\n return aspectExtractedNested;\n }\n break;\n }\n // Navigation properties\n case RelationshipMeaning.RelatedInstance: {\n if (\n // Deal with a TypeDefinition\n nestedContentField.pathToPrimaryClass[0].relationshipInfo.name ===\n \"BisCore:GeometricElement3dHasTypeDefinition\"\n ) {\n return extractNested([\"TypeDefinition\"], nestedContentField.nestedFields);\n }\n break;\n }\n default: {\n // Some elements don't have a path to primary class or relationship meaning..\n // Most likely a simple struct property\n if (!nestedContentField.pathToPrimaryClass) {\n return extractStruct(property);\n }\n }\n }\n }\n }\n return [];\n });\n\nexport const convertToECProperties = (property: PropertyMetaData): ECProperty[] => {\n const ecProperty: ECProperty = {\n ecSchemaName: property.sourceSchema,\n ecClassName: property.sourceClassName,\n ecPropertyType: property.propertyType,\n ecPropertyName: \"\",\n };\n switch (property.primitiveNavigationClass) {\n // Hardcode Models navigation path and label behavior\n case \"BisCore:ModelContainsElements\": {\n return [\n {\n ...ecProperty,\n ecPropertyName: [\n ...property.ecPropertyTraversal,\n \"ModeledElement\",\n \"UserLabel\",\n ].join(\".\"),\n },\n {\n ...ecProperty,\n ecPropertyName: [\n ...property.ecPropertyTraversal,\n \"ModeledElement\",\n \"CodeValue\",\n ].join(\".\"),\n },\n ];\n }\n // Hardcode Category and Physical Material navigation path and label behavior\n case \"BisCore:GeometricElement3dIsInCategory\":\n case \"BisCore:PhysicalElementIsOfPhysicalMaterial\":\n return [\n {\n ...ecProperty,\n ecPropertyName: [\n ...property.ecPropertyTraversal,\n \"UserLabel\",\n ].join(\".\"),\n },\n {\n ...ecProperty,\n ecPropertyName: [\n ...property.ecPropertyTraversal,\n \"CodeValue\",\n ].join(\".\"),\n },\n ];\n default: {\n return [\n {\n ...ecProperty,\n ecPropertyName: property.ecPropertyTraversal.join(\".\"),\n },\n ];\n }\n }\n};\n\nexport const findProperties = (ecProperties: ECProperty[], propertiesMetaData: PropertyMetaData[]) => {\n let ecPropertiesCopy = [...ecProperties];\n const propertiesMetaDataResult: PropertyMetaData[] = new Array<PropertyMetaData>();\n let notFound = false;\n while (ecPropertiesCopy.length !== 0) {\n for (let i = 0; i < propertiesMetaData.length; i++) {\n const generatedProperty = convertToECProperties(propertiesMetaData[i]);\n const slicedEcProperties = ecPropertiesCopy.slice(0, generatedProperty.length);\n if (deepEqual(generatedProperty, slicedEcProperties)) {\n propertiesMetaDataResult.push(propertiesMetaData[i]);\n ecPropertiesCopy = ecPropertiesCopy.slice(generatedProperty.length);\n break;\n }\n if (i === propertiesMetaData.length - 1) {\n notFound = true;\n }\n }\n if (notFound)\n break;\n }\n return notFound ? [] : propertiesMetaDataResult;\n};\n\nexport const fetchPresentationDescriptor = async (iModelConnection: IModelConnection, keySet: KeySet) => {\n const ruleSet: Ruleset = {\n id: \"gmw-element-properties\",\n rules: [\n {\n ruleType: RuleTypes.Content,\n specifications: [\n {\n specType: ContentSpecificationTypes.SelectedNodeInstances,\n propertyOverrides: [{\n name: \"*\",\n isDisplayed: true,\n }],\n },\n ],\n }],\n };\n const requestOptions: ContentDescriptorRequestOptions<IModelConnection, KeySet, RulesetVariable> = {\n imodel: iModelConnection,\n keys: keySet,\n rulesetOrId: ruleSet,\n displayType: DefaultContentDisplayTypes.PropertyPane,\n };\n const descriptor = await Presentation.presentation.getContentDescriptor(\n requestOptions\n );\n return descriptor;\n};\n"]}
@@ -2,16 +2,15 @@
2
2
  import type { CreateTypeFromInterface } from "../utils";
3
3
  import "./Grouping.scss";
4
4
  import type { Group, Mapping } from "@itwin/insights-client";
5
+ import type { ContextCustomUI } from "./customUI/GroupingMappingCustomUI";
5
6
  export declare type IGroupTyped = CreateTypeFromInterface<Group>;
6
- export declare const defaultUIMetadata: {
7
- name: string;
8
- displayLabel: string;
9
- icon: JSX.Element;
10
- }[];
11
- interface GroupsTreeProps {
7
+ export interface GroupingProps {
12
8
  mapping: Mapping;
13
- goBack: () => Promise<void>;
9
+ onClickAddGroup?: (queryGenerationType: string) => void;
10
+ onClickGroupTitle?: (group: Group) => void;
11
+ onClickGroupModify?: (group: Group, queryGenerationType: string) => void;
12
+ onClickRenderContextCustomUI?: (contextCustomUI: Exclude<ContextCustomUI["uiComponent"], undefined>, group: Group) => void;
13
+ emphasizeElements?: boolean;
14
14
  }
15
- export declare const Groupings: ({ mapping, goBack }: GroupsTreeProps) => JSX.Element | null;
16
- export {};
15
+ export declare const Groupings: ({ mapping, onClickAddGroup, onClickGroupTitle, onClickGroupModify, onClickRenderContextCustomUI, emphasizeElements, }: GroupingProps) => JSX.Element;
17
16
  //# sourceMappingURL=Grouping.d.ts.map
@@ -22,7 +22,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
22
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
23
  };
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.Groupings = exports.defaultUIMetadata = void 0;
25
+ exports.Groupings = void 0;
26
26
  /*---------------------------------------------------------------------------------------------
27
27
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
28
28
  * See LICENSE.md in the project root for license terms and full copyright notice.
@@ -33,50 +33,21 @@ const itwinui_react_1 = require("@itwin/itwinui-react");
33
33
  const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
34
34
  const DeleteModal_1 = __importDefault(require("./DeleteModal"));
35
35
  require("./Grouping.scss");
36
- const PropertyMenu_1 = require("./PropertyMenu");
37
36
  const viewerUtils_1 = require("./viewerUtils");
38
37
  const utils_1 = require("./utils");
39
- const GroupAction_1 = __importDefault(require("./GroupAction"));
40
38
  const MappingClientContext_1 = require("./context/MappingClientContext");
41
- const core_common_1 = require("@itwin/core-common");
42
39
  const HorizontalTile_1 = require("./HorizontalTile");
43
40
  const GroupingApiConfigContext_1 = require("./context/GroupingApiConfigContext");
44
41
  const GroupingMappingCustomUIContext_1 = require("./context/GroupingMappingCustomUIContext");
45
42
  const GroupingMappingCustomUI_1 = require("./customUI/GroupingMappingCustomUI");
46
- const presentation_frontend_1 = require("@itwin/presentation-frontend");
47
- exports.defaultUIMetadata = [
48
- {
49
- name: "Selection",
50
- displayLabel: "Selection",
51
- icon: react_1.default.createElement(itwinui_icons_react_1.SvgCursor, null),
52
- },
53
- {
54
- name: "Search",
55
- displayLabel: "Query Keywords",
56
- icon: react_1.default.createElement(itwinui_icons_react_1.SvgSearch, null),
57
- },
58
- {
59
- name: "Manual",
60
- displayLabel: "Manual Query",
61
- icon: react_1.default.createElement(itwinui_icons_react_1.SvgDraw, null),
62
- },
63
- ];
64
- var GroupsView;
65
- (function (GroupsView) {
66
- GroupsView[GroupsView["Add"] = 0] = "Add";
67
- GroupsView[GroupsView["Groups"] = 1] = "Groups";
68
- GroupsView[GroupsView["CustomUI"] = 2] = "CustomUI";
69
- GroupsView[GroupsView["Modifying"] = 3] = "Modifying";
70
- GroupsView[GroupsView["Properties"] = 4] = "Properties";
71
- })(GroupsView || (GroupsView = {}));
72
- const goldenAngle = 180 * (3 - Math.sqrt(5));
43
+ const GroupHilitedElementsContext_1 = require("./context/GroupHilitedElementsContext");
44
+ const groupsHelpers_1 = require("./groupsHelpers");
73
45
  const fetchGroups = async (setGroups, iModelId, mappingId, setIsLoading, getAccessToken, mappingsClient) => {
74
46
  try {
75
47
  setIsLoading(true);
76
48
  const accessToken = await getAccessToken();
77
49
  const groups = await mappingsClient.getGroups(accessToken, iModelId, mappingId);
78
50
  setGroups(groups);
79
- return groups;
80
51
  }
81
52
  catch (error) {
82
53
  utils_1.handleError(error.status);
@@ -84,104 +55,57 @@ const fetchGroups = async (setGroups, iModelId, mappingId, setIsLoading, getAcce
84
55
  finally {
85
56
  setIsLoading(false);
86
57
  }
87
- return undefined;
88
58
  };
89
- const Groupings = ({ mapping, goBack }) => {
90
- var _a, _b;
59
+ const Groupings = ({ mapping, onClickAddGroup, onClickGroupTitle, onClickGroupModify, onClickRenderContextCustomUI, emphasizeElements = true, }) => {
60
+ var _a;
91
61
  const iModelConnection = appui_react_1.useActiveIModelConnection();
92
- const { getAccessToken } = GroupingApiConfigContext_1.useGroupingMappingApiConfig();
62
+ const { getAccessToken, iModelId } = GroupingApiConfigContext_1.useGroupingMappingApiConfig();
63
+ const { showGroupColor, setShowGroupColor, hiddenGroupsIds, setHiddenGroupsIds, hilitedElementsQueryCache, groups, setGroups } = GroupHilitedElementsContext_1.useGroupHilitedElementsContext();
93
64
  const mappingClient = MappingClientContext_1.useMappingClient();
94
- const iModelId = (_a = appui_react_1.useActiveIModelConnection()) === null || _a === void 0 ? void 0 : _a.iModelId;
95
- const groupUIs = GroupingMappingCustomUIContext_1.useGroupingMappingCustomUI()
65
+ const groupUIs = GroupingMappingCustomUIContext_1.useGroupingMappingCustomUI().customUIs
96
66
  .filter((p) => p.type === GroupingMappingCustomUI_1.GroupingMappingCustomUIType.Grouping);
97
- const contextUIs = GroupingMappingCustomUIContext_1.useGroupingMappingCustomUI()
67
+ const contextUIs = GroupingMappingCustomUIContext_1.useGroupingMappingCustomUI().customUIs
98
68
  .filter((p) => p.type === GroupingMappingCustomUI_1.GroupingMappingCustomUIType.Context);
99
69
  const [showDeleteModal, setShowDeleteModal] = react_1.useState(false);
100
70
  const [isLoading, setIsLoading] = react_1.useState(true);
101
- const [groupsView, setGroupsView] = react_1.useState(GroupsView.Groups);
102
71
  const [selectedGroup, setSelectedGroup] = react_1.useState(undefined);
103
- const hilitedElements = react_1.useRef(new Map());
104
72
  const [isLoadingQuery, setLoadingQuery] = react_1.useState(false);
105
- const [groups, setGroups] = react_1.useState([]);
106
- const [hiddenGroupsIds, setHiddenGroupsIds] = react_1.useState([]);
107
- const [showGroupColor, setShowGroupColor] = react_1.useState(false);
108
- const [queryGenerationType, setQueryGenerationType] = react_1.useState("Selection");
109
- const [selectedContextCustomUI, setSelectedContextCustomUI] = react_1.useState(undefined);
110
- react_1.useEffect(() => {
111
- void fetchGroups(setGroups, iModelId, mapping.id, setIsLoading, getAccessToken, mappingClient);
112
- }, [getAccessToken, mappingClient, iModelId, mapping.id]);
113
- const getGroupColor = function (index) {
114
- return `hsl(${index * goldenAngle + 60}, 100%, 50%)`;
115
- };
116
- const getHiliteIdsFromGroups = react_1.useCallback(async (groups) => {
117
- var _a;
118
- let allIds = [];
119
- for (const group of groups) {
120
- const query = group.query;
121
- let currentIds = [];
122
- if (hilitedElements.current.has(query)) {
123
- currentIds = (_a = hilitedElements.current.get(query)) !== null && _a !== void 0 ? _a : [];
124
- }
125
- else {
126
- try {
127
- const queryRowCount = await iModelConnection.queryRowCount(query);
128
- if (queryRowCount === 0) {
129
- itwinui_react_1.toaster.warning(`${group.groupName}'s query is valid but produced no results.`);
130
- }
131
- currentIds = await viewerUtils_1.getHiliteIds(query, iModelConnection);
132
- hilitedElements.current.set(query, currentIds);
133
- }
134
- catch {
135
- itwinui_react_1.toaster.negative(`Could not hide/show ${group.groupName}. Query could not be resolved.`);
136
- }
137
- }
138
- allIds = allIds.concat(currentIds);
139
- }
140
- return allIds;
141
- }, [iModelConnection, hilitedElements]);
142
- const visualizeGroupColors = react_1.useCallback(async (viewGroups) => {
73
+ const getHiliteIdsFromGroupsWrapper = react_1.useCallback(async (groups) => iModelConnection
74
+ ? groupsHelpers_1.getHiliteIdsFromGroups(iModelConnection, groups, hilitedElementsQueryCache)
75
+ : [], [iModelConnection, hilitedElementsQueryCache]);
76
+ const visualizeGroupColorsWrapper = react_1.useCallback(async (viewGroups) => {
77
+ if (!iModelConnection)
78
+ return;
143
79
  setLoadingQuery(true);
144
- viewerUtils_1.clearEmphasizedOverriddenElements();
145
- let allIds = [];
146
- for (const group of viewGroups) {
147
- const index = viewGroups.length > groups.length
148
- ? viewGroups.findIndex((g) => g.id === group.id)
149
- : groups.findIndex((g) => g.id === group.id);
150
- const hilitedIds = await getHiliteIdsFromGroups([group]);
151
- viewerUtils_1.overrideElements(hilitedIds, getGroupColor(index), core_common_1.FeatureOverrideType.ColorAndAlpha);
152
- viewerUtils_1.emphasizeElements(hilitedIds, undefined);
153
- if (!hiddenGroupsIds.includes(group.id)) {
154
- allIds = allIds.concat(hilitedIds);
155
- }
156
- }
157
- await viewerUtils_1.zoomToElements(allIds);
80
+ await groupsHelpers_1.visualizeGroupColors(iModelConnection, groups, viewGroups, hiddenGroupsIds, hilitedElementsQueryCache, emphasizeElements);
158
81
  setLoadingQuery(false);
159
- }, [groups, hiddenGroupsIds, getHiliteIdsFromGroups]);
160
- const hideGroups = react_1.useCallback(async (viewGroups) => {
161
- var _a;
162
- setLoadingQuery(true);
163
- for (const viewGroup of viewGroups) {
164
- const query = viewGroup.query;
165
- if (hilitedElements.current.has(query)) {
166
- const hilitedIds = (_a = hilitedElements.current.get(query)) !== null && _a !== void 0 ? _a : [];
167
- viewerUtils_1.hideElements(hilitedIds);
82
+ }, [iModelConnection, groups, hiddenGroupsIds, hilitedElementsQueryCache, emphasizeElements]);
83
+ react_1.useEffect(() => {
84
+ const initialize = async () => {
85
+ await fetchGroups(setGroups, iModelId, mapping.id, setIsLoading, getAccessToken, mappingClient);
86
+ };
87
+ void initialize();
88
+ }, [getAccessToken, mappingClient, iModelId, mapping.id, setGroups]);
89
+ react_1.useEffect(() => {
90
+ if (isLoading)
91
+ return;
92
+ const visualize = async () => {
93
+ if (groups.length > 0 && showGroupColor) {
94
+ await visualizeGroupColorsWrapper(groups);
168
95
  }
169
96
  else {
170
- try {
171
- const queryRowCount = await iModelConnection.queryRowCount(query);
172
- if (queryRowCount === 0) {
173
- itwinui_react_1.toaster.warning(`${viewGroup.groupName}'s query is valid but produced no results.`);
174
- }
175
- const hiliteIds = await viewerUtils_1.hideElementsByQuery(query, iModelConnection, false);
176
- hilitedElements.current.set(query, hiliteIds);
177
- }
178
- catch {
179
- itwinui_react_1.toaster.negative(`Could not hide/show ${viewGroup.groupName}. Query could not be resolved.`);
180
- }
97
+ viewerUtils_1.clearEmphasizedOverriddenElements();
181
98
  }
182
- }
99
+ };
100
+ void visualize();
101
+ }, [groups, isLoading, showGroupColor, visualizeGroupColorsWrapper]);
102
+ const hideGroupsWrapper = react_1.useCallback(async (viewGroups) => {
103
+ if (!iModelConnection)
104
+ return;
105
+ setLoadingQuery(true);
106
+ await groupsHelpers_1.hideGroups(iModelConnection, viewGroups, hilitedElementsQueryCache);
183
107
  setLoadingQuery(false);
184
- }, [iModelConnection]);
108
+ }, [hilitedElementsQueryCache, iModelConnection]);
185
109
  const showGroup = react_1.useCallback(async (viewGroup) => {
186
110
  viewerUtils_1.clearHiddenElements();
187
111
  // hide group Ids filter
@@ -189,193 +113,114 @@ const Groupings = ({ mapping, goBack }) => {
189
113
  .map((id) => groups.find((g) => g.id === id))
190
114
  .filter((g) => !!g && g.id !== viewGroup.id);
191
115
  // view group Ids filter
192
- const viewIds = await getHiliteIdsFromGroups(groups.filter((g) => !newHiddenGroups.find((hg) => hg.id === g.id)));
193
- let hiddenIds = await getHiliteIdsFromGroups(newHiddenGroups);
116
+ const viewIds = await getHiliteIdsFromGroupsWrapper(groups.filter((g) => !newHiddenGroups.find((hg) => hg.id === g.id)));
117
+ let hiddenIds = await getHiliteIdsFromGroupsWrapper(newHiddenGroups);
194
118
  hiddenIds = hiddenIds.filter((id) => !viewIds.includes(id));
195
119
  viewerUtils_1.hideElements(hiddenIds);
196
- }, [groups, hiddenGroupsIds, getHiliteIdsFromGroups]);
120
+ }, [groups, hiddenGroupsIds, getHiliteIdsFromGroupsWrapper]);
197
121
  const addGroup = (type) => {
198
- setQueryGenerationType(type);
122
+ if (!onClickAddGroup)
123
+ return;
124
+ onClickAddGroup(type);
199
125
  viewerUtils_1.clearEmphasizedElements();
200
- setGroupsView(GroupsView.Add);
201
126
  };
202
127
  const onModify = async (group, type) => {
203
- setQueryGenerationType(type);
204
- setSelectedGroup(group);
205
- setGroupsView(GroupsView.Modifying);
128
+ if (!onClickGroupModify)
129
+ return;
206
130
  if (group.id && hiddenGroupsIds.includes(group.id)) {
207
131
  await showGroup(group);
208
132
  setHiddenGroupsIds(hiddenGroupsIds.filter((id) => id !== group.id));
209
133
  }
210
134
  viewerUtils_1.clearEmphasizedElements();
135
+ onClickGroupModify(group, type);
211
136
  };
212
- const openProperties = async (group) => {
213
- setSelectedGroup(group);
214
- setGroupsView(GroupsView.Properties);
215
- if (group.id && hiddenGroupsIds.includes(group.id)) {
137
+ const colorGroup = async (group) => {
138
+ if (showGroupColor && hiddenGroupsIds.includes(group.id)) {
216
139
  await showGroup(group);
217
140
  setHiddenGroupsIds(hiddenGroupsIds.filter((id) => id !== group.id));
218
141
  }
219
142
  };
220
143
  const refresh = react_1.useCallback(async () => {
221
- setGroupsView(GroupsView.Groups);
222
144
  setSelectedGroup(undefined);
223
- setSelectedContextCustomUI(undefined);
224
145
  setGroups([]);
225
- const groups = await fetchGroups(setGroups, iModelId, mapping.id, setIsLoading, getAccessToken, mappingClient);
226
- if (groups) {
227
- if (showGroupColor) {
228
- await visualizeGroupColors(groups);
229
- }
230
- else {
231
- viewerUtils_1.clearEmphasizedOverriddenElements();
232
- }
233
- }
234
- }, [
235
- getAccessToken,
236
- mappingClient,
237
- iModelId,
238
- mapping.id,
239
- setGroups,
240
- showGroupColor,
241
- visualizeGroupColors,
242
- ]);
243
- const resetView = async () => {
244
- if (groups) {
245
- if (showGroupColor) {
246
- await visualizeGroupColors(groups);
247
- }
248
- else {
249
- viewerUtils_1.clearOverriddenElements();
250
- }
251
- viewerUtils_1.clearEmphasizedElements();
252
- }
253
- };
146
+ await fetchGroups(setGroups, iModelId, mapping.id, setIsLoading, getAccessToken, mappingClient);
147
+ }, [getAccessToken, mappingClient, iModelId, mapping.id, setGroups]);
254
148
  const showAll = async () => {
255
149
  setLoadingQuery(true);
256
150
  viewerUtils_1.clearHiddenElements();
257
151
  setHiddenGroupsIds([]);
258
- const allIds = await getHiliteIdsFromGroups(groups);
152
+ const allIds = await getHiliteIdsFromGroupsWrapper(groups);
259
153
  await viewerUtils_1.zoomToElements(allIds);
260
154
  setLoadingQuery(false);
261
155
  };
262
156
  const hideAll = react_1.useCallback(async () => {
263
- await hideGroups(groups);
157
+ await hideGroupsWrapper(groups);
264
158
  setHiddenGroupsIds(groups.map((g) => g.id).filter((id) => !!id));
265
- const allIds = await getHiliteIdsFromGroups(groups);
159
+ const allIds = await getHiliteIdsFromGroupsWrapper(groups);
266
160
  await viewerUtils_1.zoomToElements(allIds);
267
- }, [setHiddenGroupsIds, groups, hideGroups, getHiliteIdsFromGroups]);
268
- const toggleGroupColor = react_1.useCallback(async (e) => {
269
- if (e.target.checked) {
270
- await visualizeGroupColors(groups);
271
- setShowGroupColor(true);
272
- }
273
- else {
274
- viewerUtils_1.clearEmphasizedOverriddenElements();
275
- setShowGroupColor(false);
276
- }
277
- }, [groups, visualizeGroupColors, setShowGroupColor]);
278
- const propertyMenuGoBack = react_1.useCallback(async () => {
279
- setGroupsView(GroupsView.Groups);
280
- await refresh();
281
- }, [refresh]);
282
- switch (groupsView) {
283
- case GroupsView.Add:
284
- return (react_1.default.createElement(GroupAction_1.default, { iModelId: iModelId, mappingId: mapping.id, queryGenerationType: queryGenerationType, goBack: async () => {
285
- setGroupsView(GroupsView.Groups);
286
- await refresh();
287
- }, resetView: resetView }));
288
- case GroupsView.Modifying:
289
- return selectedGroup ? (react_1.default.createElement(GroupAction_1.default, { iModelId: iModelId, mappingId: mapping.id, group: selectedGroup, queryGenerationType: queryGenerationType, goBack: async () => {
290
- setGroupsView(GroupsView.Groups);
291
- await refresh();
292
- }, resetView: resetView })) : null;
293
- case GroupsView.Properties:
294
- return selectedGroup ? (react_1.default.createElement(PropertyMenu_1.PropertyMenu, { iModelId: iModelId, mappingId: mapping.id, group: selectedGroup, goBack: propertyMenuGoBack })) : null;
295
- case GroupsView.Groups:
296
- return (react_1.default.createElement(react_1.default.Fragment, null,
297
- react_1.default.createElement(utils_1.WidgetHeader, { title: mapping.mappingName, disabled: isLoading || isLoadingQuery, returnFn: async () => {
298
- viewerUtils_1.clearEmphasizedOverriddenElements();
299
- await goBack();
300
- } }),
301
- react_1.default.createElement(itwinui_react_1.Surface, { className: 'gmw-groups-container' },
302
- react_1.default.createElement("div", { className: 'gmw-toolbar' },
303
- react_1.default.createElement(itwinui_react_1.DropdownMenu, { className: 'gmw-custom-ui-dropdown', disabled: isLoadingQuery, menuItems: () => (groupUIs.length > 0
304
- ? groupUIs
305
- : exports.defaultUIMetadata)
306
- .map((p, index) => (react_1.default.createElement(itwinui_react_1.MenuItem, { key: index, onClick: () => addGroup(p.name), icon: p.icon, className: 'gmw-menu-item', "data-testid": `gmw-add-${index}` }, p.displayLabel))) },
307
- react_1.default.createElement(itwinui_react_1.Button, { "data-testid": "gmw-add-group-button", className: 'add-load-button', startIcon: isLoadingQuery ? (react_1.default.createElement(itwinui_react_1.ProgressRadial, { size: 'small', indeterminate: true })) : (react_1.default.createElement(itwinui_icons_react_1.SvgAdd, null)), styleType: 'high-visibility', disabled: isLoadingQuery }, isLoadingQuery ? "Loading" : "Add Group")),
308
- react_1.default.createElement(itwinui_react_1.ButtonGroup, { className: 'gmw-toolbar-buttons' },
309
- react_1.default.createElement(itwinui_react_1.ToggleSwitch, { label: 'Color by Group', labelPosition: 'left', className: 'gmw-toggle', disabled: isLoadingQuery, checked: showGroupColor, onChange: toggleGroupColor }),
310
- react_1.default.createElement(itwinui_react_1.IconButton, { title: 'Show All', onClick: showAll, disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon' },
311
- react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityShow, null)),
312
- react_1.default.createElement(itwinui_react_1.IconButton, { title: 'Hide All', onClick: hideAll, disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon' },
313
- react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityHide, null)))),
314
- isLoading ? (react_1.default.createElement(utils_1.LoadingOverlay, null)) : groups.length === 0 ? (react_1.default.createElement(utils_1.EmptyMessage, { message: 'No Groups available.' })) : (react_1.default.createElement("div", { className: 'gmw-group-list' }, groups
315
- .sort((a, b) => { var _a, _b, _c; return (_c = (_a = a.groupName) === null || _a === void 0 ? void 0 : _a.localeCompare((_b = b.groupName) !== null && _b !== void 0 ? _b : "")) !== null && _c !== void 0 ? _c : 1; })
316
- .map((g) => (react_1.default.createElement(HorizontalTile_1.HorizontalTile, { key: g.id, title: g.groupName ? g.groupName : "Untitled", subText: g.description, actionGroup: react_1.default.createElement("div", { className: 'gmw-actions' },
317
- showGroupColor && (react_1.default.createElement(itwinui_react_1.IconButton, { styleType: 'borderless', className: 'gmw-group-view-icon' },
318
- react_1.default.createElement("div", { className: "gmw-color-legend", style: {
319
- backgroundColor: getGroupColor(groups.findIndex((group) => g.id === group.id)),
320
- } }))),
321
- g.id && hiddenGroupsIds.includes(g.id) ? (react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon', onClick: async () => {
322
- await showGroup(g);
323
- setHiddenGroupsIds(hiddenGroupsIds.filter((id) => g.id !== id));
324
- } },
325
- react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityHide, null))) : (react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon', onClick: async () => {
326
- await hideGroups([g]);
327
- setHiddenGroupsIds(hiddenGroupsIds.concat(g.id ? [g.id] : []));
328
- } },
329
- react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityShow, null))),
330
- react_1.default.createElement(itwinui_react_1.DropdownMenu, { className: 'gmw-custom-ui-dropdown', disabled: isLoadingQuery, menuItems: (close) => [
331
- react_1.default.createElement(itwinui_react_1.MenuItem, { key: 0, icon: react_1.default.createElement(itwinui_icons_react_1.SvgEdit, null), disabled: isLoadingQuery, "data-testid": "gmw-context-menu-item", subMenuItems: (groupUIs.length > 0
332
- ? groupUIs
333
- : exports.defaultUIMetadata)
334
- .map((p, index) => (react_1.default.createElement(itwinui_react_1.MenuItem, { key: index, className: 'gmw-menu-item', "data-testid": `gmw-edit-${index}`, onClick: async () => onModify(g, p.name), icon: p.icon }, p.displayLabel))) }, "Edit"),
335
- react_1.default.createElement(itwinui_react_1.MenuItem, { key: 1, onClick: async () => openProperties(g), icon: react_1.default.createElement(itwinui_icons_react_1.SvgList, null), "data-testid": "gmw-context-menu-item" }, "Properties"),
336
- react_1.default.createElement(itwinui_react_1.MenuItem, { key: 2, onClick: () => {
337
- setSelectedGroup(g);
338
- setShowDeleteModal(true);
339
- close();
340
- }, icon: react_1.default.createElement(itwinui_icons_react_1.SvgDelete, null), "data-testid": "gmw-context-menu-item" }, "Remove"),
341
- ].concat(contextUIs.map((p) => {
342
- return react_1.default.createElement(itwinui_react_1.MenuItem, { key: p.name, onClick: () => {
343
- if (p.uiComponent) {
344
- setSelectedGroup(g);
345
- setSelectedContextCustomUI(p);
346
- setGroupsView(GroupsView.CustomUI);
347
- }
348
- if (p.onClick) {
349
- p.onClick(g.id, mapping.id, iModelId);
350
- }
351
- close();
352
- }, icon: p.icon, "data-testid": "gmw-context-menu-item" }, p.displayLabel);
353
- })) },
354
- react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: 'borderless', "data-testid": "gmw-more-button" },
355
- react_1.default.createElement(itwinui_icons_react_1.SvgMore, null)))), onClickTitle: isLoadingQuery
356
- ? undefined
357
- : async () => openProperties(g) })))))),
358
- react_1.default.createElement(DeleteModal_1.default, { entityName: (_b = selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.groupName) !== null && _b !== void 0 ? _b : "", show: showDeleteModal, setShow: setShowDeleteModal, onDelete: async () => {
359
- var _a;
360
- const accessToken = await getAccessToken();
361
- await mappingClient.deleteGroup(accessToken, iModelId, mapping.id, (_a = selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.id) !== null && _a !== void 0 ? _a : "");
362
- }, refresh: refresh })));
363
- case GroupsView.CustomUI:
364
- return selectedContextCustomUI && selectedContextCustomUI.uiComponent && selectedGroup
365
- ? (react_1.default.createElement(react_1.default.Fragment, null,
366
- react_1.default.createElement(utils_1.WidgetHeader, { title: selectedContextCustomUI.displayLabel, returnFn: async () => {
367
- presentation_frontend_1.Presentation.selection.clearSelection("GroupingMappingWidget", iModelConnection);
368
- await refresh();
369
- } }),
370
- react_1.default.createElement(selectedContextCustomUI.uiComponent, {
371
- iModelId,
372
- mappingId: mapping.id,
373
- groupId: selectedGroup.id,
374
- })))
375
- : null;
376
- default:
377
- return (react_1.default.createElement(utils_1.EmptyMessage, { message: "No given group view" }));
378
- }
161
+ }, [setHiddenGroupsIds, groups, hideGroupsWrapper, getHiliteIdsFromGroupsWrapper]);
162
+ return (react_1.default.createElement(react_1.default.Fragment, null,
163
+ react_1.default.createElement(itwinui_react_1.Surface, { className: 'gmw-groups-container' },
164
+ react_1.default.createElement("div", { className: 'gmw-toolbar' },
165
+ onClickAddGroup && groupUIs.length > 0 &&
166
+ react_1.default.createElement(itwinui_react_1.DropdownMenu, { className: 'gmw-custom-ui-dropdown', disabled: isLoadingQuery, menuItems: () => groupUIs.map((p, index) => (react_1.default.createElement(itwinui_react_1.MenuItem, { key: index, onClick: () => addGroup(p.name), icon: p.icon, className: 'gmw-menu-item', "data-testid": `gmw-add-${index}` }, p.displayLabel))) },
167
+ react_1.default.createElement(itwinui_react_1.Button, { "data-testid": "gmw-add-group-button", className: 'add-load-button', startIcon: isLoadingQuery ? (react_1.default.createElement(itwinui_react_1.ProgressRadial, { size: 'small', indeterminate: true })) : (react_1.default.createElement(itwinui_icons_react_1.SvgAdd, null)), styleType: 'high-visibility', disabled: isLoadingQuery }, isLoadingQuery ? "Loading" : "Add Group")),
168
+ iModelConnection &&
169
+ react_1.default.createElement(itwinui_react_1.ButtonGroup, { className: 'gmw-toolbar-buttons' },
170
+ react_1.default.createElement(itwinui_react_1.ToggleSwitch, { label: 'Color by Group', labelPosition: 'left', className: 'gmw-toggle', disabled: isLoadingQuery, checked: showGroupColor, onChange: () => setShowGroupColor((b) => !b) }),
171
+ react_1.default.createElement(itwinui_react_1.IconButton, { title: 'Show All', onClick: showAll, disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon' },
172
+ react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityShow, null)),
173
+ react_1.default.createElement(itwinui_react_1.IconButton, { title: 'Hide All', onClick: hideAll, disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon' },
174
+ react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityHide, null)),
175
+ react_1.default.createElement(itwinui_react_1.IconButton, { title: "Refresh", onClick: refresh, disabled: isLoading || isLoadingQuery, styleType: 'borderless' },
176
+ react_1.default.createElement(itwinui_icons_react_1.SvgRefresh, null)))),
177
+ isLoading ? (react_1.default.createElement(utils_1.LoadingOverlay, null)) : groups.length === 0 ? (react_1.default.createElement(utils_1.EmptyMessage, { message: 'No Groups available.' })) : (react_1.default.createElement("div", { className: 'gmw-group-list' }, groups
178
+ .sort((a, b) => { var _a, _b, _c; return (_c = (_a = a.groupName) === null || _a === void 0 ? void 0 : _a.localeCompare((_b = b.groupName) !== null && _b !== void 0 ? _b : "")) !== null && _c !== void 0 ? _c : 1; })
179
+ .map((g) => (react_1.default.createElement(HorizontalTile_1.HorizontalTile, { key: g.id, title: g.groupName ? g.groupName : "Untitled", subText: g.description, actionGroup: react_1.default.createElement("div", { className: 'gmw-actions' },
180
+ iModelConnection && react_1.default.createElement(react_1.default.Fragment, null,
181
+ showGroupColor && (react_1.default.createElement(itwinui_react_1.IconButton, { styleType: 'borderless', className: 'gmw-group-view-icon' },
182
+ react_1.default.createElement("div", { className: "gmw-color-legend", style: {
183
+ backgroundColor: groupsHelpers_1.getGroupColor(groups.findIndex((group) => g.id === group.id)),
184
+ } }))),
185
+ g.id && hiddenGroupsIds.includes(g.id) ? (react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon', onClick: async () => {
186
+ await showGroup(g);
187
+ setHiddenGroupsIds(hiddenGroupsIds.filter((id) => g.id !== id));
188
+ } },
189
+ react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityHide, null))) : (react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon', onClick: async () => {
190
+ await hideGroupsWrapper([g]);
191
+ setHiddenGroupsIds(hiddenGroupsIds.concat(g.id ? [g.id] : []));
192
+ } },
193
+ react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityShow, null)))),
194
+ react_1.default.createElement(itwinui_react_1.DropdownMenu, { className: 'gmw-custom-ui-dropdown', disabled: isLoadingQuery, menuItems: (close) => [...(groupUIs.length > 0 && onClickGroupModify ?
195
+ [react_1.default.createElement(itwinui_react_1.MenuItem, { key: 0, icon: react_1.default.createElement(itwinui_icons_react_1.SvgEdit, null), disabled: isLoadingQuery, "data-testid": "gmw-context-menu-item", subMenuItems: groupUIs.map((p, index) => (react_1.default.createElement(itwinui_react_1.MenuItem, { key: index, className: 'gmw-menu-item', "data-testid": `gmw-edit-${index}`, onClick: async () => onModify(g, p.name), icon: p.icon }, p.displayLabel))) }, "Edit")] : []),
196
+ ...contextUIs.map((p) => {
197
+ return react_1.default.createElement(itwinui_react_1.MenuItem, { key: p.name, onClick: async () => {
198
+ showGroupColor && await showGroup(g);
199
+ if (p.uiComponent && onClickRenderContextCustomUI) {
200
+ onClickRenderContextCustomUI(p.uiComponent, g);
201
+ }
202
+ if (p.onClick) {
203
+ p.onClick(g, mapping, iModelId);
204
+ }
205
+ close();
206
+ }, icon: p.icon, "data-testid": "gmw-context-menu-item" }, p.displayLabel);
207
+ }), react_1.default.createElement(itwinui_react_1.MenuItem, { key: 2, onClick: () => {
208
+ setSelectedGroup(g);
209
+ setShowDeleteModal(true);
210
+ close();
211
+ }, icon: react_1.default.createElement(itwinui_icons_react_1.SvgDelete, null), "data-testid": "gmw-context-menu-item" }, "Remove"),
212
+ ] },
213
+ react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: 'borderless', "data-testid": "gmw-more-button" },
214
+ react_1.default.createElement(itwinui_icons_react_1.SvgMore, null)))), onClickTitle: onClickGroupTitle && !isLoadingQuery ?
215
+ async () => {
216
+ await colorGroup(g);
217
+ onClickGroupTitle(g);
218
+ } : undefined })))))),
219
+ react_1.default.createElement(DeleteModal_1.default, { entityName: (_a = selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.groupName) !== null && _a !== void 0 ? _a : "", show: showDeleteModal, setShow: setShowDeleteModal, onDelete: async () => {
220
+ var _a;
221
+ const accessToken = await getAccessToken();
222
+ await mappingClient.deleteGroup(accessToken, iModelId, mapping.id, (_a = selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.id) !== null && _a !== void 0 ? _a : "");
223
+ }, refresh: refresh })));
379
224
  };
380
225
  exports.Groupings = Groupings;
381
226
  //# sourceMappingURL=Grouping.js.map