@itwin/reports-config-widget-react 0.0.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/.rush/temp/package-deps_rebuild.json +46 -32
  2. package/.rush/temp/shrinkwrap-deps.json +14 -6
  3. package/CHANGELOG.json +27 -0
  4. package/CHANGELOG.md +16 -1
  5. package/coverage/clover.xml +648 -427
  6. package/coverage/coverage-final.json +28 -18
  7. package/coverage/lcov-report/index.html +34 -19
  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 +661 -0
  16. package/coverage/lcov-report/src/widget/components/Constants.ts.html +106 -0
  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 +187 -0
  19. package/coverage/lcov-report/src/widget/components/ExtractionStates/QueuedExtractionState.tsx.html +145 -0
  20. package/coverage/lcov-report/src/widget/components/ExtractionStates/RunningExtractionState.tsx.html +139 -0
  21. package/coverage/lcov-report/src/widget/components/ExtractionStates/StartingExtractionState.tsx.html +151 -0
  22. package/coverage/lcov-report/src/widget/components/ExtractionStates/SucceededExtractionState.tsx.html +190 -0
  23. package/coverage/lcov-report/src/widget/components/ExtractionStates/index.html +176 -0
  24. package/coverage/lcov-report/src/widget/components/ExtractionStatus.tsx.html +295 -0
  25. package/coverage/lcov-report/src/widget/components/ExtractionToast.tsx.html +208 -0
  26. package/coverage/lcov-report/src/widget/components/HorizontalTile.tsx.html +77 -44
  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 +475 -0
  30. package/coverage/lcov-report/src/widget/components/ReportMappingHorizontalTile.tsx.html +469 -0
  31. package/coverage/lcov-report/src/widget/components/ReportMappings.tsx.html +184 -250
  32. package/coverage/lcov-report/src/widget/components/Reports.tsx.html +180 -132
  33. package/coverage/lcov-report/src/widget/components/ReportsContainer.tsx.html +10 -10
  34. package/coverage/lcov-report/src/widget/components/SearchBar.tsx.html +11 -11
  35. package/coverage/lcov-report/src/widget/components/SelectIModel.tsx.html +31 -31
  36. package/coverage/lcov-report/src/widget/components/index.html +134 -59
  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 +1137 -738
  44. package/jest.config.js +7 -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 +37 -0
  77. package/lib/cjs/widget/components/BulkExtractor.d.ts.map +1 -0
  78. package/lib/cjs/widget/components/BulkExtractor.js +155 -0
  79. package/lib/cjs/widget/components/BulkExtractor.js.map +1 -0
  80. package/lib/cjs/widget/components/Constants.d.ts +4 -0
  81. package/lib/cjs/widget/components/Constants.d.ts.map +1 -0
  82. package/lib/cjs/widget/components/Constants.js +11 -0
  83. package/lib/cjs/widget/components/Constants.js.map +1 -0
  84. package/lib/cjs/widget/components/DeleteModal.js +1 -1
  85. package/lib/cjs/widget/components/DeleteModal.js.map +1 -1
  86. package/lib/cjs/widget/components/DeleteModal.scss +4 -3
  87. package/lib/cjs/widget/components/ExtractionStates/FailedExtractionState.d.ts +8 -0
  88. package/lib/cjs/widget/components/ExtractionStates/FailedExtractionState.d.ts.map +1 -0
  89. package/lib/cjs/widget/components/ExtractionStates/FailedExtractionState.js +23 -0
  90. package/lib/cjs/widget/components/ExtractionStates/FailedExtractionState.js.map +1 -0
  91. package/lib/cjs/widget/components/ExtractionStates/QueuedExtractionState.d.ts +3 -0
  92. package/lib/cjs/widget/components/ExtractionStates/QueuedExtractionState.d.ts.map +1 -0
  93. package/lib/cjs/widget/components/ExtractionStates/QueuedExtractionState.js +18 -0
  94. package/lib/cjs/widget/components/ExtractionStates/QueuedExtractionState.js.map +1 -0
  95. package/lib/cjs/widget/components/ExtractionStates/RunningExtractionState.d.ts +3 -0
  96. package/lib/cjs/widget/components/ExtractionStates/RunningExtractionState.d.ts.map +1 -0
  97. package/lib/cjs/widget/components/ExtractionStates/RunningExtractionState.js +17 -0
  98. package/lib/cjs/widget/components/ExtractionStates/RunningExtractionState.js.map +1 -0
  99. package/lib/cjs/widget/components/ExtractionStates/StartingExtractionState.d.ts +3 -0
  100. package/lib/cjs/widget/components/ExtractionStates/StartingExtractionState.d.ts.map +1 -0
  101. package/lib/cjs/widget/components/ExtractionStates/StartingExtractionState.js +18 -0
  102. package/lib/cjs/widget/components/ExtractionStates/StartingExtractionState.js.map +1 -0
  103. package/lib/cjs/widget/components/ExtractionStates/SucceededExtractionState.d.ts +8 -0
  104. package/lib/cjs/widget/components/ExtractionStates/SucceededExtractionState.d.ts.map +1 -0
  105. package/lib/cjs/widget/components/ExtractionStates/SucceededExtractionState.js +23 -0
  106. package/lib/cjs/widget/components/ExtractionStates/SucceededExtractionState.js.map +1 -0
  107. package/lib/cjs/widget/components/ExtractionStatus.d.ts +17 -0
  108. package/lib/cjs/widget/components/ExtractionStatus.d.ts.map +1 -0
  109. package/lib/cjs/widget/components/ExtractionStatus.js +76 -0
  110. package/lib/cjs/widget/components/ExtractionStatus.js.map +1 -0
  111. package/lib/cjs/widget/components/{Extraction.scss → ExtractionStatus.scss} +17 -15
  112. package/lib/cjs/widget/components/ExtractionToast.d.ts +11 -0
  113. package/lib/cjs/widget/components/ExtractionToast.d.ts.map +1 -0
  114. package/lib/cjs/widget/components/ExtractionToast.js +33 -0
  115. package/lib/cjs/widget/components/ExtractionToast.js.map +1 -0
  116. package/lib/cjs/widget/components/HorizontalTile.d.ts +8 -7
  117. package/lib/cjs/widget/components/HorizontalTile.d.ts.map +1 -1
  118. package/lib/cjs/widget/components/HorizontalTile.js +10 -6
  119. package/lib/cjs/widget/components/HorizontalTile.js.map +1 -1
  120. package/lib/cjs/widget/components/HorizontalTile.scss +42 -22
  121. package/lib/cjs/widget/components/ReportAction.d.ts.map +1 -1
  122. package/lib/cjs/widget/components/ReportAction.js +3 -3
  123. package/lib/cjs/widget/components/ReportAction.js.map +1 -1
  124. package/lib/cjs/widget/components/ReportAction.scss +2 -2
  125. package/lib/cjs/widget/components/ReportHorizontalTile.d.ts +16 -0
  126. package/lib/cjs/widget/components/ReportHorizontalTile.d.ts.map +1 -0
  127. package/lib/cjs/widget/components/ReportHorizontalTile.js +71 -0
  128. package/lib/cjs/widget/components/ReportHorizontalTile.js.map +1 -0
  129. package/lib/cjs/widget/components/ReportMappingHorizontalTile.d.ts +13 -0
  130. package/lib/cjs/widget/components/ReportMappingHorizontalTile.d.ts.map +1 -0
  131. package/lib/cjs/widget/components/ReportMappingHorizontalTile.js +82 -0
  132. package/lib/cjs/widget/components/ReportMappingHorizontalTile.js.map +1 -0
  133. package/lib/cjs/widget/components/ReportMappings.d.ts +3 -1
  134. package/lib/cjs/widget/components/ReportMappings.d.ts.map +1 -1
  135. package/lib/cjs/widget/components/ReportMappings.js +39 -40
  136. package/lib/cjs/widget/components/ReportMappings.js.map +1 -1
  137. package/lib/cjs/widget/components/ReportMappings.scss +7 -7
  138. package/lib/cjs/widget/components/Reports.d.ts.map +1 -1
  139. package/lib/cjs/widget/components/Reports.js +43 -28
  140. package/lib/cjs/widget/components/Reports.js.map +1 -1
  141. package/lib/cjs/widget/components/Reports.scss +8 -4
  142. package/lib/cjs/widget/components/ReportsContainer.js +1 -1
  143. package/lib/cjs/widget/components/ReportsContainer.js.map +1 -1
  144. package/lib/cjs/widget/components/ReportsContainer.scss +2 -2
  145. package/lib/cjs/widget/components/SearchBar.js +1 -1
  146. package/lib/cjs/widget/components/SearchBar.js.map +1 -1
  147. package/lib/cjs/widget/components/SearchBar.scss +6 -0
  148. package/lib/cjs/widget/components/SelectIModel.js +2 -2
  149. package/lib/cjs/widget/components/SelectIModel.js.map +1 -1
  150. package/lib/cjs/widget/components/SelectIModel.scss +4 -3
  151. package/lib/cjs/widget/components/utils.js +1 -1
  152. package/lib/cjs/widget/components/utils.js.map +1 -1
  153. package/lib/cjs/widget/components/utils.scss +2 -2
  154. package/lib/esm/test/AddMappingModal.test.d.ts +2 -0
  155. package/lib/esm/test/AddMappingModal.test.d.ts.map +1 -0
  156. package/lib/esm/test/AddMappingModal.test.js +253 -0
  157. package/lib/esm/test/AddMappingModal.test.js.map +1 -0
  158. package/lib/esm/test/BulkExtractor.test.d.ts +2 -0
  159. package/lib/esm/test/BulkExtractor.test.d.ts.map +1 -0
  160. package/lib/esm/test/BulkExtractor.test.js +158 -0
  161. package/lib/esm/test/BulkExtractor.test.js.map +1 -0
  162. package/lib/esm/test/DeleteModal.test.d.ts +2 -0
  163. package/lib/esm/test/DeleteModal.test.d.ts.map +1 -0
  164. package/lib/esm/test/DeleteModal.test.js +69 -0
  165. package/lib/esm/test/DeleteModal.test.js.map +1 -0
  166. package/lib/esm/test/ReportAction.test.js +2 -3
  167. package/lib/esm/test/ReportAction.test.js.map +1 -1
  168. package/lib/esm/test/ReportMappingHorizontalTile.test.d.ts +2 -0
  169. package/lib/esm/test/ReportMappingHorizontalTile.test.d.ts.map +1 -0
  170. package/lib/esm/test/ReportMappingHorizontalTile.test.js +316 -0
  171. package/lib/esm/test/ReportMappingHorizontalTile.test.js.map +1 -0
  172. package/lib/esm/test/ReportMappings.test.js +117 -269
  173. package/lib/esm/test/ReportMappings.test.js.map +1 -1
  174. package/lib/esm/test/Reports.test.js +1 -1
  175. package/lib/esm/test/Reports.test.js.map +1 -1
  176. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  177. package/lib/esm/widget/components/ActionPanel.d.ts.map +1 -1
  178. package/lib/esm/widget/components/ActionPanel.js +4 -5
  179. package/lib/esm/widget/components/ActionPanel.js.map +1 -1
  180. package/lib/esm/widget/components/AddMappingsModal.d.ts +2 -2
  181. package/lib/esm/widget/components/AddMappingsModal.d.ts.map +1 -1
  182. package/lib/esm/widget/components/AddMappingsModal.js +4 -5
  183. package/lib/esm/widget/components/AddMappingsModal.js.map +1 -1
  184. package/lib/esm/widget/components/AddMappingsModal.scss +4 -3
  185. package/lib/esm/widget/components/BulkExtractor.d.ts +37 -0
  186. package/lib/esm/widget/components/BulkExtractor.d.ts.map +1 -0
  187. package/lib/esm/widget/components/BulkExtractor.js +152 -0
  188. package/lib/esm/widget/components/BulkExtractor.js.map +1 -0
  189. package/lib/esm/widget/components/Constants.d.ts +4 -0
  190. package/lib/esm/widget/components/Constants.d.ts.map +1 -0
  191. package/lib/esm/widget/components/Constants.js +8 -0
  192. package/lib/esm/widget/components/Constants.js.map +1 -0
  193. package/lib/esm/widget/components/DeleteModal.js +1 -1
  194. package/lib/esm/widget/components/DeleteModal.js.map +1 -1
  195. package/lib/esm/widget/components/DeleteModal.scss +4 -3
  196. package/lib/esm/widget/components/ExtractionStates/FailedExtractionState.d.ts +8 -0
  197. package/lib/esm/widget/components/ExtractionStates/FailedExtractionState.d.ts.map +1 -0
  198. package/lib/esm/widget/components/ExtractionStates/FailedExtractionState.js +16 -0
  199. package/lib/esm/widget/components/ExtractionStates/FailedExtractionState.js.map +1 -0
  200. package/lib/esm/widget/components/ExtractionStates/QueuedExtractionState.d.ts +3 -0
  201. package/lib/esm/widget/components/ExtractionStates/QueuedExtractionState.d.ts.map +1 -0
  202. package/lib/esm/widget/components/ExtractionStates/QueuedExtractionState.js +11 -0
  203. package/lib/esm/widget/components/ExtractionStates/QueuedExtractionState.js.map +1 -0
  204. package/lib/esm/widget/components/ExtractionStates/RunningExtractionState.d.ts +3 -0
  205. package/lib/esm/widget/components/ExtractionStates/RunningExtractionState.d.ts.map +1 -0
  206. package/lib/esm/widget/components/ExtractionStates/RunningExtractionState.js +10 -0
  207. package/lib/esm/widget/components/ExtractionStates/RunningExtractionState.js.map +1 -0
  208. package/lib/esm/widget/components/ExtractionStates/StartingExtractionState.d.ts +3 -0
  209. package/lib/esm/widget/components/ExtractionStates/StartingExtractionState.d.ts.map +1 -0
  210. package/lib/esm/widget/components/ExtractionStates/StartingExtractionState.js +11 -0
  211. package/lib/esm/widget/components/ExtractionStates/StartingExtractionState.js.map +1 -0
  212. package/lib/esm/widget/components/ExtractionStates/SucceededExtractionState.d.ts +8 -0
  213. package/lib/esm/widget/components/ExtractionStates/SucceededExtractionState.d.ts.map +1 -0
  214. package/lib/esm/widget/components/ExtractionStates/SucceededExtractionState.js +16 -0
  215. package/lib/esm/widget/components/ExtractionStates/SucceededExtractionState.js.map +1 -0
  216. package/lib/esm/widget/components/ExtractionStatus.d.ts +17 -0
  217. package/lib/esm/widget/components/ExtractionStatus.d.ts.map +1 -0
  218. package/lib/esm/widget/components/ExtractionStatus.js +53 -0
  219. package/lib/esm/widget/components/ExtractionStatus.js.map +1 -0
  220. package/{src/widget/components/Extraction.scss → lib/esm/widget/components/ExtractionStatus.scss} +17 -15
  221. package/lib/esm/widget/components/ExtractionToast.d.ts +11 -0
  222. package/lib/esm/widget/components/ExtractionToast.d.ts.map +1 -0
  223. package/lib/esm/widget/components/ExtractionToast.js +25 -0
  224. package/lib/esm/widget/components/ExtractionToast.js.map +1 -0
  225. package/lib/esm/widget/components/HorizontalTile.d.ts +8 -7
  226. package/lib/esm/widget/components/HorizontalTile.d.ts.map +1 -1
  227. package/lib/esm/widget/components/HorizontalTile.js +10 -6
  228. package/lib/esm/widget/components/HorizontalTile.js.map +1 -1
  229. package/lib/esm/widget/components/HorizontalTile.scss +42 -22
  230. package/lib/esm/widget/components/ReportAction.d.ts.map +1 -1
  231. package/lib/esm/widget/components/ReportAction.js +3 -3
  232. package/lib/esm/widget/components/ReportAction.js.map +1 -1
  233. package/lib/esm/widget/components/ReportAction.scss +2 -2
  234. package/lib/esm/widget/components/ReportHorizontalTile.d.ts +16 -0
  235. package/lib/esm/widget/components/ReportHorizontalTile.d.ts.map +1 -0
  236. package/lib/esm/widget/components/ReportHorizontalTile.js +64 -0
  237. package/lib/esm/widget/components/ReportHorizontalTile.js.map +1 -0
  238. package/lib/esm/widget/components/ReportMappingHorizontalTile.d.ts +13 -0
  239. package/lib/esm/widget/components/ReportMappingHorizontalTile.d.ts.map +1 -0
  240. package/lib/esm/widget/components/ReportMappingHorizontalTile.js +75 -0
  241. package/lib/esm/widget/components/ReportMappingHorizontalTile.js.map +1 -0
  242. package/lib/esm/widget/components/ReportMappings.d.ts +3 -1
  243. package/lib/esm/widget/components/ReportMappings.d.ts.map +1 -1
  244. package/lib/esm/widget/components/ReportMappings.js +40 -41
  245. package/lib/esm/widget/components/ReportMappings.js.map +1 -1
  246. package/lib/esm/widget/components/ReportMappings.scss +7 -7
  247. package/lib/esm/widget/components/Reports.d.ts.map +1 -1
  248. package/lib/esm/widget/components/Reports.js +45 -30
  249. package/lib/esm/widget/components/Reports.js.map +1 -1
  250. package/lib/esm/widget/components/Reports.scss +8 -4
  251. package/lib/esm/widget/components/ReportsContainer.js +1 -1
  252. package/lib/esm/widget/components/ReportsContainer.js.map +1 -1
  253. package/lib/esm/widget/components/ReportsContainer.scss +2 -2
  254. package/lib/esm/widget/components/SearchBar.js +1 -1
  255. package/lib/esm/widget/components/SearchBar.js.map +1 -1
  256. package/lib/esm/widget/components/SearchBar.scss +6 -0
  257. package/lib/esm/widget/components/SelectIModel.js +2 -2
  258. package/lib/esm/widget/components/SelectIModel.js.map +1 -1
  259. package/lib/esm/widget/components/SelectIModel.scss +4 -3
  260. package/lib/esm/widget/components/utils.js +1 -1
  261. package/lib/esm/widget/components/utils.js.map +1 -1
  262. package/lib/esm/widget/components/utils.scss +2 -2
  263. package/lib/public/locales/en/ReportsConfigWidget.json +7 -1
  264. package/package.json +9 -3
  265. package/public/locales/en/ReportsConfigWidget.json +7 -1
  266. package/reports-config-widget-react.build.error.log +10 -6
  267. package/reports-config-widget-react.build.log +51 -36
  268. package/src/test/AddMappingModal.test.tsx +315 -0
  269. package/src/test/BulkExtractor.test.ts +301 -0
  270. package/src/test/DeleteModal.test.tsx +118 -0
  271. package/src/test/ReportAction.test.tsx +2 -4
  272. package/src/test/ReportMappingHorizontalTile.test.tsx +451 -0
  273. package/src/test/ReportMappings.test.tsx +154 -549
  274. package/src/test/Reports.test.tsx +1 -1
  275. package/src/widget/components/ActionPanel.tsx +19 -23
  276. package/src/widget/components/AddMappingsModal.scss +4 -3
  277. package/src/widget/components/AddMappingsModal.tsx +4 -6
  278. package/src/widget/components/BulkExtractor.ts +192 -0
  279. package/src/widget/components/Constants.ts +7 -0
  280. package/src/widget/components/DeleteModal.scss +4 -3
  281. package/src/widget/components/DeleteModal.tsx +1 -1
  282. package/src/widget/components/ExtractionStates/FailedExtractionState.tsx +34 -0
  283. package/src/widget/components/ExtractionStates/QueuedExtractionState.tsx +20 -0
  284. package/src/widget/components/ExtractionStates/RunningExtractionState.tsx +18 -0
  285. package/src/widget/components/ExtractionStates/StartingExtractionState.tsx +22 -0
  286. package/src/widget/components/ExtractionStates/SucceededExtractionState.tsx +35 -0
  287. package/{lib/esm/widget/components/Extraction.scss → src/widget/components/ExtractionStatus.scss} +17 -15
  288. package/src/widget/components/ExtractionStatus.tsx +70 -0
  289. package/src/widget/components/ExtractionToast.tsx +41 -0
  290. package/src/widget/components/HorizontalTile.scss +42 -22
  291. package/src/widget/components/HorizontalTile.tsx +45 -34
  292. package/src/widget/components/ReportAction.scss +2 -2
  293. package/src/widget/components/ReportAction.tsx +1 -3
  294. package/src/widget/components/ReportHorizontalTile.tsx +130 -0
  295. package/src/widget/components/ReportMappingHorizontalTile.tsx +128 -0
  296. package/src/widget/components/ReportMappings.scss +7 -7
  297. package/src/widget/components/ReportMappings.tsx +91 -113
  298. package/src/widget/components/Reports.scss +8 -4
  299. package/src/widget/components/Reports.tsx +78 -62
  300. package/src/widget/components/ReportsContainer.scss +2 -2
  301. package/src/widget/components/ReportsContainer.tsx +1 -1
  302. package/src/widget/components/SearchBar.scss +6 -0
  303. package/src/widget/components/SearchBar.tsx +1 -1
  304. package/src/widget/components/SelectIModel.scss +4 -3
  305. package/src/widget/components/SelectIModel.tsx +2 -2
  306. package/src/widget/components/utils.scss +2 -2
  307. package/src/widget/components/utils.tsx +1 -1
  308. package/coverage/lcov-report/src/widget/components/Extraction.tsx.html +0 -1030
  309. package/lib/cjs/widget/components/Extraction.d.ts +0 -28
  310. package/lib/cjs/widget/components/Extraction.d.ts.map +0 -1
  311. package/lib/cjs/widget/components/Extraction.js +0 -190
  312. package/lib/cjs/widget/components/Extraction.js.map +0 -1
  313. package/lib/esm/widget/components/Extraction.d.ts +0 -28
  314. package/lib/esm/widget/components/Extraction.d.ts.map +0 -1
  315. package/lib/esm/widget/components/Extraction.js +0 -166
  316. package/lib/esm/widget/components/Extraction.js.map +0 -1
  317. package/src/widget/components/Extraction.tsx +0 -315
@@ -0,0 +1,118 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import React from "react";
6
+ import faker from "@faker-js/faker";
7
+ import "@testing-library/jest-dom";
8
+ import type {
9
+ IModelConnection,
10
+ SelectionSet,
11
+ SelectionSetEvent,
12
+ } from "@itwin/core-frontend";
13
+ import { NoRenderApp } from "@itwin/core-frontend";
14
+ import {
15
+ render,
16
+ screen,
17
+ TestUtils,
18
+ } from "./test-utils";
19
+ import * as moq from "typemoq";
20
+ import type {
21
+ SelectionManager,
22
+ SelectionScopesManager,
23
+ } from "@itwin/presentation-frontend";
24
+ import {
25
+ Presentation,
26
+ SelectionChangeEvent,
27
+ } from "@itwin/presentation-frontend";
28
+ import type { BeEvent } from "@itwin/core-bentley";
29
+ import DeleteModal from "../widget/components/DeleteModal";
30
+ import { ReportsConfigWidget } from "../ReportsConfigWidget";
31
+ import { EmptyLocalization } from "@itwin/core-common";
32
+
33
+ const mockITwinId = faker.datatype.uuid();
34
+ const mockIModelId1 = faker.datatype.uuid();
35
+
36
+ const connectionMock = moq.Mock.ofType<IModelConnection>();
37
+ const selectionManagerMock = moq.Mock.ofType<SelectionManager>();
38
+ const selectionScopesManagerMock = moq.Mock.ofType<SelectionScopesManager>();
39
+
40
+ beforeAll(async () => {
41
+ await NoRenderApp.startup({localization: new EmptyLocalization()});
42
+ await Presentation.initialize();
43
+ const selectionSet = moq.Mock.ofType<SelectionSet>();
44
+ const onChanged = moq.Mock.ofType<BeEvent<(ev: SelectionSetEvent) => void>>();
45
+ selectionSet.setup((x) => x.elements).returns(() => new Set([]));
46
+ selectionSet.setup((x) => x.onChanged).returns(() => onChanged.object);
47
+ connectionMock
48
+ .setup((x) => x.selectionSet)
49
+ .returns(() => selectionSet.object);
50
+ connectionMock.setup((x) => x.iModelId).returns(() => mockIModelId1);
51
+ connectionMock.setup((x) => x.iTwinId).returns(() => mockITwinId);
52
+
53
+ selectionManagerMock
54
+ .setup((x) => x.selectionChange)
55
+ .returns(() => new SelectionChangeEvent());
56
+
57
+ selectionScopesManagerMock
58
+ .setup(async (x) => x.getSelectionScopes(connectionMock.object))
59
+ .returns(async () => []);
60
+ selectionManagerMock
61
+ .setup((x) => x.scopes)
62
+ .returns(() => selectionScopesManagerMock.object);
63
+
64
+ Presentation.setSelectionManager(selectionManagerMock.object);
65
+ await TestUtils.initializeUiFramework(connectionMock.object);
66
+ await ReportsConfigWidget.initialize();
67
+ });
68
+
69
+ describe("Delete modal", () => {
70
+ it("should render", () => {
71
+ const { container } = render(
72
+ <DeleteModal
73
+ entityName="test"
74
+ show={true}
75
+ setShow={jest.fn()}
76
+ onDelete={jest.fn()}
77
+ refresh={jest.fn()}
78
+ />
79
+ );
80
+ expect(container).toBeTruthy();
81
+ });
82
+
83
+ it("should call onDelete when delete button is clicked", async () => {
84
+ const onDelete = jest.fn();
85
+ const { user } = render(
86
+ <DeleteModal
87
+ entityName="test"
88
+ show={true}
89
+ setShow={jest.fn()}
90
+ onDelete={onDelete}
91
+ refresh={jest.fn()}
92
+ />
93
+ );
94
+ const deleteButton = screen.getByRole("button", {
95
+ name: /delete/i,
96
+ });
97
+ await user.click(deleteButton);
98
+ expect(onDelete).toHaveBeenCalled();
99
+ });
100
+
101
+ it("should call setShow when cancel button is clicked", async () => {
102
+ const setShow = jest.fn();
103
+ const { user } = render(
104
+ <DeleteModal
105
+ entityName="test"
106
+ show={true}
107
+ setShow={setShow}
108
+ onDelete={jest.fn()}
109
+ refresh={jest.fn()}
110
+ />
111
+ );
112
+ const cancelButton = screen.getByRole("button", {
113
+ name: /cancel/i,
114
+ });
115
+ await user.click(cancelButton);
116
+ expect(setShow).toHaveBeenCalled();
117
+ });
118
+ });
@@ -34,6 +34,7 @@ import {
34
34
  SelectionChangeEvent,
35
35
  } from "@itwin/presentation-frontend";
36
36
  import type { BeEvent } from "@itwin/core-bentley";
37
+ import { EmptyLocalization } from "@itwin/core-common";
37
38
 
38
39
  const mockITwinId = faker.datatype.uuid();
39
40
  const mockIModelId = faker.datatype.uuid();
@@ -54,10 +55,7 @@ jest.mock("@itwin/appui-react", () => ({
54
55
  const server = setupServer();
55
56
 
56
57
  beforeAll(async () => {
57
- // This is required by the i18n module within iTwin.js
58
- (global as any).XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; // eslint-disable-line @typescript-eslint/no-var-requires
59
-
60
- await NoRenderApp.startup();
58
+ await NoRenderApp.startup({localization: new EmptyLocalization()});
61
59
  await Presentation.initialize();
62
60
  const selectionSet = moq.Mock.ofType<SelectionSet>();
63
61
  const onChanged = moq.Mock.ofType<BeEvent<(ev: SelectionSetEvent) => void>>();
@@ -0,0 +1,451 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import React from "react";
6
+ import faker from "@faker-js/faker";
7
+ import "@testing-library/jest-dom";
8
+ import type {
9
+ IModelConnection,
10
+ SelectionSet,
11
+ SelectionSetEvent,
12
+ } from "@itwin/core-frontend";
13
+ import { NoRenderApp } from "@itwin/core-frontend";
14
+ import { ReportsConfigWidget } from "../ReportsConfigWidget";
15
+ import {
16
+ fireEvent,
17
+ render,
18
+ screen,
19
+ TestUtils,
20
+ waitFor,
21
+ within,
22
+ } from "./test-utils";
23
+ import * as moq from "typemoq";
24
+ import type {
25
+ MappingSingle,
26
+ ReportMappingCollection,
27
+ } from "@itwin/insights-client";
28
+ import type { ReportMappingAndMapping } from "../widget/components/ReportMappings";
29
+ import type { GetSingleIModelParams, IModelOperations, OperationOptions } from "@itwin/imodels-client-management";
30
+ import { IModelState } from "@itwin/imodels-client-management";
31
+ import type {
32
+ SelectionManager,
33
+ SelectionScopesManager,
34
+ } from "@itwin/presentation-frontend";
35
+ import {
36
+ Presentation,
37
+ SelectionChangeEvent,
38
+ } from "@itwin/presentation-frontend";
39
+ import { BeEvent } from "@itwin/core-bentley";
40
+ import type BulkExtractor from "../widget/components/BulkExtractor";
41
+ import { ExtractionStates } from "../widget/components/ExtractionStatus";
42
+ import { ReportMappingHorizontalTile } from "../widget/components/ReportMappingHorizontalTile";
43
+ import { EmptyLocalization } from "@itwin/core-common";
44
+
45
+ const mockITwinId = faker.datatype.uuid();
46
+ // Lets work with two iModels for now.
47
+ const mockIModelId1 = faker.datatype.uuid();
48
+ const mockIModelId2 = faker.datatype.uuid();
49
+
50
+ const mockReportId = faker.datatype.uuid();
51
+
52
+ const mockIModelsResponse = [
53
+ {
54
+ iModel: {
55
+ id: mockIModelId1,
56
+ displayName: "rAnDoMdIsPlAynAmE1",
57
+ name: "rAnDomName1",
58
+ description: "rAnDoMDeScRiPtIoN1",
59
+ createdDateTime: "2021-10-04T22:13:50.397Z",
60
+ state: IModelState.Initialized,
61
+ projectId: mockITwinId,
62
+ extent: null,
63
+ _links: {
64
+ creator: {
65
+ href: "",
66
+ },
67
+ namedVersions: {
68
+ href: "",
69
+ },
70
+ changesets: {
71
+ href: "",
72
+ },
73
+ },
74
+ },
75
+ },
76
+ {
77
+ iModel: {
78
+ id: mockIModelId2,
79
+ displayName: "rAnDoMdIsPlAynAmE2",
80
+ name: "rAnDomName2",
81
+ description: "rAnDoMDeScRiPtIoN2",
82
+ createdDateTime: "2021-10-04T22:13:50.397Z",
83
+ state: IModelState.Initialized,
84
+ projectId: mockITwinId,
85
+ extent: null,
86
+ _links: {
87
+ creator: {
88
+ href: "",
89
+ },
90
+ namedVersions: {
91
+ href: "",
92
+ },
93
+ changesets: {
94
+ href: "",
95
+ },
96
+ },
97
+ },
98
+ },
99
+ ];
100
+
101
+ const mockProjectIModels = {
102
+ iModels: mockIModelsResponse.map((iModel) => ({
103
+ id: iModel.iModel.id,
104
+ displayName: iModel.iModel.displayName,
105
+ })),
106
+ _links: {
107
+ self: {
108
+ href: "",
109
+ },
110
+ prev: null,
111
+ next: null,
112
+ },
113
+ };
114
+
115
+ const mockReportMappingsFactory = (): ReportMappingCollection => {
116
+ return {
117
+ mappings: [
118
+ {
119
+ reportId: mockReportId,
120
+ mappingId: faker.datatype.uuid(),
121
+ imodelId: mockIModelId1,
122
+ _links: {
123
+ report: {
124
+ href: "",
125
+ },
126
+ mapping: {
127
+ href: "",
128
+ },
129
+ imodel: {
130
+ href: "",
131
+ },
132
+ },
133
+ },
134
+ {
135
+ reportId: mockReportId,
136
+ mappingId: faker.datatype.uuid(),
137
+ imodelId: mockIModelId1,
138
+ _links: {
139
+ report: {
140
+ href: "",
141
+ },
142
+ mapping: {
143
+ href: "",
144
+ },
145
+ imodel: {
146
+ href: "",
147
+ },
148
+ },
149
+ },
150
+ ],
151
+ _links: {
152
+ next: undefined,
153
+ self: {
154
+ href: "",
155
+ },
156
+ },
157
+ };
158
+ };
159
+
160
+ const mockMappingsFactory = (
161
+ mockReportMappings: ReportMappingCollection
162
+ ): MappingSingle[] => {
163
+ const mockMappings: MappingSingle[] = mockReportMappings.mappings.map(
164
+ (mapping, index) => ({
165
+ mapping: {
166
+ id: mapping.mappingId,
167
+ mappingName: `mOcKMaPpIngNaMe${index}`,
168
+ description: `mOcKmApPInGDeScRiPtIoN${index}`,
169
+ extractionEnabled: false,
170
+ createdOn: "",
171
+ createdBy: "",
172
+ modifiedOn: "",
173
+ modifiedBy: "",
174
+ _links: {
175
+ imodel: {
176
+ // Tie the mapping to to the iModel Id
177
+ href: mapping.imodelId,
178
+ },
179
+ },
180
+ },
181
+ })
182
+ );
183
+
184
+ return mockMappings;
185
+ };
186
+
187
+ const mockReportMappingsAndMappingsFactory = (): ReportMappingAndMapping[] => {
188
+ const reportMappings = mockReportMappingsFactory();
189
+ const mockMappings = mockMappingsFactory(reportMappings);
190
+ const reportMappingsAndMapping =
191
+ reportMappings.mappings.map((reportMapping) => {
192
+ const mapping = mockMappings.find((x) => x.mapping.id === reportMapping.mappingId)!.mapping;
193
+ const iModelName = mockProjectIModels.iModels.find((x) => x.id === reportMapping.imodelId)!.displayName;
194
+ const reportMappingAndMapping: ReportMappingAndMapping = {
195
+ ...reportMapping,
196
+ iModelName,
197
+ mappingName: mapping.mappingName,
198
+ mappingDescription: mapping.description ?? "",
199
+ };
200
+ return reportMappingAndMapping;
201
+ });
202
+ return reportMappingsAndMapping;
203
+ };
204
+
205
+ const connectionMock = moq.Mock.ofType<IModelConnection>();
206
+ const mockBulkExtractor = moq.Mock.ofType<BulkExtractor>();
207
+ const selectionManagerMock = moq.Mock.ofType<SelectionManager>();
208
+ const selectionScopesManagerMock = moq.Mock.ofType<SelectionScopesManager>();
209
+ const mockIModelsClient = moq.Mock.ofType<IModelOperations<OperationOptions>>();
210
+
211
+ jest.mock("../widget/components/Constants.ts", () => ({
212
+ STATUS_CHECK_INTERVAL: 10,
213
+ }));
214
+
215
+ jest.mock("@itwin/appui-react", () => ({
216
+ ...jest.requireActual("@itwin/appui-react"),
217
+ useActiveIModelConnection: () => connectionMock.object,
218
+ }));
219
+
220
+ const mockOdataFeedUrl = "mockOdataFeedUrl";
221
+
222
+ beforeAll(async () => {
223
+ await NoRenderApp.startup({localization: new EmptyLocalization()});
224
+ await Presentation.initialize();
225
+ const selectionSet = moq.Mock.ofType<SelectionSet>();
226
+ const onChanged = moq.Mock.ofType<BeEvent<(ev: SelectionSetEvent) => void>>();
227
+ selectionSet.setup((x) => x.elements).returns(() => new Set([]));
228
+ selectionSet.setup((x) => x.onChanged).returns(() => onChanged.object);
229
+ connectionMock
230
+ .setup((x) => x.selectionSet)
231
+ .returns(() => selectionSet.object);
232
+ connectionMock.setup((x) => x.iModelId).returns(() => mockIModelId1);
233
+ connectionMock.setup((x) => x.iTwinId).returns(() => mockITwinId);
234
+
235
+ selectionManagerMock
236
+ .setup((x) => x.selectionChange)
237
+ .returns(() => new SelectionChangeEvent());
238
+
239
+ selectionScopesManagerMock
240
+ .setup(async (x) => x.getSelectionScopes(connectionMock.object))
241
+ .returns(async () => []);
242
+ selectionManagerMock
243
+ .setup((x) => x.scopes)
244
+ .returns(() => selectionScopesManagerMock.object);
245
+
246
+ Presentation.setSelectionManager(selectionManagerMock.object);
247
+ await TestUtils.initializeUiFramework(connectionMock.object);
248
+ await ReportsConfigWidget.initialize();
249
+ });
250
+
251
+ afterAll(() => {
252
+ TestUtils.terminateUiFramework();
253
+ });
254
+
255
+ afterEach(() => {
256
+ mockIModelsClient.reset();
257
+ mockBulkExtractor.reset();
258
+ });
259
+
260
+ describe("Report Mapping Horizontal Tile", () => {
261
+ it("tile renders correctly", async () => {
262
+ const firstMockMapping = mockReportMappingsAndMappingsFactory()[0];
263
+
264
+ mockBulkExtractor.setup(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl))
265
+ .returns(async () => ExtractionStates.None);
266
+
267
+ render(<ReportMappingHorizontalTile
268
+ jobStartEvent={new BeEvent()}
269
+ mapping={firstMockMapping}
270
+ onClickDelete={() => { }}
271
+ bulkExtractor={mockBulkExtractor.object}
272
+ odataFeedUrl={mockOdataFeedUrl}
273
+ />);
274
+
275
+ mockBulkExtractor.verify(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl), moq.Times.once());
276
+ await waitFor(() => expect(screen.getByRole("button", { name: /UpdateDataset/i })).not.toBeDisabled(), { timeout: 1000 });
277
+
278
+ expect(screen.getByText(firstMockMapping.mappingName)).toBeInTheDocument();
279
+ expect(screen.getByTitle(firstMockMapping.mappingDescription)).toBeInTheDocument();
280
+ expect(screen.getByText(firstMockMapping.iModelName)).toBeInTheDocument();
281
+ expect(screen.getByRole("button", { name: /UpdateDataset/i })).toBeInTheDocument();
282
+ expect(screen.getByRole("button", { name: /Remove/i })).toBeInTheDocument();
283
+ });
284
+
285
+ it("starting extraction sends request", async () => {
286
+ const firstMockMapping = mockReportMappingsAndMappingsFactory()[0];
287
+
288
+ mockBulkExtractor.setup(async (x) => x.runIModelExtraction(firstMockMapping.imodelId))
289
+ .returns(async () => { return Promise.resolve(); });
290
+
291
+ mockBulkExtractor.setup(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl))
292
+ .returns(async () => ExtractionStates.None);
293
+
294
+ const jobStartEvent = new BeEvent<(iModelId: string) => void>();
295
+
296
+ const { user } = render(<ReportMappingHorizontalTile
297
+ jobStartEvent={jobStartEvent}
298
+ mapping={firstMockMapping}
299
+ onClickDelete={() => { }}
300
+ bulkExtractor={mockBulkExtractor.object}
301
+ odataFeedUrl={mockOdataFeedUrl}
302
+ />);
303
+
304
+ mockBulkExtractor.verify(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl), moq.Times.once());
305
+ await waitFor(() => expect(screen.getByRole("button", { name: /UpdateDataset/i })).not.toBeDisabled(), { timeout: 1000 });
306
+
307
+ const startExtractionButton = screen.getByRole("button", { name: /UpdateDataset/i });
308
+ await user.click(startExtractionButton);
309
+
310
+ mockBulkExtractor.verify(async (x) => x.runIModelExtraction(firstMockMapping.imodelId), moq.Times.once());
311
+ });
312
+
313
+ it("on delete is called when remove is pressed", async () => {
314
+ const firstMockMapping = mockReportMappingsAndMappingsFactory()[0];
315
+
316
+ mockBulkExtractor.setup(async (x) => x.runIModelExtraction(firstMockMapping.imodelId))
317
+ .returns(async () => { return Promise.resolve(); });
318
+
319
+ mockBulkExtractor.setup(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl))
320
+ .returns(async () => ExtractionStates.None);
321
+
322
+ const mockOnClickDelete = jest.fn();
323
+
324
+ const jobStartEvent = new BeEvent<(iModelId: string) => void>();
325
+
326
+ const { user } = render(<ReportMappingHorizontalTile
327
+ jobStartEvent={jobStartEvent}
328
+ mapping={firstMockMapping}
329
+ onClickDelete={mockOnClickDelete}
330
+ bulkExtractor={mockBulkExtractor.object}
331
+ odataFeedUrl={mockOdataFeedUrl}
332
+ />);
333
+
334
+ await waitFor(() => expect(screen.getByRole("button", { name: /Remove/i })).not.toBeDisabled(), { timeout: 1000 });
335
+
336
+ const removeButton = screen.getByRole("button", { name: /Remove/i });
337
+ await user.click(removeButton);
338
+
339
+ expect(mockOnClickDelete).toBeCalledTimes(1);
340
+ });
341
+
342
+ it("full extraction status cycle", async () => {
343
+ const firstMockMapping = mockReportMappingsAndMappingsFactory()[0];
344
+
345
+ mockIModelsClient.setup(async (x) => x.getSingle(moq.It.isObjectWith<GetSingleIModelParams>({ iModelId: mockIModelId1 })))
346
+ .returns(async () => mockIModelsResponse[0].iModel);
347
+
348
+ mockBulkExtractor.setup(async (x) => x.runIModelExtraction(firstMockMapping.imodelId))
349
+ .returns(async () => { return Promise.resolve(); });
350
+
351
+ mockBulkExtractor.setup(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl))
352
+ .returns(async () => ExtractionStates.None);
353
+
354
+ const mockOnClickDelete = jest.fn();
355
+
356
+ const jobStartEvent = new BeEvent<(iModelId: string) => void>();
357
+
358
+ const { user } = render(<ReportMappingHorizontalTile
359
+ jobStartEvent={jobStartEvent}
360
+ mapping={firstMockMapping}
361
+ onClickDelete={mockOnClickDelete}
362
+ bulkExtractor={mockBulkExtractor.object}
363
+ odataFeedUrl={mockOdataFeedUrl}
364
+ />);
365
+
366
+ await waitFor(() => expect(screen.getByRole("button", { name: /UpdateDataset/i })).not.toBeDisabled(), { timeout: 1000 });
367
+
368
+ mockBulkExtractor.setup(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl))
369
+ .returns(async () => ExtractionStates.Starting);
370
+
371
+ const startExtractionButton = screen.getByRole("button", { name: /UpdateDataset/i });
372
+ await user.click(startExtractionButton);
373
+
374
+ mockBulkExtractor.verify(async (x) => x.runIModelExtraction(firstMockMapping.imodelId), moq.Times.once());
375
+
376
+ expect(screen.getByTitle(/Starting/i)).toBeInTheDocument();
377
+
378
+ mockBulkExtractor.reset();
379
+ mockBulkExtractor.setup(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl))
380
+ .returns(async () => ExtractionStates.Queued);
381
+
382
+ await waitFor(() => expect(screen.getByTitle(/Queued/i)).toBeInTheDocument(), { timeout: 1000 });
383
+
384
+ mockBulkExtractor.reset();
385
+ mockBulkExtractor.setup(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl))
386
+ .returns(async () => ExtractionStates.Running);
387
+ await waitFor(() => expect(screen.getByTitle(/Running/i)).toBeInTheDocument(), { timeout: 1000 });
388
+
389
+ mockBulkExtractor.reset();
390
+ mockBulkExtractor.setup(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl))
391
+ .returns(async () => ExtractionStates.Succeeded);
392
+ await waitFor(() => expect(screen.getByTitle(/Success/i)).toBeInTheDocument(), { timeout: 1000 });
393
+
394
+ mockBulkExtractor.reset();
395
+ fireEvent.animationEnd(screen.getByTestId("rcw-success-animation"));
396
+ await waitFor(() => expect(screen.getByRole("button", { name: /UpdateDataset/i })).toBeInTheDocument(), { timeout: 1000 });
397
+ });
398
+
399
+ it("second tile should update status", async () => {
400
+ const mockReportMappingsAndMappings = mockReportMappingsAndMappingsFactory();
401
+ const firstMockMapping = mockReportMappingsAndMappings[0];
402
+ const secondMockMapping = mockReportMappingsAndMappings[1];
403
+
404
+ mockBulkExtractor.setup(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl))
405
+ .returns(async () => ExtractionStates.None);
406
+
407
+ const jobStartEvent = new BeEvent<(iModelId: string) => void>();
408
+
409
+ const { user } = render(
410
+ <div>
411
+ <ReportMappingHorizontalTile
412
+ jobStartEvent={jobStartEvent}
413
+ mapping={firstMockMapping}
414
+ onClickDelete={() => { }}
415
+ bulkExtractor={mockBulkExtractor.object}
416
+ odataFeedUrl={mockOdataFeedUrl}
417
+ />
418
+ <ReportMappingHorizontalTile
419
+ jobStartEvent={jobStartEvent}
420
+ mapping={secondMockMapping}
421
+ onClickDelete={() => { }}
422
+ bulkExtractor={mockBulkExtractor.object}
423
+ odataFeedUrl={mockOdataFeedUrl}
424
+ />
425
+ </div>);
426
+
427
+ const tiles = screen.getAllByTestId("horizontal-tile");
428
+
429
+ for (const tile of tiles) {
430
+ const preview = within(tile);
431
+ await waitFor(() => expect(preview.getByRole("button", { name: /UpdateDataset/i })).not.toBeDisabled(), { timeout: 1000 });
432
+ }
433
+
434
+ mockBulkExtractor.reset();
435
+ mockBulkExtractor.setup(async (x) => x.getIModelState(firstMockMapping.imodelId, firstMockMapping.iModelName, mockOdataFeedUrl))
436
+ .returns(async () => ExtractionStates.Queued);
437
+
438
+ mockBulkExtractor.setup(async (x) => x.runIModelExtraction(firstMockMapping.imodelId))
439
+ .returns(async () => { return Promise.resolve(); });
440
+
441
+ const startExtractionButton = screen.getAllByRole("button", { name: /UpdateDataset/i })[0];
442
+ await user.click(startExtractionButton);
443
+
444
+ for (const tile of tiles) {
445
+ const preview = within(tile);
446
+ await waitFor(() => expect(preview.getByTitle(/Queued/i)).toBeInTheDocument(), { timeout: 1000 });
447
+ }
448
+
449
+ expect(screen.getAllByTitle(/Queued/i)).toHaveLength(2);
450
+ });
451
+ });