@itwin/reports-config-widget-react 0.2.1 → 0.4.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 (343) hide show
  1. package/.rush/temp/operation/rebuild/all.log +9 -0
  2. package/.rush/temp/operation/rebuild/state.json +3 -0
  3. package/.rush/temp/package-deps_rebuild.json +48 -44
  4. package/.rush/temp/shrinkwrap-deps.json +228 -207
  5. package/CHANGELOG.json +44 -0
  6. package/CHANGELOG.md +24 -1
  7. package/coverage/clover.xml +562 -542
  8. package/coverage/coverage-final.json +24 -20
  9. package/coverage/lcov-report/index.html +51 -51
  10. package/coverage/lcov-report/src/ReportsConfigWidget.ts.html +22 -22
  11. package/coverage/lcov-report/src/index.html +21 -21
  12. package/coverage/lcov-report/src/test/index.html +11 -11
  13. package/coverage/lcov-report/src/test/test-utils.tsx.html +20 -140
  14. package/coverage/lcov-report/src/widget/ReportsConfigUiProvider.tsx.html +14 -35
  15. package/coverage/lcov-report/src/widget/components/ActionPanel.tsx.html +26 -20
  16. package/coverage/lcov-report/src/widget/components/AddMappingsModal.tsx.html +94 -109
  17. package/coverage/lcov-report/src/widget/components/BulkExtractor.ts.html +55 -52
  18. package/coverage/lcov-report/src/widget/components/Constants.ts.html +1 -1
  19. package/coverage/lcov-report/src/widget/components/DeleteModal.tsx.html +28 -46
  20. package/coverage/lcov-report/src/widget/components/ExtractionStates/FailedExtractionState.tsx.html +1 -1
  21. package/coverage/lcov-report/src/widget/components/ExtractionStates/QueuedExtractionState.tsx.html +1 -1
  22. package/coverage/lcov-report/src/widget/components/ExtractionStates/RunningExtractionState.tsx.html +1 -1
  23. package/coverage/lcov-report/src/widget/components/ExtractionStates/StartingExtractionState.tsx.html +1 -1
  24. package/coverage/lcov-report/src/widget/components/ExtractionStates/SucceededExtractionState.tsx.html +1 -1
  25. package/coverage/lcov-report/src/widget/components/ExtractionStates/index.html +1 -1
  26. package/coverage/lcov-report/src/widget/components/ExtractionStatus.tsx.html +1 -1
  27. package/coverage/lcov-report/src/widget/components/ExtractionToast.tsx.html +1 -1
  28. package/coverage/lcov-report/src/widget/components/HorizontalTile.tsx.html +3 -3
  29. package/coverage/lcov-report/src/widget/components/LocalizedTablePaginator.tsx.html +8 -8
  30. package/coverage/lcov-report/src/widget/components/ReportAction.tsx.html +36 -81
  31. package/coverage/lcov-report/src/widget/components/ReportHorizontalTile.tsx.html +38 -41
  32. package/coverage/lcov-report/src/widget/components/ReportMappingHorizontalTile.tsx.html +46 -46
  33. package/coverage/lcov-report/src/widget/components/ReportMappings.tsx.html +127 -142
  34. package/coverage/lcov-report/src/widget/components/Reports.tsx.html +189 -312
  35. package/coverage/lcov-report/src/widget/components/ReportsConfigContext.tsx.html +370 -0
  36. package/coverage/lcov-report/src/widget/components/ReportsContainer.tsx.html +111 -33
  37. package/coverage/lcov-report/src/widget/components/ReportsHeader.tsx.html +166 -0
  38. package/coverage/lcov-report/src/widget/components/ReportsRouter.tsx.html +274 -0
  39. package/coverage/lcov-report/src/widget/components/SearchBar.tsx.html +22 -7
  40. package/coverage/lcov-report/src/widget/components/SelectIModel.tsx.html +40 -94
  41. package/coverage/lcov-report/src/widget/components/index.html +142 -97
  42. package/coverage/lcov-report/src/widget/components/utils.tsx.html +22 -19
  43. package/coverage/lcov-report/src/widget/context/{ReportsApiConfigContext.tsx.html → BulkExtractorContext.tsx.html} +23 -26
  44. package/coverage/lcov-report/src/widget/context/ReportsConfigApiContext.tsx.html +202 -0
  45. package/coverage/lcov-report/src/widget/context/index.html +30 -15
  46. package/coverage/lcov-report/src/widget/hooks/index.html +1 -1
  47. package/coverage/lcov-report/src/widget/hooks/useValidator.ts.html +11 -11
  48. package/coverage/lcov-report/src/widget/index.html +13 -13
  49. package/coverage/lcov.info +1036 -1034
  50. package/jest.config.js +1 -0
  51. package/lib/cjs/ReportsConfigWidget.js +1 -1
  52. package/lib/cjs/ReportsConfigWidget.js.map +1 -1
  53. package/lib/cjs/reports-config-widget-react.d.ts +5 -0
  54. package/lib/cjs/reports-config-widget-react.d.ts.map +1 -1
  55. package/lib/cjs/reports-config-widget-react.js +11 -0
  56. package/lib/cjs/reports-config-widget-react.js.map +1 -1
  57. package/lib/cjs/test/AddMappingModal.test.js +20 -34
  58. package/lib/cjs/test/AddMappingModal.test.js.map +1 -1
  59. package/lib/cjs/test/BulkExtractor.test.js +13 -19
  60. package/lib/cjs/test/BulkExtractor.test.js.map +1 -1
  61. package/lib/cjs/test/DeleteModal.test.d.ts.map +1 -1
  62. package/lib/cjs/test/DeleteModal.test.js +4 -62
  63. package/lib/cjs/test/DeleteModal.test.js.map +1 -1
  64. package/lib/cjs/test/ReportAction.test.js +14 -79
  65. package/lib/cjs/test/ReportAction.test.js.map +1 -1
  66. package/lib/cjs/test/ReportMappingHorizontalTile.test.js +20 -54
  67. package/lib/cjs/test/ReportMappingHorizontalTile.test.js.map +1 -1
  68. package/lib/cjs/test/ReportMappings.test.d.ts.map +1 -1
  69. package/lib/cjs/test/ReportMappings.test.js +51 -106
  70. package/lib/cjs/test/ReportMappings.test.js.map +1 -1
  71. package/lib/cjs/test/Reports.test.js +41 -96
  72. package/lib/cjs/test/Reports.test.js.map +1 -1
  73. package/lib/cjs/test/WidgetHeader.test.js +9 -3
  74. package/lib/cjs/test/WidgetHeader.test.js.map +1 -1
  75. package/lib/cjs/test/test-utils.d.ts +3 -8
  76. package/lib/cjs/test/test-utils.d.ts.map +1 -1
  77. package/lib/cjs/test/test-utils.js +6 -34
  78. package/lib/cjs/test/test-utils.js.map +1 -1
  79. package/lib/cjs/tsconfig.tsbuildinfo +1 -1
  80. package/lib/cjs/widget/ReportsConfigUiProvider.d.ts +3 -3
  81. package/lib/cjs/widget/ReportsConfigUiProvider.d.ts.map +1 -1
  82. package/lib/cjs/widget/ReportsConfigUiProvider.js +5 -7
  83. package/lib/cjs/widget/ReportsConfigUiProvider.js.map +1 -1
  84. package/lib/cjs/widget/components/ActionPanel.d.ts +3 -3
  85. package/lib/cjs/widget/components/ActionPanel.d.ts.map +1 -1
  86. package/lib/cjs/widget/components/ActionPanel.js +4 -4
  87. package/lib/cjs/widget/components/ActionPanel.js.map +1 -1
  88. package/lib/cjs/widget/components/ActionPanel.scss +2 -3
  89. package/lib/cjs/widget/components/AddMappingsModal.d.ts +4 -4
  90. package/lib/cjs/widget/components/AddMappingsModal.d.ts.map +1 -1
  91. package/lib/cjs/widget/components/AddMappingsModal.js +39 -43
  92. package/lib/cjs/widget/components/AddMappingsModal.js.map +1 -1
  93. package/lib/cjs/widget/components/AddMappingsModal.scss +1 -2
  94. package/lib/cjs/widget/components/BulkExtractor.d.ts +4 -4
  95. package/lib/cjs/widget/components/BulkExtractor.d.ts.map +1 -1
  96. package/lib/cjs/widget/components/BulkExtractor.js +8 -8
  97. package/lib/cjs/widget/components/BulkExtractor.js.map +1 -1
  98. package/lib/cjs/widget/components/DeleteModal.d.ts +4 -5
  99. package/lib/cjs/widget/components/DeleteModal.d.ts.map +1 -1
  100. package/lib/cjs/widget/components/DeleteModal.js +11 -15
  101. package/lib/cjs/widget/components/DeleteModal.js.map +1 -1
  102. package/lib/cjs/widget/components/DeleteModal.scss +2 -3
  103. package/lib/cjs/widget/components/ExtractionStatus.js +2 -2
  104. package/lib/cjs/widget/components/ExtractionStatus.js.map +1 -1
  105. package/lib/cjs/widget/components/ExtractionStatus.scss +6 -7
  106. package/lib/cjs/widget/components/HorizontalTile.js +2 -2
  107. package/lib/cjs/widget/components/HorizontalTile.js.map +1 -1
  108. package/lib/cjs/widget/components/HorizontalTile.scss +11 -14
  109. package/lib/cjs/widget/components/LocalizedTablePaginator.js +2 -2
  110. package/lib/cjs/widget/components/LocalizedTablePaginator.js.map +1 -1
  111. package/lib/cjs/widget/components/ReportAction.d.ts +4 -5
  112. package/lib/cjs/widget/components/ReportAction.d.ts.map +1 -1
  113. package/lib/cjs/widget/components/ReportAction.js +24 -26
  114. package/lib/cjs/widget/components/ReportAction.js.map +1 -1
  115. package/lib/cjs/widget/components/ReportAction.scss +1 -2
  116. package/lib/cjs/widget/components/ReportHorizontalTile.d.ts +4 -4
  117. package/lib/cjs/widget/components/ReportHorizontalTile.d.ts.map +1 -1
  118. package/lib/cjs/widget/components/ReportHorizontalTile.js +33 -20
  119. package/lib/cjs/widget/components/ReportHorizontalTile.js.map +1 -1
  120. package/lib/cjs/widget/components/ReportMappingHorizontalTile.d.ts +1 -1
  121. package/lib/cjs/widget/components/ReportMappingHorizontalTile.d.ts.map +1 -1
  122. package/lib/cjs/widget/components/ReportMappingHorizontalTile.js +36 -21
  123. package/lib/cjs/widget/components/ReportMappingHorizontalTile.js.map +1 -1
  124. package/lib/cjs/widget/components/ReportMappings.d.ts +4 -6
  125. package/lib/cjs/widget/components/ReportMappings.d.ts.map +1 -1
  126. package/lib/cjs/widget/components/ReportMappings.js +50 -63
  127. package/lib/cjs/widget/components/ReportMappings.js.map +1 -1
  128. package/lib/cjs/widget/components/ReportMappings.scss +10 -11
  129. package/lib/cjs/widget/components/Reports.d.ts +6 -1
  130. package/lib/cjs/widget/components/Reports.d.ts.map +1 -1
  131. package/lib/cjs/widget/components/Reports.js +53 -94
  132. package/lib/cjs/widget/components/Reports.js.map +1 -1
  133. package/lib/cjs/widget/components/Reports.scss +15 -15
  134. package/lib/cjs/widget/components/ReportsConfigContext.d.ts +18 -0
  135. package/lib/cjs/widget/components/ReportsConfigContext.d.ts.map +1 -0
  136. package/lib/cjs/widget/components/ReportsConfigContext.js +79 -0
  137. package/lib/cjs/widget/components/ReportsConfigContext.js.map +1 -0
  138. package/lib/cjs/widget/components/ReportsContainer.d.ts +14 -0
  139. package/lib/cjs/widget/components/ReportsContainer.d.ts.map +1 -1
  140. package/lib/cjs/widget/components/ReportsContainer.js +27 -16
  141. package/lib/cjs/widget/components/ReportsContainer.js.map +1 -1
  142. package/lib/cjs/widget/components/ReportsContainer.scss +1 -3
  143. package/lib/cjs/widget/components/ReportsHeader.d.ts +7 -0
  144. package/lib/cjs/widget/components/ReportsHeader.d.ts.map +1 -0
  145. package/lib/cjs/widget/components/ReportsHeader.js +20 -0
  146. package/lib/cjs/widget/components/ReportsHeader.js.map +1 -0
  147. package/lib/cjs/widget/components/ReportsRouter.d.ts +8 -0
  148. package/lib/cjs/widget/components/ReportsRouter.d.ts.map +1 -0
  149. package/lib/cjs/widget/components/ReportsRouter.js +51 -0
  150. package/lib/cjs/widget/components/ReportsRouter.js.map +1 -0
  151. package/lib/cjs/widget/components/SearchBar.d.ts.map +1 -1
  152. package/lib/cjs/widget/components/SearchBar.js +4 -5
  153. package/lib/cjs/widget/components/SearchBar.js.map +1 -1
  154. package/lib/cjs/widget/components/SearchBar.scss +1 -2
  155. package/lib/cjs/widget/components/SelectIModel.d.ts +3 -3
  156. package/lib/cjs/widget/components/SelectIModel.d.ts.map +1 -1
  157. package/lib/cjs/widget/components/SelectIModel.js +10 -30
  158. package/lib/cjs/widget/components/SelectIModel.js.map +1 -1
  159. package/lib/cjs/widget/components/SelectIModel.scss +2 -3
  160. package/lib/cjs/widget/components/utils.d.ts +1 -1
  161. package/lib/cjs/widget/components/utils.d.ts.map +1 -1
  162. package/lib/cjs/widget/components/utils.js +1 -1
  163. package/lib/cjs/widget/components/utils.js.map +1 -1
  164. package/lib/cjs/widget/components/utils.scss +16 -8
  165. package/lib/cjs/widget/context/BulkExtractorContext.d.ts +10 -0
  166. package/lib/cjs/widget/context/BulkExtractorContext.d.ts.map +1 -0
  167. package/lib/cjs/widget/context/{ReportsApiConfigContext.js → BulkExtractorContext.js} +7 -10
  168. package/lib/cjs/widget/context/BulkExtractorContext.js.map +1 -0
  169. package/lib/cjs/widget/context/ReportsConfigApiContext.d.ts +16 -0
  170. package/lib/cjs/widget/context/ReportsConfigApiContext.d.ts.map +1 -0
  171. package/lib/cjs/widget/context/ReportsConfigApiContext.js +43 -0
  172. package/lib/cjs/widget/context/ReportsConfigApiContext.js.map +1 -0
  173. package/lib/cjs/widget/hooks/useValidator.js +1 -1
  174. package/lib/cjs/widget/hooks/useValidator.js.map +1 -1
  175. package/lib/esm/ReportsConfigWidget.js +1 -1
  176. package/lib/esm/ReportsConfigWidget.js.map +1 -1
  177. package/lib/esm/reports-config-widget-react.d.ts +5 -0
  178. package/lib/esm/reports-config-widget-react.d.ts.map +1 -1
  179. package/lib/esm/reports-config-widget-react.js +5 -0
  180. package/lib/esm/reports-config-widget-react.js.map +1 -1
  181. package/lib/esm/test/AddMappingModal.test.js +17 -31
  182. package/lib/esm/test/AddMappingModal.test.js.map +1 -1
  183. package/lib/esm/test/BulkExtractor.test.js +14 -17
  184. package/lib/esm/test/BulkExtractor.test.js.map +1 -1
  185. package/lib/esm/test/DeleteModal.test.d.ts.map +1 -1
  186. package/lib/esm/test/DeleteModal.test.js +5 -44
  187. package/lib/esm/test/DeleteModal.test.js.map +1 -1
  188. package/lib/esm/test/ReportAction.test.js +14 -60
  189. package/lib/esm/test/ReportAction.test.js.map +1 -1
  190. package/lib/esm/test/ReportMappingHorizontalTile.test.js +4 -38
  191. package/lib/esm/test/ReportMappingHorizontalTile.test.js.map +1 -1
  192. package/lib/esm/test/ReportMappings.test.d.ts.map +1 -1
  193. package/lib/esm/test/ReportMappings.test.js +43 -98
  194. package/lib/esm/test/ReportMappings.test.js.map +1 -1
  195. package/lib/esm/test/Reports.test.js +24 -60
  196. package/lib/esm/test/Reports.test.js.map +1 -1
  197. package/lib/esm/test/WidgetHeader.test.js +8 -2
  198. package/lib/esm/test/WidgetHeader.test.js.map +1 -1
  199. package/lib/esm/test/test-utils.d.ts +3 -8
  200. package/lib/esm/test/test-utils.d.ts.map +1 -1
  201. package/lib/esm/test/test-utils.js +4 -31
  202. package/lib/esm/test/test-utils.js.map +1 -1
  203. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  204. package/lib/esm/widget/ReportsConfigUiProvider.d.ts +3 -3
  205. package/lib/esm/widget/ReportsConfigUiProvider.d.ts.map +1 -1
  206. package/lib/esm/widget/ReportsConfigUiProvider.js +2 -4
  207. package/lib/esm/widget/ReportsConfigUiProvider.js.map +1 -1
  208. package/lib/esm/widget/components/ActionPanel.d.ts +3 -3
  209. package/lib/esm/widget/components/ActionPanel.d.ts.map +1 -1
  210. package/lib/esm/widget/components/ActionPanel.js +4 -4
  211. package/lib/esm/widget/components/ActionPanel.js.map +1 -1
  212. package/lib/esm/widget/components/ActionPanel.scss +2 -3
  213. package/lib/esm/widget/components/AddMappingsModal.d.ts +4 -4
  214. package/lib/esm/widget/components/AddMappingsModal.d.ts.map +1 -1
  215. package/lib/esm/widget/components/AddMappingsModal.js +35 -39
  216. package/lib/esm/widget/components/AddMappingsModal.js.map +1 -1
  217. package/lib/esm/widget/components/AddMappingsModal.scss +1 -2
  218. package/lib/esm/widget/components/BulkExtractor.d.ts +4 -4
  219. package/lib/esm/widget/components/BulkExtractor.d.ts.map +1 -1
  220. package/lib/esm/widget/components/BulkExtractor.js +7 -8
  221. package/lib/esm/widget/components/BulkExtractor.js.map +1 -1
  222. package/lib/esm/widget/components/DeleteModal.d.ts +4 -5
  223. package/lib/esm/widget/components/DeleteModal.d.ts.map +1 -1
  224. package/lib/esm/widget/components/DeleteModal.js +11 -15
  225. package/lib/esm/widget/components/DeleteModal.js.map +1 -1
  226. package/lib/esm/widget/components/DeleteModal.scss +2 -3
  227. package/lib/esm/widget/components/ExtractionStatus.scss +6 -7
  228. package/lib/esm/widget/components/HorizontalTile.scss +11 -14
  229. package/lib/esm/widget/components/ReportAction.d.ts +4 -5
  230. package/lib/esm/widget/components/ReportAction.d.ts.map +1 -1
  231. package/lib/esm/widget/components/ReportAction.js +17 -21
  232. package/lib/esm/widget/components/ReportAction.js.map +1 -1
  233. package/lib/esm/widget/components/ReportAction.scss +1 -2
  234. package/lib/esm/widget/components/ReportHorizontalTile.d.ts +4 -4
  235. package/lib/esm/widget/components/ReportHorizontalTile.d.ts.map +1 -1
  236. package/lib/esm/widget/components/ReportHorizontalTile.js +6 -9
  237. package/lib/esm/widget/components/ReportHorizontalTile.js.map +1 -1
  238. package/lib/esm/widget/components/ReportMappingHorizontalTile.d.ts +1 -1
  239. package/lib/esm/widget/components/ReportMappingHorizontalTile.d.ts.map +1 -1
  240. package/lib/esm/widget/components/ReportMappingHorizontalTile.js +12 -13
  241. package/lib/esm/widget/components/ReportMappingHorizontalTile.js.map +1 -1
  242. package/lib/esm/widget/components/ReportMappings.d.ts +4 -6
  243. package/lib/esm/widget/components/ReportMappings.d.ts.map +1 -1
  244. package/lib/esm/widget/components/ReportMappings.js +43 -56
  245. package/lib/esm/widget/components/ReportMappings.js.map +1 -1
  246. package/lib/esm/widget/components/ReportMappings.scss +10 -11
  247. package/lib/esm/widget/components/Reports.d.ts +6 -1
  248. package/lib/esm/widget/components/Reports.d.ts.map +1 -1
  249. package/lib/esm/widget/components/Reports.js +46 -87
  250. package/lib/esm/widget/components/Reports.js.map +1 -1
  251. package/lib/esm/widget/components/Reports.scss +15 -15
  252. package/lib/esm/widget/components/ReportsConfigContext.d.ts +18 -0
  253. package/lib/esm/widget/components/ReportsConfigContext.d.ts.map +1 -0
  254. package/lib/esm/widget/components/ReportsConfigContext.js +56 -0
  255. package/lib/esm/widget/components/ReportsConfigContext.js.map +1 -0
  256. package/lib/esm/widget/components/ReportsContainer.d.ts +14 -0
  257. package/lib/esm/widget/components/ReportsContainer.d.ts.map +1 -1
  258. package/lib/esm/widget/components/ReportsContainer.js +27 -17
  259. package/lib/esm/widget/components/ReportsContainer.js.map +1 -1
  260. package/lib/esm/widget/components/ReportsContainer.scss +1 -3
  261. package/lib/esm/widget/components/ReportsHeader.d.ts +7 -0
  262. package/lib/esm/widget/components/ReportsHeader.d.ts.map +1 -0
  263. package/lib/esm/widget/components/ReportsHeader.js +13 -0
  264. package/lib/esm/widget/components/ReportsHeader.js.map +1 -0
  265. package/lib/esm/widget/components/ReportsRouter.d.ts +8 -0
  266. package/lib/esm/widget/components/ReportsRouter.d.ts.map +1 -0
  267. package/lib/esm/widget/components/ReportsRouter.js +44 -0
  268. package/lib/esm/widget/components/ReportsRouter.js.map +1 -0
  269. package/lib/esm/widget/components/SearchBar.d.ts.map +1 -1
  270. package/lib/esm/widget/components/SearchBar.js +2 -3
  271. package/lib/esm/widget/components/SearchBar.js.map +1 -1
  272. package/lib/esm/widget/components/SearchBar.scss +1 -2
  273. package/lib/esm/widget/components/SelectIModel.d.ts +3 -3
  274. package/lib/esm/widget/components/SelectIModel.d.ts.map +1 -1
  275. package/lib/esm/widget/components/SelectIModel.js +7 -27
  276. package/lib/esm/widget/components/SelectIModel.js.map +1 -1
  277. package/lib/esm/widget/components/SelectIModel.scss +2 -3
  278. package/lib/esm/widget/components/utils.d.ts +1 -1
  279. package/lib/esm/widget/components/utils.d.ts.map +1 -1
  280. package/lib/esm/widget/components/utils.js +2 -2
  281. package/lib/esm/widget/components/utils.js.map +1 -1
  282. package/lib/esm/widget/components/utils.scss +16 -8
  283. package/lib/esm/widget/context/BulkExtractorContext.d.ts +10 -0
  284. package/lib/esm/widget/context/BulkExtractorContext.d.ts.map +1 -0
  285. package/lib/esm/widget/context/BulkExtractorContext.js +11 -0
  286. package/lib/esm/widget/context/BulkExtractorContext.js.map +1 -0
  287. package/lib/esm/widget/context/ReportsConfigApiContext.d.ts +16 -0
  288. package/lib/esm/widget/context/ReportsConfigApiContext.d.ts.map +1 -0
  289. package/lib/esm/widget/context/ReportsConfigApiContext.js +20 -0
  290. package/lib/esm/widget/context/ReportsConfigApiContext.js.map +1 -0
  291. package/lib/public/locales/en/ReportsConfigWidget.json +6 -1
  292. package/package.json +29 -29
  293. package/public/locales/en/ReportsConfigWidget.json +6 -1
  294. package/reports-config-widget-react.build.error.log +6 -6
  295. package/reports-config-widget-react.build.log +52 -49
  296. package/src/reports-config-widget-react.ts +6 -0
  297. package/src/test/AddMappingModal.test.tsx +20 -37
  298. package/src/test/BulkExtractor.test.ts +15 -17
  299. package/src/test/DeleteModal.test.tsx +4 -73
  300. package/src/test/ReportAction.test.tsx +17 -90
  301. package/src/test/ReportMappingHorizontalTile.test.tsx +3 -54
  302. package/src/test/ReportMappings.test.tsx +50 -135
  303. package/src/test/Reports.test.tsx +21 -80
  304. package/src/test/WidgetHeader.test.tsx +9 -2
  305. package/src/test/test-utils.tsx +9 -49
  306. package/src/widget/ReportsConfigUiProvider.tsx +7 -14
  307. package/src/widget/components/ActionPanel.scss +2 -3
  308. package/src/widget/components/ActionPanel.tsx +17 -15
  309. package/src/widget/components/AddMappingsModal.scss +1 -2
  310. package/src/widget/components/AddMappingsModal.tsx +55 -60
  311. package/src/widget/components/BulkExtractor.ts +11 -10
  312. package/src/widget/components/DeleteModal.scss +2 -3
  313. package/src/widget/components/DeleteModal.tsx +17 -23
  314. package/src/widget/components/ExtractionStatus.scss +6 -7
  315. package/src/widget/components/HorizontalTile.scss +11 -14
  316. package/src/widget/components/ReportAction.scss +1 -2
  317. package/src/widget/components/ReportAction.tsx +18 -33
  318. package/src/widget/components/ReportHorizontalTile.tsx +11 -12
  319. package/src/widget/components/ReportMappingHorizontalTile.tsx +30 -30
  320. package/src/widget/components/ReportMappings.scss +10 -11
  321. package/src/widget/components/ReportMappings.tsx +67 -72
  322. package/src/widget/components/Reports.scss +15 -15
  323. package/src/widget/components/Reports.tsx +140 -181
  324. package/src/widget/components/ReportsConfigContext.tsx +95 -0
  325. package/src/widget/components/ReportsContainer.scss +1 -3
  326. package/src/widget/components/ReportsContainer.tsx +47 -21
  327. package/src/widget/components/ReportsHeader.tsx +27 -0
  328. package/src/widget/components/ReportsRouter.tsx +63 -0
  329. package/src/widget/components/SearchBar.scss +1 -2
  330. package/src/widget/components/SearchBar.tsx +7 -2
  331. package/src/widget/components/SelectIModel.scss +2 -3
  332. package/src/widget/components/SelectIModel.tsx +11 -29
  333. package/src/widget/components/utils.scss +16 -8
  334. package/src/widget/components/utils.tsx +8 -7
  335. package/src/widget/context/{ReportsApiConfigContext.tsx → BulkExtractorContext.tsx} +9 -10
  336. package/src/widget/context/ReportsConfigApiContext.tsx +39 -0
  337. package/lib/cjs/widget/context/ReportsApiConfigContext.d.ts +0 -9
  338. package/lib/cjs/widget/context/ReportsApiConfigContext.d.ts.map +0 -1
  339. package/lib/cjs/widget/context/ReportsApiConfigContext.js.map +0 -1
  340. package/lib/esm/widget/context/ReportsApiConfigContext.d.ts +0 -9
  341. package/lib/esm/widget/context/ReportsApiConfigContext.d.ts.map +0 -1
  342. package/lib/esm/widget/context/ReportsApiConfigContext.js +0 -14
  343. package/lib/esm/widget/context/ReportsApiConfigContext.js.map +0 -1
@@ -2,39 +2,39 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- @import "~@itwin/itwinui-css/scss/variables";
6
5
 
7
6
  .rcw-reports-list-container {
8
7
  display: flex;
9
8
  flex-direction: column;
10
9
  flex-grow: 1;
11
- padding: $iui-baseline $iui-m;
12
10
  min-height: 0;
13
11
 
14
12
  .rcw-toolbar {
15
13
  display: flex;
16
14
  justify-content: space-between;
17
- gap: $iui-s;
18
- border-bottom: 1px solid var(--iui-color-background-4);
19
- padding-bottom: $iui-baseline;
15
+ gap: var(--iui-size-xs);
16
+ border-bottom: 1px solid var(--iui-color-border-subtle);
17
+ padding-bottom: var(--iui-size-s);
20
18
  flex-wrap: wrap;
21
- }
22
19
 
23
- .rcw-search-bar-container {
24
- flex-basis: $iui-3xl;
25
- flex-shrink: 1;
26
- flex-grow: 1;
20
+ .rcw-search-bar-container {
21
+ flex-shrink: 1;
22
+ flex-grow: 0;
23
+ display: flex;
24
+ }
25
+
26
+ .rcw-button-spacing {
27
+ display: flex;
28
+ gap: var(--iui-size-xs);
29
+ }
27
30
  }
28
31
 
29
32
  .rcw-reports-list {
30
33
  display: flex;
31
34
  flex-direction: column;
32
35
  overflow-y: overlay;
33
- gap: 7.5px;
34
- margin-top: 7.5px;
36
+ gap: var(--iui-size-xs);
37
+ margin-top: var(--iui-size-xs);
35
38
  }
36
39
  }
37
40
 
38
- .rcw-button-container {
39
- display: flex;
40
- }
@@ -1,65 +1,41 @@
1
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 {
6
- SvgAdd,
7
- SvgPlay,
8
- } from "@itwin/itwinui-icons-react";
9
- import {
10
- Button,
11
- IconButton,
12
- Surface,
13
- toaster,
14
- } from "@itwin/itwinui-react";
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 { SvgAdd, SvgPlay, SvgRefresh } from "@itwin/itwinui-icons-react";
6
+ import { Button, IconButton } from "@itwin/itwinui-react";
15
7
  import React, { useCallback, useEffect, useMemo, useState } from "react";
16
8
  import type { CreateTypeFromInterface } from "./utils";
17
9
  import {
18
10
  EmptyMessage,
19
- generateUrl,
20
11
  handleError,
21
12
  LoadingOverlay,
22
- WidgetHeader,
23
13
  } from "./utils";
24
14
  import "./Reports.scss";
25
15
  import DeleteModal from "./DeleteModal";
26
- import type { Report } from "@itwin/insights-client";
27
- import { REPORTING_BASE_PATH, ReportsClient } from "@itwin/insights-client";
28
- import ReportAction from "./ReportAction";
29
- import { ReportMappings } from "./ReportMappings";
16
+ import type { Report, ReportsClient } from "@itwin/insights-client";
30
17
  import { ReportHorizontalTile } from "./ReportHorizontalTile";
31
18
  import { SearchBar } from "./SearchBar";
32
- import type { ReportsApiConfig } from "../context/ReportsApiConfigContext";
33
- import { useReportsApiConfig } from "../context/ReportsApiConfigContext";
19
+ import { useReportsConfigApi } from "../context/ReportsConfigApiContext";
34
20
  import { ReportsConfigWidget } from "../../ReportsConfigWidget";
35
- import { useActiveIModelConnection } from "@itwin/appui-react";
36
- import BulkExtractor from "./BulkExtractor";
21
+ import type { AccessToken } from "@itwin/core-bentley";
37
22
  import { BeEvent } from "@itwin/core-bentley";
38
- import { FailedExtractionToast, SuccessfulExtractionToast } from "./ExtractionToast";
23
+ import { useBulkExtractor } from "../context/BulkExtractorContext";
39
24
 
40
25
  export type ReportType = CreateTypeFromInterface<Report>;
41
26
 
42
- enum ReportsView {
43
- REPORTS = "reports",
44
- REPORTSMAPPING = "reportsmapping",
45
- ADDING = "adding",
46
- MODIFYING = "modifying",
47
- }
48
-
49
27
  const fetchReports = async (
50
- setReports: React.Dispatch<React.SetStateAction<Report[]>>,
28
+ setReports: (reports: Report[]) => void,
51
29
  iTwinId: string | undefined,
52
- setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,
53
- apiContext: ReportsApiConfig
30
+ setIsLoading: (isLoading: boolean) => void,
31
+ reportsClient: ReportsClient,
32
+ getAccessToken: () => Promise<AccessToken>
54
33
  ) => {
55
34
  try {
56
35
  if (!iTwinId) return;
57
36
  setIsLoading(true);
58
- const reportsClientApi = new ReportsClient(
59
- generateUrl(REPORTING_BASE_PATH, apiContext.baseUrl)
60
- );
61
- const accessToken = await apiContext.getAccessToken();
62
- const reports = await reportsClientApi.getReports(accessToken, iTwinId);
37
+ const accessToken = await getAccessToken();
38
+ const reports = await reportsClient.getReports(accessToken, iTwinId);
63
39
  setReports(reports ?? []);
64
40
  } catch (error: any) {
65
41
  handleError(error.status);
@@ -68,50 +44,50 @@ const fetchReports = async (
68
44
  }
69
45
  };
70
46
 
71
- export const Reports = () => {
72
- const successfulExtractionToast = (iModelName: string, odataFeedUrl: string) => {
73
- toaster.positive(<SuccessfulExtractionToast iModelName={iModelName} odataFeedUrl={odataFeedUrl} />);
74
- };
75
-
76
- const failedExtractionToast = (iModelName: string) => {
77
- toaster.negative(<FailedExtractionToast iModelName={iModelName} />);
78
- };
47
+ export interface ReportsProps {
48
+ onClickAddReport?: () => void;
49
+ onClickReportTitle?: (report: Report) => void;
50
+ onClickReportModify?: (report: Report) => void;
51
+ }
79
52
 
80
- const iTwinId = useActiveIModelConnection()?.iTwinId ?? "";
81
- const apiConfig = useReportsApiConfig();
82
- const [selectedReportIds, setSelectedReportIds] = useState<string[]>([]);
83
- const [showDeleteModal, setShowDeleteModal] = useState<boolean>(false);
84
- const [reportsView, setReportsView] = useState<ReportsView>(
85
- ReportsView.REPORTS
86
- );
87
- const [selectedReport, setSelectedReport] = useState<Report | undefined>(
53
+ export const Reports = ({
54
+ onClickAddReport,
55
+ onClickReportModify,
56
+ onClickReportTitle,
57
+ }: ReportsProps) => {
58
+ const { iTwinId, getAccessToken, reportsClient } = useReportsConfigApi();
59
+ const { bulkExtractor } = useBulkExtractor();
60
+ const [showDeleteModal, setShowDeleteModal] = useState<Report | undefined>(
88
61
  undefined
89
62
  );
63
+ const [selectedReportIds, setSelectedReportIds] = useState<string[]>([]);
90
64
  const [isLoading, setIsLoading] = useState<boolean>(true);
91
65
  const [searchValue, setSearchValue] = useState<string>("");
92
66
  const [reports, setReports] = useState<Report[]>([]);
93
- const bulkExtractor = useMemo(
94
- () => new BulkExtractor(apiConfig, successfulExtractionToast, failedExtractionToast),
95
- [apiConfig]
96
- );
97
67
  const jobStartEvent = useMemo(
98
68
  () => new BeEvent<(reportId: string) => void>(),
99
69
  []
100
70
  );
101
71
 
102
72
  useEffect(() => {
103
- void fetchReports(setReports, iTwinId, setIsLoading, apiConfig);
104
- }, [apiConfig, iTwinId, setIsLoading]);
73
+ void fetchReports(
74
+ setReports,
75
+ iTwinId,
76
+ setIsLoading,
77
+ reportsClient,
78
+ getAccessToken
79
+ );
80
+ }, [getAccessToken, iTwinId, reportsClient, setIsLoading]);
105
81
 
106
82
  const refresh = useCallback(async () => {
107
- setReportsView(ReportsView.REPORTS);
108
- setSelectedReport(undefined);
109
- await fetchReports(setReports, iTwinId, setIsLoading, apiConfig);
110
- }, [apiConfig, iTwinId, setReports]);
111
-
112
- const addReport = () => {
113
- setReportsView(ReportsView.ADDING);
114
- };
83
+ await fetchReports(
84
+ setReports,
85
+ iTwinId,
86
+ setIsLoading,
87
+ reportsClient,
88
+ getAccessToken
89
+ );
90
+ }, [getAccessToken, iTwinId, reportsClient]);
115
91
 
116
92
  const filteredReports = useMemo(
117
93
  () =>
@@ -125,140 +101,123 @@ export const Reports = () => {
125
101
  );
126
102
 
127
103
  const onSelectionChange = (reportId: string, control: boolean) => {
128
- if (!control)
129
- setSelectedReportIds([]);
104
+ if (!control) setSelectedReportIds([]);
130
105
 
131
106
  setSelectedReportIds((sr) =>
132
107
  sr.some((r) => reportId === r)
133
- ? sr.filter(
134
- (r) => reportId !== r
135
- )
108
+ ? sr.filter((r) => reportId !== r)
136
109
  : [...sr, reportId]
137
110
  );
138
111
  };
139
112
 
140
113
  const updateDatasets = useCallback(async () => {
114
+ if (!bulkExtractor) return;
141
115
  await bulkExtractor.runReportExtractions(selectedReportIds);
142
116
  selectedReportIds.map((reportId) => jobStartEvent.raiseEvent(reportId));
143
117
  setSelectedReportIds([]);
144
118
  }, [selectedReportIds, jobStartEvent, bulkExtractor]);
145
119
 
146
- switch (reportsView) {
147
- case ReportsView.ADDING:
148
- return iTwinId ? (
149
- <ReportAction iTwinId={iTwinId ?? ""} returnFn={refresh} />
150
- ) : null;
151
- case ReportsView.MODIFYING:
152
- return iTwinId ? (
153
- <ReportAction
154
- iTwinId={iTwinId}
155
- report={selectedReport}
156
- returnFn={refresh}
157
- />
158
- ) : null;
159
- case ReportsView.REPORTSMAPPING:
160
- return selectedReport ? (
161
- <ReportMappings report={selectedReport} bulkExtractor={bulkExtractor} goBack={refresh} />
162
- ) : null;
163
- default:
164
- return (
165
- <>
166
- <WidgetHeader
167
- title={ReportsConfigWidget.localization.getLocalizedString(
168
- "ReportsConfigWidget:ITwinReports"
169
- )}
170
- />
171
- <Surface className="rcw-reports-list-container">
172
- <div className="rcw-toolbar">
120
+ if (!bulkExtractor) return null;
121
+
122
+ return (
123
+ <>
124
+ <div className="rcw-reports-list-container">
125
+ <div className="rcw-toolbar">
126
+ <div className="rcw-button-spacing">
127
+ {onClickAddReport && (
173
128
  <Button
174
129
  startIcon={<SvgAdd />}
175
- onClick={() => addReport()}
130
+ onClick={onClickAddReport}
176
131
  styleType="high-visibility"
132
+ title="New Report"
177
133
  >
178
134
  {ReportsConfigWidget.localization.getLocalizedString(
179
135
  "ReportsConfigWidget:New"
180
136
  )}
181
137
  </Button>
182
- <IconButton
183
- title={ReportsConfigWidget.localization.getLocalizedString(
184
- "ReportsConfigWidget:UpdateDatasets"
185
- )}
186
- onClick={updateDatasets}
187
- disabled={selectedReportIds.length === 0}
188
- >
189
- <SvgPlay />
190
- </IconButton>
191
- <div className="rcw-search-bar-container" data-testid="rcw-search-bar">
192
- <div className="rcw-search-button">
193
- <SearchBar
194
- searchValue={searchValue}
195
- setSearchValue={setSearchValue}
196
- disabled={isLoading}
197
- />
198
- </div>
199
- </div>
200
- </div>
201
- {isLoading ? (
202
- <LoadingOverlay />
203
- ) : reports.length === 0 ? (
204
- <EmptyMessage>
205
- <>
138
+ )}
139
+ <IconButton
140
+ title={ReportsConfigWidget.localization.getLocalizedString(
141
+ "ReportsConfigWidget:UpdateDatasets"
142
+ )}
143
+ onClick={updateDatasets}
144
+ disabled={selectedReportIds.length === 0}
145
+ >
146
+ <SvgPlay />
147
+ </IconButton>
148
+ </div>
149
+ <div
150
+ className="rcw-search-bar-container"
151
+ data-testid="rcw-search-bar"
152
+ >
153
+ <IconButton
154
+ title={ReportsConfigWidget.localization.getLocalizedString(
155
+ "ReportsConfigWidget:Refresh"
156
+ )}
157
+ onClick={refresh}
158
+ disabled={isLoading}
159
+ styleType="borderless"
160
+ >
161
+ <SvgRefresh />
162
+ </IconButton>
163
+ <SearchBar
164
+ searchValue={searchValue}
165
+ setSearchValue={setSearchValue}
166
+ disabled={isLoading}
167
+ />
168
+ </div>
169
+ </div>
170
+ {isLoading ? (
171
+ <LoadingOverlay />
172
+ ) : reports.length === 0 && onClickAddReport ? (
173
+ <EmptyMessage>
174
+ <>
175
+ {ReportsConfigWidget.localization.getLocalizedString(
176
+ "ReportsConfigWidget:NoReports"
177
+ )}
178
+ <div>
179
+ <Button onClick={onClickAddReport} styleType="cta">
206
180
  {ReportsConfigWidget.localization.getLocalizedString(
207
- "ReportsConfigWidget:NoReports"
181
+ "ReportsConfigWidget:CreateOneReportCTA"
208
182
  )}
209
- <div>
210
- <Button onClick={addReport} styleType="cta">
211
- {ReportsConfigWidget.localization.getLocalizedString(
212
- "ReportsConfigWidget:CreateOneReportCTA"
213
- )}
214
- </Button>
215
- </div>
216
- </>
217
- </EmptyMessage>
218
- ) : (
219
- <div className="rcw-reports-list">
220
- {filteredReports.map((report) => (
221
- <ReportHorizontalTile
222
- key={report.id}
223
- report={report}
224
- onClickTitle={() => {
225
- setSelectedReport(report);
226
- setReportsView(ReportsView.REPORTSMAPPING);
227
- }}
228
- jobStartEvent={jobStartEvent}
229
- bulkExtractor={bulkExtractor}
230
- onClickDelete={() => {
231
- setSelectedReport(report);
232
- setShowDeleteModal(true);
233
- }}
234
- onClickModify={() => {
235
- setSelectedReport(report);
236
- setReportsView(ReportsView.MODIFYING);
237
- }}
238
- onSelectionChange={onSelectionChange}
239
- selected={selectedReportIds.some((reportId) => report.id === reportId)}
240
- />
241
- ))}
183
+ </Button>
242
184
  </div>
243
- )}
244
- </Surface>
245
- <DeleteModal
246
- entityName={selectedReport?.displayName ?? ""}
247
- show={showDeleteModal}
248
- setShow={setShowDeleteModal}
249
- onDelete={async () => {
250
- const reportsClientApi = new ReportsClient(
251
- generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl)
252
- );
253
- const accessToken = await apiConfig.getAccessToken();
254
- await reportsClientApi.deleteReport(
255
- accessToken,
256
- selectedReport?.id ?? ""
257
- );
258
- }}
259
- refresh={refresh}
260
- />
261
- </>
262
- );
263
- }
185
+ </>
186
+ </EmptyMessage>
187
+ ) : (
188
+ <div className="rcw-reports-list">
189
+ {filteredReports.map((report) => (
190
+ <ReportHorizontalTile
191
+ key={report.id}
192
+ report={report}
193
+ onClickTitle={onClickReportTitle}
194
+ jobStartEvent={jobStartEvent}
195
+ bulkExtractor={bulkExtractor}
196
+ onClickDelete={() => {
197
+ setShowDeleteModal(report);
198
+ }}
199
+ onClickModify={onClickReportModify}
200
+ onSelectionChange={onSelectionChange}
201
+ selected={selectedReportIds.some(
202
+ (reportId) => report.id === reportId
203
+ )}
204
+ />
205
+ ))}
206
+ </div>
207
+ )}
208
+ </div>
209
+ <DeleteModal
210
+ entityName={showDeleteModal?.displayName}
211
+ onClose={() => setShowDeleteModal(undefined)}
212
+ onDelete={async () => {
213
+ const accessToken = await getAccessToken();
214
+ await reportsClient.deleteReport(
215
+ accessToken,
216
+ showDeleteModal?.id ?? ""
217
+ );
218
+ }}
219
+ refresh={refresh}
220
+ />
221
+ </>
222
+ );
264
223
  };
@@ -0,0 +1,95 @@
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 { IModelApp } from "@itwin/core-frontend";
6
+ import type { IModelsClientOptions } from "@itwin/imodels-client-management";
7
+ import { Constants, IModelsClient } from "@itwin/imodels-client-management";
8
+ import { ExtractionClient, MappingsClient, REPORTING_BASE_PATH, ReportsClient } from "@itwin/insights-client";
9
+ import { toaster } from "@itwin/itwinui-react";
10
+ import React, { useCallback, useEffect, useMemo, useState } from "react";
11
+ import { BulkExtractorContext } from "../context/BulkExtractorContext";
12
+ import type {
13
+ GetAccessTokenFn,
14
+ ReportsConfigApiProps,
15
+ } from "../context/ReportsConfigApiContext";
16
+ import { ReportsConfigApiContext } from "../context/ReportsConfigApiContext";
17
+ import { REPORTS_CONFIG_BASE_URL } from "../ReportsConfigUiProvider";
18
+ import { BulkExtractor } from "./BulkExtractor";
19
+ import { FailedExtractionToast, SuccessfulExtractionToast } from "./ExtractionToast";
20
+ import { generateUrl } from "./utils";
21
+
22
+ export interface ReportsConfigContextProps {
23
+ getAccessToken?: GetAccessTokenFn;
24
+ baseUrl?: string;
25
+ iTwinId: string;
26
+ bulkExtractor?: BulkExtractor;
27
+ reportsClient?: ReportsClient;
28
+ mappingsClient?: MappingsClient;
29
+ extractionClient?: ExtractionClient;
30
+ iModelsClient?: IModelsClient;
31
+ children?: React.ReactNode;
32
+ }
33
+
34
+ const authorizationClientGetAccessToken = async () =>
35
+ (await IModelApp.authorizationClient?.getAccessToken()) ?? "";
36
+
37
+ export const ReportsConfigContext = (props: ReportsConfigContextProps) => {
38
+ const reportsBaseUrl = useCallback(() => generateUrl(
39
+ REPORTING_BASE_PATH,
40
+ props.baseUrl || REPORTS_CONFIG_BASE_URL
41
+ ), [props.baseUrl]);
42
+ const iModelClientOptions: IModelsClientOptions = useMemo(() => ({
43
+ api: { baseUrl: generateUrl(Constants.api.baseUrl, props.baseUrl ?? REPORTS_CONFIG_BASE_URL) },
44
+ }), [props.baseUrl]);
45
+ const [extractionClient, setExtractionClient] = useState<ExtractionClient>(
46
+ props.extractionClient ?? new ExtractionClient(reportsBaseUrl())
47
+ );
48
+
49
+ const [apiConfig, setApiConfig] = useState<ReportsConfigApiProps>({
50
+ getAccessToken: props.getAccessToken ?? authorizationClientGetAccessToken,
51
+ baseUrl: reportsBaseUrl(),
52
+ iTwinId: props.iTwinId,
53
+ reportsClient: props.reportsClient ?? new ReportsClient(reportsBaseUrl()),
54
+ mappingsClient: props.mappingsClient ?? new MappingsClient(reportsBaseUrl()),
55
+ iModelsClient: props.iModelsClient ?? new IModelsClient(iModelClientOptions),
56
+ });
57
+
58
+ useEffect(() => {
59
+ if (!props.extractionClient) {
60
+ setExtractionClient(props.extractionClient ?? new ExtractionClient(reportsBaseUrl()));
61
+ }
62
+ }, [props.extractionClient, reportsBaseUrl]);
63
+
64
+ const successfulExtractionToast = (iModelName: string, odataFeedUrl: string) => {
65
+ toaster.positive(<SuccessfulExtractionToast iModelName={iModelName} odataFeedUrl={odataFeedUrl} />);
66
+ };
67
+
68
+ const failedExtractionToast = (iModelName: string) => {
69
+ toaster.negative(<FailedExtractionToast iModelName={iModelName} />);
70
+ };
71
+
72
+ const bulkExtractor = useMemo(
73
+ () => ({ bulkExtractor: props.bulkExtractor ?? new BulkExtractor(apiConfig.reportsClient, extractionClient, apiConfig.getAccessToken, successfulExtractionToast, failedExtractionToast) }),
74
+ [apiConfig.getAccessToken, apiConfig.reportsClient, extractionClient, props.bulkExtractor]
75
+ );
76
+
77
+ useEffect(() => {
78
+ setApiConfig(() => ({
79
+ getAccessToken: props.getAccessToken ?? authorizationClientGetAccessToken,
80
+ baseUrl: props.baseUrl || REPORTS_CONFIG_BASE_URL,
81
+ iTwinId: props.iTwinId,
82
+ reportsClient: props.reportsClient ?? new ReportsClient(reportsBaseUrl()),
83
+ mappingsClient: props.mappingsClient ?? new MappingsClient(reportsBaseUrl()),
84
+ iModelsClient: props.iModelsClient ?? new IModelsClient(iModelClientOptions),
85
+ }));
86
+ }, [props.getAccessToken, props.baseUrl, props.iTwinId, props.reportsClient, props.mappingsClient, props.iModelsClient, reportsBaseUrl, iModelClientOptions]);
87
+
88
+ return (
89
+ <ReportsConfigApiContext.Provider value={apiConfig}>
90
+ <BulkExtractorContext.Provider value={bulkExtractor}>
91
+ {props.children}
92
+ </BulkExtractorContext.Provider>
93
+ </ReportsConfigApiContext.Provider>
94
+ );
95
+ };
@@ -2,7 +2,6 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- @import "~@itwin/itwinui-css/scss/variables";
6
5
 
7
6
  .rcw-reports-container {
8
7
  position: absolute;
@@ -10,9 +9,8 @@
10
9
  left: 0;
11
10
  display: flex;
12
11
  flex-direction: column;
13
- padding: $iui-baseline $iui-m;
12
+ padding: var(--iui-size-s) var(--iui-size-m);
14
13
  box-sizing: border-box;
15
14
  height: 100%;
16
15
  overflow: auto;
17
- gap: $iui-baseline;
18
16
  }
@@ -3,43 +3,69 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import type { AccessToken } from "@itwin/core-bentley";
6
- import { IModelApp } from "@itwin/core-frontend";
7
- import React, { useEffect, useState } from "react";
8
- import { Reports } from "../components/Reports";
9
- import type { ReportsApiConfig } from "../context/ReportsApiConfigContext";
10
- import { ReportsApiConfigContext } from "../context/ReportsApiConfigContext";
6
+ import React, { useCallback, useState } from "react";
11
7
  import "./ReportsContainer.scss";
8
+ import type { Report } from "@itwin/insights-client";
9
+ import { useActiveIModelConnection } from "@itwin/appui-react";
10
+ import { ReportsHeader } from "./ReportsHeader";
11
+ import { ReportsRouter } from "./ReportsRouter";
12
+ import { ReportsConfigContext } from "./ReportsConfigContext";
12
13
 
13
14
  interface ReportsContainerProps {
14
15
  getAccessToken?: () => Promise<AccessToken>;
15
16
  baseUrl: string;
16
17
  }
17
18
 
18
- const authorizationClientGetAccessToken = async () =>
19
- (await IModelApp.authorizationClient?.getAccessToken()) ?? "";
19
+ export enum RouteStep {
20
+ ReportsList,
21
+ ReportAction,
22
+ ReportMappings
23
+ }
24
+
25
+ export interface ReportsRouteFields {
26
+ report?: Report;
27
+ }
28
+
29
+ export interface Route {
30
+ step: RouteStep;
31
+ title: string;
32
+ reportsRoutingFields: ReportsRouteFields;
33
+ }
20
34
 
21
35
  const ReportsContainer = ({
22
36
  getAccessToken,
23
37
  baseUrl,
24
38
  }: ReportsContainerProps) => {
25
- const [apiConfig, setApiConfig] = useState<ReportsApiConfig>({
26
- getAccessToken: getAccessToken ?? authorizationClientGetAccessToken,
27
- baseUrl,
28
- });
29
-
30
- useEffect(() => {
31
- setApiConfig(() => ({
32
- baseUrl,
33
- getAccessToken: getAccessToken ?? authorizationClientGetAccessToken,
34
- }));
35
- }, [getAccessToken, baseUrl]);
39
+
40
+ const [routingHistory, setRoutingHistory] = useState<Route[]>([
41
+ { step: RouteStep.ReportsList, title: "iTwin Reports", reportsRoutingFields: {} },
42
+ ]);
43
+ const currentRoute = routingHistory[routingHistory.length - 1];
44
+ const iTwinId = useActiveIModelConnection()?.iTwinId ?? "";
45
+ const navigateTo = useCallback((toRoute: (prev: Route | undefined) => Route) => {
46
+ setRoutingHistory((r) => [...r, toRoute(r[r.length - 1])]);
47
+ }, []);
48
+
49
+ const goBack = useCallback(() => {
50
+ const updatedRouting = [...routingHistory];
51
+ updatedRouting.pop();
52
+ setRoutingHistory(updatedRouting);
53
+ }, [routingHistory]);
36
54
 
37
55
  return (
38
- <ReportsApiConfigContext.Provider value={apiConfig}>
56
+ <ReportsConfigContext getAccessToken={getAccessToken} baseUrl={baseUrl} iTwinId={iTwinId}>
39
57
  <div className="rcw-reports-container">
40
- <Reports />
58
+ <ReportsHeader
59
+ goBack={goBack}
60
+ currentRoute={currentRoute}
61
+ />
62
+ <ReportsRouter
63
+ currentRoute={currentRoute}
64
+ navigateTo={navigateTo}
65
+ goBack={goBack}
66
+ />
41
67
  </div>
42
- </ReportsApiConfigContext.Provider>
68
+ </ReportsConfigContext>
43
69
  );
44
70
  };
45
71