@itwin/reports-config-widget-react 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/.rush/temp/package-deps_rebuild.json +48 -0
  2. package/.rush/temp/shrinkwrap-deps.json +868 -0
  3. package/CHANGELOG.json +17 -0
  4. package/CHANGELOG.md +11 -0
  5. package/LICENSE.md +9 -0
  6. package/README.md +38 -0
  7. package/__mocks__/fileMock.js +5 -0
  8. package/coverage/clover.xml +612 -0
  9. package/coverage/coverage-final.json +19 -0
  10. package/coverage/lcov-report/base.css +224 -0
  11. package/coverage/lcov-report/block-navigation.js +87 -0
  12. package/coverage/lcov-report/favicon.png +0 -0
  13. package/coverage/lcov-report/index.html +191 -0
  14. package/coverage/lcov-report/prettify.css +1 -0
  15. package/coverage/lcov-report/prettify.js +2 -0
  16. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  17. package/coverage/lcov-report/sorter.js +196 -0
  18. package/coverage/lcov-report/src/ReportsConfigWidget.ts.html +193 -0
  19. package/coverage/lcov-report/src/index.html +116 -0
  20. package/coverage/lcov-report/src/test/index.html +116 -0
  21. package/coverage/lcov-report/src/test/test-utils.tsx.html +316 -0
  22. package/coverage/lcov-report/src/widget/ReportsConfigUiProvider.tsx.html +286 -0
  23. package/coverage/lcov-report/src/widget/components/ActionPanel.tsx.html +253 -0
  24. package/coverage/lcov-report/src/widget/components/AddMappingsModal.tsx.html +610 -0
  25. package/coverage/lcov-report/src/widget/components/DeleteModal.tsx.html +385 -0
  26. package/coverage/lcov-report/src/widget/components/Extraction.tsx.html +1030 -0
  27. package/coverage/lcov-report/src/widget/components/HorizontalTile.tsx.html +256 -0
  28. package/coverage/lcov-report/src/widget/components/LocalizedTablePaginator.tsx.html +262 -0
  29. package/coverage/lcov-report/src/widget/components/ReportAction.tsx.html +523 -0
  30. package/coverage/lcov-report/src/widget/components/ReportMappings.tsx.html +1135 -0
  31. package/coverage/lcov-report/src/widget/components/Reports.tsx.html +829 -0
  32. package/coverage/lcov-report/src/widget/components/ReportsContainer.tsx.html +193 -0
  33. package/coverage/lcov-report/src/widget/components/SearchBar.tsx.html +271 -0
  34. package/coverage/lcov-report/src/widget/components/SelectIModel.tsx.html +391 -0
  35. package/coverage/lcov-report/src/widget/components/index.html +296 -0
  36. package/coverage/lcov-report/src/widget/components/utils.tsx.html +562 -0
  37. package/coverage/lcov-report/src/widget/context/ReportsApiConfigContext.tsx.html +166 -0
  38. package/coverage/lcov-report/src/widget/context/index.html +116 -0
  39. package/coverage/lcov-report/src/widget/hooks/index.html +116 -0
  40. package/coverage/lcov-report/src/widget/hooks/useValidator.ts.html +295 -0
  41. package/coverage/lcov-report/src/widget/index.html +116 -0
  42. package/coverage/lcov.info +1260 -0
  43. package/jest.config.js +19 -0
  44. package/lib/cjs/ReportsConfigWidget.d.ts +10 -0
  45. package/lib/cjs/ReportsConfigWidget.d.ts.map +1 -0
  46. package/lib/cjs/ReportsConfigWidget.js +24 -0
  47. package/lib/cjs/ReportsConfigWidget.js.map +1 -0
  48. package/lib/cjs/reports-config-widget-react.d.ts +4 -0
  49. package/lib/cjs/reports-config-widget-react.d.ts.map +1 -0
  50. package/lib/cjs/reports-config-widget-react.js +20 -0
  51. package/lib/cjs/reports-config-widget-react.js.map +1 -0
  52. package/lib/cjs/test/ReportAction.test.d.ts +2 -0
  53. package/lib/cjs/test/ReportAction.test.d.ts.map +1 -0
  54. package/lib/cjs/test/ReportAction.test.js +194 -0
  55. package/lib/cjs/test/ReportAction.test.js.map +1 -0
  56. package/lib/cjs/test/ReportMappings.test.d.ts +2 -0
  57. package/lib/cjs/test/ReportMappings.test.d.ts.map +1 -0
  58. package/lib/cjs/test/ReportMappings.test.js +530 -0
  59. package/lib/cjs/test/ReportMappings.test.js.map +1 -0
  60. package/lib/cjs/test/Reports.test.d.ts +2 -0
  61. package/lib/cjs/test/Reports.test.d.ts.map +1 -0
  62. package/lib/cjs/test/Reports.test.js +232 -0
  63. package/lib/cjs/test/Reports.test.js.map +1 -0
  64. package/lib/cjs/test/WidgetHeader.test.d.ts +2 -0
  65. package/lib/cjs/test/WidgetHeader.test.d.ts.map +1 -0
  66. package/lib/cjs/test/WidgetHeader.test.js +30 -0
  67. package/lib/cjs/test/WidgetHeader.test.js.map +1 -0
  68. package/lib/cjs/test/test-utils.d.ts +69 -0
  69. package/lib/cjs/test/test-utils.d.ts.map +1 -0
  70. package/lib/cjs/test/test-utils.js +77 -0
  71. package/lib/cjs/test/test-utils.js.map +1 -0
  72. package/lib/cjs/tsconfig.tsbuildinfo +1 -0
  73. package/lib/cjs/widget/ReportsConfigUiProvider.d.ts +12 -0
  74. package/lib/cjs/widget/ReportsConfigUiProvider.d.ts.map +1 -0
  75. package/lib/cjs/widget/ReportsConfigUiProvider.js +55 -0
  76. package/lib/cjs/widget/ReportsConfigUiProvider.js.map +1 -0
  77. package/lib/cjs/widget/components/ActionPanel.d.ts +13 -0
  78. package/lib/cjs/widget/components/ActionPanel.d.ts.map +1 -0
  79. package/lib/cjs/widget/components/ActionPanel.js +39 -0
  80. package/lib/cjs/widget/components/ActionPanel.js.map +1 -0
  81. package/lib/cjs/widget/components/ActionPanel.scss +12 -0
  82. package/lib/cjs/widget/components/AddMappingsModal.d.ts +15 -0
  83. package/lib/cjs/widget/components/AddMappingsModal.d.ts.map +1 -0
  84. package/lib/cjs/widget/components/AddMappingsModal.js +118 -0
  85. package/lib/cjs/widget/components/AddMappingsModal.js.map +1 -0
  86. package/lib/cjs/widget/components/AddMappingsModal.scss +18 -0
  87. package/lib/cjs/widget/components/DeleteModal.d.ts +12 -0
  88. package/lib/cjs/widget/components/DeleteModal.d.ts.map +1 -0
  89. package/lib/cjs/widget/components/DeleteModal.js +65 -0
  90. package/lib/cjs/widget/components/DeleteModal.js.map +1 -0
  91. package/lib/cjs/widget/components/DeleteModal.scss +18 -0
  92. package/lib/cjs/widget/components/Extraction.d.ts +28 -0
  93. package/lib/cjs/widget/components/Extraction.d.ts.map +1 -0
  94. package/lib/cjs/widget/components/Extraction.js +193 -0
  95. package/lib/cjs/widget/components/Extraction.js.map +1 -0
  96. package/lib/cjs/widget/components/Extraction.scss +39 -0
  97. package/lib/cjs/widget/components/HorizontalTile.d.ts +13 -0
  98. package/lib/cjs/widget/components/HorizontalTile.d.ts.map +1 -0
  99. package/lib/cjs/widget/components/HorizontalTile.js +18 -0
  100. package/lib/cjs/widget/components/HorizontalTile.js.map +1 -0
  101. package/lib/cjs/widget/components/HorizontalTile.scss +32 -0
  102. package/lib/cjs/widget/components/LocalizedTablePaginator.d.ts +4 -0
  103. package/lib/cjs/widget/components/LocalizedTablePaginator.d.ts.map +1 -0
  104. package/lib/cjs/widget/components/LocalizedTablePaginator.js +41 -0
  105. package/lib/cjs/widget/components/LocalizedTablePaginator.js.map +1 -0
  106. package/lib/cjs/widget/components/ReportAction.d.ts +11 -0
  107. package/lib/cjs/widget/components/ReportAction.d.ts.map +1 -0
  108. package/lib/cjs/widget/components/ReportAction.js +101 -0
  109. package/lib/cjs/widget/components/ReportAction.js.map +1 -0
  110. package/lib/cjs/widget/components/ReportAction.scss +16 -0
  111. package/lib/cjs/widget/components/ReportMappings.d.ts +17 -0
  112. package/lib/cjs/widget/components/ReportMappings.d.ts.map +1 -0
  113. package/lib/cjs/widget/components/ReportMappings.js +174 -0
  114. package/lib/cjs/widget/components/ReportMappings.js.map +1 -0
  115. package/lib/cjs/widget/components/ReportMappings.scss +46 -0
  116. package/lib/cjs/widget/components/Reports.d.ts +7 -0
  117. package/lib/cjs/widget/components/Reports.d.ts.map +1 -0
  118. package/lib/cjs/widget/components/Reports.js +143 -0
  119. package/lib/cjs/widget/components/Reports.js.map +1 -0
  120. package/lib/cjs/widget/components/Reports.scss +36 -0
  121. package/lib/cjs/widget/components/ReportsContainer.d.ts +10 -0
  122. package/lib/cjs/widget/components/ReportsContainer.d.ts.map +1 -0
  123. package/lib/cjs/widget/components/ReportsContainer.js +34 -0
  124. package/lib/cjs/widget/components/ReportsContainer.js.map +1 -0
  125. package/lib/cjs/widget/components/ReportsContainer.scss +15 -0
  126. package/lib/cjs/widget/components/SearchBar.d.ts +10 -0
  127. package/lib/cjs/widget/components/SearchBar.d.ts.map +1 -0
  128. package/lib/cjs/widget/components/SearchBar.js +50 -0
  129. package/lib/cjs/widget/components/SearchBar.js.map +1 -0
  130. package/lib/cjs/widget/components/SearchBar.scss +27 -0
  131. package/lib/cjs/widget/components/SelectIModel.d.ts +9 -0
  132. package/lib/cjs/widget/components/SelectIModel.d.ts.map +1 -0
  133. package/lib/cjs/widget/components/SelectIModel.js +82 -0
  134. package/lib/cjs/widget/components/SelectIModel.js.map +1 -0
  135. package/lib/cjs/widget/components/SelectIModel.scss +15 -0
  136. package/lib/cjs/widget/components/utils.d.ts +23 -0
  137. package/lib/cjs/widget/components/utils.d.ts.map +1 -0
  138. package/lib/cjs/widget/components/utils.js +87 -0
  139. package/lib/cjs/widget/components/utils.js.map +1 -0
  140. package/lib/cjs/widget/components/utils.scss +39 -0
  141. package/lib/cjs/widget/context/ReportsApiConfigContext.d.ts +9 -0
  142. package/lib/cjs/widget/context/ReportsApiConfigContext.d.ts.map +1 -0
  143. package/lib/cjs/widget/context/ReportsApiConfigContext.js +37 -0
  144. package/lib/cjs/widget/context/ReportsApiConfigContext.js.map +1 -0
  145. package/lib/cjs/widget/hooks/useValidator.d.ts +8 -0
  146. package/lib/cjs/widget/hooks/useValidator.d.ts.map +1 -0
  147. package/lib/cjs/widget/hooks/useValidator.js +56 -0
  148. package/lib/cjs/widget/hooks/useValidator.js.map +1 -0
  149. package/lib/esm/ReportsConfigWidget.d.ts +10 -0
  150. package/lib/esm/ReportsConfigWidget.d.ts.map +1 -0
  151. package/lib/esm/ReportsConfigWidget.js +20 -0
  152. package/lib/esm/ReportsConfigWidget.js.map +1 -0
  153. package/lib/esm/reports-config-widget-react.d.ts +4 -0
  154. package/lib/esm/reports-config-widget-react.d.ts.map +1 -0
  155. package/lib/esm/reports-config-widget-react.js +8 -0
  156. package/lib/esm/reports-config-widget-react.js.map +1 -0
  157. package/lib/esm/test/ReportAction.test.d.ts +2 -0
  158. package/lib/esm/test/ReportAction.test.d.ts.map +1 -0
  159. package/lib/esm/test/ReportAction.test.js +170 -0
  160. package/lib/esm/test/ReportAction.test.js.map +1 -0
  161. package/lib/esm/test/ReportMappings.test.d.ts +2 -0
  162. package/lib/esm/test/ReportMappings.test.d.ts.map +1 -0
  163. package/lib/esm/test/ReportMappings.test.js +506 -0
  164. package/lib/esm/test/ReportMappings.test.js.map +1 -0
  165. package/lib/esm/test/Reports.test.d.ts +2 -0
  166. package/lib/esm/test/Reports.test.d.ts.map +1 -0
  167. package/lib/esm/test/Reports.test.js +208 -0
  168. package/lib/esm/test/Reports.test.js.map +1 -0
  169. package/lib/esm/test/WidgetHeader.test.d.ts +2 -0
  170. package/lib/esm/test/WidgetHeader.test.d.ts.map +1 -0
  171. package/lib/esm/test/WidgetHeader.test.js +25 -0
  172. package/lib/esm/test/WidgetHeader.test.js.map +1 -0
  173. package/lib/esm/test/test-utils.d.ts +69 -0
  174. package/lib/esm/test/test-utils.d.ts.map +1 -0
  175. package/lib/esm/test/test-utils.js +48 -0
  176. package/lib/esm/test/test-utils.js.map +1 -0
  177. package/lib/esm/tsconfig.tsbuildinfo +1 -0
  178. package/lib/esm/widget/ReportsConfigUiProvider.d.ts +12 -0
  179. package/lib/esm/widget/ReportsConfigUiProvider.d.ts.map +1 -0
  180. package/lib/esm/widget/ReportsConfigUiProvider.js +29 -0
  181. package/lib/esm/widget/ReportsConfigUiProvider.js.map +1 -0
  182. package/lib/esm/widget/components/ActionPanel.d.ts +13 -0
  183. package/lib/esm/widget/components/ActionPanel.d.ts.map +1 -0
  184. package/lib/esm/widget/components/ActionPanel.js +18 -0
  185. package/lib/esm/widget/components/ActionPanel.js.map +1 -0
  186. package/lib/esm/widget/components/ActionPanel.scss +12 -0
  187. package/lib/esm/widget/components/AddMappingsModal.d.ts +15 -0
  188. package/lib/esm/widget/components/AddMappingsModal.d.ts.map +1 -0
  189. package/lib/esm/widget/components/AddMappingsModal.js +94 -0
  190. package/lib/esm/widget/components/AddMappingsModal.js.map +1 -0
  191. package/lib/esm/widget/components/AddMappingsModal.scss +18 -0
  192. package/lib/esm/widget/components/DeleteModal.d.ts +12 -0
  193. package/lib/esm/widget/components/DeleteModal.d.ts.map +1 -0
  194. package/lib/esm/widget/components/DeleteModal.js +42 -0
  195. package/lib/esm/widget/components/DeleteModal.js.map +1 -0
  196. package/lib/esm/widget/components/DeleteModal.scss +18 -0
  197. package/lib/esm/widget/components/Extraction.d.ts +28 -0
  198. package/lib/esm/widget/components/Extraction.d.ts.map +1 -0
  199. package/lib/esm/widget/components/Extraction.js +169 -0
  200. package/lib/esm/widget/components/Extraction.js.map +1 -0
  201. package/lib/esm/widget/components/Extraction.scss +39 -0
  202. package/lib/esm/widget/components/HorizontalTile.d.ts +13 -0
  203. package/lib/esm/widget/components/HorizontalTile.d.ts.map +1 -0
  204. package/lib/esm/widget/components/HorizontalTile.js +11 -0
  205. package/lib/esm/widget/components/HorizontalTile.js.map +1 -0
  206. package/lib/esm/widget/components/HorizontalTile.scss +32 -0
  207. package/lib/esm/widget/components/LocalizedTablePaginator.d.ts +4 -0
  208. package/lib/esm/widget/components/LocalizedTablePaginator.d.ts.map +1 -0
  209. package/lib/esm/widget/components/LocalizedTablePaginator.js +18 -0
  210. package/lib/esm/widget/components/LocalizedTablePaginator.js.map +1 -0
  211. package/lib/esm/widget/components/ReportAction.d.ts +11 -0
  212. package/lib/esm/widget/components/ReportAction.d.ts.map +1 -0
  213. package/lib/esm/widget/components/ReportAction.js +77 -0
  214. package/lib/esm/widget/components/ReportAction.js.map +1 -0
  215. package/lib/esm/widget/components/ReportAction.scss +16 -0
  216. package/lib/esm/widget/components/ReportMappings.d.ts +17 -0
  217. package/lib/esm/widget/components/ReportMappings.d.ts.map +1 -0
  218. package/lib/esm/widget/components/ReportMappings.js +148 -0
  219. package/lib/esm/widget/components/ReportMappings.js.map +1 -0
  220. package/lib/esm/widget/components/ReportMappings.scss +46 -0
  221. package/lib/esm/widget/components/Reports.d.ts +7 -0
  222. package/lib/esm/widget/components/Reports.d.ts.map +1 -0
  223. package/lib/esm/widget/components/Reports.js +117 -0
  224. package/lib/esm/widget/components/Reports.js.map +1 -0
  225. package/lib/esm/widget/components/Reports.scss +36 -0
  226. package/lib/esm/widget/components/ReportsContainer.d.ts +10 -0
  227. package/lib/esm/widget/components/ReportsContainer.d.ts.map +1 -0
  228. package/lib/esm/widget/components/ReportsContainer.js +13 -0
  229. package/lib/esm/widget/components/ReportsContainer.js.map +1 -0
  230. package/lib/esm/widget/components/ReportsContainer.scss +15 -0
  231. package/lib/esm/widget/components/SearchBar.d.ts +10 -0
  232. package/lib/esm/widget/components/SearchBar.d.ts.map +1 -0
  233. package/lib/esm/widget/components/SearchBar.js +27 -0
  234. package/lib/esm/widget/components/SearchBar.js.map +1 -0
  235. package/lib/esm/widget/components/SearchBar.scss +27 -0
  236. package/lib/esm/widget/components/SelectIModel.d.ts +9 -0
  237. package/lib/esm/widget/components/SelectIModel.d.ts.map +1 -0
  238. package/lib/esm/widget/components/SelectIModel.js +59 -0
  239. package/lib/esm/widget/components/SelectIModel.js.map +1 -0
  240. package/lib/esm/widget/components/SelectIModel.scss +15 -0
  241. package/lib/esm/widget/components/utils.d.ts +23 -0
  242. package/lib/esm/widget/components/utils.d.ts.map +1 -0
  243. package/lib/esm/widget/components/utils.js +73 -0
  244. package/lib/esm/widget/components/utils.js.map +1 -0
  245. package/lib/esm/widget/components/utils.scss +39 -0
  246. package/lib/esm/widget/context/ReportsApiConfigContext.d.ts +9 -0
  247. package/lib/esm/widget/context/ReportsApiConfigContext.d.ts.map +1 -0
  248. package/lib/esm/widget/context/ReportsApiConfigContext.js +14 -0
  249. package/lib/esm/widget/context/ReportsApiConfigContext.js.map +1 -0
  250. package/lib/esm/widget/hooks/useValidator.d.ts +8 -0
  251. package/lib/esm/widget/hooks/useValidator.d.ts.map +1 -0
  252. package/lib/esm/widget/hooks/useValidator.js +50 -0
  253. package/lib/esm/widget/hooks/useValidator.js.map +1 -0
  254. package/lib/public/locales/en/ReportsConfigWidget.json +76 -0
  255. package/package.json +124 -0
  256. package/public/locales/en/ReportsConfigWidget.json +76 -0
  257. package/reports-config-widget-react.build.error.log +10 -0
  258. package/reports-config-widget-react.build.log +45 -0
  259. package/src/ReportsConfigWidget.ts +36 -0
  260. package/src/reports-config-widget-react.ts +7 -0
  261. package/src/test/ReportAction.test.tsx +258 -0
  262. package/src/test/ReportMappings.test.tsx +882 -0
  263. package/src/test/Reports.test.tsx +365 -0
  264. package/src/test/WidgetHeader.test.tsx +29 -0
  265. package/src/test/test-utils.tsx +77 -0
  266. package/src/widget/ReportsConfigUiProvider.tsx +67 -0
  267. package/src/widget/components/ActionPanel.scss +12 -0
  268. package/src/widget/components/ActionPanel.tsx +56 -0
  269. package/src/widget/components/AddMappingsModal.scss +18 -0
  270. package/src/widget/components/AddMappingsModal.tsx +175 -0
  271. package/src/widget/components/DeleteModal.scss +18 -0
  272. package/src/widget/components/DeleteModal.tsx +100 -0
  273. package/src/widget/components/Extraction.scss +39 -0
  274. package/src/widget/components/Extraction.tsx +315 -0
  275. package/src/widget/components/HorizontalTile.scss +32 -0
  276. package/src/widget/components/HorizontalTile.tsx +57 -0
  277. package/src/widget/components/LocalizedTablePaginator.tsx +59 -0
  278. package/src/widget/components/ReportAction.scss +16 -0
  279. package/src/widget/components/ReportAction.tsx +146 -0
  280. package/src/widget/components/ReportMappings.scss +46 -0
  281. package/src/widget/components/ReportMappings.tsx +350 -0
  282. package/src/widget/components/Reports.scss +36 -0
  283. package/src/widget/components/Reports.tsx +248 -0
  284. package/src/widget/components/ReportsContainer.scss +15 -0
  285. package/src/widget/components/ReportsContainer.tsx +36 -0
  286. package/src/widget/components/SearchBar.scss +27 -0
  287. package/src/widget/components/SearchBar.tsx +62 -0
  288. package/src/widget/components/SelectIModel.scss +15 -0
  289. package/src/widget/components/SelectIModel.tsx +102 -0
  290. package/src/widget/components/utils.scss +39 -0
  291. package/src/widget/components/utils.tsx +159 -0
  292. package/src/widget/context/ReportsApiConfigContext.tsx +27 -0
  293. package/src/widget/hooks/useValidator.ts +70 -0
  294. package/tsconfig.json +11 -0
@@ -0,0 +1,12 @@
1
+ import type { AbstractWidgetProps, UiItemsProvider } from "@itwin/appui-abstract";
2
+ import { StagePanelLocation, StagePanelSection } from "@itwin/appui-abstract";
3
+ import type { AccessToken } from "@itwin/core-bentley";
4
+ export declare const REPORTS_CONFIG_BASE_URL = "https://api.bentley.com";
5
+ export declare class ReportsConfigProvider implements UiItemsProvider {
6
+ readonly id = "ReportsConfigProvider";
7
+ private readonly _getAccessToken?;
8
+ private readonly _baseUrl;
9
+ constructor(getAccessToken?: () => Promise<AccessToken>, baseUrl?: string);
10
+ provideWidgets(_stageId: string, stageUsage: string, location: StagePanelLocation, section?: StagePanelSection): ReadonlyArray<AbstractWidgetProps>;
11
+ }
12
+ //# sourceMappingURL=ReportsConfigUiProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportsConfigUiProvider.d.ts","sourceRoot":"","sources":["../../../src/widget/ReportsConfigUiProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EAElB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAMvD,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAEjE,qBAAa,qBAAsB,YAAW,eAAe;IAC3D,SAAgB,EAAE,2BAA2B;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAGhC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,EAC3C,OAAO,GAAE,MAAgC;IAMpC,cAAc,CACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,aAAa,CAAC,mBAAmB,CAAC;CA2BtC"}
@@ -0,0 +1,29 @@
1
+ import { StagePanelLocation, StagePanelSection, StageUsage, } from "@itwin/appui-abstract";
2
+ import * as React from "react";
3
+ import { ReportsConfigWidget } from "../ReportsConfigWidget";
4
+ import ReportsContainer from "./components/ReportsContainer";
5
+ export const REPORTS_CONFIG_BASE_URL = "https://api.bentley.com";
6
+ export class ReportsConfigProvider {
7
+ constructor(getAccessToken, baseUrl = REPORTS_CONFIG_BASE_URL) {
8
+ this.id = "ReportsConfigProvider";
9
+ this._getAccessToken = getAccessToken;
10
+ this._baseUrl = baseUrl;
11
+ }
12
+ provideWidgets(_stageId, stageUsage, location, section) {
13
+ const widgets = [];
14
+ if (location === StagePanelLocation.Left &&
15
+ section === StagePanelSection.Start &&
16
+ stageUsage === StageUsage.General) {
17
+ const ReportsWidget = {
18
+ id: "reports-config-widget",
19
+ label: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:ReportsConfig"),
20
+ getWidgetContent: () => {
21
+ return (React.createElement(ReportsContainer, { getAccessToken: this._getAccessToken, baseUrl: this._baseUrl }));
22
+ },
23
+ };
24
+ widgets.push(ReportsWidget);
25
+ }
26
+ return widgets;
27
+ }
28
+ }
29
+ //# sourceMappingURL=ReportsConfigUiProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportsConfigUiProvider.js","sourceRoot":"","sources":["../../../src/widget/ReportsConfigUiProvider.tsx"],"names":[],"mappings":"AAQA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAE7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AAEjE,MAAM,OAAO,qBAAqB;IAKhC,YACE,cAA2C,EAC3C,UAAkB,uBAAuB;QAN3B,OAAE,GAAG,uBAAuB,CAAC;QAQ3C,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAEM,cAAc,CACnB,QAAgB,EAChB,UAAkB,EAClB,QAA4B,EAC5B,OAA2B;QAE3B,MAAM,OAAO,GAA0B,EAAE,CAAC;QAC1C,IACE,QAAQ,KAAK,kBAAkB,CAAC,IAAI;YACpC,OAAO,KAAK,iBAAiB,CAAC,KAAK;YACnC,UAAU,KAAK,UAAU,CAAC,OAAO,EACjC;YACA,MAAM,aAAa,GAAwB;gBACzC,EAAE,EAAE,uBAAuB;gBAC3B,KAAK,EAAE,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CACxD,mCAAmC,CACpC;gBACD,gBAAgB,EAAE,GAAG,EAAE;oBACrB,OAAO,CACL,oBAAC,gBAAgB,IACf,cAAc,EAAE,IAAI,CAAC,eAAe,EACpC,OAAO,EAAE,IAAI,CAAC,QAAQ,GACtB,CACH,CAAC;gBACJ,CAAC;aACF,CAAC;YAEF,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAC7B;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type {\n AbstractWidgetProps,\n UiItemsProvider,\n} from \"@itwin/appui-abstract\";\nimport {\n StagePanelLocation,\n StagePanelSection,\n StageUsage,\n} from \"@itwin/appui-abstract\";\nimport type { AccessToken } from \"@itwin/core-bentley\";\n\nimport * as React from \"react\";\nimport { ReportsConfigWidget } from \"../ReportsConfigWidget\";\nimport ReportsContainer from \"./components/ReportsContainer\";\n\nexport const REPORTS_CONFIG_BASE_URL = \"https://api.bentley.com\";\n\nexport class ReportsConfigProvider implements UiItemsProvider {\n public readonly id = \"ReportsConfigProvider\";\n private readonly _getAccessToken?: () => Promise<AccessToken>;\n private readonly _baseUrl: string;\n\n constructor(\n getAccessToken?: () => Promise<AccessToken>,\n baseUrl: string = REPORTS_CONFIG_BASE_URL\n ) {\n this._getAccessToken = getAccessToken;\n this._baseUrl = baseUrl;\n }\n\n public provideWidgets(\n _stageId: string,\n stageUsage: string,\n location: StagePanelLocation,\n section?: StagePanelSection\n ): ReadonlyArray<AbstractWidgetProps> {\n const widgets: AbstractWidgetProps[] = [];\n if (\n location === StagePanelLocation.Left &&\n section === StagePanelSection.Start &&\n stageUsage === StageUsage.General\n ) {\n const ReportsWidget: AbstractWidgetProps = {\n id: \"reports-config-widget\",\n label: ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:ReportsConfig\"\n ),\n getWidgetContent: () => {\n return (\n <ReportsContainer\n getAccessToken={this._getAccessToken}\n baseUrl={this._baseUrl}\n />\n );\n },\n };\n\n widgets.push(ReportsWidget);\n }\n\n return widgets;\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ import "./ActionPanel.scss";
3
+ export interface ActionPanelProps {
4
+ actionLabel: string;
5
+ onAction: () => Promise<void>;
6
+ onCancel: () => void;
7
+ isCancelDisabled?: boolean;
8
+ isSavingDisabled?: boolean;
9
+ isLoading?: boolean;
10
+ }
11
+ declare const ActionPanel: ({ actionLabel, onAction, onCancel, isCancelDisabled, isSavingDisabled, isLoading, }: ActionPanelProps) => JSX.Element;
12
+ export default ActionPanel;
13
+ //# sourceMappingURL=ActionPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionPanel.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/ActionPanel.tsx"],"names":[],"mappings":";AAOA,OAAO,oBAAoB,CAAC;AAG5B,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,WAAW,wFAOd,gBAAgB,KAAG,WA2BrB,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,18 @@
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 { Button } from "@itwin/itwinui-react";
6
+ import * as React from "react";
7
+ import { ReportsConfigWidget } from "../../ReportsConfigWidget";
8
+ import "./ActionPanel.scss";
9
+ import { LoadingSpinner } from "./utils";
10
+ const ActionPanel = ({ actionLabel, onAction, onCancel, isCancelDisabled = false, isSavingDisabled = false, isLoading = false, }) => {
11
+ return (React.createElement("div", { id: "action" },
12
+ React.createElement("div", { className: "rcw-action-panel" },
13
+ isLoading && React.createElement(LoadingSpinner, null),
14
+ React.createElement(Button, { disabled: isSavingDisabled || isLoading, styleType: "high-visibility", id: "save-app", onClick: onAction }, actionLabel),
15
+ React.createElement(Button, { styleType: "default", type: "button", id: "cancel", onClick: onCancel, disabled: isCancelDisabled || isLoading }, ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Cancel")))));
16
+ };
17
+ export default ActionPanel;
18
+ //# sourceMappingURL=ActionPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionPanel.js","sourceRoot":"","sources":["../../../../src/widget/components/ActionPanel.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAWzC,MAAM,WAAW,GAAG,CAAC,EACnB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,gBAAgB,GAAG,KAAK,EACxB,gBAAgB,GAAG,KAAK,EACxB,SAAS,GAAG,KAAK,GACA,EAAe,EAAE;IAClC,OAAO,CACL,6BAAK,EAAE,EAAC,QAAQ;QACd,6BAAK,SAAS,EAAC,kBAAkB;YAC9B,SAAS,IAAI,oBAAC,cAAc,OAAG;YAChC,oBAAC,MAAM,IACL,QAAQ,EAAE,gBAAgB,IAAI,SAAS,EACvC,SAAS,EAAC,iBAAiB,EAC3B,EAAE,EAAC,UAAU,EACb,OAAO,EAAE,QAAQ,IAEhB,WAAW,CACL;YACT,oBAAC,MAAM,IACL,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,QAAQ,EACX,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,gBAAgB,IAAI,SAAS,IAEtC,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,4BAA4B,CAC7B,CACM,CACL,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { Button } from \"@itwin/itwinui-react\";\nimport * as React from \"react\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\nimport \"./ActionPanel.scss\";\nimport { LoadingSpinner } from \"./utils\";\n\nexport interface ActionPanelProps {\n actionLabel: string;\n onAction: () => Promise<void>;\n onCancel: () => void;\n isCancelDisabled?: boolean;\n isSavingDisabled?: boolean;\n isLoading?: boolean;\n}\n\nconst ActionPanel = ({\n actionLabel,\n onAction,\n onCancel,\n isCancelDisabled = false,\n isSavingDisabled = false,\n isLoading = false,\n}: ActionPanelProps): JSX.Element => {\n return (\n <div id=\"action\">\n <div className=\"rcw-action-panel\">\n {isLoading && <LoadingSpinner />}\n <Button\n disabled={isSavingDisabled || isLoading}\n styleType=\"high-visibility\"\n id=\"save-app\"\n onClick={onAction}\n >\n {actionLabel}\n </Button>\n <Button\n styleType=\"default\"\n type=\"button\"\n id=\"cancel\"\n onClick={onCancel}\n disabled={isCancelDisabled || isLoading}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Cancel\"\n )}\n </Button>\n </div>\n </div>\n );\n};\n\nexport default ActionPanel;\n"]}
@@ -0,0 +1,12 @@
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 "~@itwin/itwinui-css/scss/variables";
6
+
7
+ .rcw-action-panel {
8
+ display: flex;
9
+ justify-content: right;
10
+ padding: $iui-baseline * 2 $iui-m $iui-baseline;
11
+ gap: $iui-s;
12
+ }
@@ -0,0 +1,15 @@
1
+ /// <reference types="react" />
2
+ import type { Mapping } from "@itwin/insights-client";
3
+ import "./AddMappingsModal.scss";
4
+ import type { ReportMappingAndMapping } from "./ReportMappings";
5
+ import type { CreateTypeFromInterface } from "./utils";
6
+ export declare type MappingType = CreateTypeFromInterface<Mapping>;
7
+ interface AddMappingsModalProps {
8
+ reportId: string;
9
+ existingMappings: ReportMappingAndMapping[];
10
+ show: boolean;
11
+ returnFn: () => Promise<void>;
12
+ }
13
+ declare const AddMappingsModal: ({ reportId, existingMappings, show, returnFn, }: AddMappingsModalProps) => JSX.Element;
14
+ export default AddMappingsModal;
15
+ //# sourceMappingURL=AddMappingsModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddMappingsModal.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/AddMappingsModal.tsx"],"names":[],"mappings":";AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAIhE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAIvD,oBAAY,WAAW,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;AA0B3D,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,uBAAuB,EAAE,CAAC;IAC5C,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,QAAA,MAAM,gBAAgB,oDAKnB,qBAAqB,gBAmHvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,94 @@
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 { Modal, Table, tableFilters } from "@itwin/itwinui-react";
6
+ import React, { useEffect, useMemo, useState } from "react";
7
+ import { REPORTING_BASE_PATH, ReportingClient } from "@itwin/insights-client";
8
+ import ActionPanel from "./ActionPanel";
9
+ import "./AddMappingsModal.scss";
10
+ import { LocalizedTablePaginator } from "./LocalizedTablePaginator";
11
+ import { useReportsApiConfig } from "../context/ReportsApiConfigContext";
12
+ import { SelectIModel } from "./SelectIModel";
13
+ import { generateUrl, handleError } from "./utils";
14
+ import { ReportsConfigWidget } from "../../ReportsConfigWidget";
15
+ const fetchMappings = async (setMappings, iModelId, setIsLoading, apiContext) => {
16
+ try {
17
+ setIsLoading(true);
18
+ const reportingClientApi = new ReportingClient(generateUrl(REPORTING_BASE_PATH, apiContext.baseUrl));
19
+ const accessToken = await apiContext.getAccessToken();
20
+ const mappings = await reportingClientApi.getMappings(accessToken, iModelId);
21
+ setMappings(mappings);
22
+ }
23
+ catch (error) {
24
+ handleError(error.status);
25
+ }
26
+ finally {
27
+ setIsLoading(false);
28
+ }
29
+ };
30
+ const AddMappingsModal = ({ reportId, existingMappings, show, returnFn, }) => {
31
+ const [isLoading, setIsLoading] = useState(true);
32
+ const [selectedMappings, setSelectedMappings] = useState([]);
33
+ const [selectedIModelId, setSelectediModelId] = useState("");
34
+ const [mappings, setMappings] = useState([]);
35
+ const apiConfig = useReportsApiConfig();
36
+ useEffect(() => {
37
+ if (selectedIModelId) {
38
+ void fetchMappings(setMappings, selectedIModelId, setIsLoading, apiConfig);
39
+ }
40
+ }, [apiConfig, selectedIModelId, setIsLoading]);
41
+ const mappingsColumns = useMemo(() => [
42
+ {
43
+ Header: "Table",
44
+ columns: [
45
+ {
46
+ id: "mappingName",
47
+ Header: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:MappingName"),
48
+ accessor: "mappingName",
49
+ Filter: tableFilters.TextFilter(),
50
+ },
51
+ {
52
+ id: "description",
53
+ Header: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Description"),
54
+ accessor: "description",
55
+ Filter: tableFilters.TextFilter(),
56
+ },
57
+ ],
58
+ },
59
+ ], []);
60
+ const onSave = async () => {
61
+ var _a;
62
+ try {
63
+ if (!selectedIModelId)
64
+ return;
65
+ setIsLoading(true);
66
+ const reportingClientApi = new ReportingClient(generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl));
67
+ const accessToken = await apiConfig.getAccessToken();
68
+ for (const mapping of selectedMappings) {
69
+ await reportingClientApi.createReportMapping(accessToken, reportId, {
70
+ imodelId: selectedIModelId,
71
+ mappingId: (_a = mapping.id) !== null && _a !== void 0 ? _a : "",
72
+ });
73
+ }
74
+ await returnFn();
75
+ }
76
+ catch (error) {
77
+ handleError(error.status);
78
+ }
79
+ finally {
80
+ setIsLoading(false);
81
+ }
82
+ };
83
+ return (React.createElement(Modal, { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:AddMappings"), isOpen: show, isDismissible: !isLoading, onClose: async () => {
84
+ await returnFn();
85
+ }, style: { display: "flex", flexDirection: "column", maxHeight: "77vh" } },
86
+ React.createElement("div", { className: "add-mappings-container" },
87
+ React.createElement(SelectIModel, { selectedIModelId: selectedIModelId, setSelectedIModelId: setSelectediModelId }),
88
+ React.createElement(Table, { data: isLoading ? [] : mappings, columns: mappingsColumns, className: "add-mappings-table", emptyTableContent: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:NoMappingsAvailable"), isSortable: true, isSelectable: true, isLoading: isLoading, isRowDisabled: (rowData) => existingMappings.some((v) => v.mappingId === rowData.id), onSelect: (selectData) => {
89
+ selectData && setSelectedMappings(selectData);
90
+ }, paginatorRenderer: LocalizedTablePaginator })),
91
+ React.createElement(ActionPanel, { actionLabel: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Add"), onAction: onSave, onCancel: returnFn, isSavingDisabled: selectedMappings.length === 0, isLoading: isLoading })));
92
+ };
93
+ export default AddMappingsModal;
94
+ //# sourceMappingURL=AddMappingsModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddMappingsModal.js","sourceRoot":"","sources":["../../../../src/widget/components/AddMappingsModal.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { Modal, Table, tableFilters } from \"@itwin/itwinui-react\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport type { Mapping } from \"@itwin/insights-client\";\nimport { REPORTING_BASE_PATH, ReportingClient } from \"@itwin/insights-client\";\nimport ActionPanel from \"./ActionPanel\";\nimport \"./AddMappingsModal.scss\";\nimport { LocalizedTablePaginator } from \"./LocalizedTablePaginator\";\nimport type { ReportMappingAndMapping } from \"./ReportMappings\";\nimport type { ReportsApiConfig } from \"../context/ReportsApiConfigContext\";\nimport { useReportsApiConfig } from \"../context/ReportsApiConfigContext\";\nimport { SelectIModel } from \"./SelectIModel\";\nimport type { CreateTypeFromInterface } from \"./utils\";\nimport { generateUrl, handleError } from \"./utils\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\n\nexport type MappingType = CreateTypeFromInterface<Mapping>;\n\nconst fetchMappings = async (\n setMappings: React.Dispatch<React.SetStateAction<Mapping[]>>,\n iModelId: string,\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,\n apiContext: ReportsApiConfig\n) => {\n try {\n setIsLoading(true);\n const reportingClientApi = new ReportingClient(\n generateUrl(REPORTING_BASE_PATH, apiContext.baseUrl)\n );\n const accessToken = await apiContext.getAccessToken();\n const mappings = await reportingClientApi.getMappings(\n accessToken,\n iModelId\n );\n setMappings(mappings);\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n};\n\ninterface AddMappingsModalProps {\n reportId: string;\n existingMappings: ReportMappingAndMapping[];\n show: boolean;\n returnFn: () => Promise<void>;\n}\n\nconst AddMappingsModal = ({\n reportId,\n existingMappings,\n show,\n returnFn,\n}: AddMappingsModalProps) => {\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [selectedMappings, setSelectedMappings] = useState<Mapping[]>([]);\n const [selectedIModelId, setSelectediModelId] = useState<string>(\"\");\n const [mappings, setMappings] = useState<Mapping[]>([]);\n const apiConfig = useReportsApiConfig();\n\n useEffect(() => {\n if (selectedIModelId) {\n void fetchMappings(\n setMappings,\n selectedIModelId,\n setIsLoading,\n apiConfig\n );\n }\n }, [apiConfig, selectedIModelId, setIsLoading]);\n\n const mappingsColumns = useMemo(\n () => [\n {\n Header: \"Table\",\n columns: [\n {\n id: \"mappingName\",\n Header: ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:MappingName\"\n ),\n accessor: \"mappingName\",\n Filter: tableFilters.TextFilter(),\n },\n {\n id: \"description\",\n Header: ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Description\"\n ),\n accessor: \"description\",\n Filter: tableFilters.TextFilter(),\n },\n ],\n },\n ],\n []\n );\n\n const onSave = async () => {\n try {\n if (!selectedIModelId) return;\n setIsLoading(true);\n const reportingClientApi = new ReportingClient(\n generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl)\n );\n const accessToken = await apiConfig.getAccessToken();\n for (const mapping of selectedMappings) {\n await reportingClientApi.createReportMapping(accessToken, reportId, {\n imodelId: selectedIModelId,\n mappingId: mapping.id ?? \"\",\n });\n }\n\n await returnFn();\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Modal\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:AddMappings\"\n )}\n isOpen={show}\n isDismissible={!isLoading}\n onClose={async () => {\n await returnFn();\n }}\n style={{ display: \"flex\", flexDirection: \"column\", maxHeight: \"77vh\" }}\n >\n <div className=\"add-mappings-container\">\n <SelectIModel\n selectedIModelId={selectedIModelId}\n setSelectedIModelId={setSelectediModelId}\n />\n <Table<MappingType>\n data={isLoading ? [] : mappings}\n columns={mappingsColumns}\n className=\"add-mappings-table\"\n emptyTableContent={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:NoMappingsAvailable\"\n )}\n isSortable\n isSelectable\n isLoading={isLoading}\n isRowDisabled={(rowData) =>\n existingMappings.some((v) => v.mappingId === rowData.id)\n }\n onSelect={(selectData: Mapping[] | undefined) => {\n selectData && setSelectedMappings(selectData);\n }}\n paginatorRenderer={LocalizedTablePaginator}\n />\n </div>\n <ActionPanel\n actionLabel={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Add\"\n )}\n onAction={onSave}\n onCancel={returnFn}\n isSavingDisabled={selectedMappings.length === 0}\n isLoading={isLoading}\n />\n </Modal>\n );\n};\n\nexport default AddMappingsModal;\n"]}
@@ -0,0 +1,18 @@
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 "~@itwin/itwinui-css/scss/variables";
6
+
7
+ .add-mappings-container {
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: $iui-baseline;
11
+ width: 45vw;
12
+ min-width: 100%;
13
+ overflow: auto;
14
+ .add-mappings-table {
15
+ flex-grow: 1;
16
+ overflow: auto;
17
+ }
18
+ }
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import "./DeleteModal.scss";
3
+ export interface DeleteModalProps {
4
+ entityName: string;
5
+ show: boolean;
6
+ setShow: React.Dispatch<React.SetStateAction<boolean>>;
7
+ onDelete: () => Promise<void>;
8
+ refresh: () => Promise<void>;
9
+ }
10
+ export declare const DeleteModal: ({ entityName, show, setShow, onDelete, refresh, }: DeleteModalProps) => JSX.Element;
11
+ export default DeleteModal;
12
+ //# sourceMappingURL=DeleteModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteModal.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/DeleteModal.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,oBAAoB,CAAC;AAG5B,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,sDAMrB,gBAAgB,gBAkElB,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,42 @@
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 { Button, Leading, MiddleTextTruncation, Modal, ModalButtonBar, ModalContent, } from "@itwin/itwinui-react";
6
+ import React, { useState } from "react";
7
+ import { ReportsConfigWidget } from "../../ReportsConfigWidget";
8
+ import "./DeleteModal.scss";
9
+ import { handleError, LoadingSpinner } from "./utils";
10
+ export const DeleteModal = ({ entityName, show, setShow, onDelete, refresh, }) => {
11
+ const [isLoading, setIsLoading] = useState(false);
12
+ const deleteCallback = async () => {
13
+ try {
14
+ setIsLoading(true);
15
+ await onDelete();
16
+ setShow(false);
17
+ await refresh();
18
+ }
19
+ catch (error) {
20
+ handleError(error.status);
21
+ }
22
+ finally {
23
+ setIsLoading(false);
24
+ }
25
+ };
26
+ return (React.createElement(Modal, { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Confirm"), isOpen: show, isDismissible: !isLoading, onClose: () => {
27
+ setShow(false);
28
+ } },
29
+ React.createElement(ModalContent, null,
30
+ React.createElement("div", { className: "delete-modal-body-text" },
31
+ React.createElement(Leading, null, ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:AreYouSureYouWantToDelete")),
32
+ React.createElement("strong", null, React.createElement(MiddleTextTruncation, { text: `${entityName}?` })))),
33
+ React.createElement(ModalButtonBar, null,
34
+ isLoading && (React.createElement("div", { className: "rcw-loading-delete", "data-testid": "rcw-loading-delete" },
35
+ React.createElement(LoadingSpinner, null))),
36
+ React.createElement(Button, { styleType: "high-visibility", onClick: deleteCallback, disabled: isLoading }, ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Delete")),
37
+ React.createElement(Button, { styleType: "default", onClick: () => {
38
+ setShow(false);
39
+ }, disabled: isLoading }, ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Cancel")))));
40
+ };
41
+ export default DeleteModal;
42
+ //# sourceMappingURL=DeleteModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteModal.js","sourceRoot":"","sources":["../../../../src/widget/components/DeleteModal.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EACL,MAAM,EACN,OAAO,EACP,oBAAoB,EACpB,KAAK,EACL,cAAc,EACd,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAUtD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,UAAU,EACV,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,OAAO,GACU,EAAE,EAAE;IACrB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAE3D,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAChC,IAAI;YACF,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM,QAAQ,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,MAAM,OAAO,EAAE,CAAC;SACjB;QAAC,OAAO,KAAU,EAAE;YACnB,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC3B;gBAAS;YACR,YAAY,CAAC,KAAK,CAAC,CAAC;SACrB;IACH,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,KAAK,IACJ,KAAK,EAAE,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CACxD,6BAA6B,CAC9B,EACD,MAAM,EAAE,IAAI,EACZ,aAAa,EAAE,CAAC,SAAS,EACzB,OAAO,EAAE,GAAG,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;QAED,oBAAC,YAAY;YACX,6BAAK,SAAS,EAAC,wBAAwB;gBACrC,oBAAC,OAAO,QACL,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,+CAA+C,CAChD,CACO;gBACV,oCAAS,oBAAC,oBAAoB,IAAC,IAAI,EAAE,GAAG,UAAU,GAAG,GAAI,CAAU,CAC/D,CACO;QACf,oBAAC,cAAc;YACZ,SAAS,IAAI,CACZ,6BAAK,SAAS,EAAC,oBAAoB,iBAAa,oBAAoB;gBAClE,oBAAC,cAAc,OAAG,CACd,CACP;YACD,oBAAC,MAAM,IACL,SAAS,EAAC,iBAAiB,EAC3B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,SAAS,IAElB,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,4BAA4B,CAC7B,CACM;YACT,oBAAC,MAAM,IACL,SAAS,EAAC,SAAS,EACnB,OAAO,EAAE,GAAG,EAAE;oBACZ,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC,EACD,QAAQ,EAAE,SAAS,IAElB,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAClD,4BAA4B,CAC7B,CACM,CACM,CACX,CACT,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport {\n Button,\n Leading,\n MiddleTextTruncation,\n Modal,\n ModalButtonBar,\n ModalContent,\n} from \"@itwin/itwinui-react\";\nimport React, { useState } from \"react\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\nimport \"./DeleteModal.scss\";\nimport { handleError, LoadingSpinner } from \"./utils\";\n\nexport interface DeleteModalProps {\n entityName: string;\n show: boolean;\n setShow: React.Dispatch<React.SetStateAction<boolean>>;\n onDelete: () => Promise<void>;\n refresh: () => Promise<void>;\n}\n\nexport const DeleteModal = ({\n entityName,\n show,\n setShow,\n onDelete,\n refresh,\n}: DeleteModalProps) => {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n\n const deleteCallback = async () => {\n try {\n setIsLoading(true);\n await onDelete();\n setShow(false);\n await refresh();\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Modal\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Confirm\"\n )}\n isOpen={show}\n isDismissible={!isLoading}\n onClose={() => {\n setShow(false);\n }}\n >\n <ModalContent>\n <div className=\"delete-modal-body-text\">\n <Leading>\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:AreYouSureYouWantToDelete\"\n )}\n </Leading>\n <strong>{<MiddleTextTruncation text={`${entityName}?`} />}</strong>\n </div>\n </ModalContent>\n <ModalButtonBar>\n {isLoading && (\n <div className=\"rcw-loading-delete\" data-testid=\"rcw-loading-delete\">\n <LoadingSpinner />\n </div>\n )}\n <Button\n styleType=\"high-visibility\"\n onClick={deleteCallback}\n disabled={isLoading}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Delete\"\n )}\n </Button>\n <Button\n styleType=\"default\"\n onClick={() => {\n setShow(false);\n }}\n disabled={isLoading}\n >\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Cancel\"\n )}\n </Button>\n </ModalButtonBar>\n </Modal>\n );\n};\n\nexport default DeleteModal;\n"]}
@@ -0,0 +1,18 @@
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 "~@itwin/itwinui-css/scss/variables";
6
+
7
+ .delete-modal-body-text {
8
+ display: flex;
9
+ gap: $iui-xs;
10
+ flex-wrap: wrap;
11
+ > strong {
12
+ min-width: 0px;
13
+ }
14
+ }
15
+
16
+ .rcw-loading-delete {
17
+ margin-right: $iui-s;
18
+ }
@@ -0,0 +1,28 @@
1
+ import * as React from "react";
2
+ import "./Extraction.scss";
3
+ export declare const REFRESH_DELAY = 2000;
4
+ export declare enum ExtractionStates {
5
+ None = 0,
6
+ Starting = 1,
7
+ FetchingUpdate = 2,
8
+ Queued = 3,
9
+ Running = 4,
10
+ Succeeded = 5,
11
+ Failed = 6
12
+ }
13
+ interface ExtractionStatusProps {
14
+ state: ExtractionStates;
15
+ setExtractionState?: React.Dispatch<React.SetStateAction<ExtractionStates>>;
16
+ children?: React.ReactNode;
17
+ }
18
+ export declare const ExtractionStatus: ({ state, children, setExtractionState, }: ExtractionStatusProps) => JSX.Element;
19
+ interface ExtractionProps {
20
+ iModels: Map<string, string>;
21
+ setExtractingIModelId: React.Dispatch<React.SetStateAction<string>>;
22
+ extractionState: ExtractionStates;
23
+ setExtractionState: React.Dispatch<React.SetStateAction<ExtractionStates>>;
24
+ isLoading: boolean;
25
+ }
26
+ export declare const Extraction: ({ iModels, setExtractingIModelId, extractionState, setExtractionState, isLoading, }: ExtractionProps) => JSX.Element;
27
+ export {};
28
+ //# sourceMappingURL=Extraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Extraction.d.ts","sourceRoot":"","sources":["../../../../src/widget/components/Extraction.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,mBAAmB,CAAC;AAU3B,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC,oBAAY,gBAAgB;IAC1B,IAAI,IAAA;IACJ,QAAQ,IAAA;IACR,cAAc,IAAA;IACd,MAAM,IAAA;IACN,OAAO,IAAA;IACP,SAAS,IAAA;IACT,MAAM,IAAA;CACP;AACD,UAAU,qBAAqB;IAC7B,KAAK,EAAE,gBAAgB,CAAC;IACxB,kBAAkB,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5E,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,eAAO,MAAM,gBAAgB,6CAI1B,qBAAqB,gBAkHvB,CAAC;AAEF,UAAU,eAAe;IACvB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qBAAqB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,eAAe,EAAE,gBAAgB,CAAC;IAClC,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC3E,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,wFAMpB,eAAe,gBA0IjB,CAAC"}
@@ -0,0 +1,169 @@
1
+ import { ComboBox, Label, ProgressRadial, StatusMessage, } from "@itwin/itwinui-react";
2
+ import * as React from "react";
3
+ import { useEffect, useMemo, useRef, useState } from "react";
4
+ import { REPORTING_BASE_PATH, ReportingClient } from "@itwin/insights-client";
5
+ import { generateUrl, handleError, SkeletonBlock } from "./utils";
6
+ import "./Extraction.scss";
7
+ import { SvgStatusError, SvgStatusPending, SvgStatusPendingHollow, SvgStatusSuccess, } from "@itwin/itwinui-icons-color-react";
8
+ import { useReportsApiConfig } from "../context/ReportsApiConfigContext";
9
+ import { ReportsConfigWidget } from "../../ReportsConfigWidget";
10
+ export const REFRESH_DELAY = 2000;
11
+ export var ExtractionStates;
12
+ (function (ExtractionStates) {
13
+ ExtractionStates[ExtractionStates["None"] = 0] = "None";
14
+ ExtractionStates[ExtractionStates["Starting"] = 1] = "Starting";
15
+ ExtractionStates[ExtractionStates["FetchingUpdate"] = 2] = "FetchingUpdate";
16
+ ExtractionStates[ExtractionStates["Queued"] = 3] = "Queued";
17
+ ExtractionStates[ExtractionStates["Running"] = 4] = "Running";
18
+ ExtractionStates[ExtractionStates["Succeeded"] = 5] = "Succeeded";
19
+ ExtractionStates[ExtractionStates["Failed"] = 6] = "Failed";
20
+ })(ExtractionStates || (ExtractionStates = {}));
21
+ export const ExtractionStatus = ({ state, children, setExtractionState, }) => {
22
+ const [fadeOut, setFadeOut] = useState(false);
23
+ const onAnimationEnd = () => {
24
+ if (setExtractionState) {
25
+ setExtractionState(ExtractionStates.None);
26
+ setFadeOut(false);
27
+ }
28
+ };
29
+ useEffect(() => {
30
+ let timer;
31
+ switch (state) {
32
+ case ExtractionStates.Succeeded:
33
+ case ExtractionStates.Failed:
34
+ timer = window.setTimeout(() => setFadeOut(true), 5000);
35
+ }
36
+ return () => clearTimeout(timer);
37
+ }, [state, setExtractionState]);
38
+ switch (state) {
39
+ case ExtractionStates.Starting:
40
+ return (React.createElement("div", { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Starting"), className: "extraction-status" },
41
+ React.createElement("div", { className: "status-icon" },
42
+ React.createElement(SvgStatusPendingHollow, null))));
43
+ case ExtractionStates.FetchingUpdate:
44
+ return (React.createElement("div", { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Loading"), className: "extraction-status" },
45
+ React.createElement(ProgressRadial, { size: "x-small", indeterminate: true })));
46
+ case ExtractionStates.Queued:
47
+ return (React.createElement("div", { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Queued"), className: "extraction-status" },
48
+ React.createElement("div", { className: "status-icon" },
49
+ React.createElement(SvgStatusPending, null))));
50
+ case ExtractionStates.Running:
51
+ return (React.createElement("div", { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Running"), className: "extraction-status" },
52
+ React.createElement(ProgressRadial, { size: "x-small", indeterminate: true })));
53
+ case ExtractionStates.Succeeded:
54
+ return (React.createElement("div", { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Success"), className: "extraction-status" },
55
+ React.createElement("div", { className: `status-icon`, style: {
56
+ animationName: fadeOut ? "rcw-fade-out" : "",
57
+ animationDelay: "5s",
58
+ animationDuration: "1s",
59
+ }, onAnimationEnd: onAnimationEnd },
60
+ React.createElement(SvgStatusSuccess, null))));
61
+ case ExtractionStates.Failed:
62
+ return (React.createElement("div", { title: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Failed"), className: "extraction-status" },
63
+ React.createElement("div", { className: `status-icon`, style: {
64
+ animationName: fadeOut ? "rcw-fade-out" : "",
65
+ animationDelay: "5s",
66
+ animationDuration: "1s",
67
+ }, onAnimationEnd: onAnimationEnd },
68
+ React.createElement(SvgStatusError, null))));
69
+ default:
70
+ return React.createElement(React.Fragment, null, children);
71
+ }
72
+ };
73
+ export const Extraction = ({ iModels, setExtractingIModelId, extractionState, setExtractionState, isLoading, }) => {
74
+ const jobId = useRef("");
75
+ const intervalId = useRef();
76
+ const [isRunning, setIsRunning] = useState(false);
77
+ const [currentIModelId, setCurrentIModelId] = useState();
78
+ const apiConfig = useReportsApiConfig();
79
+ const runExtraction = async (iModelId) => {
80
+ var _a, _b;
81
+ try {
82
+ setExtractionState(ExtractionStates.Starting);
83
+ setExtractingIModelId(iModelId);
84
+ const reportingClientApi = new ReportingClient(generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl));
85
+ const accessToken = await apiConfig.getAccessToken();
86
+ const response = await reportingClientApi.runExtraction(accessToken, iModelId);
87
+ jobId.current = (_b = (_a = response.run) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : "";
88
+ setIsRunning(true);
89
+ setExtractionState(ExtractionStates.FetchingUpdate);
90
+ }
91
+ catch (error) {
92
+ handleError(error.status);
93
+ setExtractionState(ExtractionStates.Failed);
94
+ setIsRunning(false);
95
+ setCurrentIModelId(undefined);
96
+ }
97
+ };
98
+ useEffect(() => {
99
+ if (!intervalId.current && isRunning) {
100
+ const newIntervalId = window.setInterval(async () => {
101
+ var _a, _b, _c, _d;
102
+ const reportingClientApi = new ReportingClient(generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl));
103
+ const accessToken = await apiConfig.getAccessToken();
104
+ const response = await reportingClientApi.getExtractionStatus(accessToken, jobId.current);
105
+ if (((_a = response.status) === null || _a === void 0 ? void 0 : _a.state) === "Queued") {
106
+ setExtractionState(ExtractionStates.Queued);
107
+ }
108
+ else if (((_b = response.status) === null || _b === void 0 ? void 0 : _b.state) === "Running") {
109
+ setExtractionState(ExtractionStates.Running);
110
+ }
111
+ else if (((_c = response.status) === null || _c === void 0 ? void 0 : _c.state) === "Succeeded") {
112
+ setExtractionState(ExtractionStates.Succeeded);
113
+ setIsRunning(false);
114
+ setCurrentIModelId(undefined);
115
+ }
116
+ else if (((_d = response.status) === null || _d === void 0 ? void 0 : _d.state) === "Failed") {
117
+ setExtractionState(ExtractionStates.Failed);
118
+ setIsRunning(false);
119
+ setCurrentIModelId(undefined);
120
+ }
121
+ }, REFRESH_DELAY);
122
+ intervalId.current = newIntervalId;
123
+ }
124
+ else if (intervalId && !isRunning) {
125
+ window.clearInterval(intervalId.current);
126
+ intervalId.current = undefined;
127
+ }
128
+ return () => window.clearInterval(intervalId.current);
129
+ }, [apiConfig, isRunning, jobId, setExtractionState]);
130
+ const iModelOptions = useMemo(() => {
131
+ // TODO Report ComboBox bug. Unique key error happens when the options list becomes reduced.
132
+ const newIModelOptions = [];
133
+ for (const [iModelId, iModelName] of iModels.entries()) {
134
+ newIModelOptions.push({
135
+ label: iModelName,
136
+ value: iModelId,
137
+ key: iModelId,
138
+ disabled: extractionState !== ExtractionStates.None,
139
+ });
140
+ }
141
+ return newIModelOptions;
142
+ }, [iModels, extractionState]);
143
+ return (React.createElement("div", { className: "extraction-container" },
144
+ React.createElement("div", { className: "extraction-combo-box", "data-testid": "extraction-combo-box" },
145
+ React.createElement(Label, { htmlFor: "combo-input" }, ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:UpdateDataset")),
146
+ isLoading ? (React.createElement(SkeletonBlock, null)) : (React.createElement(ComboBox, { options: iModelOptions, value: currentIModelId, onChange: async (value) => {
147
+ setCurrentIModelId(value);
148
+ await runExtraction(value);
149
+ }, inputProps: {
150
+ id: "combo-input",
151
+ placeholder: ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:SelectIModel"),
152
+ }, message: extractionState !== ExtractionStates.None && (React.createElement(StatusMessage, null,
153
+ React.createElement("div", { className: "extraction-status-container" },
154
+ React.createElement(ExtractionStatus, { state: extractionState, setExtractionState: setExtractionState }),
155
+ (() => {
156
+ switch (extractionState) {
157
+ case ExtractionStates.Succeeded: {
158
+ return ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Success");
159
+ }
160
+ case ExtractionStates.Failed: {
161
+ return ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:Failed");
162
+ }
163
+ default: {
164
+ return ReportsConfigWidget.localization.getLocalizedString("ReportsConfigWidget:UpdateInProgress");
165
+ }
166
+ }
167
+ })()))) })))));
168
+ };
169
+ //# sourceMappingURL=Extraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Extraction.js","sourceRoot":"","sources":["../../../../src/widget/components/Extraction.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type { SelectOption } from \"@itwin/itwinui-react\";\nimport {\n ComboBox,\n Label,\n ProgressRadial,\n StatusMessage,\n} from \"@itwin/itwinui-react\";\nimport * as React from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { REPORTING_BASE_PATH, ReportingClient } from \"@itwin/insights-client\";\nimport { generateUrl, handleError, SkeletonBlock } from \"./utils\";\nimport \"./Extraction.scss\";\nimport {\n SvgStatusError,\n SvgStatusPending,\n SvgStatusPendingHollow,\n SvgStatusSuccess,\n} from \"@itwin/itwinui-icons-color-react\";\nimport { useReportsApiConfig } from \"../context/ReportsApiConfigContext\";\nimport { ReportsConfigWidget } from \"../../ReportsConfigWidget\";\n\nexport const REFRESH_DELAY = 2000;\n\nexport enum ExtractionStates {\n None,\n Starting,\n FetchingUpdate,\n Queued,\n Running,\n Succeeded,\n Failed,\n}\ninterface ExtractionStatusProps {\n state: ExtractionStates;\n setExtractionState?: React.Dispatch<React.SetStateAction<ExtractionStates>>;\n children?: React.ReactNode;\n}\n\nexport const ExtractionStatus = ({\n state,\n children,\n setExtractionState,\n}: ExtractionStatusProps) => {\n const [fadeOut, setFadeOut] = useState<boolean>(false);\n\n const onAnimationEnd = () => {\n if (setExtractionState) {\n setExtractionState(ExtractionStates.None);\n setFadeOut(false);\n }\n };\n\n useEffect(() => {\n let timer: number;\n switch (state) {\n case ExtractionStates.Succeeded:\n case ExtractionStates.Failed:\n timer = window.setTimeout(() => setFadeOut(true), 5000);\n }\n return () => clearTimeout(timer);\n }, [state, setExtractionState]);\n\n switch (state) {\n case ExtractionStates.Starting:\n return (\n <div\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Starting\"\n )}\n className=\"extraction-status\"\n >\n <div className=\"status-icon\">\n <SvgStatusPendingHollow />\n </div>\n </div>\n );\n case ExtractionStates.FetchingUpdate:\n return (\n <div\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Loading\"\n )}\n className=\"extraction-status\"\n >\n <ProgressRadial size=\"x-small\" indeterminate />\n </div>\n );\n case ExtractionStates.Queued:\n return (\n <div\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Queued\"\n )}\n className=\"extraction-status\"\n >\n <div className=\"status-icon\">\n <SvgStatusPending />\n </div>\n </div>\n );\n case ExtractionStates.Running:\n return (\n <div\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Running\"\n )}\n className=\"extraction-status\"\n >\n <ProgressRadial size=\"x-small\" indeterminate />\n </div>\n );\n case ExtractionStates.Succeeded:\n return (\n <div\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Success\"\n )}\n className=\"extraction-status\"\n >\n <div\n className={`status-icon`}\n style={{\n animationName: fadeOut ? \"rcw-fade-out\" : \"\",\n animationDelay: \"5s\",\n animationDuration: \"1s\",\n }}\n onAnimationEnd={onAnimationEnd}\n >\n <SvgStatusSuccess />\n </div>\n </div>\n );\n case ExtractionStates.Failed:\n return (\n <div\n title={ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Failed\"\n )}\n className=\"extraction-status\"\n >\n <div\n className={`status-icon`}\n style={{\n animationName: fadeOut ? \"rcw-fade-out\" : \"\",\n animationDelay: \"5s\",\n animationDuration: \"1s\",\n }}\n onAnimationEnd={onAnimationEnd}\n >\n <SvgStatusError />\n </div>\n </div>\n );\n default:\n return <>{children}</>;\n }\n};\n\ninterface ExtractionProps {\n iModels: Map<string, string>;\n setExtractingIModelId: React.Dispatch<React.SetStateAction<string>>;\n extractionState: ExtractionStates;\n setExtractionState: React.Dispatch<React.SetStateAction<ExtractionStates>>;\n isLoading: boolean;\n}\n\nexport const Extraction = ({\n iModels,\n setExtractingIModelId,\n extractionState,\n setExtractionState,\n isLoading,\n}: ExtractionProps) => {\n const jobId = useRef<string>(\"\");\n const intervalId = useRef<number>();\n const [isRunning, setIsRunning] = useState<boolean>(false);\n const [currentIModelId, setCurrentIModelId] = useState<string>();\n const apiConfig = useReportsApiConfig();\n\n const runExtraction = async (iModelId: string) => {\n try {\n setExtractionState(ExtractionStates.Starting);\n setExtractingIModelId(iModelId);\n const reportingClientApi = new ReportingClient(\n generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl)\n );\n const accessToken = await apiConfig.getAccessToken();\n const response = await reportingClientApi.runExtraction(\n accessToken,\n iModelId\n );\n jobId.current = response.run?.id ?? \"\";\n setIsRunning(true);\n setExtractionState(ExtractionStates.FetchingUpdate);\n } catch (error: any) {\n handleError(error.status);\n setExtractionState(ExtractionStates.Failed);\n setIsRunning(false);\n setCurrentIModelId(undefined);\n }\n };\n\n useEffect(() => {\n if (!intervalId.current && isRunning) {\n const newIntervalId = window.setInterval(async () => {\n const reportingClientApi = new ReportingClient(\n generateUrl(REPORTING_BASE_PATH, apiConfig.baseUrl)\n );\n const accessToken = await apiConfig.getAccessToken();\n const response = await reportingClientApi.getExtractionStatus(\n accessToken,\n jobId.current\n );\n if (response.status?.state === \"Queued\") {\n setExtractionState(ExtractionStates.Queued);\n } else if (response.status?.state === \"Running\") {\n setExtractionState(ExtractionStates.Running);\n } else if (response.status?.state === \"Succeeded\") {\n setExtractionState(ExtractionStates.Succeeded);\n setIsRunning(false);\n setCurrentIModelId(undefined);\n } else if (response.status?.state === \"Failed\") {\n setExtractionState(ExtractionStates.Failed);\n setIsRunning(false);\n setCurrentIModelId(undefined);\n }\n }, REFRESH_DELAY);\n intervalId.current = newIntervalId;\n } else if (intervalId && !isRunning) {\n window.clearInterval(intervalId.current);\n intervalId.current = undefined;\n }\n return () => window.clearInterval(intervalId.current);\n }, [apiConfig, isRunning, jobId, setExtractionState]);\n\n const iModelOptions = useMemo(() => {\n // TODO Report ComboBox bug. Unique key error happens when the options list becomes reduced.\n const newIModelOptions: SelectOption<string>[] = [];\n\n for (const [iModelId, iModelName] of iModels.entries()) {\n newIModelOptions.push({\n label: iModelName,\n value: iModelId,\n key: iModelId,\n disabled: extractionState !== ExtractionStates.None,\n });\n }\n return newIModelOptions;\n }, [iModels, extractionState]);\n\n return (\n <div className=\"extraction-container\">\n <div className=\"extraction-combo-box\" data-testid=\"extraction-combo-box\">\n <Label htmlFor=\"combo-input\">\n {ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:UpdateDataset\"\n )}\n </Label>\n {isLoading ? (\n <SkeletonBlock />\n ) : (\n <ComboBox\n options={iModelOptions}\n value={currentIModelId}\n onChange={async (value) => {\n setCurrentIModelId(value);\n await runExtraction(value);\n }}\n inputProps={{\n id: \"combo-input\",\n placeholder: ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:SelectIModel\"\n ),\n }}\n message={\n extractionState !== ExtractionStates.None && (\n <StatusMessage>\n <div className=\"extraction-status-container\">\n <ExtractionStatus\n state={extractionState}\n setExtractionState={setExtractionState}\n />\n {(() => {\n switch (extractionState) {\n case ExtractionStates.Succeeded: {\n return ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Success\"\n );\n }\n case ExtractionStates.Failed: {\n return ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:Failed\"\n );\n }\n default: {\n return ReportsConfigWidget.localization.getLocalizedString(\n \"ReportsConfigWidget:UpdateInProgress\"\n );\n }\n }\n })()}\n </div>\n </StatusMessage>\n )\n }\n />\n )}\n </div>\n </div>\n );\n};\n"]}