@itwin/grouping-mapping-widget 0.9.3 → 0.11.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 (183) 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.d.ts +5 -1
  13. package/lib/cjs/widget/components/ConfirmMappingsImport.js +10 -9
  14. package/lib/cjs/widget/components/ConfirmMappingsImport.js.map +1 -1
  15. package/lib/cjs/widget/components/GroupAction.d.ts +13 -9
  16. package/lib/cjs/widget/components/GroupAction.js +56 -58
  17. package/lib/cjs/widget/components/GroupAction.js.map +1 -1
  18. package/lib/cjs/widget/components/GroupPropertyAction.d.ts +1 -1
  19. package/lib/cjs/widget/components/GroupPropertyAction.js.map +1 -1
  20. package/lib/cjs/widget/components/GroupPropertyUtils.js +4 -0
  21. package/lib/cjs/widget/components/GroupPropertyUtils.js.map +1 -1
  22. package/lib/cjs/widget/components/Grouping.d.ts +8 -9
  23. package/lib/cjs/widget/components/Grouping.js +118 -273
  24. package/lib/cjs/widget/components/Grouping.js.map +1 -1
  25. package/lib/cjs/widget/components/Grouping.scss +2 -2
  26. package/lib/cjs/widget/components/GroupingMapping.d.ts +28 -21
  27. package/lib/cjs/widget/components/GroupingMapping.js +59 -38
  28. package/lib/cjs/widget/components/GroupingMapping.js.map +1 -1
  29. package/lib/cjs/widget/components/GroupingMappingContent.d.ts +8 -0
  30. package/lib/cjs/widget/components/GroupingMappingContent.js +47 -0
  31. package/lib/cjs/widget/components/GroupingMappingContent.js.map +1 -0
  32. package/lib/cjs/widget/components/GroupingMappingContext.d.ts +31 -0
  33. package/lib/cjs/widget/components/GroupingMappingContext.js +84 -0
  34. package/lib/cjs/widget/components/GroupingMappingContext.js.map +1 -0
  35. package/lib/cjs/widget/components/GroupingMappingHeader.d.ts +8 -0
  36. package/lib/cjs/widget/components/GroupingMappingHeader.js +17 -0
  37. package/lib/cjs/widget/components/GroupingMappingHeader.js.map +1 -0
  38. package/lib/cjs/widget/components/GroupingMappingRouter.d.ts +8 -0
  39. package/lib/cjs/widget/components/GroupingMappingRouter.js +87 -0
  40. package/lib/cjs/widget/components/GroupingMappingRouter.js.map +1 -0
  41. package/lib/cjs/widget/components/Mapping.d.ts +12 -2
  42. package/lib/cjs/widget/components/Mapping.js +57 -84
  43. package/lib/cjs/widget/components/Mapping.js.map +1 -1
  44. package/lib/cjs/widget/components/MappingAction.d.ts +9 -5
  45. package/lib/cjs/widget/components/MappingAction.js +19 -8
  46. package/lib/cjs/widget/components/MappingAction.js.map +1 -1
  47. package/lib/cjs/widget/components/MappingImportWizardModal.d.ts +5 -1
  48. package/lib/cjs/widget/components/MappingImportWizardModal.js +11 -7
  49. package/lib/cjs/widget/components/MappingImportWizardModal.js.map +1 -1
  50. package/lib/cjs/widget/components/QueryBuilder.js +2 -7
  51. package/lib/cjs/widget/components/QueryBuilder.js.map +1 -1
  52. package/lib/cjs/widget/components/SelectMappings.d.ts +5 -1
  53. package/lib/cjs/widget/components/SelectMappings.js +8 -4
  54. package/lib/cjs/widget/components/SelectMappings.js.map +1 -1
  55. package/lib/cjs/widget/components/context/GroupHilitedElementsContext.d.ts +15 -0
  56. package/lib/cjs/widget/components/context/GroupHilitedElementsContext.js +45 -0
  57. package/lib/cjs/widget/components/context/GroupHilitedElementsContext.js.map +1 -0
  58. package/lib/cjs/widget/components/context/GroupingApiConfigContext.d.ts +1 -0
  59. package/lib/cjs/widget/components/context/GroupingApiConfigContext.js +1 -0
  60. package/lib/cjs/widget/components/context/GroupingApiConfigContext.js.map +1 -1
  61. package/lib/cjs/widget/components/context/GroupingMappingCustomUIContext.d.ts +6 -2
  62. package/lib/cjs/widget/components/context/GroupingMappingCustomUIContext.js +5 -5
  63. package/lib/cjs/widget/components/context/GroupingMappingCustomUIContext.js.map +1 -1
  64. package/lib/cjs/widget/components/customUI/DefaultGroupingUI.d.ts +3 -0
  65. package/lib/cjs/widget/components/customUI/DefaultGroupingUI.js +40 -0
  66. package/lib/cjs/widget/components/customUI/DefaultGroupingUI.js.map +1 -0
  67. package/lib/cjs/widget/components/customUI/GroupQueryBuilderCustomUI.d.ts +5 -0
  68. package/lib/cjs/widget/components/{GroupQueryBuilderContainer.js → customUI/GroupQueryBuilderCustomUI.js} +36 -16
  69. package/lib/cjs/widget/components/customUI/GroupQueryBuilderCustomUI.js.map +1 -0
  70. package/lib/cjs/widget/components/customUI/GroupingMappingCustomUI.d.ts +3 -2
  71. package/lib/cjs/widget/components/customUI/GroupingMappingCustomUI.js.map +1 -1
  72. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.d.ts +1 -2
  73. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.js +2 -1
  74. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.js.map +1 -1
  75. package/lib/cjs/widget/components/customUI/SearchGroupingCustomUI.d.ts +1 -2
  76. package/lib/cjs/widget/components/customUI/SearchGroupingCustomUI.js +2 -1
  77. package/lib/cjs/widget/components/customUI/SearchGroupingCustomUI.js.map +1 -1
  78. package/lib/cjs/widget/components/groupsHelpers.d.ts +7 -0
  79. package/lib/cjs/widget/components/groupsHelpers.js +84 -0
  80. package/lib/cjs/widget/components/groupsHelpers.js.map +1 -0
  81. package/lib/cjs/widget/components/property-grid/PropertyGridWrapper.d.ts +1 -1
  82. package/lib/cjs/widget/components/property-grid/PropertyGridWrapper.js +1 -1
  83. package/lib/cjs/widget/components/property-grid/PropertyGridWrapper.js.map +1 -1
  84. package/lib/cjs/widget/components/property-grid/PropertyView.js +29 -15
  85. package/lib/cjs/widget/components/property-grid/PropertyView.js.map +1 -1
  86. package/lib/cjs/widget/components/utils.d.ts +1 -3
  87. package/lib/cjs/widget/components/utils.js +1 -26
  88. package/lib/cjs/widget/components/utils.js.map +1 -1
  89. package/lib/esm/grouping-mapping-widget.d.ts +9 -3
  90. package/lib/esm/grouping-mapping-widget.js +7 -1
  91. package/lib/esm/grouping-mapping-widget.js.map +1 -1
  92. package/lib/esm/test/GroupingMappingCustomUI.test.js +46 -83
  93. package/lib/esm/test/GroupingMappingCustomUI.test.js.map +1 -1
  94. package/lib/esm/test/test-utils.d.ts +0 -6
  95. package/lib/esm/test/test-utils.js +7 -22
  96. package/lib/esm/test/test-utils.js.map +1 -1
  97. package/lib/esm/widget/components/ActionPanel.d.ts +1 -1
  98. package/lib/esm/widget/components/ActionPanel.js +1 -1
  99. package/lib/esm/widget/components/ActionPanel.js.map +1 -1
  100. package/lib/esm/widget/components/ConfirmMappingsImport.d.ts +5 -1
  101. package/lib/esm/widget/components/ConfirmMappingsImport.js +10 -9
  102. package/lib/esm/widget/components/ConfirmMappingsImport.js.map +1 -1
  103. package/lib/esm/widget/components/GroupAction.d.ts +13 -9
  104. package/lib/esm/widget/components/GroupAction.js +57 -61
  105. package/lib/esm/widget/components/GroupAction.js.map +1 -1
  106. package/lib/esm/widget/components/GroupPropertyAction.d.ts +1 -1
  107. package/lib/esm/widget/components/GroupPropertyAction.js.map +1 -1
  108. package/lib/esm/widget/components/GroupPropertyUtils.js +4 -0
  109. package/lib/esm/widget/components/GroupPropertyUtils.js.map +1 -1
  110. package/lib/esm/widget/components/Grouping.d.ts +8 -9
  111. package/lib/esm/widget/components/Grouping.js +122 -277
  112. package/lib/esm/widget/components/Grouping.js.map +1 -1
  113. package/lib/esm/widget/components/Grouping.scss +2 -2
  114. package/lib/esm/widget/components/GroupingMapping.d.ts +28 -21
  115. package/lib/esm/widget/components/GroupingMapping.js +59 -39
  116. package/lib/esm/widget/components/GroupingMapping.js.map +1 -1
  117. package/lib/esm/widget/components/GroupingMappingContent.d.ts +8 -0
  118. package/lib/esm/widget/components/GroupingMappingContent.js +24 -0
  119. package/lib/esm/widget/components/GroupingMappingContent.js.map +1 -0
  120. package/lib/esm/widget/components/GroupingMappingContext.d.ts +31 -0
  121. package/lib/esm/widget/components/GroupingMappingContext.js +61 -0
  122. package/lib/esm/widget/components/GroupingMappingContext.js.map +1 -0
  123. package/lib/esm/widget/components/GroupingMappingHeader.d.ts +8 -0
  124. package/lib/esm/widget/components/GroupingMappingHeader.js +10 -0
  125. package/lib/esm/widget/components/GroupingMappingHeader.js.map +1 -0
  126. package/lib/esm/widget/components/GroupingMappingRouter.d.ts +8 -0
  127. package/lib/esm/widget/components/GroupingMappingRouter.js +80 -0
  128. package/lib/esm/widget/components/GroupingMappingRouter.js.map +1 -0
  129. package/lib/esm/widget/components/Mapping.d.ts +12 -2
  130. package/lib/esm/widget/components/Mapping.js +59 -86
  131. package/lib/esm/widget/components/Mapping.js.map +1 -1
  132. package/lib/esm/widget/components/MappingAction.d.ts +9 -5
  133. package/lib/esm/widget/components/MappingAction.js +18 -9
  134. package/lib/esm/widget/components/MappingAction.js.map +1 -1
  135. package/lib/esm/widget/components/MappingImportWizardModal.d.ts +5 -1
  136. package/lib/esm/widget/components/MappingImportWizardModal.js +11 -7
  137. package/lib/esm/widget/components/MappingImportWizardModal.js.map +1 -1
  138. package/lib/esm/widget/components/QueryBuilder.js +2 -7
  139. package/lib/esm/widget/components/QueryBuilder.js.map +1 -1
  140. package/lib/esm/widget/components/SelectMappings.d.ts +5 -1
  141. package/lib/esm/widget/components/SelectMappings.js +8 -4
  142. package/lib/esm/widget/components/SelectMappings.js.map +1 -1
  143. package/lib/esm/widget/components/context/GroupHilitedElementsContext.d.ts +15 -0
  144. package/lib/esm/widget/components/context/GroupHilitedElementsContext.js +22 -0
  145. package/lib/esm/widget/components/context/GroupHilitedElementsContext.js.map +1 -0
  146. package/lib/esm/widget/components/context/GroupingApiConfigContext.d.ts +1 -0
  147. package/lib/esm/widget/components/context/GroupingApiConfigContext.js +1 -0
  148. package/lib/esm/widget/components/context/GroupingApiConfigContext.js.map +1 -1
  149. package/lib/esm/widget/components/context/GroupingMappingCustomUIContext.d.ts +6 -2
  150. package/lib/esm/widget/components/context/GroupingMappingCustomUIContext.js +5 -5
  151. package/lib/esm/widget/components/context/GroupingMappingCustomUIContext.js.map +1 -1
  152. package/lib/esm/widget/components/customUI/DefaultGroupingUI.d.ts +3 -0
  153. package/lib/esm/widget/components/customUI/DefaultGroupingUI.js +34 -0
  154. package/lib/esm/widget/components/customUI/DefaultGroupingUI.js.map +1 -0
  155. package/lib/esm/widget/components/customUI/GroupQueryBuilderCustomUI.d.ts +5 -0
  156. package/lib/esm/widget/components/{GroupQueryBuilderContainer.js → customUI/GroupQueryBuilderCustomUI.js} +11 -7
  157. package/lib/esm/widget/components/customUI/GroupQueryBuilderCustomUI.js.map +1 -0
  158. package/lib/esm/widget/components/customUI/GroupingMappingCustomUI.d.ts +3 -2
  159. package/lib/esm/widget/components/customUI/GroupingMappingCustomUI.js.map +1 -1
  160. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.d.ts +1 -2
  161. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.js +1 -2
  162. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.js.map +1 -1
  163. package/lib/esm/widget/components/customUI/SearchGroupingCustomUI.d.ts +1 -2
  164. package/lib/esm/widget/components/customUI/SearchGroupingCustomUI.js +1 -2
  165. package/lib/esm/widget/components/customUI/SearchGroupingCustomUI.js.map +1 -1
  166. package/lib/esm/widget/components/groupsHelpers.d.ts +7 -0
  167. package/lib/esm/widget/components/groupsHelpers.js +77 -0
  168. package/lib/esm/widget/components/groupsHelpers.js.map +1 -0
  169. package/lib/esm/widget/components/property-grid/PropertyGridWrapper.d.ts +1 -1
  170. package/lib/esm/widget/components/property-grid/PropertyGridWrapper.js +1 -1
  171. package/lib/esm/widget/components/property-grid/PropertyGridWrapper.js.map +1 -1
  172. package/lib/esm/widget/components/property-grid/PropertyView.js +1 -3
  173. package/lib/esm/widget/components/property-grid/PropertyView.js.map +1 -1
  174. package/lib/esm/widget/components/utils.d.ts +1 -3
  175. package/lib/esm/widget/components/utils.js +0 -24
  176. package/lib/esm/widget/components/utils.js.map +1 -1
  177. package/package.json +3 -3
  178. package/lib/cjs/widget/components/GroupQueryBuilderContainer.d.ts +0 -5
  179. package/lib/cjs/widget/components/GroupQueryBuilderContainer.js.map +0 -1
  180. package/lib/esm/widget/components/GroupQueryBuilderContainer.d.ts +0 -5
  181. package/lib/esm/widget/components/GroupQueryBuilderContainer.js.map +0 -1
  182. /package/lib/cjs/widget/components/{GroupQueryBuilder.scss → customUI/GroupQueryBuilderCustomUI.scss} +0 -0
  183. /package/lib/esm/widget/components/{GroupQueryBuilder.scss → customUI/GroupQueryBuilderCustomUI.scss} +0 -0
@@ -5,12 +5,18 @@ export { createDefaultMappingClient, createMappingClient, MappingClientContext,
5
5
  export { ClientPrefix, GetAccessTokenFn, GroupingMappingApiConfig, GroupingMappingApiConfigContext, useGroupingMappingApiConfig } from "./widget/components/context/GroupingApiConfigContext";
6
6
  export * from "@itwin/insights-client";
7
7
  /** Internal components for custom UIs */
8
- export { Mappings } from "./widget/components/Mapping";
9
- export { Groupings } from "./widget/components/Grouping";
8
+ export { Mappings, MappingsProps } from "./widget/components/Mapping";
9
+ export { MappingAction, MappingActionProps } from "./widget/components/MappingAction";
10
+ export { GroupingMappingContext, GroupingMappingContextProps } from "./widget/components/GroupingMappingContext";
11
+ export { Groupings, GroupingProps } from "./widget/components/Grouping";
12
+ export { GroupAction, GroupActionProps } from "./widget/components/GroupAction";
10
13
  export { PropertyMenu } from "./widget/components/PropertyMenu";
14
+ export { SearchGroupingCustomUI } from "./widget/components/customUI/SearchGroupingCustomUI";
15
+ export { ManualGroupingCustomUI } from "./widget/components/customUI/ManualGroupingCustomUI";
16
+ export { GroupQueryBuilderCustomUI } from "./widget/components/customUI/GroupQueryBuilderCustomUI";
17
+ export { GroupingMappingCustomUI, GroupingMappingCustomUIType, ContextCustomUI, GroupingCustomUI, GroupingCustomUIProps, ContextCustomUIProps } from "./widget/components/customUI/GroupingMappingCustomUI";
11
18
  /** Formula DataType resolver */
12
19
  export { resolveFormulaDataType } from "./formula/FormulaDataTypeResolver";
13
20
  export { DataType, PropertyMap } from "./formula/Types";
14
21
  export { IResult } from "./formula/IResult";
15
- export { GroupingMappingCustomUI, GroupingMappingCustomUIType, ContextCustomUI, GroupingCustomUI, GroupingCustomUIProps, ContextCustomUIProps } from "./widget/components/customUI/GroupingMappingCustomUI";
16
22
  //# sourceMappingURL=grouping-mapping-widget.d.ts.map
@@ -10,7 +10,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
10
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.GroupingMappingCustomUIType = exports.resolveFormulaDataType = exports.PropertyMenu = exports.Groupings = exports.Mappings = exports.useGroupingMappingApiConfig = exports.GroupingMappingApiConfigContext = exports.useMappingClient = exports.MappingClientContext = exports.createMappingClient = exports.createDefaultMappingClient = void 0;
13
+ exports.resolveFormulaDataType = exports.GroupingMappingCustomUIType = exports.GroupQueryBuilderCustomUI = exports.ManualGroupingCustomUI = exports.SearchGroupingCustomUI = exports.PropertyMenu = exports.GroupAction = exports.Groupings = exports.GroupingMappingContext = exports.MappingAction = exports.Mappings = exports.useGroupingMappingApiConfig = exports.GroupingMappingApiConfigContext = exports.useMappingClient = exports.MappingClientContext = exports.createMappingClient = exports.createDefaultMappingClient = void 0;
14
14
  /*---------------------------------------------------------------------------------------------
15
15
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
16
16
  * See LICENSE.md in the project root for license terms and full copyright notice.
@@ -30,13 +30,25 @@ __exportStar(require("@itwin/insights-client"), exports);
30
30
  /** Internal components for custom UIs */
31
31
  var Mapping_1 = require("./widget/components/Mapping");
32
32
  Object.defineProperty(exports, "Mappings", { enumerable: true, get: function () { return Mapping_1.Mappings; } });
33
+ var MappingAction_1 = require("./widget/components/MappingAction");
34
+ Object.defineProperty(exports, "MappingAction", { enumerable: true, get: function () { return MappingAction_1.MappingAction; } });
35
+ var GroupingMappingContext_1 = require("./widget/components/GroupingMappingContext");
36
+ Object.defineProperty(exports, "GroupingMappingContext", { enumerable: true, get: function () { return GroupingMappingContext_1.GroupingMappingContext; } });
33
37
  var Grouping_1 = require("./widget/components/Grouping");
34
38
  Object.defineProperty(exports, "Groupings", { enumerable: true, get: function () { return Grouping_1.Groupings; } });
39
+ var GroupAction_1 = require("./widget/components/GroupAction");
40
+ Object.defineProperty(exports, "GroupAction", { enumerable: true, get: function () { return GroupAction_1.GroupAction; } });
35
41
  var PropertyMenu_1 = require("./widget/components/PropertyMenu");
36
42
  Object.defineProperty(exports, "PropertyMenu", { enumerable: true, get: function () { return PropertyMenu_1.PropertyMenu; } });
43
+ var SearchGroupingCustomUI_1 = require("./widget/components/customUI/SearchGroupingCustomUI");
44
+ Object.defineProperty(exports, "SearchGroupingCustomUI", { enumerable: true, get: function () { return SearchGroupingCustomUI_1.SearchGroupingCustomUI; } });
45
+ var ManualGroupingCustomUI_1 = require("./widget/components/customUI/ManualGroupingCustomUI");
46
+ Object.defineProperty(exports, "ManualGroupingCustomUI", { enumerable: true, get: function () { return ManualGroupingCustomUI_1.ManualGroupingCustomUI; } });
47
+ var GroupQueryBuilderCustomUI_1 = require("./widget/components/customUI/GroupQueryBuilderCustomUI");
48
+ Object.defineProperty(exports, "GroupQueryBuilderCustomUI", { enumerable: true, get: function () { return GroupQueryBuilderCustomUI_1.GroupQueryBuilderCustomUI; } });
49
+ var GroupingMappingCustomUI_1 = require("./widget/components/customUI/GroupingMappingCustomUI");
50
+ Object.defineProperty(exports, "GroupingMappingCustomUIType", { enumerable: true, get: function () { return GroupingMappingCustomUI_1.GroupingMappingCustomUIType; } });
37
51
  /** Formula DataType resolver */
38
52
  var FormulaDataTypeResolver_1 = require("./formula/FormulaDataTypeResolver");
39
53
  Object.defineProperty(exports, "resolveFormulaDataType", { enumerable: true, get: function () { return FormulaDataTypeResolver_1.resolveFormulaDataType; } });
40
- var GroupingMappingCustomUI_1 = require("./widget/components/customUI/GroupingMappingCustomUI");
41
- Object.defineProperty(exports, "GroupingMappingCustomUIType", { enumerable: true, get: function () { return GroupingMappingCustomUI_1.GroupingMappingCustomUIType; } });
42
54
  //# sourceMappingURL=grouping-mapping-widget.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"grouping-mapping-widget.js","sourceRoot":"","sources":["../../src/grouping-mapping-widget.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,gDAAgD;AAChD,iEAA+C;AAE/C,0EAA0E;AAC1E,yFAA2J;AAAlJ,kIAAA,0BAA0B,OAAA;AAAE,2HAAA,mBAAmB,OAAA;AAAE,4HAAA,oBAAoB,OAAA;AAAE,wHAAA,gBAAgB,OAAA;AAChG,iGAA8L;AAA3H,2IAAA,+BAA+B,OAAA;AAAE,uIAAA,2BAA2B,OAAA;AAC/H,yDAAuC;AAEvC,yCAAyC;AACzC,uDAAuD;AAA9C,mGAAA,QAAQ,OAAA;AACjB,yDAAyD;AAAhD,qGAAA,SAAS,OAAA;AAClB,iEAAgE;AAAvD,4GAAA,YAAY,OAAA;AAErB,gCAAgC;AAChC,6EAA2E;AAAlE,iIAAA,sBAAsB,OAAA;AAG/B,gGAA4M;AAA1K,sIAAA,2BAA2B,OAAA","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/** UI Provider for iTwin Viewer Applications */\nexport * from \"./widget/GroupingMappingWidget\";\n\n/** Interfaces for providing custom MappingClient and API configuration */\nexport { createDefaultMappingClient, createMappingClient, MappingClientContext, useMappingClient } from \"./widget/components/context/MappingClientContext\";\nexport { ClientPrefix, GetAccessTokenFn, GroupingMappingApiConfig, GroupingMappingApiConfigContext, useGroupingMappingApiConfig } from \"./widget/components/context/GroupingApiConfigContext\";\nexport * from \"@itwin/insights-client\";\n\n/** Internal components for custom UIs */\nexport { Mappings } from \"./widget/components/Mapping\";\nexport { Groupings } from \"./widget/components/Grouping\";\nexport { PropertyMenu } from \"./widget/components/PropertyMenu\";\n\n/** Formula DataType resolver */\nexport { resolveFormulaDataType } from \"./formula/FormulaDataTypeResolver\";\nexport { DataType, PropertyMap } from \"./formula/Types\";\nexport { IResult } from \"./formula/IResult\";\nexport { GroupingMappingCustomUI, GroupingMappingCustomUIType, ContextCustomUI, GroupingCustomUI, GroupingCustomUIProps, ContextCustomUIProps } from \"./widget/components/customUI/GroupingMappingCustomUI\";\n"]}
1
+ {"version":3,"file":"grouping-mapping-widget.js","sourceRoot":"","sources":["../../src/grouping-mapping-widget.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,gDAAgD;AAChD,iEAA+C;AAE/C,0EAA0E;AAC1E,yFAA2J;AAAlJ,kIAAA,0BAA0B,OAAA;AAAE,2HAAA,mBAAmB,OAAA;AAAE,4HAAA,oBAAoB,OAAA;AAAE,wHAAA,gBAAgB,OAAA;AAChG,iGAA8L;AAA3H,2IAAA,+BAA+B,OAAA;AAAE,uIAAA,2BAA2B,OAAA;AAC/H,yDAAuC;AAEvC,yCAAyC;AACzC,uDAAsE;AAA7D,mGAAA,QAAQ,OAAA;AACjB,mEAAsF;AAA7E,8GAAA,aAAa,OAAA;AACtB,qFAAiH;AAAxG,gIAAA,sBAAsB,OAAA;AAC/B,yDAAwE;AAA/D,qGAAA,SAAS,OAAA;AAClB,+DAAgF;AAAvE,0GAAA,WAAW,OAAA;AACpB,iEAAgE;AAAvD,4GAAA,YAAY,OAAA;AACrB,8FAA6F;AAApF,gIAAA,sBAAsB,OAAA;AAC/B,8FAA6F;AAApF,gIAAA,sBAAsB,OAAA;AAC/B,oGAAmG;AAA1F,sIAAA,yBAAyB,OAAA;AAClC,gGAA4M;AAA1K,sIAAA,2BAA2B,OAAA;AAE7D,gCAAgC;AAChC,6EAA2E;AAAlE,iIAAA,sBAAsB,OAAA","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/** UI Provider for iTwin Viewer Applications */\nexport * from \"./widget/GroupingMappingWidget\";\n\n/** Interfaces for providing custom MappingClient and API configuration */\nexport { createDefaultMappingClient, createMappingClient, MappingClientContext, useMappingClient } from \"./widget/components/context/MappingClientContext\";\nexport { ClientPrefix, GetAccessTokenFn, GroupingMappingApiConfig, GroupingMappingApiConfigContext, useGroupingMappingApiConfig } from \"./widget/components/context/GroupingApiConfigContext\";\nexport * from \"@itwin/insights-client\";\n\n/** Internal components for custom UIs */\nexport { Mappings, MappingsProps } from \"./widget/components/Mapping\";\nexport { MappingAction, MappingActionProps } from \"./widget/components/MappingAction\";\nexport { GroupingMappingContext, GroupingMappingContextProps } from \"./widget/components/GroupingMappingContext\";\nexport { Groupings, GroupingProps } from \"./widget/components/Grouping\";\nexport { GroupAction, GroupActionProps } from \"./widget/components/GroupAction\";\nexport { PropertyMenu } from \"./widget/components/PropertyMenu\";\nexport { SearchGroupingCustomUI } from \"./widget/components/customUI/SearchGroupingCustomUI\";\nexport { ManualGroupingCustomUI } from \"./widget/components/customUI/ManualGroupingCustomUI\";\nexport { GroupQueryBuilderCustomUI } from \"./widget/components/customUI/GroupQueryBuilderCustomUI\";\nexport { GroupingMappingCustomUI, GroupingMappingCustomUIType, ContextCustomUI, GroupingCustomUI, GroupingCustomUIProps, ContextCustomUIProps } from \"./widget/components/customUI/GroupingMappingCustomUI\";\n\n/** Formula DataType resolver */\nexport { resolveFormulaDataType } from \"./formula/FormulaDataTypeResolver\";\nexport { DataType, PropertyMap } from \"./formula/Types\";\nexport { IResult } from \"./formula/IResult\";\n"]}
@@ -28,13 +28,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
28
28
  *--------------------------------------------------------------------------------------------*/
29
29
  const react_1 = __importDefault(require("react"));
30
30
  require("@testing-library/jest-dom");
31
- const test_utils_1 = require("./test-utils");
32
31
  const faker_1 = require("@faker-js/faker");
33
32
  const grouping_mapping_widget_1 = require("../grouping-mapping-widget");
34
33
  const moq = __importStar(require("typemoq"));
35
- const grouping_mapping_widget_2 = require("../grouping-mapping-widget");
36
34
  const user_event_1 = __importDefault(require("@testing-library/user-event"));
37
- const react_2 = require("@testing-library/react");
35
+ const test_utils_1 = require("../test/test-utils");
38
36
  const mockITwinId = faker_1.faker.datatype.uuid();
39
37
  const mockIModelId = faker_1.faker.datatype.uuid();
40
38
  const mockMappingId = faker_1.faker.datatype.uuid();
@@ -76,61 +74,44 @@ const groupsFactory = () => ({
76
74
  },
77
75
  });
78
76
  const connectionMock = moq.Mock.ofType();
79
- let groupingMappingCustomUIMock = [];
77
+ const viewManagerMock = moq.Mock.ofType();
80
78
  const mappingClientMock = moq.Mock.ofType();
81
79
  jest.mock("@itwin/appui-react", () => ({
82
80
  ...jest.requireActual("@itwin/appui-react"),
83
81
  useActiveIModelConnection: () => connectionMock.object,
84
82
  }));
85
- const mockAccessToken = jest.fn().mockResolvedValue("Bearer eyJhbGci");
86
- jest.mock("../widget/components/context/GroupingApiConfigContext", () => ({
87
- ...jest.requireActual("../widget/components/context/GroupingApiConfigContext"),
88
- useGroupingMappingApiConfig: () => ({
89
- getAccessToken: mockAccessToken,
90
- }),
91
- }));
92
- jest.mock("../widget/components/context/GroupingMappingCustomUIContext", () => ({
93
- ...jest.requireActual("../widget/components/context/GroupingMappingCustomUIContext"),
94
- useGroupingMappingCustomUI: () => groupingMappingCustomUIMock,
83
+ jest.mock("@itwin/core-frontend", () => ({
84
+ ...jest.requireActual("@itwin/core-frontend"),
85
+ IModelApp: {
86
+ viewManager: {},
87
+ },
95
88
  }));
96
89
  jest.mock("../widget/components/context/MappingClientContext", () => ({
97
90
  ...jest.requireActual("../widget/components/context/MappingClientContext"),
98
91
  useMappingClient: () => mappingClientMock.object,
99
92
  }));
100
93
  const mockGroups = groupsFactory();
101
- describe("Groupings View with default UIs", () => {
94
+ describe("Groupings View", () => {
102
95
  beforeEach(async () => {
103
96
  connectionMock.setup((x) => x.iModelId).returns(() => mockIModelId);
104
97
  connectionMock.setup((x) => x.iTwinId).returns(() => mockITwinId);
105
- const mockedAccessToken = await mockAccessToken();
106
98
  mappingClientMock
107
- .setup(async (x) => x.getGroups(mockedAccessToken, mockIModelId, mockMappingId))
99
+ .setup(async (x) => x.getGroups(moq.It.isAny(), moq.It.isAny(), moq.It.isAny()))
108
100
  .returns(async () => Promise.resolve(mockGroups.groups));
109
101
  });
110
102
  afterEach(() => {
111
103
  connectionMock.reset();
112
104
  mappingClientMock.reset();
113
- groupingMappingCustomUIMock = [];
105
+ viewManagerMock.reset();
114
106
  });
115
- it("List all groups and click on add group and edit group buttons", async () => {
107
+ it("List all groups", async () => {
116
108
  // Arange
117
109
  // Act
118
110
  const user = user_event_1.default.setup();
119
- react_2.render(react_1.default.createElement(grouping_mapping_widget_1.Groupings, { mapping: mockMapping, goBack: jest.fn() }));
111
+ test_utils_1.render(react_1.default.createElement(grouping_mapping_widget_1.Groupings, { mapping: mockMapping, onClickAddGroup: jest.fn(), onClickGroupModify: jest.fn(), onClickGroupTitle: jest.fn, onClickRenderContextCustomUI: jest.fn() }));
120
112
  await test_utils_1.waitForElementToBeRemoved(() => test_utils_1.screen.getByText(/loading/i));
121
113
  // Assert
122
- const addButton = test_utils_1.screen.getAllByTestId("gmw-add-group-button");
123
- expect(addButton).toHaveLength(1);
124
- // Click on 'Add Group' button
125
- await user.click(addButton[0]);
126
- // Should have three menu items
127
- const addSelection = test_utils_1.screen.getAllByTestId("gmw-add-0");
128
- expect(addSelection).toHaveLength(1);
129
- const addSearch = test_utils_1.screen.getAllByTestId("gmw-add-1");
130
- expect(addSearch).toHaveLength(1);
131
- const addManual = test_utils_1.screen.getAllByTestId("gmw-add-2");
132
- expect(addManual).toHaveLength(1);
133
- // Should have the right group number
114
+ // Should have the correct random mockGroups.groups count listed
134
115
  const horizontalTiles = test_utils_1.screen.getAllByTestId("gmw-horizontal-tile");
135
116
  expect(horizontalTiles).toHaveLength(mockGroups.groups.length);
136
117
  horizontalTiles.forEach((horizontalTile, index) => {
@@ -143,35 +124,23 @@ describe("Groupings View with default UIs", () => {
143
124
  const moreButton = test_utils_1.screen.getAllByTestId("gmw-more-button");
144
125
  expect(moreButton).toHaveLength(mockGroups.groups.length);
145
126
  await user.click(moreButton[0]);
146
- // Should have 3 context menu items
127
+ // Should only have the permanent delete context item.
147
128
  const contextMenuItems = test_utils_1.screen.getAllByTestId("gmw-context-menu-item");
148
- expect(contextMenuItems).toHaveLength(3);
149
- expect(contextMenuItems[0]).toHaveTextContent("Edit");
150
- expect(contextMenuItems[1]).toHaveTextContent("Properties");
151
- expect(contextMenuItems[2]).toHaveTextContent("Remove");
152
- // Hover on 'Edit'
153
- await user.hover(contextMenuItems[0]);
154
- // Should have 3 sub menu items
155
- const editSelection = test_utils_1.screen.getAllByTestId(`gmw-edit-0`);
156
- expect(editSelection).toHaveLength(1);
157
- const editSearch = test_utils_1.screen.getAllByTestId(`gmw-edit-1`);
158
- expect(editSearch).toHaveLength(1);
159
- const editManual = test_utils_1.screen.getAllByTestId(`gmw-edit-2`);
160
- expect(editManual).toHaveLength(1);
129
+ expect(contextMenuItems).toHaveLength(1);
130
+ expect(contextMenuItems[0]).toHaveTextContent("Remove");
161
131
  });
162
- it("Set up grouping custom UI - should replace default grouping methods", async () => {
132
+ it("Set up grouping custom UI", async () => {
163
133
  // Arange
164
134
  const mockedUIComponent = (_props) => react_1.default.createElement("div");
165
135
  const mockGroupingUI = {
166
- type: grouping_mapping_widget_2.GroupingMappingCustomUIType.Grouping,
136
+ type: grouping_mapping_widget_1.GroupingMappingCustomUIType.Grouping,
167
137
  name: "mOcKgRoUpInGuI",
168
138
  displayLabel: "Mock Grouping UI",
169
139
  uiComponent: mockedUIComponent,
170
140
  };
171
- groupingMappingCustomUIMock = [mockGroupingUI];
141
+ const groupingMappingCustomUIMock = [mockGroupingUI];
172
142
  // Act
173
- const user = user_event_1.default.setup();
174
- react_2.render(react_1.default.createElement(grouping_mapping_widget_1.Groupings, { mapping: mockMapping, goBack: jest.fn() }));
143
+ const { user } = test_utils_1.render(react_1.default.createElement(grouping_mapping_widget_1.Groupings, { mapping: mockMapping, onClickAddGroup: jest.fn(), onClickGroupModify: jest.fn(), onClickGroupTitle: jest.fn, onClickRenderContextCustomUI: jest.fn() }), groupingMappingCustomUIMock);
175
144
  await test_utils_1.waitForElementToBeRemoved(() => test_utils_1.screen.getByText(/loading/i));
176
145
  // Assert
177
146
  const addButton = test_utils_1.screen.getAllByTestId("gmw-add-group-button");
@@ -188,9 +157,9 @@ describe("Groupings View with default UIs", () => {
188
157
  expect(moreButton.length).toBeGreaterThan(0);
189
158
  // Click on first more icon
190
159
  await user.click(moreButton[0]);
191
- // Should have 3 context menu items without context configuration
160
+ // Should have 2 context menu items
192
161
  const contextMenuItems = test_utils_1.screen.getAllByTestId("gmw-context-menu-item");
193
- expect(contextMenuItems).toHaveLength(3);
162
+ expect(contextMenuItems).toHaveLength(2);
194
163
  expect(contextMenuItems[0]).toHaveTextContent("Edit");
195
164
  // Hover on 'Edit'
196
165
  await user.hover(contextMenuItems[0]);
@@ -203,32 +172,21 @@ describe("Groupings View with default UIs", () => {
203
172
  const groupName = test_utils_1.screen.getAllByText(mockGroups.groups[0].groupName);
204
173
  expect(groupName).toHaveLength(1);
205
174
  });
206
- it("Set up context custom UI - should have default grouping methods and add context menu", async () => {
175
+ it("Set up context custom UI - should have add context menu", async () => {
207
176
  // Arange
208
177
  const mockedUIComponent = (_props) => react_1.default.createElement("div");
209
178
  const mockContextUI = {
210
- type: grouping_mapping_widget_2.GroupingMappingCustomUIType.Context,
179
+ type: grouping_mapping_widget_1.GroupingMappingCustomUIType.Context,
211
180
  name: "mOcKgRoUpInGuI",
212
181
  displayLabel: "Mock Grouping UI",
213
182
  uiComponent: mockedUIComponent,
214
183
  };
215
- groupingMappingCustomUIMock = [mockContextUI];
184
+ const groupingMappingCustomUIMock = [mockContextUI];
185
+ const onClickRenderContextCustomUIMock = jest.fn();
216
186
  // Act
217
- const user = user_event_1.default.setup();
218
- react_2.render(react_1.default.createElement(grouping_mapping_widget_1.Groupings, { mapping: mockMapping, goBack: jest.fn() }));
187
+ const { user } = test_utils_1.render(react_1.default.createElement(grouping_mapping_widget_1.Groupings, { mapping: mockMapping, onClickAddGroup: jest.fn(), onClickGroupModify: jest.fn(), onClickGroupTitle: jest.fn, onClickRenderContextCustomUI: onClickRenderContextCustomUIMock }), groupingMappingCustomUIMock);
219
188
  await test_utils_1.waitForElementToBeRemoved(() => test_utils_1.screen.getByText(/loading/i));
220
189
  // Assert
221
- const addButton = test_utils_1.screen.getAllByTestId("gmw-add-group-button");
222
- expect(addButton).toHaveLength(1);
223
- // Click on 'Add Group' button
224
- await user.click(addButton[0]);
225
- // Should have three menu items
226
- const addSelection = test_utils_1.screen.getAllByTestId("gmw-add-0");
227
- expect(addSelection).toHaveLength(1);
228
- const addSearch = test_utils_1.screen.getAllByTestId("gmw-add-1");
229
- expect(addSearch).toHaveLength(1);
230
- const addManual = test_utils_1.screen.getAllByTestId("gmw-add-2");
231
- expect(addManual).toHaveLength(1);
232
190
  // Should have the right group number
233
191
  const horizontalTiles = test_utils_1.screen.getAllByTestId("gmw-horizontal-tile");
234
192
  expect(horizontalTiles).toHaveLength(mockGroups.groups.length);
@@ -236,36 +194,37 @@ describe("Groupings View with default UIs", () => {
236
194
  const moreButton = test_utils_1.screen.getAllByTestId("gmw-more-button");
237
195
  expect(moreButton).toHaveLength(mockGroups.groups.length);
238
196
  await user.click(moreButton[0]);
239
- // Should have 4 context menu items
197
+ // Should have 2 context menu items
240
198
  const contextMenuItems = test_utils_1.screen.getAllByTestId("gmw-context-menu-item");
241
- expect(contextMenuItems).toHaveLength(4);
242
- expect(contextMenuItems[0]).toHaveTextContent("Edit");
243
- expect(contextMenuItems[1]).toHaveTextContent("Properties");
244
- expect(contextMenuItems[2]).toHaveTextContent("Remove");
245
- expect(contextMenuItems[3]).toHaveTextContent(mockContextUI.displayLabel);
199
+ expect(contextMenuItems).toHaveLength(2);
200
+ expect(contextMenuItems[0]).toHaveTextContent(mockContextUI.displayLabel);
201
+ expect(contextMenuItems[1]).toHaveTextContent("Remove");
246
202
  // Click on the context ui
247
- await user.click(contextMenuItems[3]);
203
+ await user.click(contextMenuItems[0]);
204
+ // Callback should have been called with correct parameters
205
+ expect(onClickRenderContextCustomUIMock).toBeCalledWith(mockedUIComponent, mockGroups.groups[0]);
248
206
  });
249
207
  it("Set up both grouping and context custom UI", async () => {
250
208
  // Arange
251
209
  const mockedGroupingUIComponent = (_props) => react_1.default.createElement("div");
252
210
  const mockedContextUIComponent = (_props) => react_1.default.createElement("div");
253
211
  const mockGroupingUI = {
254
- type: grouping_mapping_widget_2.GroupingMappingCustomUIType.Grouping,
212
+ type: grouping_mapping_widget_1.GroupingMappingCustomUIType.Grouping,
255
213
  name: "mOcKgRoUpInGuI",
256
214
  displayLabel: "Mock Grouping UI",
257
215
  uiComponent: mockedGroupingUIComponent,
258
216
  };
259
217
  const mockContextUI = {
260
- type: grouping_mapping_widget_2.GroupingMappingCustomUIType.Context,
218
+ type: grouping_mapping_widget_1.GroupingMappingCustomUIType.Context,
261
219
  name: "mOcKgRoUpInGuI",
262
220
  displayLabel: "Mock Grouping UI",
263
221
  uiComponent: mockedContextUIComponent,
264
222
  };
265
- groupingMappingCustomUIMock = [mockContextUI, mockGroupingUI];
223
+ const groupingMappingCustomUIMock = [mockContextUI, mockGroupingUI];
224
+ const onClickAddGroup = jest.fn();
225
+ const onClickRenderContextCustomUIMock = jest.fn();
266
226
  // Act
267
- const user = user_event_1.default.setup();
268
- react_2.render(react_1.default.createElement(grouping_mapping_widget_1.Groupings, { mapping: mockMapping, goBack: jest.fn() }));
227
+ const { user } = test_utils_1.render(react_1.default.createElement(grouping_mapping_widget_1.Groupings, { mapping: mockMapping, onClickAddGroup: onClickAddGroup, onClickGroupModify: jest.fn(), onClickGroupTitle: jest.fn, onClickRenderContextCustomUI: onClickRenderContextCustomUIMock }), groupingMappingCustomUIMock);
269
228
  await test_utils_1.waitForElementToBeRemoved(() => test_utils_1.screen.getByText(/loading/i));
270
229
  // Assert
271
230
  const addButton = test_utils_1.screen.getAllByTestId("gmw-add-group-button");
@@ -276,6 +235,9 @@ describe("Groupings View with default UIs", () => {
276
235
  const addCustom = test_utils_1.screen.getAllByTestId("gmw-add-0");
277
236
  expect(addCustom).toHaveLength(1);
278
237
  expect(addCustom[0]).toHaveTextContent(mockGroupingUI.displayLabel);
238
+ await user.click(addCustom[0]);
239
+ // Callback should have been called with correct parameters
240
+ expect(onClickAddGroup).toBeCalledWith(mockGroupingUI.name);
279
241
  // Check the group tile number
280
242
  const horizontalTiles = test_utils_1.screen.getAllByTestId("gmw-horizontal-tile");
281
243
  expect(horizontalTiles).toHaveLength(mockGroups.groups.length);
@@ -283,15 +245,16 @@ describe("Groupings View with default UIs", () => {
283
245
  const moreButton = test_utils_1.screen.getAllByTestId("gmw-more-button");
284
246
  expect(moreButton).toHaveLength(mockGroups.groups.length);
285
247
  await user.click(moreButton[0]);
286
- // Should have 4 context menu items
248
+ // Should have 3 context menu items
287
249
  const contextMenuItems = test_utils_1.screen.getAllByTestId("gmw-context-menu-item");
288
- expect(contextMenuItems).toHaveLength(4);
250
+ expect(contextMenuItems).toHaveLength(3);
289
251
  expect(contextMenuItems[0]).toHaveTextContent("Edit");
290
- expect(contextMenuItems[1]).toHaveTextContent("Properties");
252
+ expect(contextMenuItems[1]).toHaveTextContent(mockContextUI.displayLabel);
291
253
  expect(contextMenuItems[2]).toHaveTextContent("Remove");
292
- expect(contextMenuItems[3]).toHaveTextContent(mockContextUI.displayLabel);
293
254
  // Click on the context ui
294
- await user.click(contextMenuItems[3]);
255
+ await user.click(contextMenuItems[1]);
256
+ // Callback should have been called with correct parameters
257
+ expect(onClickRenderContextCustomUIMock).toBeCalledWith(mockedContextUIComponent, mockGroups.groups[0]);
295
258
  });
296
259
  });
297
260
  //# sourceMappingURL=GroupingMappingCustomUI.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupingMappingCustomUI.test.js","sourceRoot":"","sources":["../../../src/test/GroupingMappingCustomUI.test.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*--------------------------------------------------------------------------------------------*/\nimport React from \"react\";\nimport \"@testing-library/jest-dom\";\nimport { screen, waitForElementToBeRemoved, within } from \"./test-utils\";\nimport { faker } from \"@faker-js/faker\";\nimport { Groupings } from \"../grouping-mapping-widget\";\nimport type { GroupCollection, IMappingsClient, Mapping } from \"@itwin/insights-client\";\nimport * as moq from \"typemoq\";\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport type { ContextCustomUIProps, GroupingCustomUIProps, GroupingMappingCustomUI } from \"../grouping-mapping-widget\";\nimport { GroupingMappingCustomUIType } from \"../grouping-mapping-widget\";\nimport userEvent from \"@testing-library/user-event\";\nimport { render } from \"@testing-library/react\";\n\nconst mockITwinId = faker.datatype.uuid();\nconst mockIModelId = faker.datatype.uuid();\nconst mockMappingId = faker.datatype.uuid();\nconst mockMapping: Mapping = {\n id: mockMappingId,\n mappingName: \"mOcKmApPiNg1\",\n description: \"mOcKmApPiNgDeScRiPtIoN1\",\n createdBy: faker.random.alpha(),\n createdOn: faker.date.past().toDateString(),\n modifiedBy: faker.random.alpha(),\n modifiedOn: faker.date.past().toDateString(),\n extractionEnabled: false,\n _links: {\n imodel: {\n href: \"\",\n },\n },\n};\n\nconst groupsFactory = (): GroupCollection => ({\n groups: Array.from(\n { length: faker.datatype.number({ min: 3, max: 5 }) },\n (_, index) => ({\n id: `${faker.datatype.uuid()}`,\n groupName: `mOcKgRoUp${index}`,\n description: `mOcKgRoUpDeScRiPtIoN${index}`,\n query: `mOcKgRoUpQuErY${index}`,\n _links: {\n imodel: {\n href: \"\",\n },\n mapping: {\n href: \"\",\n },\n },\n })\n ),\n _links: {\n next: undefined,\n self: {\n href: \"\",\n },\n },\n});\n\nconst connectionMock = moq.Mock.ofType<IModelConnection>();\nlet groupingMappingCustomUIMock: GroupingMappingCustomUI[] = [];\nconst mappingClientMock = moq.Mock.ofType<IMappingsClient>();\n\njest.mock(\"@itwin/appui-react\", () => ({\n ...jest.requireActual(\"@itwin/appui-react\"),\n useActiveIModelConnection: () => connectionMock.object,\n}));\n\nconst mockAccessToken = jest.fn().mockResolvedValue(\"Bearer eyJhbGci\");\n\njest.mock(\"../widget/components/context/GroupingApiConfigContext\", () => ({\n ...jest.requireActual(\"../widget/components/context/GroupingApiConfigContext\"),\n useGroupingMappingApiConfig: () => ({\n getAccessToken: mockAccessToken,\n }),\n}));\n\njest.mock(\"../widget/components/context/GroupingMappingCustomUIContext\", () => ({\n ...jest.requireActual(\"../widget/components/context/GroupingMappingCustomUIContext\"),\n useGroupingMappingCustomUI: () => groupingMappingCustomUIMock,\n}));\n\njest.mock(\"../widget/components/context/MappingClientContext\", () => ({\n ...jest.requireActual(\"../widget/components/context/MappingClientContext\"),\n useMappingClient: () => mappingClientMock.object,\n}));\n\nconst mockGroups = groupsFactory();\n\ndescribe(\"Groupings View with default UIs\", () => {\n beforeEach(async () => {\n connectionMock.setup((x) => x.iModelId).returns(() => mockIModelId);\n connectionMock.setup((x) => x.iTwinId).returns(() => mockITwinId);\n\n const mockedAccessToken = await mockAccessToken();\n mappingClientMock\n .setup(async (x) => x.getGroups(mockedAccessToken, mockIModelId, mockMappingId))\n .returns(async () => Promise.resolve(mockGroups.groups));\n });\n\n afterEach(() => {\n connectionMock.reset();\n mappingClientMock.reset();\n groupingMappingCustomUIMock = [];\n });\n\n it(\"List all groups and click on add group and edit group buttons\", async () => {\n // Arange\n\n // Act\n const user = userEvent.setup();\n render(<Groupings mapping={mockMapping} goBack={jest.fn()} />);\n\n await waitForElementToBeRemoved(() => screen.getByText(/loading/i));\n\n // Assert\n const addButton = screen.getAllByTestId(\"gmw-add-group-button\");\n expect(addButton).toHaveLength(1);\n\n // Click on 'Add Group' button\n await user.click(addButton[0]);\n\n // Should have three menu items\n const addSelection = screen.getAllByTestId(\"gmw-add-0\");\n expect(addSelection).toHaveLength(1);\n const addSearch = screen.getAllByTestId(\"gmw-add-1\");\n expect(addSearch).toHaveLength(1);\n const addManual = screen.getAllByTestId(\"gmw-add-2\");\n expect(addManual).toHaveLength(1);\n\n // Should have the right group number\n const horizontalTiles = screen.getAllByTestId(\"gmw-horizontal-tile\");\n expect(horizontalTiles).toHaveLength(mockGroups.groups.length);\n\n horizontalTiles.forEach((horizontalTile, index) => {\n const groupTile = within(horizontalTile);\n expect(\n groupTile.getByText(\n mockGroups.groups[index].groupName\n )\n ).toBeInTheDocument();\n expect(\n groupTile.getByText(\n mockGroups.groups[index].description ?? \"\"\n )\n ).toBeInTheDocument();\n });\n\n // Click on first group more icon\n const moreButton = screen.getAllByTestId(\"gmw-more-button\");\n expect(moreButton).toHaveLength(mockGroups.groups.length);\n\n await user.click(moreButton[0]);\n\n // Should have 3 context menu items\n const contextMenuItems = screen.getAllByTestId(\"gmw-context-menu-item\");\n expect(contextMenuItems).toHaveLength(3);\n expect(contextMenuItems[0]).toHaveTextContent(\"Edit\");\n expect(contextMenuItems[1]).toHaveTextContent(\"Properties\");\n expect(contextMenuItems[2]).toHaveTextContent(\"Remove\");\n\n // Hover on 'Edit'\n await user.hover(contextMenuItems[0]);\n\n // Should have 3 sub menu items\n const editSelection = screen.getAllByTestId(`gmw-edit-0`);\n expect(editSelection).toHaveLength(1);\n const editSearch = screen.getAllByTestId(`gmw-edit-1`);\n expect(editSearch).toHaveLength(1);\n const editManual = screen.getAllByTestId(`gmw-edit-2`);\n expect(editManual).toHaveLength(1);\n });\n\n it(\"Set up grouping custom UI - should replace default grouping methods\", async () => {\n // Arange\n const mockedUIComponent = (_props: GroupingCustomUIProps) => React.createElement(\"div\");\n const mockGroupingUI: GroupingMappingCustomUI = {\n type: GroupingMappingCustomUIType.Grouping,\n name: \"mOcKgRoUpInGuI\",\n displayLabel: \"Mock Grouping UI\",\n uiComponent: mockedUIComponent,\n };\n\n groupingMappingCustomUIMock = [mockGroupingUI];\n\n // Act\n const user = userEvent.setup();\n render(<Groupings mapping={mockMapping} goBack={jest.fn()} />);\n\n await waitForElementToBeRemoved(() => screen.getByText(/loading/i));\n\n // Assert\n const addButton = screen.getAllByTestId(\"gmw-add-group-button\");\n expect(addButton).toHaveLength(1);\n\n // Click on 'Add Group' button\n await user.click(addButton[0]);\n\n // Should have exactly 1 add method with given configuration\n const addCustom = screen.getAllByTestId(\"gmw-add-0\");\n expect(addCustom).toHaveLength(1);\n expect(addCustom[0]).toHaveTextContent(mockGroupingUI.displayLabel);\n\n // Each group should have a more icon button\n const moreButton = screen.getAllByTestId(\"gmw-more-button\");\n expect(moreButton).toHaveLength(mockGroups.groups.length);\n expect(moreButton.length).toBeGreaterThan(0);\n\n // Click on first more icon\n await user.click(moreButton[0]);\n\n // Should have 3 context menu items without context configuration\n const contextMenuItems = screen.getAllByTestId(\"gmw-context-menu-item\");\n expect(contextMenuItems).toHaveLength(3);\n expect(contextMenuItems[0]).toHaveTextContent(\"Edit\");\n\n // Hover on 'Edit'\n await user.hover(contextMenuItems[0]);\n\n // Should have exactly 1 sub menu item\n const editCustom = screen.getAllByTestId(`gmw-edit-0`);\n expect(editCustom).toHaveLength(1);\n expect(editCustom[0]).toHaveTextContent(mockGroupingUI.displayLabel);\n\n // Click on the edit custom UI\n await user.click(editCustom[0]);\n\n const groupName = screen.getAllByText(mockGroups.groups[0].groupName);\n expect(groupName).toHaveLength(1);\n });\n\n it(\"Set up context custom UI - should have default grouping methods and add context menu\", async () => {\n // Arange\n const mockedUIComponent = (_props: ContextCustomUIProps) => React.createElement(\"div\");\n const mockContextUI: GroupingMappingCustomUI = {\n type: GroupingMappingCustomUIType.Context,\n name: \"mOcKgRoUpInGuI\",\n displayLabel: \"Mock Grouping UI\",\n uiComponent: mockedUIComponent,\n };\n\n groupingMappingCustomUIMock = [mockContextUI];\n\n // Act\n const user = userEvent.setup();\n render(<Groupings mapping={mockMapping} goBack={jest.fn()} />);\n\n await waitForElementToBeRemoved(() => screen.getByText(/loading/i));\n\n // Assert\n const addButton = screen.getAllByTestId(\"gmw-add-group-button\");\n expect(addButton).toHaveLength(1);\n\n // Click on 'Add Group' button\n await user.click(addButton[0]);\n\n // Should have three menu items\n const addSelection = screen.getAllByTestId(\"gmw-add-0\");\n expect(addSelection).toHaveLength(1);\n const addSearch = screen.getAllByTestId(\"gmw-add-1\");\n expect(addSearch).toHaveLength(1);\n const addManual = screen.getAllByTestId(\"gmw-add-2\");\n expect(addManual).toHaveLength(1);\n\n // Should have the right group number\n const horizontalTiles = screen.getAllByTestId(\"gmw-horizontal-tile\");\n expect(horizontalTiles).toHaveLength(mockGroups.groups.length);\n\n // Click on first group more icon\n const moreButton = screen.getAllByTestId(\"gmw-more-button\");\n expect(moreButton).toHaveLength(mockGroups.groups.length);\n\n await user.click(moreButton[0]);\n\n // Should have 4 context menu items\n const contextMenuItems = screen.getAllByTestId(\"gmw-context-menu-item\");\n expect(contextMenuItems).toHaveLength(4);\n expect(contextMenuItems[0]).toHaveTextContent(\"Edit\");\n expect(contextMenuItems[1]).toHaveTextContent(\"Properties\");\n expect(contextMenuItems[2]).toHaveTextContent(\"Remove\");\n expect(contextMenuItems[3]).toHaveTextContent(mockContextUI.displayLabel);\n\n // Click on the context ui\n await user.click(contextMenuItems[3]);\n });\n\n it(\"Set up both grouping and context custom UI\", async () => {\n // Arange\n const mockedGroupingUIComponent = (_props: GroupingCustomUIProps) => React.createElement(\"div\");\n const mockedContextUIComponent = (_props: ContextCustomUIProps) => React.createElement(\"div\");\n const mockGroupingUI: GroupingMappingCustomUI = {\n type: GroupingMappingCustomUIType.Grouping,\n name: \"mOcKgRoUpInGuI\",\n displayLabel: \"Mock Grouping UI\",\n uiComponent: mockedGroupingUIComponent,\n };\n const mockContextUI: GroupingMappingCustomUI = {\n type: GroupingMappingCustomUIType.Context,\n name: \"mOcKgRoUpInGuI\",\n displayLabel: \"Mock Grouping UI\",\n uiComponent: mockedContextUIComponent,\n };\n\n groupingMappingCustomUIMock = [mockContextUI, mockGroupingUI];\n\n // Act\n const user = userEvent.setup();\n render(<Groupings mapping={mockMapping} goBack={jest.fn()} />);\n\n await waitForElementToBeRemoved(() => screen.getByText(/loading/i));\n\n // Assert\n const addButton = screen.getAllByTestId(\"gmw-add-group-button\");\n expect(addButton).toHaveLength(1);\n\n // Click on 'Add Group' button\n await user.click(addButton[0]);\n\n // Should have exactly 1 add method with given configuration\n const addCustom = screen.getAllByTestId(\"gmw-add-0\");\n expect(addCustom).toHaveLength(1);\n expect(addCustom[0]).toHaveTextContent(mockGroupingUI.displayLabel);\n\n // Check the group tile number\n const horizontalTiles = screen.getAllByTestId(\"gmw-horizontal-tile\");\n expect(horizontalTiles).toHaveLength(mockGroups.groups.length);\n\n // Click on first group more icon\n const moreButton = screen.getAllByTestId(\"gmw-more-button\");\n expect(moreButton).toHaveLength(mockGroups.groups.length);\n\n await user.click(moreButton[0]);\n\n // Should have 4 context menu items\n const contextMenuItems = screen.getAllByTestId(\"gmw-context-menu-item\");\n expect(contextMenuItems).toHaveLength(4);\n expect(contextMenuItems[0]).toHaveTextContent(\"Edit\");\n expect(contextMenuItems[1]).toHaveTextContent(\"Properties\");\n expect(contextMenuItems[2]).toHaveTextContent(\"Remove\");\n expect(contextMenuItems[3]).toHaveTextContent(mockContextUI.displayLabel);\n\n // Click on the context ui\n await user.click(contextMenuItems[3]);\n });\n});\n"]}
1
+ {"version":3,"file":"GroupingMappingCustomUI.test.js","sourceRoot":"","sources":["../../../src/test/GroupingMappingCustomUI.test.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*--------------------------------------------------------------------------------------------*/\nimport React from \"react\";\nimport \"@testing-library/jest-dom\";\nimport { faker } from \"@faker-js/faker\";\nimport { GroupingMappingCustomUIType, Groupings } from \"../grouping-mapping-widget\";\nimport type { GroupCollection, IMappingsClient, Mapping } from \"@itwin/insights-client\";\nimport * as moq from \"typemoq\";\nimport type { IModelConnection, ViewManager } from \"@itwin/core-frontend\";\nimport type { ContextCustomUIProps, GroupingCustomUIProps, GroupingMappingCustomUI } from \"../grouping-mapping-widget\";\nimport userEvent from \"@testing-library/user-event\";\nimport { render, screen, waitForElementToBeRemoved, within } from \"../test/test-utils\";\n\nconst mockITwinId = faker.datatype.uuid();\nconst mockIModelId = faker.datatype.uuid();\nconst mockMappingId = faker.datatype.uuid();\nconst mockMapping: Mapping = {\n id: mockMappingId,\n mappingName: \"mOcKmApPiNg1\",\n description: \"mOcKmApPiNgDeScRiPtIoN1\",\n createdBy: faker.random.alpha(),\n createdOn: faker.date.past().toDateString(),\n modifiedBy: faker.random.alpha(),\n modifiedOn: faker.date.past().toDateString(),\n extractionEnabled: false,\n _links: {\n imodel: {\n href: \"\",\n },\n },\n};\n\nconst groupsFactory = (): GroupCollection => ({\n groups: Array.from(\n { length: faker.datatype.number({ min: 3, max: 5 }) },\n (_, index) => ({\n id: `${faker.datatype.uuid()}`,\n groupName: `mOcKgRoUp${index}`,\n description: `mOcKgRoUpDeScRiPtIoN${index}`,\n query: `mOcKgRoUpQuErY${index}`,\n _links: {\n imodel: {\n href: \"\",\n },\n mapping: {\n href: \"\",\n },\n },\n })\n ),\n _links: {\n next: undefined,\n self: {\n href: \"\",\n },\n },\n});\n\nconst connectionMock = moq.Mock.ofType<IModelConnection>();\nconst viewManagerMock = moq.Mock.ofType<ViewManager>();\nconst mappingClientMock = moq.Mock.ofType<IMappingsClient>();\n\njest.mock(\"@itwin/appui-react\", () => ({\n ...jest.requireActual(\"@itwin/appui-react\"),\n useActiveIModelConnection: () => connectionMock.object,\n}));\n\njest.mock(\"@itwin/core-frontend\", () => ({\n ...jest.requireActual(\"@itwin/core-frontend\"),\n IModelApp: {\n viewManager: {},\n },\n}));\n\njest.mock(\"../widget/components/context/MappingClientContext\", () => ({\n ...jest.requireActual(\"../widget/components/context/MappingClientContext\"),\n useMappingClient: () => mappingClientMock.object,\n}));\n\nconst mockGroups = groupsFactory();\n\ndescribe(\"Groupings View\", () => {\n beforeEach(async () => {\n connectionMock.setup((x) => x.iModelId).returns(() => mockIModelId);\n connectionMock.setup((x) => x.iTwinId).returns(() => mockITwinId);\n\n mappingClientMock\n .setup(async (x) => x.getGroups(moq.It.isAny(), moq.It.isAny(), moq.It.isAny()))\n .returns(async () => Promise.resolve(mockGroups.groups));\n });\n\n afterEach(() => {\n connectionMock.reset();\n mappingClientMock.reset();\n viewManagerMock.reset();\n });\n\n it(\"List all groups\", async () => {\n // Arange\n\n // Act\n const user = userEvent.setup();\n render(\n <Groupings\n mapping={mockMapping}\n onClickAddGroup={jest.fn()}\n onClickGroupModify={jest.fn()}\n onClickGroupTitle={jest.fn}\n onClickRenderContextCustomUI={jest.fn()}\n />\n );\n\n await waitForElementToBeRemoved(() => screen.getByText(/loading/i));\n\n // Assert\n\n // Should have the correct random mockGroups.groups count listed\n const horizontalTiles = screen.getAllByTestId(\"gmw-horizontal-tile\");\n expect(horizontalTiles).toHaveLength(mockGroups.groups.length);\n\n horizontalTiles.forEach((horizontalTile, index) => {\n const groupTile = within(horizontalTile);\n expect(\n groupTile.getByText(\n mockGroups.groups[index].groupName\n )\n ).toBeInTheDocument();\n expect(\n groupTile.getByText(\n mockGroups.groups[index].description ?? \"\"\n )\n ).toBeInTheDocument();\n });\n\n // Click on first group more icon\n const moreButton = screen.getAllByTestId(\"gmw-more-button\");\n expect(moreButton).toHaveLength(mockGroups.groups.length);\n\n await user.click(moreButton[0]);\n\n // Should only have the permanent delete context item.\n const contextMenuItems = screen.getAllByTestId(\"gmw-context-menu-item\");\n expect(contextMenuItems).toHaveLength(1);\n expect(contextMenuItems[0]).toHaveTextContent(\"Remove\");\n });\n\n it(\"Set up grouping custom UI\", async () => {\n // Arange\n const mockedUIComponent = (_props: GroupingCustomUIProps) => React.createElement(\"div\");\n const mockGroupingUI: GroupingMappingCustomUI = {\n type: GroupingMappingCustomUIType.Grouping,\n name: \"mOcKgRoUpInGuI\",\n displayLabel: \"Mock Grouping UI\",\n uiComponent: mockedUIComponent,\n };\n\n const groupingMappingCustomUIMock = [mockGroupingUI];\n\n // Act\n const { user } = render(\n <Groupings\n mapping={mockMapping}\n onClickAddGroup={jest.fn()}\n onClickGroupModify={jest.fn()}\n onClickGroupTitle={jest.fn}\n onClickRenderContextCustomUI={jest.fn()}\n />,\n groupingMappingCustomUIMock\n );\n\n await waitForElementToBeRemoved(() => screen.getByText(/loading/i));\n\n // Assert\n const addButton = screen.getAllByTestId(\"gmw-add-group-button\");\n expect(addButton).toHaveLength(1);\n\n // Click on 'Add Group' button\n await user.click(addButton[0]);\n\n // Should have exactly 1 add method with given configuration\n const addCustom = screen.getAllByTestId(\"gmw-add-0\");\n expect(addCustom).toHaveLength(1);\n expect(addCustom[0]).toHaveTextContent(mockGroupingUI.displayLabel);\n\n // Each group should have a more icon button\n const moreButton = screen.getAllByTestId(\"gmw-more-button\");\n expect(moreButton).toHaveLength(mockGroups.groups.length);\n expect(moreButton.length).toBeGreaterThan(0);\n\n // Click on first more icon\n await user.click(moreButton[0]);\n\n // Should have 2 context menu items\n const contextMenuItems = screen.getAllByTestId(\"gmw-context-menu-item\");\n expect(contextMenuItems).toHaveLength(2);\n expect(contextMenuItems[0]).toHaveTextContent(\"Edit\");\n\n // Hover on 'Edit'\n await user.hover(contextMenuItems[0]);\n\n // Should have exactly 1 sub menu item\n const editCustom = screen.getAllByTestId(`gmw-edit-0`);\n expect(editCustom).toHaveLength(1);\n expect(editCustom[0]).toHaveTextContent(mockGroupingUI.displayLabel);\n\n // Click on the edit custom UI\n await user.click(editCustom[0]);\n\n const groupName = screen.getAllByText(mockGroups.groups[0].groupName);\n expect(groupName).toHaveLength(1);\n });\n\n it(\"Set up context custom UI - should have add context menu\", async () => {\n // Arange\n const mockedUIComponent = (_props: ContextCustomUIProps) => React.createElement(\"div\");\n const mockContextUI: GroupingMappingCustomUI = {\n type: GroupingMappingCustomUIType.Context,\n name: \"mOcKgRoUpInGuI\",\n displayLabel: \"Mock Grouping UI\",\n uiComponent: mockedUIComponent,\n };\n\n const groupingMappingCustomUIMock = [mockContextUI];\n const onClickRenderContextCustomUIMock = jest.fn();\n\n // Act\n const { user } = render(\n <Groupings\n mapping={mockMapping}\n onClickAddGroup={jest.fn()}\n onClickGroupModify={jest.fn()}\n onClickGroupTitle={jest.fn}\n onClickRenderContextCustomUI={onClickRenderContextCustomUIMock}\n />,\n groupingMappingCustomUIMock\n );\n\n await waitForElementToBeRemoved(() => screen.getByText(/loading/i));\n\n // Assert\n\n // Should have the right group number\n const horizontalTiles = screen.getAllByTestId(\"gmw-horizontal-tile\");\n expect(horizontalTiles).toHaveLength(mockGroups.groups.length);\n\n // Click on first group more icon\n const moreButton = screen.getAllByTestId(\"gmw-more-button\");\n expect(moreButton).toHaveLength(mockGroups.groups.length);\n\n await user.click(moreButton[0]);\n\n // Should have 2 context menu items\n const contextMenuItems = screen.getAllByTestId(\"gmw-context-menu-item\");\n expect(contextMenuItems).toHaveLength(2);\n expect(contextMenuItems[0]).toHaveTextContent(mockContextUI.displayLabel);\n expect(contextMenuItems[1]).toHaveTextContent(\"Remove\");\n\n // Click on the context ui\n await user.click(contextMenuItems[0]);\n\n // Callback should have been called with correct parameters\n expect(onClickRenderContextCustomUIMock).toBeCalledWith(mockedUIComponent, mockGroups.groups[0]);\n });\n\n it(\"Set up both grouping and context custom UI\", async () => {\n // Arange\n const mockedGroupingUIComponent = (_props: GroupingCustomUIProps) => React.createElement(\"div\");\n const mockedContextUIComponent = (_props: ContextCustomUIProps) => React.createElement(\"div\");\n const mockGroupingUI: GroupingMappingCustomUI = {\n type: GroupingMappingCustomUIType.Grouping,\n name: \"mOcKgRoUpInGuI\",\n displayLabel: \"Mock Grouping UI\",\n uiComponent: mockedGroupingUIComponent,\n };\n const mockContextUI: GroupingMappingCustomUI = {\n type: GroupingMappingCustomUIType.Context,\n name: \"mOcKgRoUpInGuI\",\n displayLabel: \"Mock Grouping UI\",\n uiComponent: mockedContextUIComponent,\n };\n\n const groupingMappingCustomUIMock = [mockContextUI, mockGroupingUI];\n const onClickAddGroup = jest.fn();\n const onClickRenderContextCustomUIMock = jest.fn();\n\n // Act\n const { user } = render(\n <Groupings\n mapping={mockMapping}\n onClickAddGroup={onClickAddGroup}\n onClickGroupModify={jest.fn()}\n onClickGroupTitle={jest.fn}\n onClickRenderContextCustomUI={onClickRenderContextCustomUIMock}\n />,\n groupingMappingCustomUIMock\n );\n\n await waitForElementToBeRemoved(() => screen.getByText(/loading/i));\n\n // Assert\n const addButton = screen.getAllByTestId(\"gmw-add-group-button\");\n expect(addButton).toHaveLength(1);\n\n // Click on 'Add Group' button\n await user.click(addButton[0]);\n\n // Should have exactly 1 add method with given configuration\n const addCustom = screen.getAllByTestId(\"gmw-add-0\");\n expect(addCustom).toHaveLength(1);\n expect(addCustom[0]).toHaveTextContent(mockGroupingUI.displayLabel);\n\n await user.click(addCustom[0]);\n\n // Callback should have been called with correct parameters\n expect(onClickAddGroup).toBeCalledWith(mockGroupingUI.name);\n\n // Check the group tile number\n const horizontalTiles = screen.getAllByTestId(\"gmw-horizontal-tile\");\n expect(horizontalTiles).toHaveLength(mockGroups.groups.length);\n\n // Click on first group more icon\n const moreButton = screen.getAllByTestId(\"gmw-more-button\");\n expect(moreButton).toHaveLength(mockGroups.groups.length);\n\n await user.click(moreButton[0]);\n\n // Should have 3 context menu items\n const contextMenuItems = screen.getAllByTestId(\"gmw-context-menu-item\");\n\n expect(contextMenuItems).toHaveLength(3);\n expect(contextMenuItems[0]).toHaveTextContent(\"Edit\");\n expect(contextMenuItems[1]).toHaveTextContent(mockContextUI.displayLabel);\n expect(contextMenuItems[2]).toHaveTextContent(\"Remove\");\n\n // Click on the context ui\n await user.click(contextMenuItems[1]);\n\n // Callback should have been called with correct parameters\n expect(onClickRenderContextCustomUIMock).toBeCalledWith(mockedContextUIComponent, mockGroups.groups[0]);\n });\n});\n"]}
@@ -1,6 +1,4 @@
1
1
  import * as React from "react";
2
- import type { Store } from "redux";
3
- import type { IModelConnection } from "@itwin/core-frontend";
4
2
  import type { IMappingsClient } from "@itwin/insights-client";
5
3
  import type { GroupingMappingCustomUI } from "../grouping-mapping-widget";
6
4
  import * as moq from "typemoq";
@@ -65,8 +63,4 @@ declare function render(ui: React.ReactElement, mockUIs?: GroupingMappingCustomU
65
63
  };
66
64
  export * from "@testing-library/react";
67
65
  export { render };
68
- export declare class TestUtils {
69
- static createAppStore(): Store;
70
- static initializeUiFramework(_?: IModelConnection): Promise<void>;
71
- }
72
66
  //# sourceMappingURL=test-utils.d.ts.map
@@ -25,27 +25,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
25
25
  return (mod && mod.__esModule) ? mod : { "default": mod };
26
26
  };
27
27
  Object.defineProperty(exports, "__esModule", { value: true });
28
- exports.TestUtils = exports.render = exports.mockMappingClient = exports.mockAccessToken = void 0;
28
+ exports.render = exports.mockMappingClient = exports.mockAccessToken = void 0;
29
29
  /*---------------------------------------------------------------------------------------------
30
30
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
31
31
  * See LICENSE.md in the project root for license terms and full copyright notice.
32
32
  *--------------------------------------------------------------------------------------------*/
33
33
  const React = __importStar(require("react"));
34
34
  const react_1 = require("@testing-library/react");
35
- const redux_1 = require("redux");
36
- const appui_react_1 = require("@itwin/appui-react");
37
35
  const user_event_1 = __importDefault(require("@testing-library/user-event"));
38
- const GroupingApiConfigContext_1 = require("../widget/components/context/GroupingApiConfigContext");
39
- const MappingClientContext_1 = require("../widget/components/context/MappingClientContext");
40
- const GroupingMappingCustomUIContext_1 = require("../widget/components/context/GroupingMappingCustomUIContext");
41
36
  const moq = __importStar(require("typemoq"));
37
+ const GroupingMappingContext_1 = require("../widget/components/GroupingMappingContext");
42
38
  const mockAccessToken = async () => "Bearer eyJhbGci";
43
39
  exports.mockAccessToken = mockAccessToken;
44
40
  exports.mockMappingClient = moq.Mock.ofType();
45
41
  function render(ui, mockUIs = [], { ...options } = {}) {
46
- const Wrapper = ({ children }) => (React.createElement(GroupingApiConfigContext_1.GroupingMappingApiConfigContext.Provider, { value: { getAccessToken: exports.mockAccessToken } },
47
- React.createElement(MappingClientContext_1.MappingClientContext.Provider, { value: exports.mockMappingClient.object },
48
- React.createElement(GroupingMappingCustomUIContext_1.GroupingMappingCustomUIContext.Provider, { value: mockUIs }, children))));
42
+ const contextProps = {
43
+ getAccessToken: exports.mockAccessToken,
44
+ iModelId: "mock",
45
+ customUIs: mockUIs,
46
+ };
47
+ const Wrapper = ({ children }) => (React.createElement(GroupingMappingContext_1.GroupingMappingContext, { ...contextProps }, children));
49
48
  return {
50
49
  user: user_event_1.default.setup(),
51
50
  ...react_1.render(ui, { wrapper: Wrapper, ...options }),
@@ -53,19 +52,4 @@ function render(ui, mockUIs = [], { ...options } = {}) {
53
52
  }
54
53
  exports.render = render;
55
54
  __exportStar(require("@testing-library/react"), exports);
56
- class TestUtils {
57
- static createAppStore() {
58
- const rootReducer = redux_1.combineReducers({
59
- frameworkState: appui_react_1.FrameworkReducer,
60
- });
61
- return redux_1.createStore(rootReducer, window.__REDUX_DEVTOOLS_EXTENSION__ &&
62
- window.__REDUX_DEVTOOLS_EXTENSION__());
63
- }
64
- static async initializeUiFramework(_) {
65
- const store = this.createAppStore();
66
- await appui_react_1.UiFramework.initialize(store);
67
- appui_react_1.SyncUiEventDispatcher.setTimeoutPeriod(0); // disables non-immediate event processing.
68
- }
69
- }
70
- exports.TestUtils = TestUtils;
71
55
  //# sourceMappingURL=test-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../../src/test/test-utils.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,6CAA+B;AAC/B,kDAA6D;AAE7D,iCAAqD;AACrD,oDAI4B;AAE5B,6EAAoD;AACpD,oGAAwG;AAExG,4FAAyF;AACzF,gHAA6G;AAE7G,6CAA+B;AAExB,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC;AAAhD,QAAA,eAAe,mBAAiC;AAChD,QAAA,iBAAiB,GAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAmB,CAAC;AAMrE,SAAS,MAAM,CAAC,EAAsB,EAAE,UAAqC,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE;IAClG,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAgB,EAAE,EAAE,CAAC,CAC9C,oBAAC,0DAA+B,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,cAAc,EAAE,uBAAe,EAAE;QAClF,oBAAC,2CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,yBAAiB,CAAC,MAAM;YAC5D,oBAAC,+DAA8B,CAAC,QAAQ,IAAC,KAAK,EAAE,OAAO,IACpD,QAAQ,CAC+B,CACZ,CACS,CAC5C,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,oBAAS,CAAC,KAAK,EAAE;QACvB,GAAG,cAAS,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;KACnD,CAAC;AACJ,CAAC;AAIQ,wBAAM;AAFf,yDAAuC;AAIvC,MAAa,SAAS;IACb,MAAM,CAAC,cAAc;QAC1B,MAAM,WAAW,GAAG,uBAAe,CAAC;YAClC,cAAc,EAAE,8BAAgB;SACjC,CAAC,CAAC;QAEH,OAAO,mBAAW,CAChB,WAAW,EACV,MAAc,CAAC,4BAA4B;YAC3C,MAAc,CAAC,4BAA4B,EAAE,CAC/C,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAoB;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,yBAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACpC,mCAAqB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,2CAA2C;IACxF,CAAC;CACF;AAlBD,8BAkBC","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 * as React from \"react\";\nimport { render as rtlRender } from \"@testing-library/react\";\nimport type { Store } from \"redux\";\nimport { combineReducers, createStore } from \"redux\";\nimport {\n FrameworkReducer,\n SyncUiEventDispatcher,\n UiFramework,\n} from \"@itwin/appui-react\";\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport userEvent from \"@testing-library/user-event\";\nimport { GroupingMappingApiConfigContext } from \"../widget/components/context/GroupingApiConfigContext\";\nimport type { IMappingsClient } from \"@itwin/insights-client\";\nimport { MappingClientContext } from \"../widget/components/context/MappingClientContext\";\nimport { GroupingMappingCustomUIContext } from \"../widget/components/context/GroupingMappingCustomUIContext\";\nimport type { GroupingMappingCustomUI } from \"../grouping-mapping-widget\";\nimport * as moq from \"typemoq\";\n\nexport const mockAccessToken = async () => \"Bearer eyJhbGci\";\nexport const mockMappingClient = moq.Mock.ofType<IMappingsClient>();\n\ninterface WrapperProps {\n children?: React.ReactNode;\n}\n\nfunction render(ui: React.ReactElement, mockUIs: GroupingMappingCustomUI[] = [], { ...options } = {}) {\n const Wrapper = ({ children }: WrapperProps) => (\n <GroupingMappingApiConfigContext.Provider value={{ getAccessToken: mockAccessToken }}>\n <MappingClientContext.Provider value={mockMappingClient.object}>\n <GroupingMappingCustomUIContext.Provider value={mockUIs}>\n {children}\n </GroupingMappingCustomUIContext.Provider>\n </MappingClientContext.Provider>\n </GroupingMappingApiConfigContext.Provider>\n );\n\n return {\n user: userEvent.setup(),\n ...rtlRender(ui, { wrapper: Wrapper, ...options }),\n };\n}\n\nexport * from \"@testing-library/react\";\n// override React Testing Library's render with our own\nexport { render };\n\nexport class TestUtils {\n public static createAppStore(): Store {\n const rootReducer = combineReducers({\n frameworkState: FrameworkReducer,\n });\n\n return createStore(\n rootReducer,\n (window as any).__REDUX_DEVTOOLS_EXTENSION__ &&\n (window as any).__REDUX_DEVTOOLS_EXTENSION__()\n );\n }\n\n public static async initializeUiFramework(_?: IModelConnection) {\n const store = this.createAppStore();\n await UiFramework.initialize(store);\n SyncUiEventDispatcher.setTimeoutPeriod(0); // disables non-immediate event processing.\n }\n}\n"]}
1
+ {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../../src/test/test-utils.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,6CAA+B;AAC/B,kDAA6D;AAC7D,6EAAoD;AAGpD,6CAA+B;AAE/B,wFAAqF;AAE9E,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC;AAAhD,QAAA,eAAe,mBAAiC;AAChD,QAAA,iBAAiB,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,EAAmB,CAAC;AAMpE,SAAS,MAAM,CAAC,EAAsB,EAAE,UAAqC,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE;IAClG,MAAM,YAAY,GAAgC;QAChD,cAAc,EAAE,uBAAe;QAC/B,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,OAAO;KACnB,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAgB,EAAE,EAAE,CAAC,CAC9C,oBAAC,+CAAsB,OAAK,YAAY,IACrC,QAAQ,CACc,CAC1B,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,oBAAS,CAAC,KAAK,EAAE;QACvB,GAAG,cAAS,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;KACnD,CAAC;AACJ,CAAC;AAIQ,wBAAM;AAFf,yDAAuC","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 * as React from \"react\";\nimport { render as rtlRender } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport type { IMappingsClient } from \"@itwin/insights-client\";\nimport type { GroupingMappingCustomUI } from \"../grouping-mapping-widget\";\nimport * as moq from \"typemoq\";\nimport type { GroupingMappingContextProps } from \"../widget/components/GroupingMappingContext\";\nimport { GroupingMappingContext } from \"../widget/components/GroupingMappingContext\";\n\nexport const mockAccessToken = async () => \"Bearer eyJhbGci\";\nexport const mockMappingClient = moq.Mock.ofType<IMappingsClient>();\n\ninterface WrapperProps {\n children?: React.ReactNode;\n}\n\nfunction render(ui: React.ReactElement, mockUIs: GroupingMappingCustomUI[] = [], { ...options } = {}) {\n const contextProps: GroupingMappingContextProps = {\n getAccessToken: mockAccessToken,\n iModelId: \"mock\",\n customUIs: mockUIs,\n };\n const Wrapper = ({ children }: WrapperProps) => (\n <GroupingMappingContext {...contextProps}>\n {children}\n </GroupingMappingContext>\n );\n\n return {\n user: userEvent.setup(),\n ...rtlRender(ui, { wrapper: Wrapper, ...options }),\n };\n}\n\nexport * from \"@testing-library/react\";\n// override React Testing Library's render with our own\nexport { render };\n"]}
@@ -2,7 +2,7 @@
2
2
  import "./ActionPanel.scss";
3
3
  export interface ActionPanelProps {
4
4
  onSave: () => void;
5
- onCancel: () => void;
5
+ onCancel?: () => void;
6
6
  isCancelDisabled?: boolean;
7
7
  isSavingDisabled?: boolean;
8
8
  isLoading?: boolean;
@@ -33,7 +33,7 @@ const ActionPanel = ({ onSave, onCancel, isCancelDisabled = false, isSavingDisab
33
33
  isLoading &&
34
34
  React.createElement(utils_1.LoadingSpinner, null),
35
35
  React.createElement(itwinui_react_1.Button, { disabled: isSavingDisabled || isLoading, styleType: 'high-visibility', id: 'save-app', onClick: onSave }, "Save"),
36
- React.createElement(itwinui_react_1.Button, { styleType: 'default', type: 'button', id: 'cancel', onClick: onCancel, disabled: isCancelDisabled || isLoading }, "Cancel"))));
36
+ onCancel && React.createElement(itwinui_react_1.Button, { styleType: 'default', type: 'button', id: 'cancel', onClick: onCancel, disabled: isCancelDisabled || isLoading }, "Cancel"))));
37
37
  };
38
38
  exports.default = ActionPanel;
39
39
  //# sourceMappingURL=ActionPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ActionPanel.js","sourceRoot":"","sources":["../../../../src/widget/components/ActionPanel.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,wDAA8C;AAC9C,6CAA+B;AAC/B,8BAA4B;AAC5B,mCAAyC;AAUzC,MAAM,WAAW,GAAG,CAAC,EACnB,MAAM,EACN,QAAQ,EACR,gBAAgB,GAAG,KAAK,EACxB,gBAAgB,GAAG,KAAK,EACxB,SAAS,GAAG,KAAK,GACA,EAAe,EAAE;IAClC,OAAO,CACL,6BAAK,EAAE,EAAC,QAAQ,EAAC,SAAS,EAAC,4BAA4B;QACrD,6BAAK,SAAS,EAAC,kBAAkB;YAC9B,SAAS;gBACR,oBAAC,sBAAc,OAAG;YAEpB,oBAAC,sBAAM,IACL,QAAQ,EAAE,gBAAgB,IAAI,SAAS,EACvC,SAAS,EAAC,iBAAiB,EAC3B,EAAE,EAAC,UAAU,EACb,OAAO,EAAE,MAAM,WAGR;YACT,oBAAC,sBAAM,IACL,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,QAAQ,EACX,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,gBAAgB,IAAI,SAAS,aAGhC,CACL,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,WAAW,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*--------------------------------------------------------------------------------------------*/\nimport { Button } from \"@itwin/itwinui-react\";\nimport * as React from \"react\";\nimport \"./ActionPanel.scss\";\nimport { LoadingSpinner } from \"./utils\";\n\nexport interface ActionPanelProps {\n onSave: () => void;\n onCancel: () => void;\n isCancelDisabled?: boolean;\n isSavingDisabled?: boolean;\n isLoading?: boolean;\n}\n\nconst ActionPanel = ({\n onSave,\n onCancel,\n isCancelDisabled = false,\n isSavingDisabled = false,\n isLoading = false,\n}: ActionPanelProps): JSX.Element => {\n return (\n <div id='action' className='gmw-action-panel-container'>\n <div className='gmw-action-panel'>\n {isLoading &&\n <LoadingSpinner />\n }\n <Button\n disabled={isSavingDisabled || isLoading}\n styleType='high-visibility'\n id='save-app'\n onClick={onSave}\n >\n Save\n </Button>\n <Button\n styleType='default'\n type='button'\n id='cancel'\n onClick={onCancel}\n disabled={isCancelDisabled || isLoading}\n >\n Cancel\n </Button>\n </div>\n </div>\n );\n};\n\nexport default ActionPanel;\n"]}
1
+ {"version":3,"file":"ActionPanel.js","sourceRoot":"","sources":["../../../../src/widget/components/ActionPanel.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,wDAA8C;AAC9C,6CAA+B;AAC/B,8BAA4B;AAC5B,mCAAyC;AAUzC,MAAM,WAAW,GAAG,CAAC,EACnB,MAAM,EACN,QAAQ,EACR,gBAAgB,GAAG,KAAK,EACxB,gBAAgB,GAAG,KAAK,EACxB,SAAS,GAAG,KAAK,GACA,EAAe,EAAE;IAClC,OAAO,CACL,6BAAK,EAAE,EAAC,QAAQ,EAAC,SAAS,EAAC,4BAA4B;QACrD,6BAAK,SAAS,EAAC,kBAAkB;YAC9B,SAAS;gBACR,oBAAC,sBAAc,OAAG;YAEpB,oBAAC,sBAAM,IACL,QAAQ,EAAE,gBAAgB,IAAI,SAAS,EACvC,SAAS,EAAC,iBAAiB,EAC3B,EAAE,EAAC,UAAU,EACb,OAAO,EAAE,MAAM,WAGR;YACR,QAAQ,IAAI,oBAAC,sBAAM,IAClB,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,QAAQ,EACX,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,gBAAgB,IAAI,SAAS,aAGhC,CACL,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,WAAW,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*--------------------------------------------------------------------------------------------*/\nimport { Button } from \"@itwin/itwinui-react\";\nimport * as React from \"react\";\nimport \"./ActionPanel.scss\";\nimport { LoadingSpinner } from \"./utils\";\n\nexport interface ActionPanelProps {\n onSave: () => void;\n onCancel?: () => void;\n isCancelDisabled?: boolean;\n isSavingDisabled?: boolean;\n isLoading?: boolean;\n}\n\nconst ActionPanel = ({\n onSave,\n onCancel,\n isCancelDisabled = false,\n isSavingDisabled = false,\n isLoading = false,\n}: ActionPanelProps): JSX.Element => {\n return (\n <div id='action' className='gmw-action-panel-container'>\n <div className='gmw-action-panel'>\n {isLoading &&\n <LoadingSpinner />\n }\n <Button\n disabled={isSavingDisabled || isLoading}\n styleType='high-visibility'\n id='save-app'\n onClick={onSave}\n >\n Save\n </Button>\n {onCancel && <Button\n styleType='default'\n type='button'\n id='cancel'\n onClick={onCancel}\n disabled={isCancelDisabled || isLoading}\n >\n Cancel\n </Button>}\n </div>\n </div>\n );\n};\n\nexport default ActionPanel;\n"]}