@itwin/reports-config-widget-react 0.1.0 → 0.2.1

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 (250) hide show
  1. package/.rush/temp/package-deps_rebuild.json +38 -34
  2. package/.rush/temp/shrinkwrap-deps.json +14 -6
  3. package/CHANGELOG.json +30 -0
  4. package/CHANGELOG.md +17 -1
  5. package/coverage/clover.xml +605 -610
  6. package/coverage/coverage-final.json +28 -27
  7. package/coverage/lcov-report/index.html +31 -31
  8. package/coverage/lcov-report/src/ReportsConfigWidget.ts.html +10 -10
  9. package/coverage/lcov-report/src/index.html +1 -1
  10. package/coverage/lcov-report/src/test/index.html +1 -1
  11. package/coverage/lcov-report/src/test/test-utils.tsx.html +22 -22
  12. package/coverage/lcov-report/src/widget/ReportsConfigUiProvider.tsx.html +7 -7
  13. package/coverage/lcov-report/src/widget/components/ActionPanel.tsx.html +29 -41
  14. package/coverage/lcov-report/src/widget/components/AddMappingsModal.tsx.html +31 -37
  15. package/coverage/lcov-report/src/widget/components/BulkExtractor.ts.html +270 -162
  16. package/coverage/lcov-report/src/widget/components/Constants.ts.html +4 -4
  17. package/coverage/lcov-report/src/widget/components/DeleteModal.tsx.html +21 -21
  18. package/coverage/lcov-report/src/widget/components/ExtractionStates/FailedExtractionState.tsx.html +6 -6
  19. package/coverage/lcov-report/src/widget/components/ExtractionStates/QueuedExtractionState.tsx.html +14 -14
  20. package/coverage/lcov-report/src/widget/components/ExtractionStates/RunningExtractionState.tsx.html +15 -15
  21. package/coverage/lcov-report/src/widget/components/ExtractionStates/StartingExtractionState.tsx.html +14 -14
  22. package/coverage/lcov-report/src/widget/components/ExtractionStates/SucceededExtractionState.tsx.html +22 -19
  23. package/coverage/lcov-report/src/widget/components/ExtractionStates/index.html +43 -43
  24. package/coverage/lcov-report/src/widget/components/ExtractionStatus.tsx.html +57 -57
  25. package/coverage/lcov-report/src/widget/components/ExtractionToast.tsx.html +208 -0
  26. package/coverage/lcov-report/src/widget/components/HorizontalTile.tsx.html +8 -8
  27. package/coverage/lcov-report/src/widget/components/LocalizedTablePaginator.tsx.html +8 -8
  28. package/coverage/lcov-report/src/widget/components/ReportAction.tsx.html +14 -20
  29. package/coverage/lcov-report/src/widget/components/ReportHorizontalTile.tsx.html +30 -33
  30. package/coverage/lcov-report/src/widget/components/ReportMappingHorizontalTile.tsx.html +469 -0
  31. package/coverage/lcov-report/src/widget/components/ReportMappings.tsx.html +183 -231
  32. package/coverage/lcov-report/src/widget/components/Reports.tsx.html +73 -43
  33. package/coverage/lcov-report/src/widget/components/ReportsContainer.tsx.html +10 -10
  34. package/coverage/lcov-report/src/widget/components/SearchBar.tsx.html +10 -10
  35. package/coverage/lcov-report/src/widget/components/SelectIModel.tsx.html +31 -31
  36. package/coverage/lcov-report/src/widget/components/index.html +100 -85
  37. package/coverage/lcov-report/src/widget/components/utils.tsx.html +32 -32
  38. package/coverage/lcov-report/src/widget/context/ReportsApiConfigContext.tsx.html +8 -8
  39. package/coverage/lcov-report/src/widget/context/index.html +1 -1
  40. package/coverage/lcov-report/src/widget/hooks/index.html +1 -1
  41. package/coverage/lcov-report/src/widget/hooks/useValidator.ts.html +7 -7
  42. package/coverage/lcov-report/src/widget/index.html +1 -1
  43. package/coverage/lcov.info +990 -1003
  44. package/jest.config.js +6 -0
  45. package/lib/cjs/test/AddMappingModal.test.d.ts +2 -0
  46. package/lib/cjs/test/AddMappingModal.test.d.ts.map +1 -0
  47. package/lib/cjs/test/AddMappingModal.test.js +277 -0
  48. package/lib/cjs/test/AddMappingModal.test.js.map +1 -0
  49. package/lib/cjs/test/BulkExtractor.test.d.ts +2 -0
  50. package/lib/cjs/test/BulkExtractor.test.d.ts.map +1 -0
  51. package/lib/cjs/test/BulkExtractor.test.js +182 -0
  52. package/lib/cjs/test/BulkExtractor.test.js.map +1 -0
  53. package/lib/cjs/test/DeleteModal.test.d.ts +2 -0
  54. package/lib/cjs/test/DeleteModal.test.d.ts.map +1 -0
  55. package/lib/cjs/test/DeleteModal.test.js +93 -0
  56. package/lib/cjs/test/DeleteModal.test.js.map +1 -0
  57. package/lib/cjs/test/ReportAction.test.js +2 -3
  58. package/lib/cjs/test/ReportAction.test.js.map +1 -1
  59. package/lib/cjs/test/ReportMappingHorizontalTile.test.d.ts +2 -0
  60. package/lib/cjs/test/ReportMappingHorizontalTile.test.d.ts.map +1 -0
  61. package/lib/cjs/test/ReportMappingHorizontalTile.test.js +340 -0
  62. package/lib/cjs/test/ReportMappingHorizontalTile.test.js.map +1 -0
  63. package/lib/cjs/test/ReportMappings.test.js +115 -267
  64. package/lib/cjs/test/ReportMappings.test.js.map +1 -1
  65. package/lib/cjs/test/Reports.test.js +1 -1
  66. package/lib/cjs/test/Reports.test.js.map +1 -1
  67. package/lib/cjs/tsconfig.tsbuildinfo +1 -1
  68. package/lib/cjs/widget/components/ActionPanel.d.ts.map +1 -1
  69. package/lib/cjs/widget/components/ActionPanel.js +4 -5
  70. package/lib/cjs/widget/components/ActionPanel.js.map +1 -1
  71. package/lib/cjs/widget/components/AddMappingsModal.d.ts +2 -2
  72. package/lib/cjs/widget/components/AddMappingsModal.d.ts.map +1 -1
  73. package/lib/cjs/widget/components/AddMappingsModal.js +5 -4
  74. package/lib/cjs/widget/components/AddMappingsModal.js.map +1 -1
  75. package/lib/cjs/widget/components/AddMappingsModal.scss +4 -3
  76. package/lib/cjs/widget/components/BulkExtractor.d.ts +18 -9
  77. package/lib/cjs/widget/components/BulkExtractor.d.ts.map +1 -1
  78. package/lib/cjs/widget/components/BulkExtractor.js +86 -57
  79. package/lib/cjs/widget/components/BulkExtractor.js.map +1 -1
  80. package/lib/cjs/widget/components/DeleteModal.js +1 -1
  81. package/lib/cjs/widget/components/DeleteModal.js.map +1 -1
  82. package/lib/cjs/widget/components/DeleteModal.scss +4 -3
  83. package/lib/cjs/widget/components/ExtractionStates/RunningExtractionState.js +1 -1
  84. package/lib/cjs/widget/components/ExtractionStates/RunningExtractionState.js.map +1 -1
  85. package/lib/cjs/widget/components/ExtractionStates/SucceededExtractionState.d.ts.map +1 -1
  86. package/lib/cjs/widget/components/ExtractionStates/SucceededExtractionState.js +1 -1
  87. package/lib/cjs/widget/components/ExtractionStates/SucceededExtractionState.js.map +1 -1
  88. package/lib/cjs/widget/components/ExtractionStatus.scss +15 -1
  89. package/lib/cjs/widget/components/ExtractionToast.d.ts +11 -0
  90. package/lib/cjs/widget/components/ExtractionToast.d.ts.map +1 -0
  91. package/lib/cjs/widget/components/ExtractionToast.js +33 -0
  92. package/lib/cjs/widget/components/ExtractionToast.js.map +1 -0
  93. package/lib/cjs/widget/components/HorizontalTile.scss +1 -1
  94. package/lib/cjs/widget/components/ReportAction.d.ts.map +1 -1
  95. package/lib/cjs/widget/components/ReportAction.js +3 -3
  96. package/lib/cjs/widget/components/ReportAction.js.map +1 -1
  97. package/lib/cjs/widget/components/ReportAction.scss +2 -2
  98. package/lib/cjs/widget/components/ReportHorizontalTile.d.ts.map +1 -1
  99. package/lib/cjs/widget/components/ReportHorizontalTile.js +1 -2
  100. package/lib/cjs/widget/components/ReportHorizontalTile.js.map +1 -1
  101. package/lib/cjs/widget/components/ReportMappingHorizontalTile.d.ts +13 -0
  102. package/lib/cjs/widget/components/ReportMappingHorizontalTile.d.ts.map +1 -0
  103. package/lib/cjs/widget/components/ReportMappingHorizontalTile.js +82 -0
  104. package/lib/cjs/widget/components/ReportMappingHorizontalTile.js.map +1 -0
  105. package/lib/cjs/widget/components/ReportMappings.d.ts +3 -1
  106. package/lib/cjs/widget/components/ReportMappings.d.ts.map +1 -1
  107. package/lib/cjs/widget/components/ReportMappings.js +39 -40
  108. package/lib/cjs/widget/components/ReportMappings.js.map +1 -1
  109. package/lib/cjs/widget/components/ReportMappings.scss +7 -7
  110. package/lib/cjs/widget/components/Reports.d.ts.map +1 -1
  111. package/lib/cjs/widget/components/Reports.js +13 -6
  112. package/lib/cjs/widget/components/Reports.js.map +1 -1
  113. package/lib/cjs/widget/components/Reports.scss +1 -1
  114. package/lib/cjs/widget/components/ReportsContainer.js +1 -1
  115. package/lib/cjs/widget/components/ReportsContainer.js.map +1 -1
  116. package/lib/cjs/widget/components/ReportsContainer.scss +2 -2
  117. package/lib/cjs/widget/components/SelectIModel.js +2 -2
  118. package/lib/cjs/widget/components/SelectIModel.js.map +1 -1
  119. package/lib/cjs/widget/components/SelectIModel.scss +4 -3
  120. package/lib/cjs/widget/components/utils.js +1 -1
  121. package/lib/cjs/widget/components/utils.js.map +1 -1
  122. package/lib/cjs/widget/components/utils.scss +2 -2
  123. package/lib/esm/test/AddMappingModal.test.d.ts +2 -0
  124. package/lib/esm/test/AddMappingModal.test.d.ts.map +1 -0
  125. package/lib/esm/test/AddMappingModal.test.js +253 -0
  126. package/lib/esm/test/AddMappingModal.test.js.map +1 -0
  127. package/lib/esm/test/BulkExtractor.test.d.ts +2 -0
  128. package/lib/esm/test/BulkExtractor.test.d.ts.map +1 -0
  129. package/lib/esm/test/BulkExtractor.test.js +158 -0
  130. package/lib/esm/test/BulkExtractor.test.js.map +1 -0
  131. package/lib/esm/test/DeleteModal.test.d.ts +2 -0
  132. package/lib/esm/test/DeleteModal.test.d.ts.map +1 -0
  133. package/lib/esm/test/DeleteModal.test.js +69 -0
  134. package/lib/esm/test/DeleteModal.test.js.map +1 -0
  135. package/lib/esm/test/ReportAction.test.js +2 -3
  136. package/lib/esm/test/ReportAction.test.js.map +1 -1
  137. package/lib/esm/test/ReportMappingHorizontalTile.test.d.ts +2 -0
  138. package/lib/esm/test/ReportMappingHorizontalTile.test.d.ts.map +1 -0
  139. package/lib/esm/test/ReportMappingHorizontalTile.test.js +316 -0
  140. package/lib/esm/test/ReportMappingHorizontalTile.test.js.map +1 -0
  141. package/lib/esm/test/ReportMappings.test.js +117 -269
  142. package/lib/esm/test/ReportMappings.test.js.map +1 -1
  143. package/lib/esm/test/Reports.test.js +1 -1
  144. package/lib/esm/test/Reports.test.js.map +1 -1
  145. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  146. package/lib/esm/widget/components/ActionPanel.d.ts.map +1 -1
  147. package/lib/esm/widget/components/ActionPanel.js +4 -5
  148. package/lib/esm/widget/components/ActionPanel.js.map +1 -1
  149. package/lib/esm/widget/components/AddMappingsModal.d.ts +2 -2
  150. package/lib/esm/widget/components/AddMappingsModal.d.ts.map +1 -1
  151. package/lib/esm/widget/components/AddMappingsModal.js +4 -5
  152. package/lib/esm/widget/components/AddMappingsModal.js.map +1 -1
  153. package/lib/esm/widget/components/AddMappingsModal.scss +4 -3
  154. package/lib/esm/widget/components/BulkExtractor.d.ts +18 -9
  155. package/lib/esm/widget/components/BulkExtractor.d.ts.map +1 -1
  156. package/lib/esm/widget/components/BulkExtractor.js +86 -57
  157. package/lib/esm/widget/components/BulkExtractor.js.map +1 -1
  158. package/lib/esm/widget/components/DeleteModal.js +1 -1
  159. package/lib/esm/widget/components/DeleteModal.js.map +1 -1
  160. package/lib/esm/widget/components/DeleteModal.scss +4 -3
  161. package/lib/esm/widget/components/ExtractionStates/RunningExtractionState.js +1 -1
  162. package/lib/esm/widget/components/ExtractionStates/RunningExtractionState.js.map +1 -1
  163. package/lib/esm/widget/components/ExtractionStates/SucceededExtractionState.d.ts.map +1 -1
  164. package/lib/esm/widget/components/ExtractionStates/SucceededExtractionState.js +1 -1
  165. package/lib/esm/widget/components/ExtractionStates/SucceededExtractionState.js.map +1 -1
  166. package/lib/esm/widget/components/ExtractionStatus.scss +15 -1
  167. package/lib/esm/widget/components/ExtractionToast.d.ts +11 -0
  168. package/lib/esm/widget/components/ExtractionToast.d.ts.map +1 -0
  169. package/lib/esm/widget/components/ExtractionToast.js +25 -0
  170. package/lib/esm/widget/components/ExtractionToast.js.map +1 -0
  171. package/lib/esm/widget/components/HorizontalTile.scss +1 -1
  172. package/lib/esm/widget/components/ReportAction.d.ts.map +1 -1
  173. package/lib/esm/widget/components/ReportAction.js +3 -3
  174. package/lib/esm/widget/components/ReportAction.js.map +1 -1
  175. package/lib/esm/widget/components/ReportAction.scss +2 -2
  176. package/lib/esm/widget/components/ReportHorizontalTile.d.ts.map +1 -1
  177. package/lib/esm/widget/components/ReportHorizontalTile.js +1 -2
  178. package/lib/esm/widget/components/ReportHorizontalTile.js.map +1 -1
  179. package/lib/esm/widget/components/ReportMappingHorizontalTile.d.ts +13 -0
  180. package/lib/esm/widget/components/ReportMappingHorizontalTile.d.ts.map +1 -0
  181. package/lib/esm/widget/components/ReportMappingHorizontalTile.js +75 -0
  182. package/lib/esm/widget/components/ReportMappingHorizontalTile.js.map +1 -0
  183. package/lib/esm/widget/components/ReportMappings.d.ts +3 -1
  184. package/lib/esm/widget/components/ReportMappings.d.ts.map +1 -1
  185. package/lib/esm/widget/components/ReportMappings.js +40 -41
  186. package/lib/esm/widget/components/ReportMappings.js.map +1 -1
  187. package/lib/esm/widget/components/ReportMappings.scss +7 -7
  188. package/lib/esm/widget/components/Reports.d.ts.map +1 -1
  189. package/lib/esm/widget/components/Reports.js +15 -8
  190. package/lib/esm/widget/components/Reports.js.map +1 -1
  191. package/lib/esm/widget/components/Reports.scss +1 -1
  192. package/lib/esm/widget/components/ReportsContainer.js +1 -1
  193. package/lib/esm/widget/components/ReportsContainer.js.map +1 -1
  194. package/lib/esm/widget/components/ReportsContainer.scss +2 -2
  195. package/lib/esm/widget/components/SelectIModel.js +2 -2
  196. package/lib/esm/widget/components/SelectIModel.js.map +1 -1
  197. package/lib/esm/widget/components/SelectIModel.scss +4 -3
  198. package/lib/esm/widget/components/utils.js +1 -1
  199. package/lib/esm/widget/components/utils.js.map +1 -1
  200. package/lib/esm/widget/components/utils.scss +2 -2
  201. package/lib/public/locales/en/ReportsConfigWidget.json +5 -0
  202. package/package.json +7 -4
  203. package/public/locales/en/ReportsConfigWidget.json +5 -0
  204. package/reports-config-widget-react.build.error.log +10 -6
  205. package/reports-config-widget-react.build.log +51 -46
  206. package/src/test/AddMappingModal.test.tsx +315 -0
  207. package/src/test/BulkExtractor.test.ts +301 -0
  208. package/src/test/DeleteModal.test.tsx +118 -0
  209. package/src/test/ReportAction.test.tsx +2 -4
  210. package/src/test/ReportMappingHorizontalTile.test.tsx +451 -0
  211. package/src/test/ReportMappings.test.tsx +154 -549
  212. package/src/test/Reports.test.tsx +1 -1
  213. package/src/widget/components/ActionPanel.tsx +19 -23
  214. package/src/widget/components/AddMappingsModal.scss +4 -3
  215. package/src/widget/components/AddMappingsModal.tsx +4 -6
  216. package/src/widget/components/BulkExtractor.ts +97 -61
  217. package/src/widget/components/DeleteModal.scss +4 -3
  218. package/src/widget/components/DeleteModal.tsx +1 -1
  219. package/src/widget/components/ExtractionStates/RunningExtractionState.tsx +1 -1
  220. package/src/widget/components/ExtractionStates/SucceededExtractionState.tsx +1 -0
  221. package/src/widget/components/ExtractionStatus.scss +15 -1
  222. package/src/widget/components/ExtractionToast.tsx +41 -0
  223. package/src/widget/components/HorizontalTile.scss +1 -1
  224. package/src/widget/components/ReportAction.scss +2 -2
  225. package/src/widget/components/ReportAction.tsx +1 -3
  226. package/src/widget/components/ReportHorizontalTile.tsx +1 -2
  227. package/src/widget/components/ReportMappingHorizontalTile.tsx +128 -0
  228. package/src/widget/components/ReportMappings.scss +7 -7
  229. package/src/widget/components/ReportMappings.tsx +89 -105
  230. package/src/widget/components/Reports.scss +1 -1
  231. package/src/widget/components/Reports.tsx +18 -8
  232. package/src/widget/components/ReportsContainer.scss +2 -2
  233. package/src/widget/components/ReportsContainer.tsx +1 -1
  234. package/src/widget/components/SelectIModel.scss +4 -3
  235. package/src/widget/components/SelectIModel.tsx +2 -2
  236. package/src/widget/components/utils.scss +2 -2
  237. package/src/widget/components/utils.tsx +1 -1
  238. package/coverage/lcov-report/src/widget/components/Extraction.tsx.html +0 -1030
  239. package/lib/cjs/widget/components/Extraction.d.ts +0 -28
  240. package/lib/cjs/widget/components/Extraction.d.ts.map +0 -1
  241. package/lib/cjs/widget/components/Extraction.js +0 -190
  242. package/lib/cjs/widget/components/Extraction.js.map +0 -1
  243. package/lib/cjs/widget/components/Extraction.scss +0 -39
  244. package/lib/esm/widget/components/Extraction.d.ts +0 -28
  245. package/lib/esm/widget/components/Extraction.d.ts.map +0 -1
  246. package/lib/esm/widget/components/Extraction.js +0 -166
  247. package/lib/esm/widget/components/Extraction.js.map +0 -1
  248. package/lib/esm/widget/components/Extraction.scss +0 -39
  249. package/src/widget/components/Extraction.scss +0 -39
  250. package/src/widget/components/Extraction.tsx +0 -315
@@ -1 +1 @@
1
- {"version":3,"file":"ActionPanel.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/ActionPanel.tsx"],"names":[],"mappings":";AAOA,OAAO,oBAAoB,CAAC;AAG5B,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,WAAW,wFAOd,gBAAgB,KAAG,WA2BrB,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ActionPanel.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/ActionPanel.tsx"],"names":[],"mappings":";AAOA,OAAO,oBAAoB,CAAC;AAG5B,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,WAAW,wFAOd,gBAAgB,KAAG,WAuBrB,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -8,11 +8,10 @@ import { ReportsConfigWidget } from "../../ReportsConfigWidget";
8
8
  import "./ActionPanel.scss";
9
9
  import { LoadingSpinner } from "./utils";
10
10
  const ActionPanel = ({ actionLabel, onAction, onCancel, isCancelDisabled = false, isSavingDisabled = false, isLoading = false, }) => {
11
- return (React.createElement("div", { id: "action" },
12
- React.createElement("div", { className: "rcw-action-panel" },
13
- isLoading && React.createElement(LoadingSpinner, null),
14
- React.createElement(Button, { disabled: isSavingDisabled || isLoading, styleType: "high-visibility", id: "save-app", onClick: onAction }, actionLabel),
15
- React.createElement(Button, { styleType: "default", type: "button", id: "cancel", onClick: onCancel, disabled: isCancelDisabled || isLoading }, ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Cancel")))));
11
+ return (React.createElement("div", { className: "rcw-action-panel" },
12
+ isLoading && React.createElement(LoadingSpinner, null),
13
+ React.createElement(Button, { disabled: isSavingDisabled || isLoading, styleType: "high-visibility", onClick: onAction }, actionLabel),
14
+ React.createElement(Button, { styleType: "default", type: "button", onClick: onCancel, disabled: isCancelDisabled || isLoading }, ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Cancel"))));
16
15
  };
17
16
  export default ActionPanel;
18
17
  //# 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,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAWzC,MAAM,WAAW,GAAG,CAAC,EACnB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,gBAAgB,GAAG,KAAK,EACxB,gBAAgB,GAAG,KAAK,EACxB,SAAS,GAAG,KAAK,GACA,EAAe,EAAE;IAClC,OAAO,CACL,6BAAK,EAAE,EAAC,QAAQ;QACd,6BAAK,SAAS,EAAC,kBAAkB;YAC9B,SAAS,IAAI,oBAAC,cAAc,OAAG;YAChC,oBAAC,MAAM,IACL,QAAQ,EAAE,gBAAgB,IAAI,SAAS,EACvC,SAAS,EAAC,iBAAiB,EAC3B,EAAE,EAAC,UAAU,EACb,OAAO,EAAE,QAAQ,IAEhB,WAAW,CACL;YACT,oBAAC,MAAM,IACL,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,QAAQ,EACX,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,gBAAgB,IAAI,SAAS,IAEtC,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,4BAA4B,CAC7B,CACM,CACL,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,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 { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\nimport \"./ActionPanel.scss\";\nimport { LoadingSpinner } from \"./utils\";\n\nexport interface ActionPanelProps {\n actionLabel: string;\n onAction: () => Promise<void>;\n onCancel: () => void;\n isCancelDisabled?: boolean;\n isSavingDisabled?: boolean;\n isLoading?: boolean;\n}\n\nconst ActionPanel = ({\n actionLabel,\n onAction,\n onCancel,\n isCancelDisabled = false,\n isSavingDisabled = false,\n isLoading = false,\n}: ActionPanelProps): JSX.Element => {\n return (\n <div id=\"action\">\n <div className=\"rcw-action-panel\">\n {isLoading && <LoadingSpinner />}\n <Button\n disabled={isSavingDisabled || isLoading}\n styleType=\"high-visibility\"\n id=\"save-app\"\n onClick={onAction}\n >\n {actionLabel}\n </Button>\n <Button\n styleType=\"default\"\n type=\"button\"\n id=\"cancel\"\n onClick={onCancel}\n disabled={isCancelDisabled || isLoading}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Cancel\"\n )}\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,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAWzC,MAAM,WAAW,GAAG,CAAC,EACnB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,gBAAgB,GAAG,KAAK,EACxB,gBAAgB,GAAG,KAAK,EACxB,SAAS,GAAG,KAAK,GACA,EAAe,EAAE;IAClC,OAAO,CACL,6BAAK,SAAS,EAAC,kBAAkB;QAC9B,SAAS,IAAI,oBAAC,cAAc,OAAG;QAChC,oBAAC,MAAM,IACL,QAAQ,EAAE,gBAAgB,IAAI,SAAS,EACvC,SAAS,EAAC,iBAAiB,EAC3B,OAAO,EAAE,QAAQ,IAEhB,WAAW,CACL;QACT,oBAAC,MAAM,IACL,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,gBAAgB,IAAI,SAAS,IAEtC,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,4BAA4B,CAC7B,CACM,CACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,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 { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\nimport \"./ActionPanel.scss\";\nimport { LoadingSpinner } from \"./utils\";\n\nexport interface ActionPanelProps {\n actionLabel: string;\n onAction: () => Promise<void>;\n onCancel: () => void;\n isCancelDisabled?: boolean;\n isSavingDisabled?: boolean;\n isLoading?: boolean;\n}\n\nconst ActionPanel = ({\n actionLabel,\n onAction,\n onCancel,\n isCancelDisabled = false,\n isSavingDisabled = false,\n isLoading = false,\n}: ActionPanelProps): JSX.Element => {\n return (\n <div className=\"rcw-action-panel\">\n {isLoading && <LoadingSpinner />}\n <Button\n disabled={isSavingDisabled || isLoading}\n styleType=\"high-visibility\"\n onClick={onAction}\n >\n {actionLabel}\n </Button>\n <Button\n styleType=\"default\"\n type=\"button\"\n onClick={onCancel}\n disabled={isCancelDisabled || isLoading}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Cancel\"\n )}\n </Button>\n </div>\n );\n};\n\nexport default ActionPanel;\n"]}
@@ -10,6 +10,6 @@ interface AddMappingsModalProps {
10
10
  show: boolean;
11
11
  returnFn: () => Promise<void>;
12
12
  }
13
- declare const AddMappingsModal: ({ reportId, existingMappings, show, returnFn, }: AddMappingsModalProps) => JSX.Element;
14
- export default AddMappingsModal;
13
+ export declare const AddMappingsModal: ({ reportId, existingMappings, show, returnFn, }: AddMappingsModalProps) => JSX.Element;
14
+ export {};
15
15
  //# sourceMappingURL=AddMappingsModal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AddMappingsModal.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/AddMappingsModal.tsx"],"names":[],"mappings":";AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAIhE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAIvD,oBAAY,WAAW,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;AA0B3D,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,uBAAuB,EAAE,CAAC;IAC5C,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,QAAA,MAAM,gBAAgB,oDAKnB,qBAAqB,gBAmHvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"AddMappingsModal.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/AddMappingsModal.tsx"],"names":[],"mappings":";AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAIhE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAIvD,oBAAY,WAAW,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;AA0B3D,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,uBAAuB,EAAE,CAAC;IAC5C,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,eAAO,MAAM,gBAAgB,oDAK1B,qBAAqB,gBAmHvB,CAAC"}
@@ -27,8 +27,8 @@ const fetchMappings = async (setMappings, iModelId, setIsLoading, apiContext) =>
27
27
  setIsLoading(false);
28
28
  }
29
29
  };
30
- const AddMappingsModal = ({ reportId, existingMappings, show, returnFn, }) => {
31
- const [isLoading, setIsLoading] = useState(true);
30
+ export const AddMappingsModal = ({ reportId, existingMappings, show, returnFn, }) => {
31
+ const [isLoading, setIsLoading] = useState(false);
32
32
  const [selectedMappings, setSelectedMappings] = useState([]);
33
33
  const [selectedIModelId, setSelectediModelId] = useState("");
34
34
  const [mappings, setMappings] = useState([]);
@@ -82,12 +82,11 @@ const AddMappingsModal = ({ reportId, existingMappings, show, returnFn, }) => {
82
82
  return (React.createElement(Modal, { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:AddMappings"), isOpen: show, isDismissible: !isLoading, onClose: async () => {
83
83
  await returnFn();
84
84
  }, style: { display: "flex", flexDirection: "column", maxHeight: "77vh" } },
85
- React.createElement("div", { className: "add-mappings-container" },
85
+ React.createElement("div", { className: "rcw-add-mappings-container" },
86
86
  React.createElement(SelectIModel, { selectedIModelId: selectedIModelId, setSelectedIModelId: setSelectediModelId }),
87
- React.createElement(Table, { data: isLoading ? [] : mappings, columns: mappingsColumns, className: "add-mappings-table", emptyTableContent: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:NoMappingsAvailable"), isSortable: true, isSelectable: true, isLoading: isLoading, isRowDisabled: (rowData) => existingMappings.some((v) => v.mappingId === rowData.id), onSelect: (selectData) => {
87
+ React.createElement(Table, { data: isLoading ? [] : mappings, columns: mappingsColumns, className: "rcw-add-mappings-table", emptyTableContent: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:NoMappingsAvailable"), isSortable: true, isSelectable: true, isLoading: isLoading, isRowDisabled: (rowData) => existingMappings.some((v) => v.mappingId === rowData.id), onSelect: (selectData) => {
88
88
  selectData && setSelectedMappings(selectData);
89
89
  }, paginatorRenderer: LocalizedTablePaginator })),
90
90
  React.createElement(ActionPanel, { actionLabel: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Add"), onAction: onSave, onCancel: returnFn, isSavingDisabled: selectedMappings.length === 0, isLoading: isLoading })));
91
91
  };
92
- export default AddMappingsModal;
93
92
  //# sourceMappingURL=AddMappingsModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AddMappingsModal.js","sourceRoot":"","sources":["../../../../src/widget/components/AddMappingsModal.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 { Modal, Table, tableFilters } from \"@itwin/itwinui-react\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport type { Mapping } from \"@itwin/insights-client\";\nimport { MappingsClient, REPORTING_BASE_PATH, ReportsClient } from \"@itwin/insights-client\";\nimport ActionPanel from \"./ActionPanel\";\nimport \"./AddMappingsModal.scss\";\nimport { LocalizedTablePaginator } from \"./LocalizedTablePaginator\";\nimport type { ReportMappingAndMapping } from \"./ReportMappings\";\nimport type { ReportsApiConfig } from \"../context/ReportsApiConfigContext\";\nimport { useReportsApiConfig } from \"../context/ReportsApiConfigContext\";\nimport { SelectIModel } from \"./SelectIModel\";\nimport type { CreateTypeFromInterface } from \"./utils\";\nimport { generateUrl, handleError } from \"./utils\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\n\nexport type MappingType = CreateTypeFromInterface<Mapping>;\n\nconst fetchMappings = async (\n setMappings: React.Dispatch<React.SetStateAction<Mapping[]>>,\n iModelId: string,\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,\n apiContext: ReportsApiConfig\n) => {\n try {\n setIsLoading(true);\n const mappingsClientApi = new MappingsClient(\n generateUrl(REPORTING_BASE_PATH, apiContext.baseUrl)\n );\n const accessToken = await apiContext.getAccessToken();\n const mappings = await mappingsClientApi.getMappings(\n accessToken,\n iModelId\n );\n setMappings(mappings);\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n};\n\ninterface AddMappingsModalProps {\n reportId: string;\n existingMappings: ReportMappingAndMapping[];\n show: boolean;\n returnFn: () => Promise<void>;\n}\n\nconst AddMappingsModal = ({\n reportId,\n existingMappings,\n show,\n returnFn,\n}: AddMappingsModalProps) => {\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [selectedMappings, setSelectedMappings] = useState<Mapping[]>([]);\n const [selectedIModelId, setSelectediModelId] = useState<string>(\"\");\n const [mappings, setMappings] = useState<Mapping[]>([]);\n const apiConfig = useReportsApiConfig();\n\n useEffect(() => {\n if (selectedIModelId) {\n void fetchMappings(\n setMappings,\n selectedIModelId,\n setIsLoading,\n apiConfig\n );\n }\n }, [apiConfig, selectedIModelId, setIsLoading]);\n\n const mappingsColumns = useMemo(\n () => [\n {\n Header: \"Table\",\n columns: [\n {\n id: \"mappingName\",\n Header: ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:MappingName\"\n ),\n accessor: \"mappingName\",\n Filter: tableFilters.TextFilter(),\n },\n {\n id: \"description\",\n Header: ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Description\"\n ),\n accessor: \"description\",\n Filter: tableFilters.TextFilter(),\n },\n ],\n },\n ],\n []\n );\n\n const onSave = async () => {\n try {\n if (!selectedIModelId) return;\n setIsLoading(true);\n const reportsClientApi = new ReportsClient(\n generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl)\n );\n const accessToken = await apiConfig.getAccessToken();\n for (const mapping of selectedMappings) {\n await reportsClientApi.createReportMapping(accessToken, reportId, {\n imodelId: selectedIModelId,\n mappingId: mapping.id,\n });\n }\n\n await returnFn();\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Modal\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:AddMappings\"\n )}\n isOpen={show}\n isDismissible={!isLoading}\n onClose={async () => {\n await returnFn();\n }}\n style={{ display: \"flex\", flexDirection: \"column\", maxHeight: \"77vh\" }}\n >\n <div className=\"add-mappings-container\">\n <SelectIModel\n selectedIModelId={selectedIModelId}\n setSelectedIModelId={setSelectediModelId}\n />\n <Table<MappingType>\n data={isLoading ? [] : mappings}\n columns={mappingsColumns}\n className=\"add-mappings-table\"\n emptyTableContent={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:NoMappingsAvailable\"\n )}\n isSortable\n isSelectable\n isLoading={isLoading}\n isRowDisabled={(rowData) =>\n existingMappings.some((v) => v.mappingId === rowData.id)\n }\n onSelect={(selectData: Mapping[] | undefined) => {\n selectData && setSelectedMappings(selectData);\n }}\n paginatorRenderer={LocalizedTablePaginator}\n />\n </div>\n <ActionPanel\n actionLabel={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Add\"\n )}\n onAction={onSave}\n onCancel={returnFn}\n isSavingDisabled={selectedMappings.length === 0}\n isLoading={isLoading}\n />\n </Modal>\n );\n};\n\nexport default AddMappingsModal;\n"]}
1
+ {"version":3,"file":"AddMappingsModal.js","sourceRoot":"","sources":["../../../../src/widget/components/AddMappingsModal.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 { Modal, Table, tableFilters } from \"@itwin/itwinui-react\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport type { Mapping } from \"@itwin/insights-client\";\nimport { MappingsClient, REPORTING_BASE_PATH, ReportsClient } from \"@itwin/insights-client\";\nimport ActionPanel from \"./ActionPanel\";\nimport \"./AddMappingsModal.scss\";\nimport { LocalizedTablePaginator } from \"./LocalizedTablePaginator\";\nimport type { ReportMappingAndMapping } from \"./ReportMappings\";\nimport type { ReportsApiConfig } from \"../context/ReportsApiConfigContext\";\nimport { useReportsApiConfig } from \"../context/ReportsApiConfigContext\";\nimport { SelectIModel } from \"./SelectIModel\";\nimport type { CreateTypeFromInterface } from \"./utils\";\nimport { generateUrl, handleError } from \"./utils\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\n\nexport type MappingType = CreateTypeFromInterface<Mapping>;\n\nconst fetchMappings = async (\n setMappings: React.Dispatch<React.SetStateAction<Mapping[]>>,\n iModelId: string,\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,\n apiContext: ReportsApiConfig\n) => {\n try {\n setIsLoading(true);\n const mappingsClientApi = new MappingsClient(\n generateUrl(REPORTING_BASE_PATH, apiContext.baseUrl)\n );\n const accessToken = await apiContext.getAccessToken();\n const mappings = await mappingsClientApi.getMappings(\n accessToken,\n iModelId\n );\n setMappings(mappings);\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n};\n\ninterface AddMappingsModalProps {\n reportId: string;\n existingMappings: ReportMappingAndMapping[];\n show: boolean;\n returnFn: () => Promise<void>;\n}\n\nexport const AddMappingsModal = ({\n reportId,\n existingMappings,\n show,\n returnFn,\n}: AddMappingsModalProps) => {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [selectedMappings, setSelectedMappings] = useState<Mapping[]>([]);\n const [selectedIModelId, setSelectediModelId] = useState<string>(\"\");\n const [mappings, setMappings] = useState<Mapping[]>([]);\n const apiConfig = useReportsApiConfig();\n\n useEffect(() => {\n if (selectedIModelId) {\n void fetchMappings(\n setMappings,\n selectedIModelId,\n setIsLoading,\n apiConfig\n );\n }\n }, [apiConfig, selectedIModelId, setIsLoading]);\n\n const mappingsColumns = useMemo(\n () => [\n {\n Header: \"Table\",\n columns: [\n {\n id: \"mappingName\",\n Header: ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:MappingName\"\n ),\n accessor: \"mappingName\",\n Filter: tableFilters.TextFilter(),\n },\n {\n id: \"description\",\n Header: ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Description\"\n ),\n accessor: \"description\",\n Filter: tableFilters.TextFilter(),\n },\n ],\n },\n ],\n []\n );\n\n const onSave = async () => {\n try {\n if (!selectedIModelId) return;\n setIsLoading(true);\n const reportsClientApi = new ReportsClient(\n generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl)\n );\n const accessToken = await apiConfig.getAccessToken();\n for (const mapping of selectedMappings) {\n await reportsClientApi.createReportMapping(accessToken, reportId, {\n imodelId: selectedIModelId,\n mappingId: mapping.id,\n });\n }\n\n await returnFn();\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Modal\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:AddMappings\"\n )}\n isOpen={show}\n isDismissible={!isLoading}\n onClose={async () => {\n await returnFn();\n }}\n style={{ display: \"flex\", flexDirection: \"column\", maxHeight: \"77vh\" }}\n >\n <div className=\"rcw-add-mappings-container\">\n <SelectIModel\n selectedIModelId={selectedIModelId}\n setSelectedIModelId={setSelectediModelId}\n />\n <Table<MappingType>\n data={isLoading ? [] : mappings}\n columns={mappingsColumns}\n className=\"rcw-add-mappings-table\"\n emptyTableContent={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:NoMappingsAvailable\"\n )}\n isSortable\n isSelectable\n isLoading={isLoading}\n isRowDisabled={(rowData) =>\n existingMappings.some((v) => v.mappingId === rowData.id)\n }\n onSelect={(selectData: Mapping[] | undefined) => {\n selectData && setSelectedMappings(selectData);\n }}\n paginatorRenderer={LocalizedTablePaginator}\n />\n </div>\n <ActionPanel\n actionLabel={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Add\"\n )}\n onAction={onSave}\n onCancel={returnFn}\n isSavingDisabled={selectedMappings.length === 0}\n isLoading={isLoading}\n />\n </Modal>\n );\n};\n"]}
@@ -4,15 +4,16 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  @import "~@itwin/itwinui-css/scss/variables";
6
6
 
7
- .add-mappings-container {
7
+ .rcw-add-mappings-container {
8
8
  display: flex;
9
9
  flex-direction: column;
10
10
  gap: $iui-baseline;
11
11
  width: 45vw;
12
12
  min-width: 100%;
13
13
  overflow: auto;
14
- .add-mappings-table {
14
+
15
+ .rcw-add-mappings-table {
15
16
  flex-grow: 1;
16
17
  overflow: auto;
17
18
  }
18
- }
19
+ }
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import type { ReportMapping } from "@itwin/insights-client";
2
3
  import type { ReportsApiConfig } from "../context/ReportsApiConfigContext";
3
4
  import { ExtractionStates } from "./ExtractionStatus";
@@ -7,22 +8,30 @@ export declare type ReportMappingAndMapping = ReportMapping & {
7
8
  iModelName: string;
8
9
  };
9
10
  export default class BulkExtractor {
10
- private _reportRunIds;
11
11
  private _reportsClientApi;
12
12
  private _extractionClientApi;
13
13
  private _accessToken;
14
- private _reportStates;
14
+ private _reportIModels;
15
+ private _iModelStates;
15
16
  private _timeFetched;
16
- private _reportIds;
17
- constructor(apiConfig: ReportsApiConfig, reportIds: string[]);
18
- private getStates;
17
+ private _iModelRun;
18
+ private _iModelToast;
19
+ private _successfulExtractionToast;
20
+ private _failedExtractionToast;
21
+ private _setJobRunning;
22
+ private _iModels;
23
+ constructor(apiConfig: ReportsApiConfig, successfulExtractionToast: (iModelName: string, odataFeedUrl: string) => void, failedExtractionToast: (iModelName: string) => void);
19
24
  private fetchStates;
20
- getState(reportId: string): ExtractionStates;
21
- clearJob(reportId: string): void;
25
+ getReportState(reportId: string): Promise<ExtractionStates>;
26
+ getIModelState(iModelId: string, iModelName: string, odataFeedUrl: string): Promise<ExtractionStates>;
22
27
  private static getFinalState;
23
- private getSingleState;
24
- startJobs(reportIds: string[]): Promise<void>;
28
+ private getState;
29
+ private checkRunning;
30
+ runReportExtractions(reportIds: string[]): Promise<void>;
25
31
  private runExtraction;
32
+ runIModelExtraction(iModelId: string): Promise<void>;
33
+ setHook(setJobRunning: React.Dispatch<React.SetStateAction<boolean>>, iModels: string[]): void;
34
+ runIModelExtractions(iModels: string[]): Promise<void>;
26
35
  private fetchReportIModels;
27
36
  }
28
37
  //# sourceMappingURL=BulkExtractor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BulkExtractor.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/BulkExtractor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,oBAAY,uBAAuB,GAAG,aAAa,GAAG;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,oBAAoB,CAAmB;IAC/C,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,UAAU,CAAW;gBAEjB,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE;YAQ9C,SAAS;YA4BT,WAAW;IAIlB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IAW5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIvC,OAAO,CAAC,MAAM,CAAC,aAAa;YAgBd,cAAc;IAUf,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YA4B5C,aAAa;YAab,kBAAkB;CAOjC"}
1
+ {"version":3,"file":"BulkExtractor.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/BulkExtractor.ts"],"names":[],"mappings":";AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,oBAAY,uBAAuB,GAAG,aAAa,GAAG;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,oBAAoB,CAAmB;IAC/C,OAAO,CAAC,YAAY,CAAwB;IAE5C,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,0BAA0B,CAAqD;IACvF,OAAO,CAAC,sBAAsB,CAA+B;IAC7D,OAAO,CAAC,cAAc,CAA4D;IAClF,OAAO,CAAC,QAAQ,CAAgB;gBAG9B,SAAS,EAAE,gBAAgB,EAC3B,yBAAyB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,EAC7E,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI;YAUvC,WAAW;IAUZ,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiB3D,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsBlH,OAAO,CAAC,MAAM,CAAC,aAAa;YAgBd,QAAQ;IAWtB,OAAO,CAAC,YAAY;IAcP,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAcvD,aAAa;IAcd,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAMxF,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAWrD,kBAAkB;CAOjC"}
@@ -7,57 +7,67 @@ import { generateUrl, handleError } from "./utils";
7
7
  import { ExtractionStates } from "./ExtractionStatus";
8
8
  import { STATUS_CHECK_INTERVAL } from "./Constants";
9
9
  export default class BulkExtractor {
10
- constructor(apiConfig, reportIds) {
11
- this._reportRunIds = new Map();
12
- this._reportStates = new Map();
10
+ constructor(apiConfig, successfulExtractionToast, failedExtractionToast) {
11
+ this._reportIModels = new Map(); // key: reportId, value: iModels
12
+ this._iModelStates = new Map(); // key: iModelId, value: state
13
13
  this._timeFetched = new Date();
14
+ this._iModelRun = new Map(); // key: iModelId, value: runId
15
+ this._iModelToast = new Set();
16
+ this._iModels = [];
14
17
  const url = generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl);
15
18
  this._reportsClientApi = new ReportsClient(url);
16
19
  this._extractionClientApi = new ExtractionClient(url);
17
20
  this._accessToken = apiConfig.getAccessToken;
18
- this._reportIds = reportIds;
21
+ this._successfulExtractionToast = successfulExtractionToast;
22
+ this._failedExtractionToast = failedExtractionToast;
19
23
  }
20
- async getStates(reportIds) {
21
- const stateByReportId = new Map();
22
- const stateByRunId = new Map();
23
- for (const reportId of reportIds) {
24
- const runs = this._reportRunIds.get(reportId);
25
- if (!runs) {
26
- stateByReportId.set(reportId, ExtractionStates.None);
27
- continue;
28
- }
29
- const states = [];
30
- for (const runId of runs) {
31
- const state = stateByRunId.get(runId);
32
- if (state) {
33
- states.push(state);
34
- }
35
- else {
36
- const runState = await this.getSingleState(runId, await this._accessToken());
37
- states.push(runState);
38
- stateByRunId.set(runId, runState);
39
- }
24
+ async fetchStates() {
25
+ for (const [iModelId, runId] of this._iModelRun) {
26
+ const state = await this.getState(runId);
27
+ if (state === ExtractorState.Succeeded || state === ExtractorState.Failed) {
28
+ this._iModelRun.delete(iModelId);
40
29
  }
41
- const finalState = BulkExtractor.getFinalState(states);
42
- stateByReportId.set(reportId, finalState);
30
+ this._iModelStates.set(iModelId, state);
43
31
  }
44
- return stateByReportId;
45
- }
46
- async fetchStates() {
47
- this._reportStates = await this.getStates(this._reportIds);
48
32
  }
49
- getState(reportId) {
50
- var _a;
33
+ async getReportState(reportId) {
51
34
  if ((new Date().getTime() - this._timeFetched.getTime()) > STATUS_CHECK_INTERVAL) {
52
35
  this._timeFetched = new Date();
53
- this.fetchStates().catch((e) =>
54
- /* eslint-disable no-console */
55
- console.error(e));
36
+ await this.fetchStates();
37
+ }
38
+ const iModels = this._reportIModels.get(reportId);
39
+ if (!iModels)
40
+ return ExtractionStates.None;
41
+ const states = [];
42
+ for (const iModelId of iModels) {
43
+ const state = this._iModelStates.get(iModelId);
44
+ if (!state)
45
+ continue;
46
+ states.push(state);
56
47
  }
57
- return (_a = this._reportStates.get(reportId)) !== null && _a !== void 0 ? _a : ExtractionStates.None;
48
+ return BulkExtractor.getFinalState(states);
58
49
  }
59
- clearJob(reportId) {
60
- this._reportRunIds.delete(reportId);
50
+ async getIModelState(iModelId, iModelName, odataFeedUrl) {
51
+ if ((new Date().getTime() - this._timeFetched.getTime()) > STATUS_CHECK_INTERVAL) {
52
+ this._timeFetched = new Date();
53
+ await this.fetchStates();
54
+ }
55
+ const state = this._iModelStates.get(iModelId);
56
+ if (!state)
57
+ return ExtractionStates.None;
58
+ if (!this._iModelToast.has(iModelId)) {
59
+ if (state === ExtractorState.Succeeded) {
60
+ this._successfulExtractionToast(iModelName, odataFeedUrl);
61
+ this._iModelToast.add(iModelId);
62
+ this.checkRunning();
63
+ }
64
+ else if (state === ExtractorState.Failed) {
65
+ this._failedExtractionToast(iModelName);
66
+ this._iModelToast.add(iModelId);
67
+ this.checkRunning();
68
+ }
69
+ }
70
+ return BulkExtractor.getFinalState([state]);
61
71
  }
62
72
  static getFinalState(states) {
63
73
  if (states.includes(ExtractorState.Failed))
@@ -70,8 +80,9 @@ export default class BulkExtractor {
70
80
  return ExtractionStates.Succeeded;
71
81
  return ExtractionStates.Failed;
72
82
  }
73
- async getSingleState(runId, accessToken) {
83
+ async getState(runId) {
74
84
  try {
85
+ const accessToken = await this._accessToken();
75
86
  const response = await this._extractionClientApi.getExtractionStatus(accessToken, runId);
76
87
  return response.state;
77
88
  }
@@ -80,34 +91,34 @@ export default class BulkExtractor {
80
91
  }
81
92
  return ExtractorState.Failed;
82
93
  }
83
- async startJobs(reportIds) {
94
+ checkRunning() {
95
+ if (this._setJobRunning) {
96
+ let allFinished = true;
97
+ this._iModels.forEach((iModelId) => {
98
+ const state = this._iModelStates.get(iModelId);
99
+ if (state === ExtractorState.Queued || state === ExtractorState.Running) {
100
+ allFinished = false;
101
+ }
102
+ });
103
+ this._setJobRunning(!allFinished);
104
+ }
105
+ }
106
+ async runReportExtractions(reportIds) {
84
107
  const reportIModelIds = new Map();
85
108
  for (const reportId of reportIds) {
86
109
  const reportIModels = await this.fetchReportIModels(reportId);
87
110
  reportIModelIds.set(reportId, reportIModels);
88
- this._reportStates.set(reportId, ExtractionStates.Starting);
111
+ this._reportIModels.set(reportId, reportIModels);
89
112
  }
90
113
  const iModels = new Set(Array.from(reportIModelIds.values()).flat());
91
- const extractionMapPromise = Array.from(iModels).map(async (iModel) => {
92
- const run = await this.runExtraction(iModel);
93
- return [iModel, run];
94
- });
95
- const extractionMap = await Promise.all(extractionMapPromise);
96
- const extractionByIModel = new Map(extractionMap);
97
- reportIds.forEach((reportId) => {
98
- const reportIModels = reportIModelIds.get(reportId);
99
- const runs = [];
100
- reportIModels.forEach((iModelId) => {
101
- const runId = extractionByIModel.get(iModelId);
102
- if (runId)
103
- runs.push(runId);
104
- });
105
- this._reportRunIds.set(reportId, runs);
106
- });
114
+ for (const iModel of iModels) {
115
+ await this.runIModelExtractions([iModel]);
116
+ }
107
117
  }
108
118
  async runExtraction(iModelId) {
109
119
  try {
110
120
  const response = await this._extractionClientApi.runExtraction(await this._accessToken(), iModelId);
121
+ this._iModelToast.delete(iModelId);
111
122
  return response.id;
112
123
  }
113
124
  catch (error) {
@@ -115,6 +126,24 @@ export default class BulkExtractor {
115
126
  }
116
127
  return undefined;
117
128
  }
129
+ async runIModelExtraction(iModelId) {
130
+ return this.runIModelExtractions([iModelId]);
131
+ }
132
+ setHook(setJobRunning, iModels) {
133
+ this._setJobRunning = setJobRunning;
134
+ this._iModels = iModels;
135
+ this.checkRunning();
136
+ }
137
+ async runIModelExtractions(iModels) {
138
+ for (const iModelId of iModels) {
139
+ const run = await this.runExtraction(iModelId);
140
+ if (run) {
141
+ this._iModelStates.set(iModelId, ExtractorState.Queued);
142
+ this._iModelRun.set(iModelId, run);
143
+ }
144
+ this.checkRunning();
145
+ }
146
+ }
118
147
  async fetchReportIModels(reportId) {
119
148
  const reportMappings = await this._reportsClientApi.getReportMappings(await this._accessToken(), reportId);
120
149
  return reportMappings.map((x) => x.imodelId);
@@ -1 +1 @@
1
- {"version":3,"file":"BulkExtractor.js","sourceRoot":"","sources":["../../../../src/widget/components/BulkExtractor.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 { ExtractionClient, ExtractorState, REPORTING_BASE_PATH, ReportsClient } from \"@itwin/insights-client\";\nimport type { ReportMapping } from \"@itwin/insights-client\";\nimport { generateUrl, handleError } from \"./utils\";\nimport type { ReportsApiConfig } from \"../context/ReportsApiConfigContext\";\nimport { ExtractionStates } from \"./ExtractionStatus\";\nimport { STATUS_CHECK_INTERVAL } from \"./Constants\";\n\nexport type ReportMappingAndMapping = ReportMapping & {\n mappingName: string;\n mappingDescription: string;\n iModelName: string;\n};\n\nexport default class BulkExtractor {\n private _reportRunIds = new Map<string, string[]>();\n private _reportsClientApi: ReportsClient;\n private _extractionClientApi: ExtractionClient;\n private _accessToken: () => Promise<string>;\n private _reportStates = new Map<string, ExtractionStates>();\n private _timeFetched = new Date();\n private _reportIds: string[];\n\n constructor(apiConfig: ReportsApiConfig, reportIds: string[]) {\n const url = generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl);\n this._reportsClientApi = new ReportsClient(url);\n this._extractionClientApi = new ExtractionClient(url);\n this._accessToken = apiConfig.getAccessToken;\n this._reportIds = reportIds;\n }\n\n private async getStates(reportIds: string[]): Promise<Map<string, ExtractionStates>> {\n const stateByReportId = new Map<string, ExtractionStates>();\n const stateByRunId = new Map<string, ExtractorState>();\n\n for (const reportId of reportIds) {\n const runs = this._reportRunIds.get(reportId);\n if (!runs) {\n stateByReportId.set(reportId, ExtractionStates.None);\n continue;\n }\n\n const states: ExtractorState[] = [];\n for (const runId of runs) {\n const state = stateByRunId.get(runId);\n if (state) {\n states.push(state);\n } else {\n const runState = await this.getSingleState(runId, await this._accessToken());\n states.push(runState);\n stateByRunId.set(runId, runState);\n }\n }\n const finalState = BulkExtractor.getFinalState(states);\n stateByReportId.set(reportId, finalState);\n }\n return stateByReportId;\n }\n\n private async fetchStates(): Promise<void> {\n this._reportStates = await this.getStates(this._reportIds);\n }\n\n public getState(reportId: string): ExtractionStates {\n if ((new Date().getTime() - this._timeFetched.getTime()) > STATUS_CHECK_INTERVAL) {\n this._timeFetched = new Date();\n this.fetchStates().catch((e) =>\n /* eslint-disable no-console */\n console.error(e)\n );\n }\n return this._reportStates.get(reportId) ?? ExtractionStates.None;\n }\n\n public clearJob(reportId: string): void {\n this._reportRunIds.delete(reportId);\n }\n\n private static getFinalState(states: ExtractorState[]): ExtractionStates {\n if (states.includes(ExtractorState.Failed))\n return ExtractionStates.Failed;\n\n if (states.includes(ExtractorState.Queued))\n return ExtractionStates.Queued;\n\n if (states.includes(ExtractorState.Running))\n return ExtractionStates.Running;\n\n if (states.includes(ExtractorState.Succeeded))\n return ExtractionStates.Succeeded;\n\n return ExtractionStates.Failed;\n }\n\n private async getSingleState(runId: string, accessToken: string): Promise<ExtractorState> {\n try {\n const response = await this._extractionClientApi.getExtractionStatus(accessToken, runId);\n return response.state;\n } catch (error: any) {\n handleError(error.status);\n }\n return ExtractorState.Failed;\n }\n\n public async startJobs(reportIds: string[]): Promise<void> {\n const reportIModelIds = new Map<string, string[]>();\n for (const reportId of reportIds) {\n const reportIModels = await this.fetchReportIModels(reportId);\n reportIModelIds.set(reportId, reportIModels);\n this._reportStates.set(reportId, ExtractionStates.Starting);\n }\n const iModels = new Set(Array.from(reportIModelIds.values()).flat());\n const extractionMapPromise =\n Array.from(iModels).map(async (iModel): Promise<[string, string | undefined]> => {\n const run = await this.runExtraction(iModel);\n return [iModel, run];\n });\n\n const extractionMap = await Promise.all(extractionMapPromise);\n const extractionByIModel = new Map<string, string | undefined>(extractionMap);\n reportIds.forEach((reportId) => {\n const reportIModels = reportIModelIds.get(reportId)!;\n const runs: string[] = [];\n reportIModels.forEach((iModelId) => {\n const runId = extractionByIModel.get(iModelId);\n if (runId)\n runs.push(runId);\n });\n this._reportRunIds.set(reportId, runs);\n });\n }\n\n private async runExtraction(iModelId: string): Promise<string | undefined> {\n try {\n const response = await this._extractionClientApi.runExtraction(\n await this._accessToken(),\n iModelId\n );\n return response.id;\n } catch (error: any) {\n handleError(error.status);\n }\n return undefined;\n }\n\n private async fetchReportIModels(reportId: string): Promise<string[]> {\n const reportMappings = await this._reportsClientApi.getReportMappings(\n await this._accessToken(),\n reportId\n );\n return reportMappings.map((x) => x.imodelId);\n }\n}\n"]}
1
+ {"version":3,"file":"BulkExtractor.js","sourceRoot":"","sources":["../../../../src/widget/components/BulkExtractor.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 { ExtractionClient, ExtractorState, REPORTING_BASE_PATH, ReportsClient } from \"@itwin/insights-client\";\nimport type { ReportMapping } from \"@itwin/insights-client\";\nimport { generateUrl, handleError } from \"./utils\";\nimport type { ReportsApiConfig } from \"../context/ReportsApiConfigContext\";\nimport { ExtractionStates } from \"./ExtractionStatus\";\nimport { STATUS_CHECK_INTERVAL } from \"./Constants\";\n\nexport type ReportMappingAndMapping = ReportMapping & {\n mappingName: string;\n mappingDescription: string;\n iModelName: string;\n};\n\nexport default class BulkExtractor {\n private _reportsClientApi: ReportsClient;\n private _extractionClientApi: ExtractionClient;\n private _accessToken: () => Promise<string>;\n\n private _reportIModels = new Map<string, string[]>(); // key: reportId, value: iModels\n private _iModelStates = new Map<string, ExtractorState>(); // key: iModelId, value: state\n private _timeFetched = new Date();\n private _iModelRun = new Map<string, string>(); // key: iModelId, value: runId\n private _iModelToast = new Set<string>();\n private _successfulExtractionToast: (iModelName: string, odataFeedUrl: string) => void;\n private _failedExtractionToast: (iModelName: string) => void;\n private _setJobRunning: React.Dispatch<React.SetStateAction<boolean>> | undefined;\n private _iModels: string[] = [];\n\n constructor(\n apiConfig: ReportsApiConfig,\n successfulExtractionToast: (iModelName: string, odataFeedUrl: string) => void,\n failedExtractionToast: (iModelName: string) => void,\n ) {\n const url = generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl);\n this._reportsClientApi = new ReportsClient(url);\n this._extractionClientApi = new ExtractionClient(url);\n this._accessToken = apiConfig.getAccessToken;\n this._successfulExtractionToast = successfulExtractionToast;\n this._failedExtractionToast = failedExtractionToast;\n }\n\n private async fetchStates(): Promise<void> {\n for (const [iModelId, runId] of this._iModelRun) {\n const state = await this.getState(runId);\n if (state === ExtractorState.Succeeded || state === ExtractorState.Failed) {\n this._iModelRun.delete(iModelId);\n }\n this._iModelStates.set(iModelId, state);\n }\n }\n\n public async getReportState(reportId: string): Promise<ExtractionStates> {\n if ((new Date().getTime() - this._timeFetched.getTime()) > STATUS_CHECK_INTERVAL) {\n this._timeFetched = new Date();\n await this.fetchStates();\n }\n\n const iModels = this._reportIModels.get(reportId);\n if (!iModels) return ExtractionStates.None;\n const states: ExtractorState[] = [];\n for (const iModelId of iModels) {\n const state = this._iModelStates.get(iModelId);\n if (!state) continue;\n states.push(state);\n }\n return BulkExtractor.getFinalState(states);\n }\n\n public async getIModelState(iModelId: string, iModelName: string, odataFeedUrl: string): Promise<ExtractionStates> {\n if ((new Date().getTime() - this._timeFetched.getTime()) > STATUS_CHECK_INTERVAL) {\n this._timeFetched = new Date();\n await this.fetchStates();\n }\n\n const state = this._iModelStates.get(iModelId);\n if (!state) return ExtractionStates.None;\n if (!this._iModelToast.has(iModelId)) {\n if (state === ExtractorState.Succeeded) {\n this._successfulExtractionToast(iModelName, odataFeedUrl);\n this._iModelToast.add(iModelId);\n this.checkRunning();\n } else if (state === ExtractorState.Failed) {\n this._failedExtractionToast(iModelName);\n this._iModelToast.add(iModelId);\n this.checkRunning();\n }\n }\n return BulkExtractor.getFinalState([state]);\n }\n\n private static getFinalState(states: ExtractorState[]): ExtractionStates {\n if (states.includes(ExtractorState.Failed))\n return ExtractionStates.Failed;\n\n if (states.includes(ExtractorState.Queued))\n return ExtractionStates.Queued;\n\n if (states.includes(ExtractorState.Running))\n return ExtractionStates.Running;\n\n if (states.includes(ExtractorState.Succeeded))\n return ExtractionStates.Succeeded;\n\n return ExtractionStates.Failed;\n }\n\n private async getState(runId: string): Promise<ExtractorState> {\n try {\n const accessToken = await this._accessToken();\n const response = await this._extractionClientApi.getExtractionStatus(accessToken, runId);\n return response.state;\n } catch (error: any) {\n handleError(error.status);\n }\n return ExtractorState.Failed;\n }\n\n private checkRunning(): void {\n if (this._setJobRunning) {\n let allFinished = true;\n this._iModels.forEach((iModelId) => {\n const state = this._iModelStates.get(iModelId);\n if (state === ExtractorState.Queued || state === ExtractorState.Running) {\n allFinished = false;\n }\n });\n\n this._setJobRunning(!allFinished);\n }\n }\n\n public async runReportExtractions(reportIds: string[]): Promise<void> {\n const reportIModelIds = new Map<string, string[]>();\n for (const reportId of reportIds) {\n const reportIModels = await this.fetchReportIModels(reportId);\n reportIModelIds.set(reportId, reportIModels);\n this._reportIModels.set(reportId, reportIModels);\n }\n const iModels = new Set(Array.from(reportIModelIds.values()).flat());\n\n for (const iModel of iModels) {\n await this.runIModelExtractions([iModel]);\n }\n }\n\n private async runExtraction(iModelId: string): Promise<string | undefined> {\n try {\n const response = await this._extractionClientApi.runExtraction(\n await this._accessToken(),\n iModelId\n );\n this._iModelToast.delete(iModelId);\n return response.id;\n } catch (error: any) {\n handleError(error.status);\n }\n return undefined;\n }\n\n public async runIModelExtraction(iModelId: string): Promise<void> {\n return this.runIModelExtractions([iModelId]);\n }\n\n public setHook(setJobRunning: React.Dispatch<React.SetStateAction<boolean>>, iModels: string[]): void {\n this._setJobRunning = setJobRunning;\n this._iModels = iModels;\n this.checkRunning();\n }\n\n public async runIModelExtractions(iModels: string[]): Promise<void> {\n for (const iModelId of iModels) {\n const run = await this.runExtraction(iModelId);\n if (run) {\n this._iModelStates.set(iModelId, ExtractorState.Queued);\n this._iModelRun.set(iModelId, run);\n }\n this.checkRunning();\n }\n }\n\n private async fetchReportIModels(reportId: string): Promise<string[]> {\n const reportMappings = await this._reportsClientApi.getReportMappings(\n await this._accessToken(),\n reportId\n );\n return reportMappings.map((x) => x.imodelId);\n }\n}\n"]}
@@ -27,7 +27,7 @@ export const DeleteModal = ({ entityName, show, setShow, onDelete, refresh, }) =
27
27
  setShow(false);
28
28
  } },
29
29
  React.createElement(ModalContent, null,
30
- React.createElement("div", { className: "delete-modal-body-text" },
30
+ React.createElement("div", { className: "rcw-delete-modal-body-text" },
31
31
  React.createElement(Leading, null, ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:AreYouSureYouWantToDelete")),
32
32
  React.createElement("strong", null, React.createElement(MiddleTextTruncation, { text: `${entityName}?` })))),
33
33
  React.createElement(ModalButtonBar, null,
@@ -1 +1 @@
1
- {"version":3,"file":"DeleteModal.js","sourceRoot":"","sources":["../../../../src/widget/components/DeleteModal.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EACL,MAAM,EACN,OAAO,EACP,oBAAoB,EACpB,KAAK,EACL,cAAc,EACd,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAUtD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,UAAU,EACV,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,OAAO,GACU,EAAE,EAAE;IACrB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAE3D,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAChC,IAAI;YACF,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM,QAAQ,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,MAAM,OAAO,EAAE,CAAC;SACjB;QAAC,OAAO,KAAU,EAAE;YACnB,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC3B;gBAAS;YACR,YAAY,CAAC,KAAK,CAAC,CAAC;SACrB;IACH,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,KAAK,IACJ,KAAK,EAAE,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CACxD,6BAA6B,CAC9B,EACD,MAAM,EAAE,IAAI,EACZ,aAAa,EAAE,CAAC,SAAS,EACzB,OAAO,EAAE,GAAG,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;QAED,oBAAC,YAAY;YACX,6BAAK,SAAS,EAAC,wBAAwB;gBACrC,oBAAC,OAAO,QACL,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,+CAA+C,CAChD,CACO;gBACV,oCAAS,oBAAC,oBAAoB,IAAC,IAAI,EAAE,GAAG,UAAU,GAAG,GAAI,CAAU,CAC/D,CACO;QACf,oBAAC,cAAc;YACZ,SAAS,IAAI,CACZ,6BAAK,SAAS,EAAC,oBAAoB,iBAAa,oBAAoB;gBAClE,oBAAC,cAAc,OAAG,CACd,CACP;YACD,oBAAC,MAAM,IACL,SAAS,EAAC,iBAAiB,EAC3B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,SAAS,IAElB,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,4BAA4B,CAC7B,CACM;YACT,oBAAC,MAAM,IACL,SAAS,EAAC,SAAS,EACnB,OAAO,EAAE,GAAG,EAAE;oBACZ,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC,EACD,QAAQ,EAAE,SAAS,IAElB,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,4BAA4B,CAC7B,CACM,CACM,CACX,CACT,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,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 {\n Button,\n Leading,\n MiddleTextTruncation,\n Modal,\n ModalButtonBar,\n ModalContent,\n} from \"@itwin/itwinui-react\";\nimport React, { useState } from \"react\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\nimport \"./DeleteModal.scss\";\nimport { handleError, LoadingSpinner } from \"./utils\";\n\nexport interface DeleteModalProps {\n entityName: string;\n show: boolean;\n setShow: React.Dispatch<React.SetStateAction<boolean>>;\n onDelete: () => Promise<void>;\n refresh: () => Promise<void>;\n}\n\nexport const DeleteModal = ({\n entityName,\n show,\n setShow,\n onDelete,\n refresh,\n}: DeleteModalProps) => {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n\n const deleteCallback = async () => {\n try {\n setIsLoading(true);\n await onDelete();\n setShow(false);\n await refresh();\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Modal\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Confirm\"\n )}\n isOpen={show}\n isDismissible={!isLoading}\n onClose={() => {\n setShow(false);\n }}\n >\n <ModalContent>\n <div className=\"delete-modal-body-text\">\n <Leading>\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:AreYouSureYouWantToDelete\"\n )}\n </Leading>\n <strong>{<MiddleTextTruncation text={`${entityName}?`} />}</strong>\n </div>\n </ModalContent>\n <ModalButtonBar>\n {isLoading && (\n <div className=\"rcw-loading-delete\" data-testid=\"rcw-loading-delete\">\n <LoadingSpinner />\n </div>\n )}\n <Button\n styleType=\"high-visibility\"\n onClick={deleteCallback}\n disabled={isLoading}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Delete\"\n )}\n </Button>\n <Button\n styleType=\"default\"\n onClick={() => {\n setShow(false);\n }}\n disabled={isLoading}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Cancel\"\n )}\n </Button>\n </ModalButtonBar>\n </Modal>\n );\n};\n\nexport default DeleteModal;\n"]}
1
+ {"version":3,"file":"DeleteModal.js","sourceRoot":"","sources":["../../../../src/widget/components/DeleteModal.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EACL,MAAM,EACN,OAAO,EACP,oBAAoB,EACpB,KAAK,EACL,cAAc,EACd,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAUtD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,UAAU,EACV,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,OAAO,GACU,EAAE,EAAE;IACrB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAE3D,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAChC,IAAI;YACF,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM,QAAQ,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,MAAM,OAAO,EAAE,CAAC;SACjB;QAAC,OAAO,KAAU,EAAE;YACnB,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC3B;gBAAS;YACR,YAAY,CAAC,KAAK,CAAC,CAAC;SACrB;IACH,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,KAAK,IACJ,KAAK,EAAE,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CACxD,6BAA6B,CAC9B,EACD,MAAM,EAAE,IAAI,EACZ,aAAa,EAAE,CAAC,SAAS,EACzB,OAAO,EAAE,GAAG,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;QAED,oBAAC,YAAY;YACX,6BAAK,SAAS,EAAC,4BAA4B;gBACzC,oBAAC,OAAO,QACL,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,+CAA+C,CAChD,CACO;gBACV,oCAAS,oBAAC,oBAAoB,IAAC,IAAI,EAAE,GAAG,UAAU,GAAG,GAAI,CAAU,CAC/D,CACO;QACf,oBAAC,cAAc;YACZ,SAAS,IAAI,CACZ,6BAAK,SAAS,EAAC,oBAAoB,iBAAa,oBAAoB;gBAClE,oBAAC,cAAc,OAAG,CACd,CACP;YACD,oBAAC,MAAM,IACL,SAAS,EAAC,iBAAiB,EAC3B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,SAAS,IAElB,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,4BAA4B,CAC7B,CACM;YACT,oBAAC,MAAM,IACL,SAAS,EAAC,SAAS,EACnB,OAAO,EAAE,GAAG,EAAE;oBACZ,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC,EACD,QAAQ,EAAE,SAAS,IAElB,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,4BAA4B,CAC7B,CACM,CACM,CACX,CACT,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,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 {\n Button,\n Leading,\n MiddleTextTruncation,\n Modal,\n ModalButtonBar,\n ModalContent,\n} from \"@itwin/itwinui-react\";\nimport React, { useState } from \"react\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\nimport \"./DeleteModal.scss\";\nimport { handleError, LoadingSpinner } from \"./utils\";\n\nexport interface DeleteModalProps {\n entityName: string;\n show: boolean;\n setShow: React.Dispatch<React.SetStateAction<boolean>>;\n onDelete: () => Promise<void>;\n refresh: () => Promise<void>;\n}\n\nexport const DeleteModal = ({\n entityName,\n show,\n setShow,\n onDelete,\n refresh,\n}: DeleteModalProps) => {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n\n const deleteCallback = async () => {\n try {\n setIsLoading(true);\n await onDelete();\n setShow(false);\n await refresh();\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Modal\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Confirm\"\n )}\n isOpen={show}\n isDismissible={!isLoading}\n onClose={() => {\n setShow(false);\n }}\n >\n <ModalContent>\n <div className=\"rcw-delete-modal-body-text\">\n <Leading>\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:AreYouSureYouWantToDelete\"\n )}\n </Leading>\n <strong>{<MiddleTextTruncation text={`${entityName}?`} />}</strong>\n </div>\n </ModalContent>\n <ModalButtonBar>\n {isLoading && (\n <div className=\"rcw-loading-delete\" data-testid=\"rcw-loading-delete\">\n <LoadingSpinner />\n </div>\n )}\n <Button\n styleType=\"high-visibility\"\n onClick={deleteCallback}\n disabled={isLoading}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Delete\"\n )}\n </Button>\n <Button\n styleType=\"default\"\n onClick={() => {\n setShow(false);\n }}\n disabled={isLoading}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Cancel\"\n )}\n </Button>\n </ModalButtonBar>\n </Modal>\n );\n};\n\nexport default DeleteModal;\n"]}
@@ -4,15 +4,16 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  @import "~@itwin/itwinui-css/scss/variables";
6
6
 
7
- .delete-modal-body-text {
7
+ .rcw-delete-modal-body-text {
8
8
  display: flex;
9
9
  gap: $iui-xs;
10
10
  flex-wrap: wrap;
11
- > strong {
11
+
12
+ >strong {
12
13
  min-width: 0px;
13
14
  }
14
15
  }
15
16
 
16
17
  .rcw-loading-delete {
17
18
  margin-right: $iui-s;
18
- }
19
+ }
@@ -5,6 +5,6 @@
5
5
  import React from "react";
6
6
  import { ProgressRadial } from "@itwin/itwinui-react";
7
7
  import { ReportsConfigWidget } from "../../../ReportsConfigWidget";
8
- export const RunningExtractionState = () => (React.createElement("div", { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Running"), className: "rcw-extraction-status" },
8
+ export const RunningExtractionState = () => (React.createElement("div", { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Running"), className: "rcw-extraction-status-running" },
9
9
  React.createElement(ProgressRadial, { size: "x-small", indeterminate: true })));
10
10
  //# sourceMappingURL=RunningExtractionState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RunningExtractionState.js","sourceRoot":"","sources":["../../../../../src/widget/components/ExtractionStates/RunningExtractionState.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAAC,CAC1C,6BACE,KAAK,EAAE,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CACxD,6BAA6B,CAC9B,EACD,SAAS,EAAC,uBAAuB;IAEjC,oBAAC,cAAc,IAAC,IAAI,EAAC,SAAS,EAAC,aAAa,SAAG,CAC3C,CACP,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 React from \"react\";\nimport { ProgressRadial } from \"@itwin/itwinui-react\";\nimport { ReportsConfigWidget } from \"../../../ReportsConfigWidget\";\n\nexport const RunningExtractionState = () => (\n <div\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Running\"\n )}\n className=\"rcw-extraction-status\"\n >\n <ProgressRadial size=\"x-small\" indeterminate />\n </div>\n);\n"]}
1
+ {"version":3,"file":"RunningExtractionState.js","sourceRoot":"","sources":["../../../../../src/widget/components/ExtractionStates/RunningExtractionState.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAAC,CAC1C,6BACE,KAAK,EAAE,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CACxD,6BAA6B,CAC9B,EACD,SAAS,EAAC,+BAA+B;IAEzC,oBAAC,cAAc,IAAC,IAAI,EAAC,SAAS,EAAC,aAAa,SAAG,CAC3C,CACP,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 React from \"react\";\nimport { ProgressRadial } from \"@itwin/itwinui-react\";\nimport { ReportsConfigWidget } from \"../../../ReportsConfigWidget\";\n\nexport const RunningExtractionState = () => (\n <div\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Running\"\n )}\n className=\"rcw-extraction-status-running\"\n >\n <ProgressRadial size=\"x-small\" indeterminate />\n </div>\n);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SucceededExtractionState.d.ts","sourceRoot":"","sources":["../../../../../src/widget/components/ExtractionStates/SucceededExtractionState.tsx"],"names":[],"mappings":";AASA,UAAU,oBAAoB;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,eAAO,MAAM,wBAAwB,kCAAmC,oBAAoB,gBAmB3F,CAAC"}
1
+ {"version":3,"file":"SucceededExtractionState.d.ts","sourceRoot":"","sources":["../../../../../src/widget/components/ExtractionStates/SucceededExtractionState.tsx"],"names":[],"mappings":";AASA,UAAU,oBAAoB;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,eAAO,MAAM,wBAAwB,kCAAmC,oBAAoB,gBAoB3F,CAAC"}
@@ -7,7 +7,7 @@ import { SvgStatusSuccess } from "@itwin/itwinui-icons-color-react";
7
7
  import { ReportsConfigWidget } from "../../../ReportsConfigWidget";
8
8
  import { ANIMATION_DELAY, ANIMATION_DURATION } from "../Constants";
9
9
  export const SucceededExtractionState = ({ animation, onAnimationEnd }) => (React.createElement("div", { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Success"), className: "rcw-extraction-status" },
10
- React.createElement("div", { className: `rcw-status-icon`, style: {
10
+ React.createElement("div", { className: `rcw-status-icon`, "data-testid": "rcw-success-animation", style: {
11
11
  animationName: animation ? "rcw-fade-out" : "",
12
12
  animationDelay: ANIMATION_DELAY,
13
13
  animationDuration: ANIMATION_DURATION,
@@ -1 +1 @@
1
- {"version":3,"file":"SucceededExtractionState.js","sourceRoot":"","sources":["../../../../../src/widget/components/ExtractionStates/SucceededExtractionState.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAOnE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAwB,EAAE,EAAE,CAAC,CAC/F,6BACE,KAAK,EAAE,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CACxD,6BAA6B,CAC9B,EACD,SAAS,EAAC,uBAAuB;IAEjC,6BACE,SAAS,EAAE,iBAAiB,EAC5B,KAAK,EAAE;YACL,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;YAC9C,cAAc,EAAE,eAAe;YAC/B,iBAAiB,EAAE,kBAAkB;SACtC,EACD,cAAc,EAAE,cAAc;QAE9B,oBAAC,gBAAgB,OAAG,CAChB,CACF,CACP,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 React from \"react\";\nimport { SvgStatusSuccess } from \"@itwin/itwinui-icons-color-react\";\nimport { ReportsConfigWidget } from \"../../../ReportsConfigWidget\";\nimport { ANIMATION_DELAY, ANIMATION_DURATION } from \"../Constants\";\n\ninterface ExtractionStateProps {\n animation: boolean;\n onAnimationEnd: () => void;\n}\n\nexport const SucceededExtractionState = ({ animation, onAnimationEnd }: ExtractionStateProps) => (\n <div\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Success\"\n )}\n className=\"rcw-extraction-status\"\n >\n <div\n className={`rcw-status-icon`}\n style={{\n animationName: animation ? \"rcw-fade-out\" : \"\",\n animationDelay: ANIMATION_DELAY,\n animationDuration: ANIMATION_DURATION,\n }}\n onAnimationEnd={onAnimationEnd}\n >\n <SvgStatusSuccess />\n </div>\n </div>\n);\n"]}
1
+ {"version":3,"file":"SucceededExtractionState.js","sourceRoot":"","sources":["../../../../../src/widget/components/ExtractionStates/SucceededExtractionState.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAOnE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAwB,EAAE,EAAE,CAAC,CAC/F,6BACE,KAAK,EAAE,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CACxD,6BAA6B,CAC9B,EACD,SAAS,EAAC,uBAAuB;IAEjC,6BACE,SAAS,EAAE,iBAAiB,iBAChB,uBAAuB,EACnC,KAAK,EAAE;YACL,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;YAC9C,cAAc,EAAE,eAAe;YAC/B,iBAAiB,EAAE,kBAAkB;SACtC,EACD,cAAc,EAAE,cAAc;QAE9B,oBAAC,gBAAgB,OAAG,CAChB,CACF,CACP,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 React from \"react\";\nimport { SvgStatusSuccess } from \"@itwin/itwinui-icons-color-react\";\nimport { ReportsConfigWidget } from \"../../../ReportsConfigWidget\";\nimport { ANIMATION_DELAY, ANIMATION_DURATION } from \"../Constants\";\n\ninterface ExtractionStateProps {\n animation: boolean;\n onAnimationEnd: () => void;\n}\n\nexport const SucceededExtractionState = ({ animation, onAnimationEnd }: ExtractionStateProps) => (\n <div\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Success\"\n )}\n className=\"rcw-extraction-status\"\n >\n <div\n className={`rcw-status-icon`}\n data-testid=\"rcw-success-animation\"\n style={{\n animationName: animation ? \"rcw-fade-out\" : \"\",\n animationDelay: ANIMATION_DELAY,\n animationDuration: ANIMATION_DURATION,\n }}\n onAnimationEnd={onAnimationEnd}\n >\n <SvgStatusSuccess />\n </div>\n </div>\n);\n"]}
@@ -6,10 +6,24 @@
6
6
 
7
7
  .rcw-extraction-status {
8
8
  align-items: center;
9
- margin: auto $iui-s * 2;
10
9
  height: 38px;
11
10
  display: flex;
12
11
 
12
+ .rcw-status-icon {
13
+ width: $iui-icons-default;
14
+ height: $iui-icons-default;
15
+ align-items: center;
16
+ margin: auto $iui-xs * 3;
17
+ display: flex;
18
+ }
19
+ }
20
+
21
+ .rcw-extraction-status-running {
22
+ align-items: center;
23
+ height: 38px;
24
+ display: flex;
25
+ margin: auto $iui-xs * 3;
26
+
13
27
  .rcw-status-icon {
14
28
  width: $iui-icons-default;
15
29
  height: $iui-icons-default;
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ interface SuccessfulExtractionToastProps extends ExtractionToastProps {
3
+ odataFeedUrl: string;
4
+ }
5
+ interface ExtractionToastProps {
6
+ iModelName: string;
7
+ }
8
+ export declare const SuccessfulExtractionToast: ({ iModelName, odataFeedUrl }: SuccessfulExtractionToastProps) => JSX.Element;
9
+ export declare const FailedExtractionToast: ({ iModelName }: ExtractionToastProps) => JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=ExtractionToast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtractionToast.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/ExtractionToast.tsx"],"names":[],"mappings":";AAQA,UAAU,8BAA+B,SAAQ,oBAAoB;IACnE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,oBAAoB;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,yBAAyB,iCAAkC,8BAA8B,gBAgBrG,CAAC;AAEF,eAAO,MAAM,qBAAqB,mBAAoB,oBAAoB,gBAMzE,CAAC"}