@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
@@ -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"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FailedExtractionToast = exports.SuccessfulExtractionToast = void 0;
7
+ /*---------------------------------------------------------------------------------------------
8
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
9
+ * See LICENSE.md in the project root for license terms and full copyright notice.
10
+ *--------------------------------------------------------------------------------------------*/
11
+ const react_1 = __importDefault(require("react"));
12
+ const itwinui_react_1 = require("@itwin/itwinui-react");
13
+ const ReportsConfigWidget_1 = require("../../ReportsConfigWidget");
14
+ const SuccessfulExtractionToast = ({ iModelName, odataFeedUrl }) => {
15
+ const onClick = async (e) => {
16
+ e.preventDefault();
17
+ await navigator.clipboard.writeText(odataFeedUrl);
18
+ };
19
+ return (react_1.default.createElement("div", null,
20
+ react_1.default.createElement(itwinui_react_1.Text, null,
21
+ ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:ExtractionSuccess"),
22
+ iModelName),
23
+ react_1.default.createElement("a", { href: "#", onClick: onClick }, ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:CopyODataUrl"))));
24
+ };
25
+ exports.SuccessfulExtractionToast = SuccessfulExtractionToast;
26
+ const FailedExtractionToast = ({ iModelName }) => {
27
+ return (react_1.default.createElement("div", null,
28
+ react_1.default.createElement(itwinui_react_1.Text, null,
29
+ ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:ExtractionFailed"),
30
+ iModelName)));
31
+ };
32
+ exports.FailedExtractionToast = FailedExtractionToast;
33
+ //# sourceMappingURL=ExtractionToast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtractionToast.js","sourceRoot":"","sources":["../../../../src/widget/components/ExtractionToast.tsx"],"names":[],"mappings":";;;;;;AAAA;;;+FAG+F;AAC/F,kDAA0B;AAC1B,wDAA4C;AAC5C,mEAAgE;AAUzD,MAAM,yBAAyB,GAAG,CAAC,EAAE,UAAU,EAAE,YAAY,EAAkC,EAAE,EAAE;IACxG,MAAM,OAAO,GAAG,KAAK,EAAE,CAAkD,EAAE,EAAE;QAC3E,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC,CAAC;IACF,OAAO,CACL;QACE,8BAAC,oBAAI;YAAE,yCAAmB,CAAC,YAAY,CAAC,kBAAkB,CAAC,uCAAuC,CAAC;YAAE,UAAU,CAAQ;QACvH,qCACE,IAAI,EAAC,GAAG,EACR,OAAO,EAAE,OAAO,IAEf,yCAAmB,CAAC,YAAY,CAAC,kBAAkB,CAAC,kCAAkC,CAAC,CACtF,CACA,CACP,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,yBAAyB,6BAgBpC;AAEK,MAAM,qBAAqB,GAAG,CAAC,EAAE,UAAU,EAAwB,EAAE,EAAE;IAC5E,OAAO,CACL;QACE,8BAAC,oBAAI;YAAE,yCAAmB,CAAC,YAAY,CAAC,kBAAkB,CAAC,sCAAsC,CAAC;YAAE,UAAU,CAAQ,CAClH,CACP,CAAC;AACJ,CAAC,CAAC;AANW,QAAA,qBAAqB,yBAMhC","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 { Text } from \"@itwin/itwinui-react\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\n\ninterface SuccessfulExtractionToastProps extends ExtractionToastProps {\n odataFeedUrl: string;\n}\n\ninterface ExtractionToastProps {\n iModelName: string;\n}\n\nexport const SuccessfulExtractionToast = ({ iModelName, odataFeedUrl }: SuccessfulExtractionToastProps) => {\n const onClick = async (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n e.preventDefault();\n await navigator.clipboard.writeText(odataFeedUrl);\n };\n return (\n <div>\n <Text>{ReportsConfigWidget.localization.getLocalizedString(\"ReportsConfigWidget:ExtractionSuccess\")}{iModelName}</Text>\n <a\n href=\"#\"\n onClick={onClick}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\"ReportsConfigWidget:CopyODataUrl\")}\n </a>\n </div>\n );\n};\n\nexport const FailedExtractionToast = ({ iModelName }: ExtractionToastProps) => {\n return (\n <div>\n <Text>{ReportsConfigWidget.localization.getLocalizedString(\"ReportsConfigWidget:ExtractionFailed\")}{iModelName}</Text>\n </div>\n );\n};\n"]}
@@ -36,8 +36,8 @@
36
36
  margin-left: 0;
37
37
  align-self: center;
38
38
  min-width: 36px;
39
- margin-right: $iui-xs;
40
39
  flex-shrink: 0;
40
+ display: flex;
41
41
  }
42
42
  }
43
43
 
@@ -1 +1 @@
1
- {"version":3,"file":"ReportAction.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/ReportAction.tsx"],"names":[],"mappings":";AAcA,OAAO,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAKrD,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,QAAA,MAAM,YAAY,kCAAmC,iBAAiB,gBAqHrE,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ReportAction.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/ReportAction.tsx"],"names":[],"mappings":";AAcA,OAAO,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAKrD,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,QAAA,MAAM,YAAY,kCAAmC,iBAAiB,gBAmHrE,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -79,9 +79,9 @@ const ReportAction = ({ iTwinId, report, returnFn }) => {
79
79
  ? ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:ModifyReport")
80
80
  : ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:AddReport"), returnFn: returnFn }),
81
81
  react_1.default.createElement("div", { className: "rcw-details-form-container" },
82
- react_1.default.createElement(itwinui_react_1.Fieldset, { legend: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:ReportDetails"), className: "details-form" },
82
+ react_1.default.createElement(itwinui_react_1.Fieldset, { legend: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:ReportDetails"), className: "rcw-details-form" },
83
83
  react_1.default.createElement(itwinui_react_1.Small, { className: "field-legend" }, ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:MandatoryFields")),
84
- react_1.default.createElement(itwinui_react_1.LabeledInput, { id: "name", name: "name", label: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Name"), value: values.name, required: true, disabled: isLoading, onChange: (event) => {
84
+ react_1.default.createElement(itwinui_react_1.LabeledInput, { name: "name", label: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Name"), value: values.name, required: true, disabled: isLoading, onChange: (event) => {
85
85
  utils_1.handleInputChange(event, values, setValues);
86
86
  validator.showMessageFor("name");
87
87
  }, message: validator.message("name", values.name, useValidator_1.NAME_REQUIREMENTS), status: validator.message("name", values.name, useValidator_1.NAME_REQUIREMENTS)
@@ -92,7 +92,7 @@ const ReportAction = ({ iTwinId, report, returnFn }) => {
92
92
  utils_1.handleInputChange(event, values, setValues);
93
93
  validator.showMessageFor("name");
94
94
  } }),
95
- react_1.default.createElement(itwinui_react_1.LabeledInput, { id: "description", name: "description", label: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Description"), value: values.description, onChange: (event) => {
95
+ react_1.default.createElement(itwinui_react_1.LabeledInput, { name: "description", label: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Description"), value: values.description, onChange: (event) => {
96
96
  utils_1.handleInputChange(event, values, setValues);
97
97
  }, disabled: isLoading }))),
98
98
  react_1.default.createElement(ActionPanel_1.default, { actionLabel: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Add"), onAction: onSave, onCancel: returnFn, isSavingDisabled: !values.name, isLoading: isLoading })));
@@ -1 +1 @@
1
- {"version":3,"file":"ReportAction.js","sourceRoot":"","sources":["../../../../src/widget/components/ReportAction.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 { Fieldset, LabeledInput, Small } from \"@itwin/itwinui-react\";\nimport React, { useState } from \"react\";\nimport ActionPanel from \"./ActionPanel\";\nimport useValidator, { NAME_REQUIREMENTS } from \"../hooks/useValidator\";\nimport {\n generateUrl,\n handleError,\n handleInputChange,\n WidgetHeader,\n} from \"./utils\";\nimport \"./ReportAction.scss\";\nimport type { Report } from \"@itwin/insights-client\";\nimport { REPORTING_BASE_PATH, ReportsClient } from \"@itwin/insights-client\";\nimport { useReportsApiConfig } from \"../context/ReportsApiConfigContext\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\n\ninterface ReportActionProps {\n iTwinId: string;\n report?: Report;\n returnFn: () => Promise<void>;\n}\n\nconst ReportAction = ({ iTwinId, report, returnFn }: ReportActionProps) => {\n const apiConfig = useReportsApiConfig();\n const [values, setValues] = useState({\n name: report?.displayName ?? \"\",\n description: report?.description ?? \"\",\n });\n const [validator, showValidationMessage] = useValidator();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n\n const onSave = async () => {\n try {\n if (!validator.allValid()) {\n showValidationMessage(true);\n return;\n }\n setIsLoading(true);\n const reportsClientApi = new ReportsClient(\n generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl)\n );\n const accessToken = await apiConfig.getAccessToken();\n report\n ? await reportsClientApi.updateReport(accessToken, report.id ?? \"\", {\n displayName: values.name,\n description: values.description,\n })\n : await reportsClientApi.createReport(accessToken, {\n displayName: values.name,\n description: values.description,\n projectId: iTwinId,\n });\n await returnFn();\n } catch (error: any) {\n handleError(error.status);\n setIsLoading(false);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <>\n <WidgetHeader\n title={\n report\n ? ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:ModifyReport\"\n )\n : ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:AddReport\"\n )\n }\n returnFn={returnFn}\n />\n <div className=\"rcw-details-form-container\">\n <Fieldset\n legend={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:ReportDetails\"\n )}\n className=\"details-form\"\n >\n <Small className=\"field-legend\">\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:MandatoryFields\"\n )}\n </Small>\n <LabeledInput\n id=\"name\"\n name=\"name\"\n label={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Name\"\n )}\n value={values.name}\n required\n disabled={isLoading}\n onChange={(event) => {\n handleInputChange(event, values, setValues);\n validator.showMessageFor(\"name\");\n }}\n message={validator.message(\"name\", values.name, NAME_REQUIREMENTS)}\n status={\n validator.message(\"name\", values.name, NAME_REQUIREMENTS)\n ? \"negative\"\n : undefined\n }\n onBlur={() => {\n validator.showMessageFor(\"name\");\n }}\n onBlurCapture={(event) => {\n handleInputChange(event, values, setValues);\n validator.showMessageFor(\"name\");\n }}\n />\n <LabeledInput\n id=\"description\"\n name=\"description\"\n label={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Description\"\n )}\n value={values.description}\n onChange={(event) => {\n handleInputChange(event, values, setValues);\n }}\n disabled={isLoading}\n />\n </Fieldset>\n </div>\n <ActionPanel\n actionLabel={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Add\"\n )}\n onAction={onSave}\n onCancel={returnFn}\n isSavingDisabled={!values.name}\n isLoading={isLoading}\n />\n </>\n );\n};\n\nexport default ReportAction;\n"]}
1
+ {"version":3,"file":"ReportAction.js","sourceRoot":"","sources":["../../../../src/widget/components/ReportAction.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 { Fieldset, LabeledInput, Small } from \"@itwin/itwinui-react\";\nimport React, { useState } from \"react\";\nimport ActionPanel from \"./ActionPanel\";\nimport useValidator, { NAME_REQUIREMENTS } from \"../hooks/useValidator\";\nimport {\n generateUrl,\n handleError,\n handleInputChange,\n WidgetHeader,\n} from \"./utils\";\nimport \"./ReportAction.scss\";\nimport type { Report } from \"@itwin/insights-client\";\nimport { REPORTING_BASE_PATH, ReportsClient } from \"@itwin/insights-client\";\nimport { useReportsApiConfig } from \"../context/ReportsApiConfigContext\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\n\ninterface ReportActionProps {\n iTwinId: string;\n report?: Report;\n returnFn: () => Promise<void>;\n}\n\nconst ReportAction = ({ iTwinId, report, returnFn }: ReportActionProps) => {\n const apiConfig = useReportsApiConfig();\n const [values, setValues] = useState({\n name: report?.displayName ?? \"\",\n description: report?.description ?? \"\",\n });\n const [validator, showValidationMessage] = useValidator();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n\n const onSave = async () => {\n try {\n if (!validator.allValid()) {\n showValidationMessage(true);\n return;\n }\n setIsLoading(true);\n const reportsClientApi = new ReportsClient(\n generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl)\n );\n const accessToken = await apiConfig.getAccessToken();\n report\n ? await reportsClientApi.updateReport(accessToken, report.id ?? \"\", {\n displayName: values.name,\n description: values.description,\n })\n : await reportsClientApi.createReport(accessToken, {\n displayName: values.name,\n description: values.description,\n projectId: iTwinId,\n });\n await returnFn();\n } catch (error: any) {\n handleError(error.status);\n setIsLoading(false);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <>\n <WidgetHeader\n title={\n report\n ? ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:ModifyReport\"\n )\n : ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:AddReport\"\n )\n }\n returnFn={returnFn}\n />\n <div className=\"rcw-details-form-container\">\n <Fieldset\n legend={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:ReportDetails\"\n )}\n className=\"rcw-details-form\"\n >\n <Small className=\"field-legend\">\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:MandatoryFields\"\n )}\n </Small>\n <LabeledInput\n name=\"name\"\n label={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Name\"\n )}\n value={values.name}\n required\n disabled={isLoading}\n onChange={(event) => {\n handleInputChange(event, values, setValues);\n validator.showMessageFor(\"name\");\n }}\n message={validator.message(\"name\", values.name, NAME_REQUIREMENTS)}\n status={\n validator.message(\"name\", values.name, NAME_REQUIREMENTS)\n ? \"negative\"\n : undefined\n }\n onBlur={() => {\n validator.showMessageFor(\"name\");\n }}\n onBlurCapture={(event) => {\n handleInputChange(event, values, setValues);\n validator.showMessageFor(\"name\");\n }}\n />\n <LabeledInput\n name=\"description\"\n label={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Description\"\n )}\n value={values.description}\n onChange={(event) => {\n handleInputChange(event, values, setValues);\n }}\n disabled={isLoading}\n />\n </Fieldset>\n </div>\n <ActionPanel\n actionLabel={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Add\"\n )}\n onAction={onSave}\n onCancel={returnFn}\n isSavingDisabled={!values.name}\n isLoading={isLoading}\n />\n </>\n );\n};\n\nexport default ReportAction;\n"]}
@@ -8,9 +8,9 @@
8
8
  overflow-x: auto;
9
9
  height: 100%;
10
10
 
11
- .details-form {
11
+ .rcw-details-form {
12
12
  display: flex;
13
13
  flex-direction: column;
14
14
  gap: $iui-baseline;
15
15
  }
16
- }
16
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"ReportHorizontalTile.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/ReportHorizontalTile.tsx"],"names":[],"mappings":";AAMA,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAarD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC;IAC1F,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,KAAK,IAAI,CAAC;IACvE,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,eAAO,MAAM,oBAAoB,UAAW,yBAAyB,gBA+FpE,CAAC"}
1
+ {"version":3,"file":"ReportHorizontalTile.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/ReportHorizontalTile.tsx"],"names":[],"mappings":";AAMA,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAarD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC;IAC1F,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,KAAK,IAAI,CAAC;IACvE,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,eAAO,MAAM,oBAAoB,UAAW,yBAAyB,gBA8FpE,CAAC"}
@@ -37,7 +37,7 @@ const ReportHorizontalTile = (props) => {
37
37
  if (jobStarted) {
38
38
  window.clearInterval(interval.current);
39
39
  interval.current = window.setInterval(async () => {
40
- const state = props.bulkExtractor.getState(props.report.id);
40
+ const state = await props.bulkExtractor.getReportState(props.report.id);
41
41
  if (state) {
42
42
  setExtractionState(state);
43
43
  if (state === ExtractionStatus_1.ExtractionStates.Failed || state === ExtractionStatus_1.ExtractionStates.Succeeded) {
@@ -64,7 +64,6 @@ const ReportHorizontalTile = (props) => {
64
64
  ] },
65
65
  react_2.default.createElement(itwinui_react_1.IconButton, { styleType: "borderless" },
66
66
  react_2.default.createElement(itwinui_icons_react_1.SvgMore, null))))) : (react_2.default.createElement(ExtractionStatus_1.ExtractionStatus, { state: extractionState, clearExtractionState: () => {
67
- props.bulkExtractor.clearJob(props.report.id);
68
67
  setExtractionState(ExtractionStatus_1.ExtractionStates.None);
69
68
  } })) }));
70
69
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ReportHorizontalTile.js","sourceRoot":"","sources":["../../../../src/widget/components/ReportHorizontalTile.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 { useEffect, useRef, useState } from \"react\";\nimport React from \"react\";\nimport type BulkExtractor from \"./BulkExtractor\";\nimport { ExtractionStates, ExtractionStatus } from \"./ExtractionStatus\";\nimport type { BeEvent } from \"@itwin/core-bentley\";\nimport { STATUS_CHECK_INTERVAL } from \"./Constants\";\nimport type { Report } from \"@itwin/insights-client\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\nimport {\n DropdownMenu,\n IconButton,\n MenuItem,\n} from \"@itwin/itwinui-react\";\nimport {\n SvgDelete,\n SvgEdit,\n SvgMore,\n} from \"@itwin/itwinui-icons-react\";\nimport { HorizontalTile } from \"./HorizontalTile\";\nimport type { HorizontalTileProps } from \"./HorizontalTile\";\n\nexport interface ReportHorizontalTileProps extends Pick<HorizontalTileProps, \"onClickTitle\"> {\n selected: boolean;\n onSelectionChange: (reportId: string, controlPressed: boolean) => void;\n bulkExtractor: BulkExtractor;\n jobStartEvent: BeEvent<(reportId: string) => void>;\n report: Report;\n onClickDelete: () => void;\n onClickModify: () => void;\n}\n\nexport const ReportHorizontalTile = (props: ReportHorizontalTileProps) => {\n const [jobStarted, setJobStarted] = useState<boolean>(false);\n const [extractionState, setExtractionState] = useState<ExtractionStates>(ExtractionStates.None);\n const interval = useRef<number>();\n\n useEffect(() => {\n const listener = (startedReportId: string) => {\n if (startedReportId === props.report.id) {\n setExtractionState(ExtractionStates.Starting);\n setJobStarted(true);\n }\n };\n props.jobStartEvent.addListener(listener);\n\n return () => {\n props.jobStartEvent.removeListener(listener);\n };\n }, [props.jobStartEvent, props.report.id]);\n\n useEffect(() => {\n if (jobStarted) {\n window.clearInterval(interval.current);\n interval.current = window.setInterval(async () => {\n const state = props.bulkExtractor.getState(props.report.id);\n if (state) {\n setExtractionState(state);\n if (state === ExtractionStates.Failed || state === ExtractionStates.Succeeded) {\n setJobStarted(false);\n }\n }\n }, STATUS_CHECK_INTERVAL);\n }\n return () => window.clearInterval(interval.current);\n }, [props.report.id, props.bulkExtractor, jobStarted]);\n\n const onClickTile = (e: React.MouseEvent) => {\n if (e?.currentTarget.className?.toString().split(\" \").includes(\"rcw-horizontal-tile-container\")) {\n props.onSelectionChange(props.report.id, e.ctrlKey);\n }\n };\n\n return (\n <HorizontalTile\n title={props.report.displayName}\n subText={props.report.description ?? \"\"}\n subtextToolTip={props.report.description ?? \"\"}\n titleTooltip={props.report.displayName}\n onClick={onClickTile}\n onClickTitle={props.onClickTitle}\n selected={props.selected}\n actionGroup={extractionState === ExtractionStates.None ? (\n <div\n className=\"rcw-action-button\"\n data-testid=\"tile-action-button\">\n <DropdownMenu\n menuItems={(close: () => void) => [\n <MenuItem\n key={0}\n onClick={props.onClickModify}\n icon={<SvgEdit />}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Modify\"\n )}\n </MenuItem>,\n <MenuItem\n key={1}\n onClick={() => {\n props.onClickDelete();\n close();\n }}\n icon={<SvgDelete />}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Remove\"\n )}\n </MenuItem>,\n ]}\n >\n <IconButton styleType=\"borderless\">\n <SvgMore />\n </IconButton>\n </DropdownMenu>\n </div>\n ) : (\n <ExtractionStatus\n state={extractionState}\n clearExtractionState={() => {\n props.bulkExtractor.clearJob(props.report.id);\n setExtractionState(ExtractionStates.None);\n }}\n ></ExtractionStatus>\n )}\n ></HorizontalTile>\n );\n};\n"]}
1
+ {"version":3,"file":"ReportHorizontalTile.js","sourceRoot":"","sources":["../../../../src/widget/components/ReportHorizontalTile.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 { useEffect, useRef, useState } from \"react\";\nimport React from \"react\";\nimport type BulkExtractor from \"./BulkExtractor\";\nimport { ExtractionStates, ExtractionStatus } from \"./ExtractionStatus\";\nimport type { BeEvent } from \"@itwin/core-bentley\";\nimport { STATUS_CHECK_INTERVAL } from \"./Constants\";\nimport type { Report } from \"@itwin/insights-client\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\nimport {\n DropdownMenu,\n IconButton,\n MenuItem,\n} from \"@itwin/itwinui-react\";\nimport {\n SvgDelete,\n SvgEdit,\n SvgMore,\n} from \"@itwin/itwinui-icons-react\";\nimport { HorizontalTile } from \"./HorizontalTile\";\nimport type { HorizontalTileProps } from \"./HorizontalTile\";\n\nexport interface ReportHorizontalTileProps extends Pick<HorizontalTileProps, \"onClickTitle\"> {\n selected: boolean;\n onSelectionChange: (reportId: string, controlPressed: boolean) => void;\n bulkExtractor: BulkExtractor;\n jobStartEvent: BeEvent<(reportId: string) => void>;\n report: Report;\n onClickDelete: () => void;\n onClickModify: () => void;\n}\n\nexport const ReportHorizontalTile = (props: ReportHorizontalTileProps) => {\n const [jobStarted, setJobStarted] = useState<boolean>(false);\n const [extractionState, setExtractionState] = useState<ExtractionStates>(ExtractionStates.None);\n const interval = useRef<number>();\n\n useEffect(() => {\n const listener = (startedReportId: string) => {\n if (startedReportId === props.report.id) {\n setExtractionState(ExtractionStates.Starting);\n setJobStarted(true);\n }\n };\n props.jobStartEvent.addListener(listener);\n\n return () => {\n props.jobStartEvent.removeListener(listener);\n };\n }, [props.jobStartEvent, props.report.id]);\n\n useEffect(() => {\n if (jobStarted) {\n window.clearInterval(interval.current);\n interval.current = window.setInterval(async () => {\n const state = await props.bulkExtractor.getReportState(props.report.id);\n if (state) {\n setExtractionState(state);\n if (state === ExtractionStates.Failed || state === ExtractionStates.Succeeded) {\n setJobStarted(false);\n }\n }\n }, STATUS_CHECK_INTERVAL);\n }\n return () => window.clearInterval(interval.current);\n }, [props.report.id, props.bulkExtractor, jobStarted]);\n\n const onClickTile = (e: React.MouseEvent) => {\n if (e?.currentTarget.className?.toString().split(\" \").includes(\"rcw-horizontal-tile-container\")) {\n props.onSelectionChange(props.report.id, e.ctrlKey);\n }\n };\n\n return (\n <HorizontalTile\n title={props.report.displayName}\n subText={props.report.description ?? \"\"}\n subtextToolTip={props.report.description ?? \"\"}\n titleTooltip={props.report.displayName}\n onClick={onClickTile}\n onClickTitle={props.onClickTitle}\n selected={props.selected}\n actionGroup={extractionState === ExtractionStates.None ? (\n <div\n className=\"rcw-action-button\"\n data-testid=\"tile-action-button\">\n <DropdownMenu\n menuItems={(close: () => void) => [\n <MenuItem\n key={0}\n onClick={props.onClickModify}\n icon={<SvgEdit />}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Modify\"\n )}\n </MenuItem>,\n <MenuItem\n key={1}\n onClick={() => {\n props.onClickDelete();\n close();\n }}\n icon={<SvgDelete />}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Remove\"\n )}\n </MenuItem>,\n ]}\n >\n <IconButton styleType=\"borderless\">\n <SvgMore />\n </IconButton>\n </DropdownMenu>\n </div>\n ) : (\n <ExtractionStatus\n state={extractionState}\n clearExtractionState={() => {\n setExtractionState(ExtractionStates.None);\n }}\n ></ExtractionStatus>\n )}\n ></HorizontalTile>\n );\n};\n"]}
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ import type BulkExtractor from "./BulkExtractor";
3
+ import type { BeEvent } from "@itwin/core-bentley";
4
+ import type { ReportMappingAndMapping } from "./ReportMappings";
5
+ export interface ReportMappingHorizontalTileProps {
6
+ jobStartEvent: BeEvent<(iModelId: string) => void>;
7
+ mapping: ReportMappingAndMapping;
8
+ onClickDelete: () => void;
9
+ bulkExtractor: BulkExtractor;
10
+ odataFeedUrl: string;
11
+ }
12
+ export declare const ReportMappingHorizontalTile: (props: ReportMappingHorizontalTileProps) => JSX.Element;
13
+ //# sourceMappingURL=ReportMappingHorizontalTile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportMappingHorizontalTile.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/ReportMappingHorizontalTile.tsx"],"names":[],"mappings":";AAMA,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AASnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;IACnD,OAAO,EAAE,uBAAuB,CAAC;IACjC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,2BAA2B,UAAW,gCAAgC,gBAoGlF,CAAC"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ReportMappingHorizontalTile = void 0;
7
+ /*---------------------------------------------------------------------------------------------
8
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
9
+ * See LICENSE.md in the project root for license terms and full copyright notice.
10
+ *--------------------------------------------------------------------------------------------*/
11
+ const react_1 = require("react");
12
+ const react_2 = __importDefault(require("react"));
13
+ const ExtractionStatus_1 = require("./ExtractionStatus");
14
+ const Constants_1 = require("./Constants");
15
+ const ReportsConfigWidget_1 = require("../../ReportsConfigWidget");
16
+ const itwinui_react_1 = require("@itwin/itwinui-react");
17
+ const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
18
+ const HorizontalTile_1 = require("./HorizontalTile");
19
+ const ReportMappingHorizontalTile = (props) => {
20
+ const [extractionState, setExtractionState] = react_1.useState(ExtractionStatus_1.ExtractionStates.None);
21
+ const [jobStarted, setJobStarted] = react_1.useState(true);
22
+ const interval = react_1.useRef();
23
+ const initialLoad = react_1.useRef(true);
24
+ react_1.useEffect(() => {
25
+ const listener = (startedIModelId) => {
26
+ if (startedIModelId === props.mapping.imodelId) {
27
+ setExtractionState(ExtractionStatus_1.ExtractionStates.Starting);
28
+ setJobStarted(true);
29
+ }
30
+ };
31
+ props.jobStartEvent.addListener(listener);
32
+ return () => {
33
+ props.jobStartEvent.removeListener(listener);
34
+ };
35
+ }, [props.jobStartEvent, props.mapping]);
36
+ const getExtractionState = react_1.useCallback(async () => {
37
+ const state = await props.bulkExtractor.getIModelState(props.mapping.imodelId, props.mapping.iModelName, props.odataFeedUrl);
38
+ if (state === ExtractionStatus_1.ExtractionStates.Failed || state === ExtractionStatus_1.ExtractionStates.Succeeded || state === ExtractionStatus_1.ExtractionStates.None) {
39
+ setJobStarted(false);
40
+ if (initialLoad.current) {
41
+ initialLoad.current = false;
42
+ setExtractionState(ExtractionStatus_1.ExtractionStates.None);
43
+ return;
44
+ }
45
+ }
46
+ else {
47
+ initialLoad.current = false;
48
+ }
49
+ setExtractionState(state);
50
+ }, [props.mapping, props.bulkExtractor, props.odataFeedUrl]);
51
+ react_1.useEffect(() => {
52
+ if (jobStarted) {
53
+ getExtractionState().catch((error) => {
54
+ setExtractionState(ExtractionStatus_1.ExtractionStates.Failed);
55
+ setJobStarted(false);
56
+ /* eslint-disable no-console */
57
+ console.error(error);
58
+ });
59
+ window.clearInterval(interval.current);
60
+ interval.current = window.setInterval(async () => {
61
+ await getExtractionState();
62
+ }, Constants_1.STATUS_CHECK_INTERVAL);
63
+ }
64
+ return () => window.clearInterval(interval.current);
65
+ }, [jobStarted, getExtractionState]);
66
+ return (react_2.default.createElement(HorizontalTile_1.HorizontalTile, { title: props.mapping.mappingName, subText: props.mapping.iModelName, titleTooltip: props.mapping.mappingDescription, actionGroup: (react_2.default.createElement("div", { className: "rcw-action-button", "data-testid": "tile-action-button" },
67
+ extractionState === ExtractionStatus_1.ExtractionStates.None ?
68
+ (react_2.default.createElement(itwinui_react_1.IconButton, { styleType: "borderless", title: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:UpdateDataset"), onClick: async () => {
69
+ setExtractionState(ExtractionStatus_1.ExtractionStates.Starting);
70
+ await props.bulkExtractor.runIModelExtraction(props.mapping.imodelId);
71
+ props.jobStartEvent.raiseEvent(props.mapping.imodelId);
72
+ }, disabled: jobStarted },
73
+ react_2.default.createElement(itwinui_icons_react_1.SvgRefresh, null))) : (react_2.default.createElement(ExtractionStatus_1.ExtractionStatus, { state: extractionState, clearExtractionState: () => {
74
+ setExtractionState(ExtractionStatus_1.ExtractionStates.None);
75
+ } })),
76
+ react_2.default.createElement(itwinui_react_1.IconButton, { styleType: "borderless", title: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Remove"), onClick: () => {
77
+ props.onClickDelete();
78
+ }, disabled: jobStarted },
79
+ react_2.default.createElement(itwinui_icons_react_1.SvgDelete, null)))) }));
80
+ };
81
+ exports.ReportMappingHorizontalTile = ReportMappingHorizontalTile;
82
+ //# sourceMappingURL=ReportMappingHorizontalTile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportMappingHorizontalTile.js","sourceRoot":"","sources":["../../../../src/widget/components/ReportMappingHorizontalTile.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 { useCallback, useEffect, useRef, useState } from \"react\";\nimport React from \"react\";\nimport type BulkExtractor from \"./BulkExtractor\";\nimport { ExtractionStates, ExtractionStatus } from \"./ExtractionStatus\";\nimport type { BeEvent } from \"@itwin/core-bentley\";\nimport { STATUS_CHECK_INTERVAL } from \"./Constants\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\nimport { IconButton } from \"@itwin/itwinui-react\";\nimport {\n SvgDelete,\n SvgRefresh,\n} from \"@itwin/itwinui-icons-react\";\nimport { HorizontalTile } from \"./HorizontalTile\";\nimport type { ReportMappingAndMapping } from \"./ReportMappings\";\n\nexport interface ReportMappingHorizontalTileProps {\n jobStartEvent: BeEvent<(iModelId: string) => void>;\n mapping: ReportMappingAndMapping;\n onClickDelete: () => void;\n bulkExtractor: BulkExtractor;\n odataFeedUrl: string;\n}\n\nexport const ReportMappingHorizontalTile = (props: ReportMappingHorizontalTileProps) => {\n const [extractionState, setExtractionState] = useState<ExtractionStates>(ExtractionStates.None);\n const [jobStarted, setJobStarted] = useState<boolean>(true);\n const interval = useRef<number>();\n const initialLoad = useRef<boolean>(true);\n\n useEffect(() => {\n const listener = (startedIModelId: string) => {\n if (startedIModelId === props.mapping.imodelId) {\n setExtractionState(ExtractionStates.Starting);\n setJobStarted(true);\n }\n };\n props.jobStartEvent.addListener(listener);\n\n return () => {\n props.jobStartEvent.removeListener(listener);\n };\n }, [props.jobStartEvent, props.mapping]);\n\n const getExtractionState = useCallback(async () => {\n const state = await props.bulkExtractor.getIModelState(props.mapping.imodelId, props.mapping.iModelName, props.odataFeedUrl);\n if (state === ExtractionStates.Failed || state === ExtractionStates.Succeeded || state === ExtractionStates.None) {\n setJobStarted(false);\n if (initialLoad.current) {\n initialLoad.current = false;\n setExtractionState(ExtractionStates.None);\n return;\n }\n } else {\n initialLoad.current = false;\n }\n setExtractionState(state);\n }, [props.mapping, props.bulkExtractor, props.odataFeedUrl]);\n\n useEffect(() => {\n if (jobStarted) {\n getExtractionState().catch((error) => {\n setExtractionState(ExtractionStates.Failed);\n setJobStarted(false);\n /* eslint-disable no-console */\n console.error(error);\n });\n window.clearInterval(interval.current);\n interval.current = window.setInterval(async () => {\n await getExtractionState();\n }, STATUS_CHECK_INTERVAL);\n }\n return () => window.clearInterval(interval.current);\n }, [jobStarted, getExtractionState]);\n\n return (\n <HorizontalTile\n title={props.mapping.mappingName}\n subText={props.mapping.iModelName}\n titleTooltip={props.mapping.mappingDescription}\n actionGroup={(\n <div\n className=\"rcw-action-button\"\n data-testid=\"tile-action-button\">\n {extractionState === ExtractionStates.None ?\n (\n <IconButton\n styleType=\"borderless\"\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:UpdateDataset\"\n )}\n onClick={async () => {\n setExtractionState(ExtractionStates.Starting);\n await props.bulkExtractor.runIModelExtraction(props.mapping.imodelId);\n props.jobStartEvent.raiseEvent(props.mapping.imodelId);\n }}\n disabled={jobStarted}\n >\n <SvgRefresh />\n </IconButton>\n ) : (\n <ExtractionStatus\n state={extractionState}\n clearExtractionState={() => {\n setExtractionState(ExtractionStates.None);\n }}\n ></ExtractionStatus>\n )}\n <IconButton\n styleType=\"borderless\"\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Remove\"\n )}\n onClick={() => {\n props.onClickDelete();\n }}\n disabled={jobStarted}\n >\n <SvgDelete />\n </IconButton>\n </div >\n )}\n />\n );\n};\n"]}
@@ -2,6 +2,7 @@
2
2
  import type { CreateTypeFromInterface } from "./utils";
3
3
  import "./ReportMappings.scss";
4
4
  import type { Report, ReportMapping } from "@itwin/insights-client";
5
+ import type BulkExtractor from "./BulkExtractor";
5
6
  export declare type ReportMappingType = CreateTypeFromInterface<ReportMapping>;
6
7
  export declare type ReportMappingAndMapping = ReportMappingType & {
7
8
  mappingName: string;
@@ -10,8 +11,9 @@ export declare type ReportMappingAndMapping = ReportMappingType & {
10
11
  };
11
12
  interface ReportMappingsProps {
12
13
  report: Report;
14
+ bulkExtractor: BulkExtractor;
13
15
  goBack: () => Promise<void>;
14
16
  }
15
- export declare const ReportMappings: ({ report, goBack }: ReportMappingsProps) => JSX.Element;
17
+ export declare const ReportMappings: ({ report, bulkExtractor, goBack }: ReportMappingsProps) => JSX.Element;
16
18
  export {};
17
19
  //# sourceMappingURL=ReportMappings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReportMappings.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/ReportMappings.tsx"],"names":[],"mappings":";AAqBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAQvD,OAAO,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAgBpE,oBAAY,iBAAiB,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;AAEvE,oBAAY,uBAAuB,GAAG,iBAAiB,GAAG;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAwEF,UAAU,mBAAmB;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,eAAO,MAAM,cAAc,uBAAwB,mBAAmB,gBAwNrE,CAAC"}
1
+ {"version":3,"file":"ReportMappings.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/ReportMappings.tsx"],"names":[],"mappings":";AAiBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAQvD,OAAO,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAcpE,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAC;AAIjD,oBAAY,iBAAiB,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;AAEvE,oBAAY,uBAAuB,GAAG,iBAAiB,GAAG;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAwEF,UAAU,mBAAmB;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,eAAO,MAAM,cAAc,sCAAuC,mBAAmB,gBAyMpF,CAAC"}
@@ -34,21 +34,22 @@ const utils_1 = require("./utils");
34
34
  require("./ReportMappings.scss");
35
35
  const DeleteModal_1 = __importDefault(require("./DeleteModal"));
36
36
  const insights_client_1 = require("@itwin/insights-client");
37
- const AddMappingsModal_1 = __importDefault(require("./AddMappingsModal"));
37
+ const AddMappingsModal_1 = require("./AddMappingsModal");
38
38
  const imodels_client_management_1 = require("@itwin/imodels-client-management");
39
39
  const imodels_access_frontend_1 = require("@itwin/imodels-access-frontend");
40
- const HorizontalTile_1 = require("./HorizontalTile");
41
- const Extraction_1 = require("./Extraction");
42
40
  const SearchBar_1 = require("./SearchBar");
43
41
  const ReportsApiConfigContext_1 = require("../context/ReportsApiConfigContext");
44
42
  const ReportsConfigWidget_1 = require("../../ReportsConfigWidget");
43
+ const ReportMappingHorizontalTile_1 = require("./ReportMappingHorizontalTile");
44
+ const core_bentley_1 = require("@itwin/core-bentley");
45
+ const utils_2 = require("./utils");
45
46
  var ReportMappingsView;
46
47
  (function (ReportMappingsView) {
47
48
  ReportMappingsView["REPORTMAPPINGS"] = "reportmappings";
48
49
  ReportMappingsView["ADDING"] = "adding";
49
50
  })(ReportMappingsView || (ReportMappingsView = {}));
50
51
  const fetchReportMappings = async (setReportMappings, reportId, setIsLoading, apiContext) => {
51
- var _a;
52
+ var _a, _b;
52
53
  try {
53
54
  setIsLoading(true);
54
55
  const reportsClientApi = new insights_client_1.ReportsClient(utils_1.generateUrl(insights_client_1.REPORTING_BASE_PATH, apiContext.baseUrl));
@@ -61,8 +62,8 @@ const fetchReportMappings = async (setReportMappings, reportId, setIsLoading, ap
61
62
  const iModelsClient = new imodels_client_management_1.IModelsClient(iModelClientOptions);
62
63
  const authorization = imodels_access_frontend_1.AccessTokenAdapter.toAuthorizationCallback(accessToken);
63
64
  const iModelNames = new Map();
64
- const reportMappingsAndMapping = await Promise.all((_a = reportMappings.map(async (reportMapping) => {
65
- var _a, _b;
65
+ const reportMappingsAndMappings = [];
66
+ for (const reportMapping of reportMappings) {
66
67
  const iModelId = reportMapping.imodelId;
67
68
  let iModelName = "";
68
69
  const mapping = await mappingsClientApi.getMapping(accessToken, iModelId, reportMapping.mappingId);
@@ -84,9 +85,9 @@ const fetchReportMappings = async (setReportMappings, reportId, setIsLoading, ap
84
85
  mappingName: mapping.mappingName,
85
86
  mappingDescription: (_b = mapping.description) !== null && _b !== void 0 ? _b : "",
86
87
  };
87
- return reportMappingAndMapping;
88
- })) !== null && _a !== void 0 ? _a : []);
89
- setReportMappings(reportMappingsAndMapping);
88
+ reportMappingsAndMappings.push(reportMappingAndMapping);
89
+ }
90
+ setReportMappings(reportMappingsAndMappings);
90
91
  }
91
92
  catch (error) {
92
93
  utils_1.handleError(error.status);
@@ -95,20 +96,23 @@ const fetchReportMappings = async (setReportMappings, reportId, setIsLoading, ap
95
96
  setIsLoading(false);
96
97
  }
97
98
  };
98
- const ReportMappings = ({ report, goBack }) => {
99
+ const ReportMappings = ({ report, bulkExtractor, goBack }) => {
99
100
  var _a;
100
101
  const apiConfig = ReportsApiConfigContext_1.useReportsApiConfig();
101
102
  const [reportMappingsView, setReportMappingsView] = react_1.useState(ReportMappingsView.REPORTMAPPINGS);
102
103
  const [selectedReportMapping, setSelectedReportMapping] = react_1.useState(undefined);
103
104
  const [showDeleteModal, setShowDeleteModal] = react_1.useState(false);
104
105
  const [isLoading, setIsLoading] = react_1.useState(true);
105
- const [extractionState, setExtractionState] = react_1.useState(Extraction_1.ExtractionStates.None);
106
- const [runningIModelId, setRunningIModelId] = react_1.useState("");
107
106
  const [searchValue, setSearchValue] = react_1.useState("");
108
107
  const [reportMappings, setReportMappings] = react_1.useState([]);
108
+ const [jobRunning, setJobRunning] = react_1.useState(false);
109
+ const jobStartEvent = react_1.useMemo(() => new core_bentley_1.BeEvent(), []);
109
110
  react_1.useEffect(() => {
110
111
  void fetchReportMappings(setReportMappings, report.id, setIsLoading, apiConfig);
111
112
  }, [apiConfig, report.id, setIsLoading]);
113
+ react_1.useEffect(() => {
114
+ bulkExtractor.setHook(setJobRunning, reportMappings.map((x) => x.imodelId));
115
+ }, [bulkExtractor, reportMappings]);
112
116
  const refresh = react_1.useCallback(async () => {
113
117
  setReportMappingsView(ReportMappingsView.REPORTMAPPINGS);
114
118
  await fetchReportMappings(setReportMappings, report.id, setIsLoading, apiConfig);
@@ -116,10 +120,6 @@ const ReportMappings = ({ report, goBack }) => {
116
120
  const addMapping = () => {
117
121
  setReportMappingsView(ReportMappingsView.ADDING);
118
122
  };
119
- const uniqueIModels = react_1.useMemo(() => new Map(reportMappings.map((mapping) => [
120
- mapping.imodelId,
121
- mapping.iModelName,
122
- ])), [reportMappings]);
123
123
  const odataFeedUrl = `${utils_1.generateUrl(insights_client_1.REPORTING_BASE_PATH, apiConfig.baseUrl)}/odata/${report.id}`;
124
124
  const filteredReportMappings = react_1.useMemo(() => reportMappings.filter((x) => [x.iModelName, x.mappingName, x.mappingDescription]
125
125
  .join(" ")
@@ -127,44 +127,43 @@ const ReportMappings = ({ report, goBack }) => {
127
127
  .includes(searchValue.toLowerCase())), [reportMappings, searchValue]);
128
128
  return (react_1.default.createElement(react_1.default.Fragment, null,
129
129
  react_1.default.createElement(utils_1.WidgetHeader, { title: report.displayName, returnFn: goBack }),
130
- react_1.default.createElement("div", { className: "report-mapping-misc" },
131
- react_1.default.createElement(itwinui_react_1.LabeledInput, { label: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:ODataFeedURL"), className: "odata-url-input", readOnly: true, value: odataFeedUrl, svgIcon: react_1.default.createElement(itwinui_react_1.IconButton, { title: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Copy"), styleType: "borderless", onClick: async (_) => {
130
+ react_1.default.createElement("div", { className: "rcw-report-mapping-misc" },
131
+ react_1.default.createElement(itwinui_react_1.LabeledInput, { label: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:ODataFeedURL"), className: "rcw-odata-url-input", readOnly: true, value: odataFeedUrl, svgIcon: react_1.default.createElement(itwinui_react_1.IconButton, { title: ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Copy"), styleType: "borderless", onClick: async (_) => {
132
132
  await navigator.clipboard.writeText(odataFeedUrl);
133
133
  itwinui_react_1.toaster.positive(ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:CopiedToClipboard"));
134
134
  } },
135
- react_1.default.createElement(itwinui_icons_react_1.SvgCopy, null)), iconDisplayStyle: "inline" }),
136
- react_1.default.createElement(Extraction_1.Extraction, { iModels: uniqueIModels, extractionState: extractionState, setExtractionState: setExtractionState, setExtractingIModelId: setRunningIModelId, isLoading: isLoading })),
137
- react_1.default.createElement(itwinui_react_1.Surface, { className: "report-mappings-container" },
138
- react_1.default.createElement("div", { className: "toolbar" },
135
+ react_1.default.createElement(itwinui_icons_react_1.SvgCopy, null)), iconDisplayStyle: "inline" })),
136
+ react_1.default.createElement(itwinui_react_1.Surface, { className: "rcw-report-mappings-container" },
137
+ react_1.default.createElement("div", { className: "rcw-toolbar" },
139
138
  react_1.default.createElement(itwinui_react_1.Button, { startIcon: react_1.default.createElement(itwinui_icons_react_1.SvgAdd, null), onClick: () => addMapping(), styleType: "high-visibility" }, ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:AddMapping")),
140
- react_1.default.createElement("div", { className: "search-bar-container", "data-testid": "search-bar" },
139
+ react_1.default.createElement("div", { className: "rcw-search-bar-container", "data-testid": "rcw-search-bar" },
141
140
  react_1.default.createElement(SearchBar_1.SearchBar, { searchValue: searchValue, setSearchValue: setSearchValue, disabled: isLoading }))),
142
141
  isLoading ? (react_1.default.createElement(utils_1.LoadingOverlay, null)) : reportMappings.length === 0 ? (react_1.default.createElement(utils_1.EmptyMessage, null,
143
142
  react_1.default.createElement(react_1.default.Fragment, null,
144
143
  react_1.default.createElement(itwinui_react_1.Text, null, ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:NoReportMappings")),
145
144
  react_1.default.createElement("div", null,
146
- react_1.default.createElement(itwinui_react_1.Button, { onClick: () => addMapping(), styleType: "cta" }, ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:LetsAddSomeMappingsCTA")))))) : (react_1.default.createElement("div", { className: "mapping-list" }, filteredReportMappings.map((mapping) => (react_1.default.createElement(HorizontalTile_1.HorizontalTile, { key: mapping.mappingId, title: mapping.mappingName, subText: mapping.iModelName, titleTooltip: mapping.mappingDescription, actionGroup: react_1.default.createElement(Extraction_1.ExtractionStatus, { state: mapping.imodelId === runningIModelId
147
- ? extractionState
148
- : Extraction_1.ExtractionStates.None },
149
- react_1.default.createElement(itwinui_react_1.DropdownMenu, { menuItems: (close) => [
150
- react_1.default.createElement(itwinui_react_1.MenuItem, { key: 0, onClick: () => {
151
- setSelectedReportMapping(mapping);
152
- setShowDeleteModal(true);
153
- close();
154
- }, icon: react_1.default.createElement(itwinui_icons_react_1.SvgDelete, null) }, ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Remove")),
155
- ] },
156
- react_1.default.createElement(itwinui_react_1.IconButton, { styleType: "borderless" },
157
- react_1.default.createElement(itwinui_icons_react_1.SvgMore, { style: {
158
- width: "16px",
159
- height: "16px",
160
- } })))) })))))),
161
- react_1.default.createElement(AddMappingsModal_1.default, { show: reportMappingsView === ReportMappingsView.ADDING, reportId: report.id, existingMappings: reportMappings, returnFn: refresh }),
145
+ react_1.default.createElement(itwinui_react_1.Button, { onClick: () => addMapping(), styleType: "cta" }, ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:LetsAddSomeMappingsCTA")))))) : (react_1.default.createElement("div", { className: "rcw-mapping-list" }, filteredReportMappings.map((mapping) => (react_1.default.createElement(ReportMappingHorizontalTile_1.ReportMappingHorizontalTile, { key: mapping.mappingId, bulkExtractor: bulkExtractor, mapping: mapping, onClickDelete: () => {
146
+ setSelectedReportMapping(mapping);
147
+ setShowDeleteModal(true);
148
+ }, odataFeedUrl: odataFeedUrl, jobStartEvent: jobStartEvent })))))),
149
+ react_1.default.createElement(AddMappingsModal_1.AddMappingsModal, { show: reportMappingsView === ReportMappingsView.ADDING, reportId: report.id, existingMappings: reportMappings, returnFn: refresh }),
162
150
  react_1.default.createElement(DeleteModal_1.default, { entityName: (_a = selectedReportMapping === null || selectedReportMapping === void 0 ? void 0 : selectedReportMapping.mappingName) !== null && _a !== void 0 ? _a : "", show: showDeleteModal, setShow: setShowDeleteModal, onDelete: async () => {
163
151
  var _a;
164
152
  const reportsClientApi = new insights_client_1.ReportsClient(utils_1.generateUrl(insights_client_1.REPORTING_BASE_PATH, apiConfig.baseUrl));
165
153
  const accessToken = await apiConfig.getAccessToken();
166
154
  await reportsClientApi.deleteReportMapping(accessToken, report.id, (_a = selectedReportMapping === null || selectedReportMapping === void 0 ? void 0 : selectedReportMapping.mappingId) !== null && _a !== void 0 ? _a : "");
167
- }, refresh: refresh })));
155
+ }, refresh: refresh }),
156
+ react_1.default.createElement("div", { className: "rcw-action-panel" },
157
+ isLoading && react_1.default.createElement(utils_2.LoadingSpinner, null),
158
+ react_1.default.createElement(itwinui_react_1.Button, { disabled: isLoading || jobRunning || reportMappings.length === 0, styleType: "high-visibility", onClick: async () => {
159
+ setJobRunning(true);
160
+ const uniqueIModels = Array.from(new Set(reportMappings.map((x) => x.imodelId)));
161
+ await bulkExtractor.runIModelExtractions(uniqueIModels);
162
+ reportMappings.forEach((reportMapping) => {
163
+ jobStartEvent.raiseEvent(reportMapping.imodelId);
164
+ });
165
+ } }, ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:UpdateAllDatasets")),
166
+ react_1.default.createElement(itwinui_react_1.Button, { styleType: "default", type: "button", onClick: goBack, disabled: isLoading }, ReportsConfigWidget_1.ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Close")))));
168
167
  };
169
168
  exports.ReportMappings = ReportMappings;
170
169
  //# sourceMappingURL=ReportMappings.js.map