@mwater/visualization 5.4.5 → 5.6.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 (310) hide show
  1. package/lib/MWaterContextComponent.d.ts +1 -1
  2. package/lib/MWaterContextComponent.js +1 -1
  3. package/lib/MWaterGlobalFiltersComponent.d.ts +2 -2
  4. package/lib/MWaterGlobalFiltersComponent.js +11 -20
  5. package/lib/MWaterLoaderComponent.d.ts +5 -14
  6. package/lib/MWaterLoaderComponent.js +2 -11
  7. package/lib/UndoStack.d.ts +2 -1
  8. package/lib/UndoStack.js +12 -6
  9. package/lib/dashboards/DashboardComponent.js +7 -5
  10. package/lib/dashboards/DashboardDesign.d.ts +1 -1
  11. package/lib/dashboards/LayoutOptionsComponent.js +18 -11
  12. package/lib/dashboards/ServerDashboardDataSource.d.ts +10 -1
  13. package/lib/dashboards/ServerDashboardDataSource.js +29 -10
  14. package/lib/dashboards/SettingsModalComponent.js +1 -1
  15. package/lib/dashboards/layoutOptions.d.ts +5 -1
  16. package/lib/datagrids/DatagridComponent.js +23 -3
  17. package/lib/datagrids/DatagridDesignerComponent.d.ts +2 -3
  18. package/lib/datagrids/DatagridDesignerComponent.js +108 -120
  19. package/lib/datagrids/DatagridViewComponent.js +3 -2
  20. package/lib/datagrids/ExprCellComponent.d.ts +1 -0
  21. package/lib/datagrids/ExprCellComponent.js +22 -20
  22. package/lib/datagrids/OrderBysDesignerComponent.d.ts +7 -7
  23. package/lib/datagrids/OrderBysDesignerComponent.js +19 -28
  24. package/lib/index.css +45 -2
  25. package/lib/index.d.ts +5 -5
  26. package/lib/index.js +2 -3
  27. package/lib/layouts/blocks/BlocksDisplayComponent.d.ts +8 -1
  28. package/lib/layouts/blocks/BlocksDisplayComponent.js +46 -4
  29. package/lib/maps/BufferLayer.d.ts +18 -0
  30. package/lib/maps/BufferLayer.js +36 -14
  31. package/lib/maps/BufferLayerDesign.d.ts +1 -1
  32. package/lib/maps/BufferLayerDesignerComponent.js +2 -2
  33. package/lib/maps/ChoroplethLayer.d.ts +18 -0
  34. package/lib/maps/ChoroplethLayer.js +46 -25
  35. package/lib/maps/ChoroplethLayerDesign.d.ts +7 -3
  36. package/lib/maps/ChoroplethLayerDesigner.d.ts +10 -22
  37. package/lib/maps/ChoroplethLayerDesigner.js +58 -89
  38. package/lib/maps/DirectMapDataSource.js +17 -10
  39. package/lib/maps/EditHoverOver.d.ts +4 -3
  40. package/lib/maps/EditHoverOver.js +64 -35
  41. package/lib/maps/HoverContent.d.ts +10 -5
  42. package/lib/maps/HoverContent.js +7 -36
  43. package/lib/maps/Layer.d.ts +37 -0
  44. package/lib/maps/Layer.js +30 -4
  45. package/lib/maps/LeafletMapComponent.js +10 -19
  46. package/lib/maps/MWaterServerLayer.d.ts +2 -2
  47. package/lib/maps/MWaterServerLayer.js +6 -6
  48. package/lib/maps/MapComponent.js +0 -1
  49. package/lib/maps/MapLayerDataSource.d.ts +9 -0
  50. package/lib/maps/MapUtils.d.ts +19 -1
  51. package/lib/maps/MapUtils.js +80 -1
  52. package/lib/maps/MarkersLayer.d.ts +18 -0
  53. package/lib/maps/MarkersLayer.js +42 -26
  54. package/lib/maps/MarkersLayerDesign.d.ts +1 -1
  55. package/lib/maps/MarkersLayerDesignerComponent.d.ts +12 -28
  56. package/lib/maps/MarkersLayerDesignerComponent.js +81 -111
  57. package/lib/maps/RasterMapViewComponent.js +1 -1
  58. package/lib/maps/ServerMapDataSource.d.ts +9 -0
  59. package/lib/maps/ServerMapDataSource.js +29 -10
  60. package/lib/maps/VectorMapViewComponent.js +7 -15
  61. package/lib/maps/maps.d.ts +4 -2
  62. package/lib/maps/symbols/font-awesome/asterisk.png +0 -0
  63. package/lib/maps/symbols/font-awesome/ban.png +0 -0
  64. package/lib/maps/symbols/font-awesome/beer.png +0 -0
  65. package/lib/maps/symbols/font-awesome/bell.png +0 -0
  66. package/lib/maps/symbols/font-awesome/bolt.png +0 -0
  67. package/lib/maps/symbols/font-awesome/building.png +0 -0
  68. package/lib/maps/symbols/font-awesome/bullseye.png +0 -0
  69. package/lib/maps/symbols/font-awesome/bus.png +0 -0
  70. package/lib/maps/symbols/font-awesome/caret-up.png +0 -0
  71. package/lib/maps/symbols/font-awesome/certificate.png +0 -0
  72. package/lib/maps/symbols/font-awesome/check-circle.png +0 -0
  73. package/lib/maps/symbols/font-awesome/check.png +0 -0
  74. package/lib/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  75. package/lib/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  76. package/lib/maps/symbols/font-awesome/cloud-rain.png +0 -0
  77. package/lib/maps/symbols/font-awesome/cloud.png +0 -0
  78. package/lib/maps/symbols/font-awesome/comment.png +0 -0
  79. package/lib/maps/symbols/font-awesome/crosshairs.png +0 -0
  80. package/lib/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  81. package/lib/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  82. package/lib/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  83. package/lib/maps/symbols/font-awesome/female.png +0 -0
  84. package/lib/maps/symbols/font-awesome/file.png +0 -0
  85. package/lib/maps/symbols/font-awesome/flag.png +0 -0
  86. package/lib/maps/symbols/font-awesome/flask.png +0 -0
  87. package/lib/maps/symbols/font-awesome/h-square.png +0 -0
  88. package/lib/maps/symbols/font-awesome/home.png +0 -0
  89. package/lib/maps/symbols/font-awesome/info-circle.png +0 -0
  90. package/lib/maps/symbols/font-awesome/male.png +0 -0
  91. package/lib/maps/symbols/font-awesome/medkit.png +0 -0
  92. package/lib/maps/symbols/font-awesome/mobile.png +0 -0
  93. package/lib/maps/symbols/font-awesome/plus-circle.png +0 -0
  94. package/lib/maps/symbols/font-awesome/plus-square.png +0 -0
  95. package/lib/maps/symbols/font-awesome/plus.png +0 -0
  96. package/lib/maps/symbols/font-awesome/square.png +0 -0
  97. package/lib/maps/symbols/font-awesome/star.png +0 -0
  98. package/lib/maps/symbols/font-awesome/thumbs-down.png +0 -0
  99. package/lib/maps/symbols/font-awesome/thumbs-up.png +0 -0
  100. package/lib/maps/symbols/font-awesome/ticket.png +0 -0
  101. package/lib/maps/symbols/font-awesome/times-circle.png +0 -0
  102. package/lib/maps/symbols/font-awesome/times.png +0 -0
  103. package/lib/maps/symbols/font-awesome/tint.png +0 -0
  104. package/lib/maps/symbols/font-awesome/tree.png +0 -0
  105. package/lib/maps/symbols/font-awesome/university.png +0 -0
  106. package/lib/maps/symbols/font-awesome/usd.png +0 -0
  107. package/lib/maps/symbols/font-awesome/user.png +0 -0
  108. package/lib/maps/symbols/font-awesome/users.png +0 -0
  109. package/lib/maps/symbols/font-awesome/wheelchair.png +0 -0
  110. package/lib/maps/symbols/sdf-ize.sh +93 -0
  111. package/lib/maps/vectorMaps.d.ts +1 -0
  112. package/lib/maps/vectorMaps.js +20 -36
  113. package/lib/mwater_table_selection/FormsListComponent.d.ts +33 -0
  114. package/lib/mwater_table_selection/FormsListComponent.js +141 -0
  115. package/lib/mwater_table_selection/IndicatorsListComponent.d.ts +49 -0
  116. package/lib/mwater_table_selection/IndicatorsListComponent.js +251 -0
  117. package/lib/mwater_table_selection/IssuesListComponent.d.ts +29 -0
  118. package/lib/mwater_table_selection/IssuesListComponent.js +123 -0
  119. package/lib/mwater_table_selection/MWaterAccountingSystemListComponent.d.ts +20 -0
  120. package/lib/mwater_table_selection/MWaterAccountingSystemListComponent.js +157 -0
  121. package/lib/mwater_table_selection/MWaterAssetSystemsListComponent.d.ts +17 -0
  122. package/lib/mwater_table_selection/MWaterAssetSystemsListComponent.js +79 -0
  123. package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.d.ts +18 -0
  124. package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.js +80 -0
  125. package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.d.ts +63 -0
  126. package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.js +461 -0
  127. package/lib/mwater_table_selection/MWaterCustomTablesetListComponent.d.ts +17 -0
  128. package/lib/mwater_table_selection/MWaterCustomTablesetListComponent.js +94 -0
  129. package/lib/mwater_table_selection/MWaterMetricsTableListComponent.d.ts +17 -0
  130. package/lib/mwater_table_selection/MWaterMetricsTableListComponent.js +80 -0
  131. package/lib/mwater_table_selection/MWaterTableSelectComponent.d.ts +32 -0
  132. package/lib/mwater_table_selection/MWaterTableSelectComponent.js +163 -0
  133. package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.d.ts +19 -0
  134. package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.js +111 -0
  135. package/lib/quickfilter/QuickfiltersComponent.d.ts +3 -102
  136. package/lib/quickfilter/QuickfiltersComponent.js +53 -110
  137. package/lib/quickfilter/TextLiteralComponent.d.ts +23 -47
  138. package/lib/quickfilter/TextLiteralComponent.js +85 -82
  139. package/lib/widgets/MapWidget.js +4 -2
  140. package/lib/widgets/charts/Chart.d.ts +11 -0
  141. package/lib/widgets/charts/Chart.js +15 -0
  142. package/lib/widgets/charts/ChartWidgetComponent.d.ts +1 -0
  143. package/lib/widgets/charts/ChartWidgetComponent.js +27 -1
  144. package/lib/widgets/charts/layered/LayeredChartDesign.d.ts +1 -1
  145. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.d.ts +1 -1
  146. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.js +5 -12
  147. package/lib/widgets/charts/layered/LayeredChartLayerDesignerComponent.d.ts +43 -57
  148. package/lib/widgets/charts/layered/LayeredChartLayerDesignerComponent.js +113 -110
  149. package/lib/widgets/charts/layered/LayeredChartUtils.d.ts +2 -1
  150. package/lib/widgets/charts/layered/LayeredChartUtils.js +0 -2
  151. package/lib/widgets/charts/pivot/PivotChart.d.ts +2 -0
  152. package/lib/widgets/charts/pivot/PivotChart.js +156 -0
  153. package/lib/widgets/charts/pivot/PivotChartDesignerComponent.d.ts +5 -20
  154. package/lib/widgets/charts/pivot/PivotChartDesignerComponent.js +31 -61
  155. package/lib/widgets/charts/pivot/PivotChartLayoutBuilder.d.ts +4 -0
  156. package/lib/widgets/charts/pivot/PivotChartLayoutBuilder.js +4 -2
  157. package/lib/widgets/charts/pivot/PivotChartLayoutComponent.d.ts +5 -44
  158. package/lib/widgets/charts/pivot/PivotChartLayoutComponent.js +38 -63
  159. package/lib/widgets/charts/pivot/SegmentDesignerComponent.d.ts +7 -68
  160. package/lib/widgets/charts/pivot/SegmentDesignerComponent.js +58 -106
  161. package/lib/widgets/charts/table/TableChart.d.ts +2 -0
  162. package/lib/widgets/charts/table/TableChart.js +172 -1
  163. package/lib/widgets/charts/table/TableChartDesignerComponent.d.ts +7 -17
  164. package/lib/widgets/charts/table/TableChartDesignerComponent.js +79 -95
  165. package/lib/widgets/charts/table/TableChartViewComponent.d.ts +1 -7
  166. package/lib/widgets/charts/table/TableChartViewComponent.js +19 -27
  167. package/lib/widgets/text/ExprItemEditorComponent.d.ts +3 -8
  168. package/lib/widgets/text/ExprItemEditorComponent.js +36 -33
  169. package/lib/widgets/text/ExprUpdateModalComponent.d.ts +1 -0
  170. package/package.json +4 -10
  171. package/src/MWaterContextComponent.tsx +2 -2
  172. package/src/{MWaterGlobalFiltersComponent.ts → MWaterGlobalFiltersComponent.tsx} +32 -33
  173. package/src/{MWaterLoaderComponent.ts → MWaterLoaderComponent.tsx} +18 -19
  174. package/src/UndoStack.ts +14 -6
  175. package/src/dashboards/DashboardComponent.tsx +7 -5
  176. package/src/dashboards/DashboardDesign.ts +1 -1
  177. package/src/dashboards/LayoutOptionsComponent.tsx +22 -10
  178. package/src/dashboards/ServerDashboardDataSource.ts +36 -13
  179. package/src/dashboards/SettingsModalComponent.tsx +1 -1
  180. package/src/dashboards/layoutOptions.tsx +5 -1
  181. package/src/datagrids/DatagridComponent.tsx +31 -3
  182. package/src/datagrids/DatagridDesignerComponent.tsx +241 -229
  183. package/src/datagrids/DatagridViewComponent.tsx +3 -2
  184. package/src/datagrids/ExprCellComponent.tsx +23 -20
  185. package/src/datagrids/OrderBysDesignerComponent.tsx +61 -70
  186. package/src/index.css +45 -2
  187. package/src/index.ts +5 -11
  188. package/src/layouts/blocks/BlocksDisplayComponent.tsx +60 -5
  189. package/src/maps/BufferLayer.ts +48 -20
  190. package/src/maps/BufferLayerDesign.ts +1 -1
  191. package/src/maps/BufferLayerDesignerComponent.tsx +2 -1
  192. package/src/maps/ChoroplethLayer.ts +70 -39
  193. package/src/maps/ChoroplethLayerDesign.ts +6 -2
  194. package/src/maps/ChoroplethLayerDesigner.tsx +171 -167
  195. package/src/maps/DirectMapDataSource.ts +21 -13
  196. package/src/maps/EditHoverOver.tsx +98 -54
  197. package/src/maps/HoverContent.tsx +17 -48
  198. package/src/maps/Layer.ts +42 -4
  199. package/src/maps/LeafletMapComponent.tsx +10 -19
  200. package/src/maps/MWaterServerLayer.ts +6 -6
  201. package/src/maps/MapComponent.ts +0 -1
  202. package/src/maps/MapLayerDataSource.ts +8 -0
  203. package/src/maps/MapUtils.ts +82 -3
  204. package/src/maps/MarkersLayer.ts +54 -27
  205. package/src/maps/MarkersLayerDesign.ts +1 -1
  206. package/src/maps/MarkersLayerDesignerComponent.tsx +360 -0
  207. package/src/maps/RasterMapViewComponent.ts +1 -1
  208. package/src/maps/ServerMapDataSource.ts +35 -12
  209. package/src/maps/VectorMapViewComponent.tsx +8 -19
  210. package/src/maps/maps.ts +4 -2
  211. package/src/maps/symbols/font-awesome/asterisk.png +0 -0
  212. package/src/maps/symbols/font-awesome/ban.png +0 -0
  213. package/src/maps/symbols/font-awesome/beer.png +0 -0
  214. package/src/maps/symbols/font-awesome/bell.png +0 -0
  215. package/src/maps/symbols/font-awesome/bolt.png +0 -0
  216. package/src/maps/symbols/font-awesome/building.png +0 -0
  217. package/src/maps/symbols/font-awesome/bullseye.png +0 -0
  218. package/src/maps/symbols/font-awesome/bus.png +0 -0
  219. package/src/maps/symbols/font-awesome/caret-up.png +0 -0
  220. package/src/maps/symbols/font-awesome/certificate.png +0 -0
  221. package/src/maps/symbols/font-awesome/check-circle.png +0 -0
  222. package/src/maps/symbols/font-awesome/check.png +0 -0
  223. package/src/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  224. package/src/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  225. package/src/maps/symbols/font-awesome/cloud-rain.png +0 -0
  226. package/src/maps/symbols/font-awesome/cloud.png +0 -0
  227. package/src/maps/symbols/font-awesome/comment.png +0 -0
  228. package/src/maps/symbols/font-awesome/crosshairs.png +0 -0
  229. package/src/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  230. package/src/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  231. package/src/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  232. package/src/maps/symbols/font-awesome/female.png +0 -0
  233. package/src/maps/symbols/font-awesome/file.png +0 -0
  234. package/src/maps/symbols/font-awesome/flag.png +0 -0
  235. package/src/maps/symbols/font-awesome/flask.png +0 -0
  236. package/src/maps/symbols/font-awesome/h-square.png +0 -0
  237. package/src/maps/symbols/font-awesome/home.png +0 -0
  238. package/src/maps/symbols/font-awesome/info-circle.png +0 -0
  239. package/src/maps/symbols/font-awesome/male.png +0 -0
  240. package/src/maps/symbols/font-awesome/medkit.png +0 -0
  241. package/src/maps/symbols/font-awesome/mobile.png +0 -0
  242. package/src/maps/symbols/font-awesome/plus-circle.png +0 -0
  243. package/src/maps/symbols/font-awesome/plus-square.png +0 -0
  244. package/src/maps/symbols/font-awesome/plus.png +0 -0
  245. package/src/maps/symbols/font-awesome/square.png +0 -0
  246. package/src/maps/symbols/font-awesome/star.png +0 -0
  247. package/src/maps/symbols/font-awesome/thumbs-down.png +0 -0
  248. package/src/maps/symbols/font-awesome/thumbs-up.png +0 -0
  249. package/src/maps/symbols/font-awesome/ticket.png +0 -0
  250. package/src/maps/symbols/font-awesome/times-circle.png +0 -0
  251. package/src/maps/symbols/font-awesome/times.png +0 -0
  252. package/src/maps/symbols/font-awesome/tint.png +0 -0
  253. package/src/maps/symbols/font-awesome/tree.png +0 -0
  254. package/src/maps/symbols/font-awesome/university.png +0 -0
  255. package/src/maps/symbols/font-awesome/usd.png +0 -0
  256. package/src/maps/symbols/font-awesome/user.png +0 -0
  257. package/src/maps/symbols/font-awesome/users.png +0 -0
  258. package/src/maps/symbols/font-awesome/wheelchair.png +0 -0
  259. package/src/maps/symbols/sdf-ize.sh +93 -0
  260. package/src/maps/vectorMaps.tsx +20 -44
  261. package/src/mwater_table_selection/FormsListComponent.tsx +188 -0
  262. package/src/mwater_table_selection/IndicatorsListComponent.tsx +411 -0
  263. package/src/mwater_table_selection/IssuesListComponent.tsx +167 -0
  264. package/src/mwater_table_selection/MWaterAccountingSystemListComponent.tsx +225 -0
  265. package/src/{MWaterAssetSystemsListComponent.tsx → mwater_table_selection/MWaterAssetSystemsListComponent.tsx} +2 -2
  266. package/src/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.tsx +111 -0
  267. package/src/mwater_table_selection/MWaterCompleteTableSelectComponent.tsx +713 -0
  268. package/src/{MWaterCustomTablesetListComponent.tsx → mwater_table_selection/MWaterCustomTablesetListComponent.tsx} +1 -1
  269. package/src/{MWaterMetricsTableListComponent.tsx → mwater_table_selection/MWaterMetricsTableListComponent.tsx} +1 -1
  270. package/src/{MWaterTableSelectComponent.tsx → mwater_table_selection/MWaterTableSelectComponent.tsx} +91 -90
  271. package/src/mwater_table_selection/MWaterWorkflowsSelectComponent.tsx +159 -0
  272. package/src/quickfilter/{QuickfiltersComponent.ts → QuickfiltersComponent.tsx} +165 -158
  273. package/src/quickfilter/TextLiteralComponent.tsx +197 -0
  274. package/src/widgets/MapWidget.tsx +9 -1
  275. package/src/widgets/charts/Chart.ts +17 -0
  276. package/src/widgets/charts/ChartWidgetComponent.tsx +36 -1
  277. package/src/widgets/charts/layered/LayeredChartDesign.ts +1 -1
  278. package/src/widgets/charts/layered/LayeredChartDesignerComponent.tsx +23 -24
  279. package/src/widgets/charts/layered/LayeredChartLayerDesignerComponent.tsx +260 -211
  280. package/src/widgets/charts/layered/LayeredChartUtils.ts +7 -7
  281. package/src/widgets/charts/pivot/PivotChart.ts +191 -0
  282. package/src/widgets/charts/pivot/PivotChartDesignerComponent.tsx +124 -129
  283. package/src/widgets/charts/pivot/PivotChartLayoutBuilder.ts +4 -2
  284. package/src/widgets/charts/pivot/PivotChartLayoutComponent.tsx +120 -149
  285. package/src/widgets/charts/pivot/SegmentDesignerComponent.tsx +178 -198
  286. package/src/widgets/charts/table/TableChart.ts +177 -1
  287. package/src/widgets/charts/table/TableChartDesignerComponent.tsx +422 -0
  288. package/src/widgets/charts/table/{TableChartViewComponent.ts → TableChartViewComponent.tsx} +65 -60
  289. package/src/widgets/text/ExprItemEditorComponent.tsx +83 -77
  290. package/src/widgets/text/ExprUpdateModalComponent.tsx +1 -0
  291. package/test/UndoStackTests.ts +52 -1
  292. package/.storybook/config.js +0 -7
  293. package/.storybook/head.html +0 -4
  294. package/.storybook/webpack.config.js +0 -15
  295. package/src/MWaterCompleteTableSelectComponent.tsx +0 -975
  296. package/src/maps/BingLayer.ts +0 -146
  297. package/src/maps/MarkersLayerDesignerComponent.ts +0 -374
  298. package/src/quickfilter/TextLiteralComponent.ts +0 -165
  299. package/src/widgets/charts/table/TableChartDesignerComponent.ts +0 -441
  300. package/stories/UpdateableComponent.js +0 -29
  301. package/stories/consoles.js +0 -202
  302. package/stories/dashboards.js +0 -217
  303. package/stories/datagridDesign.js +0 -114
  304. package/stories/datagrids.js +0 -69
  305. package/stories/dates.js +0 -80
  306. package/stories/exprcomponent.js +0 -43
  307. package/stories/index.js +0 -18
  308. package/stories/leaflet.js +0 -59
  309. package/stories/maps.js +0 -24
  310. package/stories/pivotChart.js +0 -235
@@ -0,0 +1,461 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const lodash_1 = __importDefault(require("lodash"));
30
+ const react_1 = __importDefault(require("react"));
31
+ const uiComponents = __importStar(require("../UIComponents"));
32
+ const expressions_1 = require("@mwater/expressions");
33
+ const MWaterCustomTablesetListComponent_1 = require("./MWaterCustomTablesetListComponent");
34
+ const MWaterMetricsTableListComponent_1 = require("./MWaterMetricsTableListComponent");
35
+ const MWaterAssetSystemsListComponent_1 = require("./MWaterAssetSystemsListComponent");
36
+ const FormsListComponent_1 = require("./FormsListComponent");
37
+ const IndicatorsListComponent_1 = require("./IndicatorsListComponent");
38
+ const IssuesListComponent_1 = require("./IssuesListComponent");
39
+ const MWaterAccountingSystemListComponent_1 = require("./MWaterAccountingSystemListComponent");
40
+ const MWaterCalculatedDataSourcesListComponent_1 = require("./MWaterCalculatedDataSourcesListComponent");
41
+ const MWaterWorkflowsSelectComponent_1 = require("./MWaterWorkflowsSelectComponent");
42
+ const sitesOrder = {
43
+ "entities.water_point": 1,
44
+ "entities.sanitation_facility": 2,
45
+ "entities.household": 3,
46
+ "entities.community": 4,
47
+ "entities.school": 5,
48
+ "entities.health_facility": 6,
49
+ "entities.place_of_worship": 7,
50
+ "entities.water_system": 8,
51
+ "entities.water_system_component": 9,
52
+ "entities.wastewater_treatment_system": 10,
53
+ "entities.waste_disposal_site": 11
54
+ };
55
+ /** Entity types that are assets */
56
+ const assetEntities = [
57
+ "entities.water_asset"
58
+ ];
59
+ /** Allows selection of a table. Card-based layout with categories */
60
+ class MWaterCompleteTableSelectComponent extends react_1.default.Component {
61
+ constructor(props) {
62
+ super(props);
63
+ this.state = {
64
+ selectedCategory: null,
65
+ showLegacyAssets: false,
66
+ searchText: ""
67
+ };
68
+ }
69
+ handleExtraTableAdd = (tableId) => {
70
+ return this.props.onExtraTablesChange(lodash_1.default.union(this.props.extraTables, [tableId]));
71
+ };
72
+ handleExtraTableRemove = (tableId) => {
73
+ const displayName = this.getExtraTableDisplayName(tableId);
74
+ if (!displayName) {
75
+ return;
76
+ }
77
+ if (confirm(T `Remove ${displayName}? Any widgets that depend on it will no longer work properly.`)) {
78
+ // Set to null if current table matches (for wildcards, check if current table starts with prefix)
79
+ if (tableId.endsWith(".*")) {
80
+ const prefix = tableId.slice(0, -2);
81
+ if (this.props.table && this.props.table.startsWith(prefix + ".")) {
82
+ this.props.onChange(null);
83
+ }
84
+ }
85
+ else if (this.props.table === tableId) {
86
+ this.props.onChange(null);
87
+ }
88
+ return this.props.onExtraTablesChange(lodash_1.default.without(this.props.extraTables, tableId));
89
+ }
90
+ };
91
+ handleCategorySelect = (categoryId) => {
92
+ this.setState({ selectedCategory: categoryId });
93
+ };
94
+ handleBackToCategories = () => {
95
+ this.setState({ selectedCategory: null, showLegacyAssets: false });
96
+ };
97
+ renderSites() {
98
+ let table;
99
+ let types = [];
100
+ for (table of this.props.schema.getTables()) {
101
+ if (table.deprecated) {
102
+ continue;
103
+ }
104
+ if (!table.id.match(/^entities\./)) {
105
+ continue;
106
+ }
107
+ // Skip assets
108
+ if (assetEntities.includes(table.id)) {
109
+ continue;
110
+ }
111
+ types.push(table.id);
112
+ }
113
+ // Sort by order if present
114
+ types = lodash_1.default.sortBy(types, (type) => sitesOrder[type] || 999);
115
+ return react_1.default.createElement(uiComponents.OptionListComponent, { items: lodash_1.default.compact(lodash_1.default.map(types, (tableId) => {
116
+ table = this.props.schema.getTable(tableId);
117
+ return {
118
+ name: expressions_1.ExprUtils.localizeString(table.name, T.locale),
119
+ desc: expressions_1.ExprUtils.localizeString(table.desc, T.locale),
120
+ onClick: this.props.onChange.bind(null, table.id)
121
+ };
122
+ })) });
123
+ }
124
+ renderForms() {
125
+ return react_1.default.createElement(FormsListComponent_1.FormsListComponent, { schema: this.props.schema, client: this.props.client, apiUrl: this.props.apiUrl, user: this.props.user, onChange: this.props.onChange, extraTables: this.props.extraTables, onExtraTableAdd: this.handleExtraTableAdd, onExtraTableRemove: this.handleExtraTableRemove });
126
+ }
127
+ renderIndicators() {
128
+ return react_1.default.createElement(IndicatorsListComponent_1.IndicatorsListComponent, { schema: this.props.schema, client: this.props.client, apiUrl: this.props.apiUrl, user: this.props.user, onChange: this.props.onChange, extraTables: this.props.extraTables, onExtraTableAdd: this.handleExtraTableAdd, onExtraTableRemove: this.handleExtraTableRemove });
129
+ }
130
+ renderIssues() {
131
+ return react_1.default.createElement(IssuesListComponent_1.IssuesListComponent, { schema: this.props.schema, client: this.props.client, apiUrl: this.props.apiUrl, user: this.props.user, onChange: this.props.onChange, extraTables: this.props.extraTables, onExtraTableAdd: this.handleExtraTableAdd, onExtraTableRemove: this.handleExtraTableRemove });
132
+ }
133
+ renderWorkflows() {
134
+ return react_1.default.createElement(MWaterWorkflowsSelectComponent_1.MWaterWorkflowsSelectComponent, { schema: this.props.schema, client: this.props.client, apiUrl: this.props.apiUrl, user: this.props.user, onChange: this.props.onChange, extraTables: this.props.extraTables, onExtraTableAdd: this.handleExtraTableAdd, onExtraTableRemove: this.handleExtraTableRemove });
135
+ }
136
+ renderSweetSense() {
137
+ let sweetSenseTables = this.getSweetSenseTables();
138
+ sweetSenseTables = lodash_1.default.sortBy(sweetSenseTables, (table) => table.name.en);
139
+ return react_1.default.createElement(uiComponents.OptionListComponent, { items: lodash_1.default.map(sweetSenseTables, (table) => {
140
+ return {
141
+ name: expressions_1.ExprUtils.localizeString(table.name, T.locale),
142
+ desc: expressions_1.ExprUtils.localizeString(table.desc, T.locale),
143
+ onClick: this.props.onChange.bind(null, table.id)
144
+ };
145
+ }) });
146
+ }
147
+ renderTablesets() {
148
+ return react_1.default.createElement(MWaterCustomTablesetListComponent_1.MWaterCustomTablesetListComponent, { schema: this.props.schema, client: this.props.client, apiUrl: this.props.apiUrl, user: this.props.user, onChange: this.props.onChange, extraTables: this.props.extraTables, onExtraTableAdd: this.handleExtraTableAdd, onExtraTableRemove: this.handleExtraTableRemove, locale: T.locale });
149
+ }
150
+ renderMetrics() {
151
+ return react_1.default.createElement(MWaterMetricsTableListComponent_1.MWaterMetricsTableListComponent, { schema: this.props.schema, client: this.props.client, apiUrl: this.props.apiUrl, user: this.props.user, onChange: this.props.onChange, extraTables: this.props.extraTables, onExtraTableAdd: this.handleExtraTableAdd, onExtraTableRemove: this.handleExtraTableRemove, locale: T.locale });
152
+ }
153
+ renderAccountingSystems() {
154
+ return react_1.default.createElement(MWaterAccountingSystemListComponent_1.MWaterAccountingSystemListComponent, { schema: this.props.schema, client: this.props.client, apiUrl: this.props.apiUrl, user: this.props.user, onChange: this.props.onChange, extraTables: this.props.extraTables, onExtraTableAdd: this.handleExtraTableAdd, onExtraTableRemove: this.handleExtraTableRemove, locale: T.locale });
155
+ }
156
+ renderAssets() {
157
+ const items = [];
158
+ for (const tableId of assetEntities) {
159
+ const table = this.props.schema.getTable(tableId);
160
+ if (!table) {
161
+ continue;
162
+ }
163
+ items.push({
164
+ name: expressions_1.ExprUtils.localizeString(table.name, T.locale),
165
+ desc: expressions_1.ExprUtils.localizeString(table.desc, T.locale),
166
+ onClick: this.props.onChange.bind(null, table.id),
167
+ onRemove: this.handleExtraTableRemove.bind(null, table.id)
168
+ });
169
+ }
170
+ return react_1.default.createElement("div", null,
171
+ react_1.default.createElement(uiComponents.OptionListComponent, { items: items }),
172
+ react_1.default.createElement("div", { className: "text-center mt-2 mb-2" },
173
+ react_1.default.createElement("button", { className: "btn btn-link", onClick: () => this.setState({ showLegacyAssets: !this.state.showLegacyAssets }) },
174
+ this.state.showLegacyAssets ? T `Hide` : T `Show`,
175
+ " ",
176
+ T `Legacy Assets`)),
177
+ this.state.showLegacyAssets && this.renderLegacyAssets());
178
+ }
179
+ renderLegacyAssets() {
180
+ return react_1.default.createElement(MWaterAssetSystemsListComponent_1.MWaterAssetSystemsListComponent, { schema: this.props.schema, client: this.props.client, apiUrl: this.props.apiUrl, user: this.props.user, onChange: this.props.onChange, extraTables: this.props.extraTables, onExtraTableAdd: this.handleExtraTableAdd, onExtraTableRemove: this.handleExtraTableRemove, locale: T.locale });
181
+ }
182
+ renderCalculated() {
183
+ return react_1.default.createElement(MWaterCalculatedDataSourcesListComponent_1.MWaterCalculatedDataSourcesListComponent, { schema: this.props.schema, client: this.props.client, apiUrl: this.props.apiUrl, user: this.props.user, onChange: this.props.onChange, extraTables: this.props.extraTables, onExtraTableAdd: this.handleExtraTableAdd, onExtraTableRemove: this.handleExtraTableRemove, locale: T.locale });
184
+ }
185
+ renderOther() {
186
+ let otherTables = lodash_1.default.filter(this.props.schema.getTables(), (table) => {
187
+ // Remove deprecated
188
+ if (table.deprecated) {
189
+ return false;
190
+ }
191
+ // Remove sites
192
+ if (table.id.match(/^entities\./)) {
193
+ return false;
194
+ }
195
+ // sweetsense tables
196
+ if (table.id.match(/^sweetsense/)) {
197
+ return false;
198
+ }
199
+ // Remove responses
200
+ if (table.id.match(/^responses:/)) {
201
+ return false;
202
+ }
203
+ // Remove indicators
204
+ if (table.id.match(/^indicator_values:/)) {
205
+ return false;
206
+ }
207
+ // Remove issues
208
+ if (table.id.match(/^(issues|issue_events):/)) {
209
+ return false;
210
+ }
211
+ // Remove custom tablesets
212
+ if (table.id.match(/^custom\./)) {
213
+ return false;
214
+ }
215
+ // Remove metrics
216
+ if (table.id.match(/^metrics:/)) {
217
+ return false;
218
+ }
219
+ // Remove assets
220
+ if (table.id.match(/^assets:/)) {
221
+ return false;
222
+ }
223
+ // Remove calculated data sources
224
+ if (table.id.match(/^calculated:/)) {
225
+ return false;
226
+ }
227
+ // Remove workflows
228
+ if (table.id.match(/^(workflows|workflow_events):/)) {
229
+ return false;
230
+ }
231
+ return true;
232
+ });
233
+ otherTables = lodash_1.default.sortBy(otherTables, (table) => table.name.en);
234
+ return react_1.default.createElement(uiComponents.OptionListComponent, { items: lodash_1.default.map(otherTables, (table) => {
235
+ return {
236
+ name: expressions_1.ExprUtils.localizeString(table.name, T.locale),
237
+ desc: expressions_1.ExprUtils.localizeString(table.desc, T.locale),
238
+ onClick: this.props.onChange.bind(null, table.id)
239
+ };
240
+ }) });
241
+ }
242
+ getSweetSenseTables() {
243
+ return lodash_1.default.filter(this.props.schema.getTables(), (table) => {
244
+ if (table.deprecated) {
245
+ return false;
246
+ }
247
+ if (table.id.match(/^sweetsense/)) {
248
+ return true;
249
+ }
250
+ return false;
251
+ });
252
+ }
253
+ /** Get all available categories */
254
+ getCategories() {
255
+ const categories = [
256
+ {
257
+ id: "sites",
258
+ name: T("Sites").toString(),
259
+ description: T("Water points, sanitation facilities, households, and other sites").toString(),
260
+ icon: "fa fa-map-marker",
261
+ render: () => this.renderSites()
262
+ },
263
+ {
264
+ id: "forms",
265
+ name: T("Surveys").toString(),
266
+ description: T("Data collected from survey forms").toString(),
267
+ icon: "fa fa-th-list",
268
+ render: () => this.renderForms()
269
+ },
270
+ {
271
+ id: "assets",
272
+ name: T("Assets").toString(),
273
+ description: T("Asset tracking and management").toString(),
274
+ icon: "fas fa-map-pin",
275
+ render: () => this.renderAssets()
276
+ },
277
+ {
278
+ id: "indicators",
279
+ name: T("Indicators").toString(),
280
+ description: T("Calculated indicators and metrics").toString(),
281
+ icon: "fa fa-check-circle",
282
+ render: () => this.renderIndicators()
283
+ },
284
+ {
285
+ id: "tablesets",
286
+ name: T("Tables").toString(),
287
+ description: T("Custom tables and datasets").toString(),
288
+ icon: "fa fa-table",
289
+ render: () => this.renderTablesets()
290
+ },
291
+ {
292
+ id: "calculated",
293
+ name: T("Calculated").toString(),
294
+ description: T("Calculated and derived data sources").toString(),
295
+ icon: "fa fa-cogs",
296
+ render: () => this.renderCalculated()
297
+ },
298
+ {
299
+ id: "accounting",
300
+ name: T("Accounting").toString(),
301
+ description: T("Financial and accounting data").toString(),
302
+ icon: "fa fa-calculator",
303
+ render: () => this.renderAccountingSystems()
304
+ },
305
+ {
306
+ id: "workflows",
307
+ name: T("Workflows").toString(),
308
+ description: T("Multi-step processes and workflows").toString(),
309
+ icon: "fa fa-project-diagram",
310
+ render: () => this.renderWorkflows()
311
+ },
312
+ {
313
+ id: "issues",
314
+ name: T("Issues").toString(),
315
+ description: T("Reported problems and issues").toString(),
316
+ icon: "fa fa-exclamation-circle",
317
+ render: () => this.renderIssues()
318
+ },
319
+ {
320
+ id: "metrics",
321
+ name: T("Metrics").toString(),
322
+ description: T("Performance metrics and KPIs").toString(),
323
+ icon: "fa fa-line-chart",
324
+ render: () => this.renderMetrics()
325
+ },
326
+ {
327
+ id: "other",
328
+ name: T("Advanced").toString(),
329
+ description: T("Other advanced data sources").toString(),
330
+ icon: "fa fa-ellipsis-h",
331
+ render: () => this.renderOther()
332
+ }
333
+ ];
334
+ // // Add sensors if applicable
335
+ // const sweetSenseTables = this.getSweetSenseTables()
336
+ // if (sweetSenseTables.length > 0) {
337
+ // categories.splice(9, 0, {
338
+ // id: "sensors",
339
+ // name: T("Sensors").toString(),
340
+ // description: T("Sensor data and monitoring").toString(),
341
+ // icon: "fa fa-wifi",
342
+ // render: () => this.renderSweetSense()
343
+ // })
344
+ // }
345
+ return categories;
346
+ }
347
+ /** Render a single category card */
348
+ renderCategoryCard(category) {
349
+ return (react_1.default.createElement("div", { key: category.id, className: "card mb-2", style: {
350
+ cursor: "pointer",
351
+ transition: "background-color 0.15s, border-color 0.15s"
352
+ }, onMouseEnter: (e) => {
353
+ e.currentTarget.style.backgroundColor = "#f8f9fa";
354
+ e.currentTarget.style.borderColor = "#adb5bd";
355
+ }, onMouseLeave: (e) => {
356
+ e.currentTarget.style.backgroundColor = "";
357
+ e.currentTarget.style.borderColor = "";
358
+ }, onClick: () => this.handleCategorySelect(category.id) },
359
+ react_1.default.createElement("div", { className: "card-body d-flex align-items-center", style: { padding: "0.75rem" } },
360
+ react_1.default.createElement("div", { style: { fontSize: "1.75rem", width: "2.5rem", textAlign: "center", color: "#6c757d" } },
361
+ react_1.default.createElement("i", { className: category.icon })),
362
+ react_1.default.createElement("div", { style: { flex: 1, marginLeft: "0.75rem" } },
363
+ react_1.default.createElement("div", { style: { fontWeight: 600, fontSize: "1rem", marginBottom: "0.15rem" } }, category.name),
364
+ react_1.default.createElement("div", { className: "text-muted", style: { fontSize: "0.85rem" } }, category.description)),
365
+ react_1.default.createElement("div", { style: { color: "#adb5bd", fontSize: "1.1rem" } },
366
+ react_1.default.createElement("i", { className: "fa fa-chevron-right" })))));
367
+ }
368
+ /** Get display name for an extra table (handles wildcards) */
369
+ getExtraTableDisplayName(tableId) {
370
+ // Check if it's a wildcard pattern
371
+ if (tableId.endsWith(".*")) {
372
+ // Find first matching table
373
+ const prefix = tableId.slice(0, -2); // Remove .*
374
+ const matchingTable = this.props.schema.getTables().find(t => t.id.startsWith(prefix + "."));
375
+ if (matchingTable) {
376
+ const fullName = expressions_1.ExprUtils.localizeString(matchingTable.name, T.locale);
377
+ // Split by " > " and take first part
378
+ const parts = fullName.split(" > ");
379
+ return parts[0];
380
+ }
381
+ // Fallback to showing the pattern
382
+ return tableId;
383
+ }
384
+ // Regular table
385
+ const table = this.props.schema.getTable(tableId);
386
+ if (!table) {
387
+ return null;
388
+ }
389
+ return expressions_1.ExprUtils.localizeString(table.name, T.locale);
390
+ }
391
+ /** Render the currently included extra tables section */
392
+ renderExtraTables() {
393
+ if (!this.props.extraTables || this.props.extraTables.length === 0) {
394
+ return null;
395
+ }
396
+ return (react_1.default.createElement("div", { className: "mb-3 pb-2", style: { borderBottom: "1px solid #dee2e6" } },
397
+ react_1.default.createElement("span", { className: "text-muted me-2", style: { fontSize: "0.9rem" } },
398
+ T `Currently Included`,
399
+ ":"),
400
+ this.props.extraTables.map((tableId) => {
401
+ const displayName = this.getExtraTableDisplayName(tableId);
402
+ if (!displayName) {
403
+ return null;
404
+ }
405
+ return (react_1.default.createElement("span", { key: tableId, className: "d-inline-flex align-items-center me-2 px-2 py-1 bg-light border rounded", style: { fontSize: "0.85rem" } },
406
+ react_1.default.createElement("span", null, displayName),
407
+ react_1.default.createElement("button", { className: "btn btn-link btn-sm p-0 ms-1", style: { fontSize: "0.9rem", color: "#6c757d" }, onClick: (e) => {
408
+ e.stopPropagation();
409
+ this.handleExtraTableRemove(tableId);
410
+ } },
411
+ react_1.default.createElement("i", { className: "fa fa-times" }))));
412
+ })));
413
+ }
414
+ /** Render the landing page with all categories */
415
+ renderLandingPage() {
416
+ const categories = this.getCategories();
417
+ // Filter by search text
418
+ const filteredCategories = this.state.searchText
419
+ ? categories.filter((cat) => {
420
+ const searchLower = this.state.searchText.toLowerCase();
421
+ return (cat.name.toLowerCase().includes(searchLower) ||
422
+ cat.description.toLowerCase().includes(searchLower));
423
+ })
424
+ : categories;
425
+ return (react_1.default.createElement("div", null,
426
+ react_1.default.createElement("div", { className: "text-muted mb-3" }, T `Select a data source category to browse available tables and datasets.`),
427
+ react_1.default.createElement("div", { className: "mb-3 position-relative" },
428
+ react_1.default.createElement("i", { className: "fa fa-search position-absolute", style: { left: "0.75rem", top: "50%", transform: "translateY(-50%)", color: "#6c757d" } }),
429
+ react_1.default.createElement("input", { type: "text", className: "form-control", style: { paddingLeft: "2.5rem" }, placeholder: T("Search categories...").toString(), value: this.state.searchText, onChange: (e) => this.setState({ searchText: e.target.value }), ref: (c) => {
430
+ if (c) {
431
+ c.focus();
432
+ }
433
+ } })),
434
+ this.renderExtraTables(),
435
+ react_1.default.createElement("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "0.5rem" } }, filteredCategories.map((category) => this.renderCategoryCard(category))),
436
+ filteredCategories.length === 0 && this.state.searchText && (react_1.default.createElement("div", { className: "text-center text-muted mt-4" }, T `No categories match your search.`))));
437
+ }
438
+ /** Render a specific category view */
439
+ renderCategoryView() {
440
+ const categories = this.getCategories();
441
+ const category = categories.find((c) => c.id === this.state.selectedCategory);
442
+ if (!category) {
443
+ return null;
444
+ }
445
+ return (react_1.default.createElement("div", null,
446
+ react_1.default.createElement("div", { className: "mb-3" },
447
+ react_1.default.createElement("button", { className: "btn btn-link p-0", style: { textDecoration: "none" }, onClick: this.handleBackToCategories },
448
+ react_1.default.createElement("i", { className: "fa fa-arrow-left me-2" }),
449
+ T `Back to All Data Sources`)),
450
+ react_1.default.createElement("h5", { className: "mb-3" },
451
+ react_1.default.createElement("i", { className: `${category.icon} me-2 text-muted` }),
452
+ category.name),
453
+ category.render()));
454
+ }
455
+ render() {
456
+ return (react_1.default.createElement("div", { style: { height: "65vh", overflowY: "auto" } }, this.state.selectedCategory === null
457
+ ? this.renderLandingPage()
458
+ : this.renderCategoryView()));
459
+ }
460
+ }
461
+ exports.default = MWaterCompleteTableSelectComponent;
@@ -0,0 +1,17 @@
1
+ import { Schema } from "@mwater/expressions";
2
+ import React from "react";
3
+ /** Searchable list of custom tables */
4
+ export declare const MWaterCustomTablesetListComponent: (props: {
5
+ apiUrl: string;
6
+ schema: Schema;
7
+ client?: string;
8
+ /** User id */
9
+ user?: string;
10
+ /** Called with table selected */
11
+ onChange: (tableId: string | null) => void;
12
+ extraTables: string[];
13
+ onExtraTableAdd: (tableId: string) => void;
14
+ onExtraTableRemove: (tableId: string) => void;
15
+ /** e.g. "en" */
16
+ locale?: string;
17
+ }) => React.JSX.Element;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MWaterCustomTablesetListComponent = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const expressions_1 = require("@mwater/expressions");
9
+ const react_1 = require("react");
10
+ const react_2 = __importDefault(require("react"));
11
+ const UIComponents_1 = require("../UIComponents");
12
+ const bootstrap_1 = require("@mwater/react-library/lib/bootstrap");
13
+ /** Searchable list of custom tables */
14
+ const MWaterCustomTablesetListComponent = (props) => {
15
+ const [tablesets, setTablesets] = (0, react_1.useState)();
16
+ const [search, setSearch] = (0, react_1.useState)("");
17
+ const [extraTableNeeded, setExtraTableNeeded] = (0, react_1.useState)();
18
+ const [showSystem, setShowSystem] = (0, react_1.useState)(false);
19
+ // Get list of all tablesets
20
+ (0, react_1.useEffect)(() => {
21
+ fetch(`${props.apiUrl}custom_tablesets?client=${props.client || ""}`)
22
+ .then((response) => response.json())
23
+ .then((tablesets) => {
24
+ // Filter out non-normal
25
+ tablesets = tablesets.filter((ts) => ts.type === "normal");
26
+ // Put included ones first
27
+ setTablesets(lodash_1.default.sortByAll(tablesets, [
28
+ (ts) => (props.extraTables.some((t) => (t || "").startsWith(`custom.${ts.code}.`)) ? 0 : 1),
29
+ (ts) => expressions_1.ExprUtils.localizeString(ts.design.name, props.locale)
30
+ ]));
31
+ });
32
+ }, []);
33
+ (0, react_1.useEffect)(() => {
34
+ if (extraTableNeeded && props.schema.getTable(extraTableNeeded)) {
35
+ props.onChange(extraTableNeeded);
36
+ }
37
+ });
38
+ const selectTable = (ts, tableId) => {
39
+ const qualifiedTableId = `custom.${ts.code}.${tableId}`;
40
+ // If already included, select it
41
+ if (props.schema.getTable(qualifiedTableId)) {
42
+ props.onChange(qualifiedTableId);
43
+ return;
44
+ }
45
+ // Request extra tables as wildcard
46
+ setExtraTableNeeded(qualifiedTableId);
47
+ props.onExtraTableAdd(`custom.${ts.code}.*`);
48
+ };
49
+ const handleRemove = (ts) => {
50
+ // Remove from extra tables
51
+ const match = props.extraTables.find((t) => (t || "").startsWith(`custom.${ts.code}.`));
52
+ if (match) {
53
+ if (confirm(T `Remove this set of tables? Some widgets may not work correctly.`)) {
54
+ props.onChange(null);
55
+ props.onExtraTableRemove(match);
56
+ }
57
+ }
58
+ };
59
+ if (!tablesets || extraTableNeeded) {
60
+ return (react_2.default.createElement("div", null,
61
+ react_2.default.createElement("i", { className: "fa fa-spin fa-spinner" }),
62
+ " ",
63
+ T `Loading...`));
64
+ }
65
+ const renderTableset = (ts) => {
66
+ const name = expressions_1.ExprUtils.localizeString(ts.design.name, props.locale) || "";
67
+ // Check search
68
+ if (search &&
69
+ !name.toLowerCase().includes(search.toLowerCase()) &&
70
+ !ts.design.tables.some((t) => expressions_1.ExprUtils.localizeString(t.name).toLowerCase().includes(search.toLowerCase()))) {
71
+ return null;
72
+ }
73
+ const items = ts.design.tables
74
+ .filter((t) => !t.deprecated)
75
+ .map((t) => ({
76
+ name: expressions_1.ExprUtils.localizeString(t.name, props.locale),
77
+ onClick: () => selectTable(ts, t.id)
78
+ }));
79
+ const alreadyIncluded = props.extraTables.some((t) => (t || "").startsWith(`custom.${ts.code}.`));
80
+ return (react_2.default.createElement("div", { key: ts.code },
81
+ alreadyIncluded ? (react_2.default.createElement("div", { style: { float: "right" } },
82
+ react_2.default.createElement("button", { className: "btn btn-sm btn-link", type: "button", onClick: () => handleRemove(ts) },
83
+ react_2.default.createElement("i", { className: "fa fa-remove" })))) : null,
84
+ react_2.default.createElement("h4", { className: "text-muted" }, name),
85
+ react_2.default.createElement(UIComponents_1.OptionListComponent, { items: items })));
86
+ };
87
+ const visibleTablesets = tablesets.filter((ts) => (showSystem || !ts.design.system) && !ts.design.deprecated);
88
+ return (react_2.default.createElement("div", null,
89
+ react_2.default.createElement(bootstrap_1.TextInput, { value: search, onChange: setSearch, placeholder: T `Search...` }),
90
+ visibleTablesets.map((ts) => renderTableset(ts)),
91
+ react_2.default.createElement("div", null,
92
+ react_2.default.createElement("button", { className: "btn btn-link btn-sm", onClick: () => setShowSystem(!showSystem) }, showSystem ? T `Hide system tables` : T `Show system tables`))));
93
+ };
94
+ exports.MWaterCustomTablesetListComponent = MWaterCustomTablesetListComponent;
@@ -0,0 +1,17 @@
1
+ import { Schema } from "@mwater/expressions";
2
+ import React from "react";
3
+ /** Searchable list of metric tables */
4
+ export declare const MWaterMetricsTableListComponent: (props: {
5
+ apiUrl: string;
6
+ schema: Schema;
7
+ client?: string;
8
+ /** User id */
9
+ user?: string;
10
+ /** Called with table selected */
11
+ onChange: (tableId: string | null) => void;
12
+ extraTables: string[];
13
+ onExtraTableAdd: (tableId: string) => void;
14
+ onExtraTableRemove: (tableId: string) => void;
15
+ /** e.g. "en" */
16
+ locale?: string;
17
+ }) => React.JSX.Element;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MWaterMetricsTableListComponent = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const expressions_1 = require("@mwater/expressions");
9
+ const react_1 = require("react");
10
+ const react_2 = __importDefault(require("react"));
11
+ const UIComponents_1 = require("../UIComponents");
12
+ const bootstrap_1 = require("@mwater/react-library/lib/bootstrap");
13
+ /** Searchable list of metric tables */
14
+ const MWaterMetricsTableListComponent = (props) => {
15
+ const [metrics, setMetrics] = (0, react_1.useState)();
16
+ const [search, setSearch] = (0, react_1.useState)("");
17
+ const [extraTableNeeded, setExtraTableNeeded] = (0, react_1.useState)();
18
+ // Get list of all metrics
19
+ (0, react_1.useEffect)(() => {
20
+ fetch(`${props.apiUrl}metrics?client=${props.client || ""}`)
21
+ .then((response) => response.json())
22
+ .then((body) => {
23
+ // Put included ones first
24
+ setMetrics(lodash_1.default.sortByAll(body, [
25
+ (m) => (props.extraTables.some((t) => (t = `metrics:${m._id}`)) ? 0 : 1),
26
+ (m) => expressions_1.ExprUtils.localizeString(m.design.name, props.locale)
27
+ ]));
28
+ });
29
+ }, []);
30
+ (0, react_1.useEffect)(() => {
31
+ if (extraTableNeeded && props.schema.getTable(extraTableNeeded)) {
32
+ props.onChange(extraTableNeeded);
33
+ }
34
+ });
35
+ const selectTable = (metric) => {
36
+ const qualifiedTableId = `metrics:${metric._id}`;
37
+ // If already included, select it
38
+ if (props.schema.getTable(qualifiedTableId)) {
39
+ props.onChange(qualifiedTableId);
40
+ return;
41
+ }
42
+ // Request extra tables as wildcard
43
+ setExtraTableNeeded(qualifiedTableId);
44
+ props.onExtraTableAdd(qualifiedTableId);
45
+ };
46
+ const handleRemove = (metric) => {
47
+ // Remove from extra tables
48
+ const match = props.extraTables.find((t) => t == `metrics:${metric._id}`);
49
+ if (match) {
50
+ if (confirm(T `Remove this table? Some widgets may not work correctly.`)) {
51
+ props.onChange(null);
52
+ props.onExtraTableRemove(match);
53
+ }
54
+ }
55
+ };
56
+ if (!metrics || extraTableNeeded) {
57
+ return (react_2.default.createElement("div", null,
58
+ react_2.default.createElement("i", { className: "fa fa-spin fa-spinner" }),
59
+ " ",
60
+ T `Loading...`));
61
+ }
62
+ const renderMetrics = () => {
63
+ const items = metrics
64
+ .filter((m) => !m.design.deprecated)
65
+ .map((m) => {
66
+ const alreadyIncluded = props.extraTables.some((t) => t == `metrics:${m._id}`);
67
+ return {
68
+ name: expressions_1.ExprUtils.localizeString(m.design.name, props.locale) || "",
69
+ onClick: () => selectTable(m),
70
+ onRemove: alreadyIncluded ? handleRemove.bind(null, m) : undefined
71
+ };
72
+ })
73
+ .filter((item) => !search || !item.name.toLowerCase().includes(search.toLowerCase()));
74
+ return react_2.default.createElement(UIComponents_1.OptionListComponent, { items: items });
75
+ };
76
+ return (react_2.default.createElement("div", null,
77
+ react_2.default.createElement(bootstrap_1.TextInput, { value: search, onChange: setSearch, placeholder: T `Search...` }),
78
+ renderMetrics()));
79
+ };
80
+ exports.MWaterMetricsTableListComponent = MWaterMetricsTableListComponent;