@itwin/reports-config-widget-react 0.2.1 → 0.3.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 (288) 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 +36 -32
  4. package/.rush/temp/shrinkwrap-deps.json +88 -34
  5. package/CHANGELOG.json +18 -0
  6. package/CHANGELOG.md +10 -1
  7. package/lib/cjs/reports-config-widget-react.d.ts +5 -0
  8. package/lib/cjs/reports-config-widget-react.d.ts.map +1 -1
  9. package/lib/cjs/reports-config-widget-react.js +11 -0
  10. package/lib/cjs/reports-config-widget-react.js.map +1 -1
  11. package/lib/cjs/test/AddMappingModal.test.js +15 -28
  12. package/lib/cjs/test/AddMappingModal.test.js.map +1 -1
  13. package/lib/cjs/test/BulkExtractor.test.js +13 -19
  14. package/lib/cjs/test/BulkExtractor.test.js.map +1 -1
  15. package/lib/cjs/test/DeleteModal.test.d.ts.map +1 -1
  16. package/lib/cjs/test/DeleteModal.test.js +4 -62
  17. package/lib/cjs/test/DeleteModal.test.js.map +1 -1
  18. package/lib/cjs/test/ReportAction.test.js +13 -78
  19. package/lib/cjs/test/ReportAction.test.js.map +1 -1
  20. package/lib/cjs/test/ReportMappingHorizontalTile.test.js +2 -35
  21. package/lib/cjs/test/ReportMappingHorizontalTile.test.js.map +1 -1
  22. package/lib/cjs/test/ReportMappings.test.d.ts.map +1 -1
  23. package/lib/cjs/test/ReportMappings.test.js +38 -91
  24. package/lib/cjs/test/ReportMappings.test.js.map +1 -1
  25. package/lib/cjs/test/Reports.test.js +19 -72
  26. package/lib/cjs/test/Reports.test.js.map +1 -1
  27. package/lib/cjs/test/test-utils.d.ts +3 -8
  28. package/lib/cjs/test/test-utils.d.ts.map +1 -1
  29. package/lib/cjs/test/test-utils.js +8 -33
  30. package/lib/cjs/test/test-utils.js.map +1 -1
  31. package/lib/cjs/tsconfig.tsbuildinfo +1 -1
  32. package/lib/cjs/widget/components/ActionPanel.d.ts +1 -1
  33. package/lib/cjs/widget/components/ActionPanel.d.ts.map +1 -1
  34. package/lib/cjs/widget/components/ActionPanel.js +4 -4
  35. package/lib/cjs/widget/components/ActionPanel.js.map +1 -1
  36. package/lib/cjs/widget/components/AddMappingsModal.d.ts +4 -4
  37. package/lib/cjs/widget/components/AddMappingsModal.d.ts.map +1 -1
  38. package/lib/cjs/widget/components/AddMappingsModal.js +23 -22
  39. package/lib/cjs/widget/components/AddMappingsModal.js.map +1 -1
  40. package/lib/cjs/widget/components/BulkExtractor.d.ts +4 -4
  41. package/lib/cjs/widget/components/BulkExtractor.d.ts.map +1 -1
  42. package/lib/cjs/widget/components/BulkExtractor.js +6 -6
  43. package/lib/cjs/widget/components/BulkExtractor.js.map +1 -1
  44. package/lib/cjs/widget/components/DeleteModal.d.ts +4 -5
  45. package/lib/cjs/widget/components/DeleteModal.d.ts.map +1 -1
  46. package/lib/cjs/widget/components/DeleteModal.js +9 -13
  47. package/lib/cjs/widget/components/DeleteModal.js.map +1 -1
  48. package/lib/cjs/widget/components/HorizontalTile.scss +6 -3
  49. package/lib/cjs/widget/components/ReportAction.d.ts +4 -5
  50. package/lib/cjs/widget/components/ReportAction.d.ts.map +1 -1
  51. package/lib/cjs/widget/components/ReportAction.js +15 -15
  52. package/lib/cjs/widget/components/ReportAction.js.map +1 -1
  53. package/lib/cjs/widget/components/ReportHorizontalTile.d.ts +4 -4
  54. package/lib/cjs/widget/components/ReportHorizontalTile.d.ts.map +1 -1
  55. package/lib/cjs/widget/components/ReportHorizontalTile.js +27 -12
  56. package/lib/cjs/widget/components/ReportHorizontalTile.js.map +1 -1
  57. package/lib/cjs/widget/components/ReportMappingHorizontalTile.d.ts +1 -1
  58. package/lib/cjs/widget/components/ReportMappingHorizontalTile.d.ts.map +1 -1
  59. package/lib/cjs/widget/components/ReportMappingHorizontalTile.js +24 -9
  60. package/lib/cjs/widget/components/ReportMappingHorizontalTile.js.map +1 -1
  61. package/lib/cjs/widget/components/ReportMappings.d.ts +4 -6
  62. package/lib/cjs/widget/components/ReportMappings.d.ts.map +1 -1
  63. package/lib/cjs/widget/components/ReportMappings.js +37 -47
  64. package/lib/cjs/widget/components/ReportMappings.js.map +1 -1
  65. package/lib/cjs/widget/components/ReportMappings.scss +3 -3
  66. package/lib/cjs/widget/components/Reports.d.ts +6 -1
  67. package/lib/cjs/widget/components/Reports.d.ts.map +1 -1
  68. package/lib/cjs/widget/components/Reports.js +42 -83
  69. package/lib/cjs/widget/components/Reports.js.map +1 -1
  70. package/lib/cjs/widget/components/ReportsConfigContext.d.ts +18 -0
  71. package/lib/cjs/widget/components/ReportsConfigContext.d.ts.map +1 -0
  72. package/lib/cjs/widget/components/ReportsConfigContext.js +87 -0
  73. package/lib/cjs/widget/components/ReportsConfigContext.js.map +1 -0
  74. package/lib/cjs/widget/components/ReportsContainer.d.ts +14 -0
  75. package/lib/cjs/widget/components/ReportsContainer.d.ts.map +1 -1
  76. package/lib/cjs/widget/components/ReportsContainer.js +28 -16
  77. package/lib/cjs/widget/components/ReportsContainer.js.map +1 -1
  78. package/lib/cjs/widget/components/ReportsHeader.d.ts +7 -0
  79. package/lib/cjs/widget/components/ReportsHeader.d.ts.map +1 -0
  80. package/lib/cjs/widget/components/ReportsHeader.js +20 -0
  81. package/lib/cjs/widget/components/ReportsHeader.js.map +1 -0
  82. package/lib/cjs/widget/components/ReportsRouter.d.ts +8 -0
  83. package/lib/cjs/widget/components/ReportsRouter.d.ts.map +1 -0
  84. package/lib/cjs/widget/components/ReportsRouter.js +52 -0
  85. package/lib/cjs/widget/components/ReportsRouter.js.map +1 -0
  86. package/lib/cjs/widget/components/SearchBar.js +1 -2
  87. package/lib/cjs/widget/components/SearchBar.js.map +1 -1
  88. package/lib/cjs/widget/components/SearchBar.scss +1 -1
  89. package/lib/cjs/widget/components/SelectIModel.d.ts +3 -3
  90. package/lib/cjs/widget/components/SelectIModel.d.ts.map +1 -1
  91. package/lib/cjs/widget/components/SelectIModel.js +6 -26
  92. package/lib/cjs/widget/components/SelectIModel.js.map +1 -1
  93. package/lib/cjs/widget/components/utils.d.ts +1 -1
  94. package/lib/cjs/widget/components/utils.d.ts.map +1 -1
  95. package/lib/cjs/widget/components/utils.js.map +1 -1
  96. package/lib/cjs/widget/context/BulkExtractorContext.d.ts +10 -0
  97. package/lib/cjs/widget/context/BulkExtractorContext.d.ts.map +1 -0
  98. package/lib/cjs/widget/context/{ReportsApiConfigContext.js → BulkExtractorContext.js} +7 -10
  99. package/lib/cjs/widget/context/BulkExtractorContext.js.map +1 -0
  100. package/lib/cjs/widget/context/ReportsConfigApiContext.d.ts +16 -0
  101. package/lib/cjs/widget/context/ReportsConfigApiContext.d.ts.map +1 -0
  102. package/lib/cjs/widget/context/ReportsConfigApiContext.js +43 -0
  103. package/lib/cjs/widget/context/ReportsConfigApiContext.js.map +1 -0
  104. package/lib/esm/reports-config-widget-react.d.ts +5 -0
  105. package/lib/esm/reports-config-widget-react.d.ts.map +1 -1
  106. package/lib/esm/reports-config-widget-react.js +5 -0
  107. package/lib/esm/reports-config-widget-react.js.map +1 -1
  108. package/lib/esm/test/AddMappingModal.test.js +16 -29
  109. package/lib/esm/test/AddMappingModal.test.js.map +1 -1
  110. package/lib/esm/test/BulkExtractor.test.js +14 -17
  111. package/lib/esm/test/BulkExtractor.test.js.map +1 -1
  112. package/lib/esm/test/DeleteModal.test.d.ts.map +1 -1
  113. package/lib/esm/test/DeleteModal.test.js +5 -44
  114. package/lib/esm/test/DeleteModal.test.js.map +1 -1
  115. package/lib/esm/test/ReportAction.test.js +14 -60
  116. package/lib/esm/test/ReportAction.test.js.map +1 -1
  117. package/lib/esm/test/ReportMappingHorizontalTile.test.js +3 -36
  118. package/lib/esm/test/ReportMappingHorizontalTile.test.js.map +1 -1
  119. package/lib/esm/test/ReportMappings.test.d.ts.map +1 -1
  120. package/lib/esm/test/ReportMappings.test.js +37 -90
  121. package/lib/esm/test/ReportMappings.test.js.map +1 -1
  122. package/lib/esm/test/Reports.test.js +20 -54
  123. package/lib/esm/test/Reports.test.js.map +1 -1
  124. package/lib/esm/test/test-utils.d.ts +3 -8
  125. package/lib/esm/test/test-utils.d.ts.map +1 -1
  126. package/lib/esm/test/test-utils.js +7 -31
  127. package/lib/esm/test/test-utils.js.map +1 -1
  128. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  129. package/lib/esm/widget/components/ActionPanel.d.ts +1 -1
  130. package/lib/esm/widget/components/ActionPanel.d.ts.map +1 -1
  131. package/lib/esm/widget/components/ActionPanel.js +4 -4
  132. package/lib/esm/widget/components/ActionPanel.js.map +1 -1
  133. package/lib/esm/widget/components/AddMappingsModal.d.ts +4 -4
  134. package/lib/esm/widget/components/AddMappingsModal.d.ts.map +1 -1
  135. package/lib/esm/widget/components/AddMappingsModal.js +25 -24
  136. package/lib/esm/widget/components/AddMappingsModal.js.map +1 -1
  137. package/lib/esm/widget/components/BulkExtractor.d.ts +4 -4
  138. package/lib/esm/widget/components/BulkExtractor.d.ts.map +1 -1
  139. package/lib/esm/widget/components/BulkExtractor.js +7 -8
  140. package/lib/esm/widget/components/BulkExtractor.js.map +1 -1
  141. package/lib/esm/widget/components/DeleteModal.d.ts +4 -5
  142. package/lib/esm/widget/components/DeleteModal.d.ts.map +1 -1
  143. package/lib/esm/widget/components/DeleteModal.js +9 -13
  144. package/lib/esm/widget/components/DeleteModal.js.map +1 -1
  145. package/lib/esm/widget/components/HorizontalTile.scss +6 -3
  146. package/lib/esm/widget/components/ReportAction.d.ts +4 -5
  147. package/lib/esm/widget/components/ReportAction.d.ts.map +1 -1
  148. package/lib/esm/widget/components/ReportAction.js +14 -16
  149. package/lib/esm/widget/components/ReportAction.js.map +1 -1
  150. package/lib/esm/widget/components/ReportHorizontalTile.d.ts +4 -4
  151. package/lib/esm/widget/components/ReportHorizontalTile.d.ts.map +1 -1
  152. package/lib/esm/widget/components/ReportHorizontalTile.js +4 -5
  153. package/lib/esm/widget/components/ReportHorizontalTile.js.map +1 -1
  154. package/lib/esm/widget/components/ReportMappingHorizontalTile.d.ts +1 -1
  155. package/lib/esm/widget/components/ReportMappingHorizontalTile.d.ts.map +1 -1
  156. package/lib/esm/widget/components/ReportMappingHorizontalTile.js +1 -2
  157. package/lib/esm/widget/components/ReportMappingHorizontalTile.js.map +1 -1
  158. package/lib/esm/widget/components/ReportMappings.d.ts +4 -6
  159. package/lib/esm/widget/components/ReportMappings.d.ts.map +1 -1
  160. package/lib/esm/widget/components/ReportMappings.js +39 -49
  161. package/lib/esm/widget/components/ReportMappings.js.map +1 -1
  162. package/lib/esm/widget/components/ReportMappings.scss +3 -3
  163. package/lib/esm/widget/components/Reports.d.ts +6 -1
  164. package/lib/esm/widget/components/Reports.d.ts.map +1 -1
  165. package/lib/esm/widget/components/Reports.js +45 -86
  166. package/lib/esm/widget/components/Reports.js.map +1 -1
  167. package/lib/esm/widget/components/ReportsConfigContext.d.ts +18 -0
  168. package/lib/esm/widget/components/ReportsConfigContext.d.ts.map +1 -0
  169. package/lib/esm/widget/components/ReportsConfigContext.js +64 -0
  170. package/lib/esm/widget/components/ReportsConfigContext.js.map +1 -0
  171. package/lib/esm/widget/components/ReportsContainer.d.ts +14 -0
  172. package/lib/esm/widget/components/ReportsContainer.d.ts.map +1 -1
  173. package/lib/esm/widget/components/ReportsContainer.js +28 -17
  174. package/lib/esm/widget/components/ReportsContainer.js.map +1 -1
  175. package/lib/esm/widget/components/ReportsHeader.d.ts +7 -0
  176. package/lib/esm/widget/components/ReportsHeader.d.ts.map +1 -0
  177. package/lib/esm/widget/components/ReportsHeader.js +13 -0
  178. package/lib/esm/widget/components/ReportsHeader.js.map +1 -0
  179. package/lib/esm/widget/components/ReportsRouter.d.ts +8 -0
  180. package/lib/esm/widget/components/ReportsRouter.d.ts.map +1 -0
  181. package/lib/esm/widget/components/ReportsRouter.js +45 -0
  182. package/lib/esm/widget/components/ReportsRouter.js.map +1 -0
  183. package/lib/esm/widget/components/SearchBar.js +1 -2
  184. package/lib/esm/widget/components/SearchBar.js.map +1 -1
  185. package/lib/esm/widget/components/SearchBar.scss +1 -1
  186. package/lib/esm/widget/components/SelectIModel.d.ts +3 -3
  187. package/lib/esm/widget/components/SelectIModel.d.ts.map +1 -1
  188. package/lib/esm/widget/components/SelectIModel.js +7 -27
  189. package/lib/esm/widget/components/SelectIModel.js.map +1 -1
  190. package/lib/esm/widget/components/utils.d.ts +1 -1
  191. package/lib/esm/widget/components/utils.d.ts.map +1 -1
  192. package/lib/esm/widget/components/utils.js.map +1 -1
  193. package/lib/esm/widget/context/BulkExtractorContext.d.ts +10 -0
  194. package/lib/esm/widget/context/BulkExtractorContext.d.ts.map +1 -0
  195. package/lib/esm/widget/context/BulkExtractorContext.js +11 -0
  196. package/lib/esm/widget/context/BulkExtractorContext.js.map +1 -0
  197. package/lib/esm/widget/context/ReportsConfigApiContext.d.ts +16 -0
  198. package/lib/esm/widget/context/ReportsConfigApiContext.d.ts.map +1 -0
  199. package/lib/esm/widget/context/ReportsConfigApiContext.js +20 -0
  200. package/lib/esm/widget/context/ReportsConfigApiContext.js.map +1 -0
  201. package/lib/public/locales/en/ReportsConfigWidget.json +2 -1
  202. package/package.json +2 -2
  203. package/public/locales/en/ReportsConfigWidget.json +2 -1
  204. package/reports-config-widget-react.build.error.log +1 -14
  205. package/reports-config-widget-react.build.log +2 -60
  206. package/src/reports-config-widget-react.ts +6 -0
  207. package/src/test/AddMappingModal.test.tsx +20 -37
  208. package/src/test/BulkExtractor.test.ts +15 -17
  209. package/src/test/DeleteModal.test.tsx +4 -73
  210. package/src/test/ReportAction.test.tsx +17 -90
  211. package/src/test/ReportMappingHorizontalTile.test.tsx +3 -54
  212. package/src/test/ReportMappings.test.tsx +50 -135
  213. package/src/test/Reports.test.tsx +21 -80
  214. package/src/test/test-utils.tsx +9 -49
  215. package/src/widget/components/ActionPanel.tsx +16 -14
  216. package/src/widget/components/AddMappingsModal.tsx +39 -39
  217. package/src/widget/components/BulkExtractor.ts +11 -10
  218. package/src/widget/components/DeleteModal.tsx +14 -20
  219. package/src/widget/components/HorizontalTile.scss +6 -3
  220. package/src/widget/components/ReportAction.tsx +15 -30
  221. package/src/widget/components/ReportHorizontalTile.tsx +10 -11
  222. package/src/widget/components/ReportMappingHorizontalTile.tsx +2 -3
  223. package/src/widget/components/ReportMappings.scss +3 -3
  224. package/src/widget/components/ReportMappings.tsx +66 -69
  225. package/src/widget/components/Reports.tsx +143 -187
  226. package/src/widget/components/ReportsConfigContext.tsx +95 -0
  227. package/src/widget/components/ReportsContainer.tsx +47 -21
  228. package/src/widget/components/ReportsHeader.tsx +27 -0
  229. package/src/widget/components/ReportsRouter.tsx +63 -0
  230. package/src/widget/components/SearchBar.scss +1 -1
  231. package/src/widget/components/SearchBar.tsx +2 -2
  232. package/src/widget/components/SelectIModel.tsx +11 -29
  233. package/src/widget/components/utils.tsx +1 -1
  234. package/src/widget/context/{ReportsApiConfigContext.tsx → BulkExtractorContext.tsx} +9 -10
  235. package/src/widget/context/ReportsConfigApiContext.tsx +39 -0
  236. package/coverage/clover.xml +0 -838
  237. package/coverage/coverage-final.json +0 -29
  238. package/coverage/lcov-report/base.css +0 -224
  239. package/coverage/lcov-report/block-navigation.js +0 -87
  240. package/coverage/lcov-report/favicon.png +0 -0
  241. package/coverage/lcov-report/index.html +0 -206
  242. package/coverage/lcov-report/prettify.css +0 -1
  243. package/coverage/lcov-report/prettify.js +0 -2
  244. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  245. package/coverage/lcov-report/sorter.js +0 -196
  246. package/coverage/lcov-report/src/ReportsConfigWidget.ts.html +0 -193
  247. package/coverage/lcov-report/src/index.html +0 -116
  248. package/coverage/lcov-report/src/test/index.html +0 -116
  249. package/coverage/lcov-report/src/test/test-utils.tsx.html +0 -316
  250. package/coverage/lcov-report/src/widget/ReportsConfigUiProvider.tsx.html +0 -286
  251. package/coverage/lcov-report/src/widget/components/ActionPanel.tsx.html +0 -241
  252. package/coverage/lcov-report/src/widget/components/AddMappingsModal.tsx.html +0 -604
  253. package/coverage/lcov-report/src/widget/components/BulkExtractor.ts.html +0 -661
  254. package/coverage/lcov-report/src/widget/components/Constants.ts.html +0 -106
  255. package/coverage/lcov-report/src/widget/components/DeleteModal.tsx.html +0 -385
  256. package/coverage/lcov-report/src/widget/components/ExtractionStates/FailedExtractionState.tsx.html +0 -187
  257. package/coverage/lcov-report/src/widget/components/ExtractionStates/QueuedExtractionState.tsx.html +0 -145
  258. package/coverage/lcov-report/src/widget/components/ExtractionStates/RunningExtractionState.tsx.html +0 -139
  259. package/coverage/lcov-report/src/widget/components/ExtractionStates/StartingExtractionState.tsx.html +0 -151
  260. package/coverage/lcov-report/src/widget/components/ExtractionStates/SucceededExtractionState.tsx.html +0 -190
  261. package/coverage/lcov-report/src/widget/components/ExtractionStates/index.html +0 -176
  262. package/coverage/lcov-report/src/widget/components/ExtractionStatus.tsx.html +0 -295
  263. package/coverage/lcov-report/src/widget/components/ExtractionToast.tsx.html +0 -208
  264. package/coverage/lcov-report/src/widget/components/HorizontalTile.tsx.html +0 -289
  265. package/coverage/lcov-report/src/widget/components/LocalizedTablePaginator.tsx.html +0 -262
  266. package/coverage/lcov-report/src/widget/components/ReportAction.tsx.html +0 -517
  267. package/coverage/lcov-report/src/widget/components/ReportHorizontalTile.tsx.html +0 -475
  268. package/coverage/lcov-report/src/widget/components/ReportMappingHorizontalTile.tsx.html +0 -469
  269. package/coverage/lcov-report/src/widget/components/ReportMappings.tsx.html +0 -1078
  270. package/coverage/lcov-report/src/widget/components/Reports.tsx.html +0 -877
  271. package/coverage/lcov-report/src/widget/components/ReportsContainer.tsx.html +0 -223
  272. package/coverage/lcov-report/src/widget/components/SearchBar.tsx.html +0 -271
  273. package/coverage/lcov-report/src/widget/components/SelectIModel.tsx.html +0 -391
  274. package/coverage/lcov-report/src/widget/components/index.html +0 -371
  275. package/coverage/lcov-report/src/widget/components/utils.tsx.html +0 -562
  276. package/coverage/lcov-report/src/widget/context/ReportsApiConfigContext.tsx.html +0 -166
  277. package/coverage/lcov-report/src/widget/context/index.html +0 -116
  278. package/coverage/lcov-report/src/widget/hooks/index.html +0 -116
  279. package/coverage/lcov-report/src/widget/hooks/useValidator.ts.html +0 -295
  280. package/coverage/lcov-report/src/widget/index.html +0 -116
  281. package/coverage/lcov.info +0 -1594
  282. package/lib/cjs/widget/context/ReportsApiConfigContext.d.ts +0 -9
  283. package/lib/cjs/widget/context/ReportsApiConfigContext.d.ts.map +0 -1
  284. package/lib/cjs/widget/context/ReportsApiConfigContext.js.map +0 -1
  285. package/lib/esm/widget/context/ReportsApiConfigContext.d.ts +0 -9
  286. package/lib/esm/widget/context/ReportsApiConfigContext.d.ts.map +0 -1
  287. package/lib/esm/widget/context/ReportsApiConfigContext.js +0 -14
  288. package/lib/esm/widget/context/ReportsApiConfigContext.js.map +0 -1
@@ -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, Surface } 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,120 @@ 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
120
+ if (!bulkExtractor) return null;
121
+
122
+ return (
123
+ <>
124
+ <Surface className="rcw-reports-list-container">
125
+ <div className="rcw-toolbar">
126
+ {onClickAddReport && (
127
+ <Button
128
+ startIcon={<SvgAdd />}
129
+ onClick={onClickAddReport}
130
+ styleType="high-visibility"
131
+ >
132
+ {ReportsConfigWidget.localization.getLocalizedString(
133
+ "ReportsConfigWidget:New"
134
+ )}
135
+ </Button>
136
+ )}
137
+ <IconButton
167
138
  title={ReportsConfigWidget.localization.getLocalizedString(
168
- "ReportsConfigWidget:ITwinReports"
139
+ "ReportsConfigWidget:UpdateDatasets"
169
140
  )}
170
- />
171
- <Surface className="rcw-reports-list-container">
172
- <div className="rcw-toolbar">
173
- <Button
174
- startIcon={<SvgAdd />}
175
- onClick={() => addReport()}
176
- styleType="high-visibility"
177
- >
178
- {ReportsConfigWidget.localization.getLocalizedString(
179
- "ReportsConfigWidget:New"
180
- )}
181
- </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
- <>
141
+ onClick={updateDatasets}
142
+ disabled={selectedReportIds.length === 0}
143
+ >
144
+ <SvgPlay />
145
+ </IconButton>
146
+ <div
147
+ className="rcw-search-bar-container"
148
+ data-testid="rcw-search-bar"
149
+ >
150
+ <IconButton
151
+ title={ReportsConfigWidget.localization.getLocalizedString(
152
+ "ReportsConfigWidget:Refresh"
153
+ )}
154
+ onClick={refresh}
155
+ disabled={isLoading}
156
+ styleType="borderless"
157
+ >
158
+ <SvgRefresh />
159
+ </IconButton>
160
+ <SearchBar
161
+ searchValue={searchValue}
162
+ setSearchValue={setSearchValue}
163
+ disabled={isLoading}
164
+ />
165
+ </div>
166
+ </div>
167
+ {isLoading ? (
168
+ <LoadingOverlay />
169
+ ) : reports.length === 0 && onClickAddReport ? (
170
+ <EmptyMessage>
171
+ <>
172
+ {ReportsConfigWidget.localization.getLocalizedString(
173
+ "ReportsConfigWidget:NoReports"
174
+ )}
175
+ <div>
176
+ <Button onClick={onClickAddReport} styleType="cta">
206
177
  {ReportsConfigWidget.localization.getLocalizedString(
207
- "ReportsConfigWidget:NoReports"
178
+ "ReportsConfigWidget:CreateOneReportCTA"
208
179
  )}
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
- ))}
180
+ </Button>
242
181
  </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
- }
182
+ </>
183
+ </EmptyMessage>
184
+ ) : (
185
+ <div className="rcw-reports-list">
186
+ {filteredReports.map((report) => (
187
+ <ReportHorizontalTile
188
+ key={report.id}
189
+ report={report}
190
+ onClickTitle={onClickReportTitle}
191
+ jobStartEvent={jobStartEvent}
192
+ bulkExtractor={bulkExtractor}
193
+ onClickDelete={() => {
194
+ setShowDeleteModal(report);
195
+ }}
196
+ onClickModify={onClickReportModify}
197
+ onSelectionChange={onSelectionChange}
198
+ selected={selectedReportIds.some(
199
+ (reportId) => report.id === reportId
200
+ )}
201
+ />
202
+ ))}
203
+ </div>
204
+ )}
205
+ </Surface>
206
+ <DeleteModal
207
+ entityName={showDeleteModal?.displayName}
208
+ onClose={() => setShowDeleteModal(undefined)}
209
+ onDelete={async () => {
210
+ const accessToken = await getAccessToken();
211
+ await reportsClient.deleteReport(
212
+ accessToken,
213
+ showDeleteModal?.id ?? ""
214
+ );
215
+ }}
216
+ refresh={refresh}
217
+ />
218
+ </>
219
+ );
264
220
  };
@@ -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
+ };
@@ -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
 
@@ -0,0 +1,27 @@
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 type { Route } from "./ReportsContainer";
7
+ import { RouteStep } from "./ReportsContainer";
8
+ import { WidgetHeader } from "./utils";
9
+
10
+ export const ReportsHeader = ({
11
+ goBack,
12
+ currentRoute,
13
+ }: {
14
+ goBack: () => void;
15
+ currentRoute: Route;
16
+ }) => {
17
+ const shouldDisableReturnFn =
18
+ currentRoute.step === RouteStep.ReportsList ||
19
+ currentRoute.step === RouteStep.ReportAction;
20
+
21
+ return (
22
+ <WidgetHeader
23
+ returnFn={shouldDisableReturnFn ? undefined : goBack}
24
+ title={currentRoute.title}
25
+ />
26
+ );
27
+ };