@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
@@ -28,7 +28,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const lodash_1 = __importDefault(require("lodash"));
30
30
  const react_1 = __importDefault(require("react"));
31
- const R = react_1.default.createElement;
32
31
  const immer_1 = require("immer");
33
32
  const expressions_ui_1 = require("@mwater/expressions-ui");
34
33
  const expressions_1 = require("@mwater/expressions");
@@ -41,7 +40,7 @@ const ZoomLevelsComponent_1 = __importDefault(require("./ZoomLevelsComponent"));
41
40
  const ui = __importStar(require("@mwater/react-library/lib/bootstrap"));
42
41
  const AdminScopeAndDetailLevelComponent_1 = __importDefault(require("./AdminScopeAndDetailLevelComponent"));
43
42
  const ScopeAndDetailLevelComponent_1 = __importDefault(require("./ScopeAndDetailLevelComponent"));
44
- const EditHoverOver_1 = __importDefault(require("./EditHoverOver"));
43
+ const EditHoverOver_1 = require("./EditHoverOver");
45
44
  // Designer for a choropleth layer
46
45
  class ChoroplethLayerDesigner extends react_1.default.Component {
47
46
  update(mutation) {
@@ -151,7 +150,8 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
151
150
  react_1.default.createElement(expressions_ui_2.TableSelectComponent, { schema: this.props.schema, value: this.props.design.table, onChange: this.handleTableChange, filter: this.props.design.filter, onFilterChange: this.handleFilterChange })));
152
151
  }
153
152
  renderRegionsTable() {
154
- let options = lodash_1.default.map(lodash_1.default.filter(this.props.schema.getTables(), table => table.id.startsWith("regions.")), table => ({ value: table.id, label: table.name.en }));
153
+ // Regions tables are either "regions." or "regions_<name>" with a shape column
154
+ let options = lodash_1.default.map(lodash_1.default.filter(this.props.schema.getTables(), table => table.id.startsWith("regions.") || (table.id.startsWith("regions_") && this.props.schema.getColumn(table.id, "shape") != null)), table => ({ value: table.id, label: expressions_1.ExprUtils.localizeString(table.name) }));
155
155
  const regionsTable = this.props.design.regionsTable || "admin_regions";
156
156
  return (react_1.default.createElement("div", { className: "mb-3" },
157
157
  react_1.default.createElement("label", { className: "text-muted" }, T `Regions Type`),
@@ -182,39 +182,27 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
182
182
  renderScopeAndDetailLevel() {
183
183
  const regionsTable = this.props.design.regionsTable || "admin_regions";
184
184
  if (regionsTable === "admin_regions") {
185
- return R(AdminScopeAndDetailLevelComponent_1.default, {
186
- schema: this.props.schema,
187
- dataSource: this.props.dataSource,
188
- scope: this.props.design.scope,
189
- scopeLevel: this.props.design.scopeLevel || 0,
190
- detailLevel: this.props.design.detailLevel,
191
- onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange
192
- });
185
+ return react_1.default.createElement(AdminScopeAndDetailLevelComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, scope: this.props.design.scope, scopeLevel: this.props.design.scopeLevel || 0, detailLevel: this.props.design.detailLevel, onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange });
193
186
  }
194
187
  else {
195
- return R(ScopeAndDetailLevelComponent_1.default, {
196
- schema: this.props.schema,
197
- dataSource: this.props.dataSource,
198
- scope: this.props.design.scope,
199
- scopeLevel: this.props.design.scopeLevel,
200
- detailLevel: this.props.design.detailLevel,
201
- onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange,
202
- regionsTable
203
- });
188
+ return react_1.default.createElement(ScopeAndDetailLevelComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, scope: this.props.design.scope, scopeLevel: this.props.design.scopeLevel, detailLevel: this.props.design.detailLevel, onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange, regionsTable: regionsTable });
204
189
  }
205
190
  }
206
191
  renderDisplayNames() {
207
- return R("div", { className: "mb-3" }, react_1.default.createElement(ui.Checkbox, { value: this.props.design.displayNames, onChange: value => this.handleDisplayNamesChange(value) }, T `Display Region Names`));
192
+ return (react_1.default.createElement("div", { className: "mb-3" },
193
+ react_1.default.createElement(ui.Checkbox, { value: this.props.design.displayNames, onChange: value => this.handleDisplayNamesChange(value) }, T `Display Region Names`)));
208
194
  }
209
195
  renderColor() {
210
196
  // Only if plain
211
197
  if (this.props.design.regionMode !== "plain") {
212
198
  return null;
213
199
  }
214
- return R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, R("span", { className: "fas fa-tint" }), T `Fill Color`), R("div", null, R(ColorComponent_1.default, {
215
- color: this.props.design.color,
216
- onChange: this.handleColorChange
217
- })));
200
+ return (react_1.default.createElement("div", { className: "mb-3" },
201
+ react_1.default.createElement("label", { className: "text-muted" },
202
+ react_1.default.createElement("span", { className: "fas fa-tint" }),
203
+ T `Fill Color`),
204
+ react_1.default.createElement("div", null,
205
+ react_1.default.createElement(ColorComponent_1.default, { color: this.props.design.color, onChange: this.handleColorChange }))));
218
206
  }
219
207
  renderColorAxis() {
220
208
  // Not applicable if in plain mode, or if in indirect mode with no table
@@ -235,19 +223,12 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
235
223
  }
236
224
  }
237
225
  const table = this.props.design.table;
238
- return R("div", null, R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, R("span", { className: "fas fa-tint" }), T `Color By Data`), R(AxisComponent_1.default, {
239
- schema: this.props.schema,
240
- dataSource: this.props.dataSource,
241
- table: this.props.design.table,
242
- types: ["text", "enum", "boolean", "date"],
243
- aggrNeed: "required",
244
- value: this.props.design.axes.color,
245
- defaultColor: this.props.design.color,
246
- showColorMap: true,
247
- onChange: this.handleColorAxisChange,
248
- allowExcludedValues: true,
249
- filters: filters
250
- })));
226
+ return (react_1.default.createElement("div", null,
227
+ react_1.default.createElement("div", { className: "mb-3" },
228
+ react_1.default.createElement("label", { className: "text-muted" },
229
+ react_1.default.createElement("span", { className: "fas fa-tint" }),
230
+ T `Color By Data`),
231
+ react_1.default.createElement(AxisComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, types: ["text", "enum", "boolean", "date"], aggrNeed: "required", value: this.props.design.axes.color, defaultColor: this.props.design.color, showColorMap: true, onChange: this.handleColorAxisChange, allowExcludedValues: true, filters: filters }))));
251
232
  }
252
233
  else {
253
234
  // direct mode
@@ -275,19 +256,12 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
275
256
  }
276
257
  });
277
258
  }
278
- return R("div", null, R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, R("span", { className: "fas fa-tint" }), T `Color By Data`), R(AxisComponent_1.default, {
279
- schema: this.props.schema,
280
- dataSource: this.props.dataSource,
281
- table: regionsTable,
282
- types: ["text", "enum", "boolean", "date"],
283
- aggrNeed: "none",
284
- value: this.props.design.axes.color,
285
- defaultColor: this.props.design.color,
286
- showColorMap: true,
287
- onChange: this.handleColorAxisChange,
288
- allowExcludedValues: true,
289
- filters: filters
290
- })));
259
+ return (react_1.default.createElement("div", null,
260
+ react_1.default.createElement("div", { className: "mb-3" },
261
+ react_1.default.createElement("label", { className: "text-muted" },
262
+ react_1.default.createElement("span", { className: "fas fa-tint" }),
263
+ T `Color By Data`),
264
+ react_1.default.createElement(AxisComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, table: regionsTable, types: ["text", "enum", "boolean", "date"], aggrNeed: "none", value: this.props.design.axes.color, defaultColor: this.props.design.color, showColorMap: true, onChange: this.handleColorAxisChange, allowExcludedValues: true, filters: filters }))));
291
265
  }
292
266
  }
293
267
  // renderLabelAxis: ->
@@ -309,33 +283,30 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
309
283
  // showColorMap: true
310
284
  // onChange: @handleColorAxisChange)
311
285
  renderFillOpacity() {
312
- return R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, T `Fill Opacity: ${(this.props.design.fillOpacity * this.props.design.fillOpacity * 100).toFixed(0)}%`), ": ", R(rc_slider_1.default, {
313
- min: 0,
314
- max: 100,
315
- step: 1,
316
- tipTransitionName: "rc-slider-tooltip-zoom-down",
317
- value: Math.round(this.props.design.fillOpacity * this.props.design.fillOpacity * 100),
318
- onChange: (val) => this.handleFillOpacityChange(Math.sqrt(val / 100))
319
- }));
286
+ return (react_1.default.createElement("div", { className: "mb-3" },
287
+ react_1.default.createElement("label", { className: "text-muted" }, T `Fill Opacity: ${(this.props.design.fillOpacity * this.props.design.fillOpacity * 100).toFixed(0)}%`),
288
+ ": ",
289
+ react_1.default.createElement(rc_slider_1.default, { min: 0, max: 100, step: 1, tipTransitionName: "rc-slider-tooltip-zoom-down", value: Math.round(this.props.design.fillOpacity * this.props.design.fillOpacity * 100), onChange: (val) => this.handleFillOpacityChange(Math.sqrt(val / 100)) })));
320
290
  }
321
291
  renderBorderColor() {
322
- return R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, R("span", { className: "fas fa-tint" }), T `Border Color`), R("div", null, R(ColorComponent_1.default, {
323
- color: this.props.design.borderColor || "#000",
324
- onChange: this.handleBorderColorChange
325
- })));
292
+ return (react_1.default.createElement("div", { className: "mb-3" },
293
+ react_1.default.createElement("label", { className: "text-muted" },
294
+ react_1.default.createElement("span", { className: "fas fa-tint" }),
295
+ T `Border Color`),
296
+ react_1.default.createElement("div", null,
297
+ react_1.default.createElement(ColorComponent_1.default, { color: this.props.design.borderColor || "#000", onChange: this.handleBorderColorChange }))));
326
298
  }
327
299
  renderFilter() {
328
300
  // If not in indirect mode with table, hide
329
301
  if (this.props.design.regionMode !== "indirect" || !this.props.design.table) {
330
302
  return null;
331
303
  }
332
- return R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, R("span", { className: "fas fa-filter" }), T `Filters`), R("div", { style: { marginLeft: 8 } }, R(expressions_ui_1.FilterExprComponent, {
333
- schema: this.props.schema,
334
- dataSource: this.props.dataSource,
335
- onChange: this.handleFilterChange,
336
- table: this.props.design.table,
337
- value: this.props.design.filter
338
- })));
304
+ return (react_1.default.createElement("div", { className: "mb-3" },
305
+ react_1.default.createElement("label", { className: "text-muted" },
306
+ react_1.default.createElement("span", { className: "fas fa-filter" }),
307
+ T `Filters`),
308
+ react_1.default.createElement("div", { style: { marginLeft: 8 } },
309
+ react_1.default.createElement(expressions_ui_1.FilterExprComponent, { schema: this.props.schema, dataSource: this.props.dataSource, onChange: this.handleFilterChange, table: this.props.design.table, value: this.props.design.filter }))));
339
310
  }
340
311
  renderPopup() {
341
312
  // If not in indirect mode with table, hide
@@ -347,15 +318,7 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
347
318
  if (this.props.design.adminRegionExpr) {
348
319
  defaultPopupFilterJoins[this.props.design.table] = this.props.design.adminRegionExpr;
349
320
  }
350
- return R(EditPopupComponent_1.default, {
351
- design: this.props.design,
352
- onDesignChange: this.props.onDesignChange,
353
- schema: this.props.schema,
354
- dataSource: this.props.dataSource,
355
- table: this.props.design.table,
356
- idTable: regionsTable,
357
- defaultPopupFilterJoins
358
- });
321
+ return react_1.default.createElement(EditPopupComponent_1.default, { design: this.props.design, onDesignChange: this.props.onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, idTable: regionsTable, defaultPopupFilterJoins: defaultPopupFilterJoins });
359
322
  }
360
323
  renderHoverOver() {
361
324
  // If not in indirect mode with table, hide
@@ -367,18 +330,24 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
367
330
  if (this.props.design.adminRegionExpr) {
368
331
  defaultPopupFilterJoins[this.props.design.table] = this.props.design.adminRegionExpr;
369
332
  }
370
- return R(EditHoverOver_1.default, {
371
- design: this.props.design,
372
- onDesignChange: this.props.onDesignChange,
373
- schema: this.props.schema,
374
- dataSource: this.props.dataSource,
375
- table: this.props.design.table,
376
- idTable: regionsTable,
377
- defaultPopupFilterJoins
378
- });
333
+ return react_1.default.createElement(EditHoverOver_1.EditHoverOver, { design: this.props.design, onDesignChange: this.props.onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, idTable: regionsTable, defaultPopupFilterJoins: defaultPopupFilterJoins, aggrStatuses: ["individual", "aggregate", "literal"] });
379
334
  }
380
335
  render() {
381
- return R("div", null, this.renderRegionMode(), this.renderRegionsTable(), this.renderTable(), this.renderAdminRegionExpr(), this.renderScopeAndDetailLevel(), this.renderDisplayNames(), this.renderColor(), this.renderColorAxis(), this.renderFillOpacity(), this.renderBorderColor(), this.renderFilter(), this.renderPopup(), this.renderHoverOver(), R(ZoomLevelsComponent_1.default, { design: this.props.design, onDesignChange: this.props.onDesignChange }));
336
+ return (react_1.default.createElement("div", null,
337
+ this.renderRegionMode(),
338
+ this.renderRegionsTable(),
339
+ this.renderTable(),
340
+ this.renderAdminRegionExpr(),
341
+ this.renderScopeAndDetailLevel(),
342
+ this.renderDisplayNames(),
343
+ this.renderColor(),
344
+ this.renderColorAxis(),
345
+ this.renderFillOpacity(),
346
+ this.renderBorderColor(),
347
+ this.renderFilter(),
348
+ this.renderPopup(),
349
+ this.renderHoverOver(),
350
+ react_1.default.createElement(ZoomLevelsComponent_1.default, { design: this.props.design, onDesignChange: this.props.onDesignChange })));
382
351
  }
383
352
  }
384
353
  exports.default = ChoroplethLayerDesigner;
@@ -227,22 +227,12 @@ class DirectLayerDataSource {
227
227
  query.cacheExpiry = cacheExpiry;
228
228
  }
229
229
  let url = `${this.options.apiUrl}maps/tiles/{z}/{x}/{y}.${extension}?` + querystring_1.default.stringify(query);
230
- // Add subdomains: {s} will be substituted with "a", "b" or "c" in leaflet for api.mwater.co only.
231
- // Used to speed queries
232
- if (url.match(/^https:\/\/api\.mwater\.co\//)) {
233
- url = url.replace(/^https:\/\/api\.mwater\.co\//, "https://{s}-api.mwater.co/");
234
- }
235
230
  return url;
236
231
  }
237
232
  // Create query string
238
233
  createLegacyUrl(design, extension, filters) {
239
234
  let where;
240
235
  let url = `${this.options.apiUrl}maps/tiles/{z}/{x}/{y}.${extension}?type=${design.type}&radius=1000`;
241
- // Add subdomains: {s} will be substituted with "a", "b" or "c" in leaflet for api.mwater.co only.
242
- // Used to speed queries
243
- if (url.match(/^https:\/\/api\.mwater\.co\//)) {
244
- url = url.replace(/^https:\/\/api\.mwater\.co\//, "https://{s}-api.mwater.co/");
245
- }
246
236
  if (this.options.client) {
247
237
  url += `&client=${this.options.client}`;
248
238
  }
@@ -262,4 +252,21 @@ class DirectLayerDataSource {
262
252
  }
263
253
  return url;
264
254
  }
255
+ /** Gets hover over data for hover over items
256
+ * @param design The design of the layer
257
+ * @param data The data of the current item being hovered over. e.g. { id: 123 }
258
+ * @param filters The filters to apply to the hover over data, not including filtering down to the current item
259
+ * @returns A promise that resolves to the hover over data, indexed by the id of the hover over item
260
+ */
261
+ getHoverOverData(design, data, filters) {
262
+ // Create layer
263
+ const layer = LayerFactory_1.default.createLayer(this.options.layerView.type);
264
+ return layer.getHoverOverData({
265
+ design,
266
+ data,
267
+ filters,
268
+ schema: this.options.schema,
269
+ dataSource: this.options.dataSource,
270
+ });
271
+ }
265
272
  }
@@ -1,4 +1,4 @@
1
- import { DataSource, Schema } from "@mwater/expressions";
1
+ import { AggrStatus, DataSource, Schema } from "@mwater/expressions";
2
2
  import React from "react";
3
3
  export interface EditHoverOverProps {
4
4
  /** Schema to use */
@@ -13,6 +13,7 @@ export interface EditHoverOverProps {
13
13
  /** Table of the row that join is to. Usually same as table except for choropleth maps */
14
14
  idTable: string;
15
15
  defaultPopupFilterJoins: any;
16
+ /** Aggr statuses to allow in hover over expressions */
17
+ aggrStatuses: AggrStatus[];
16
18
  }
17
- declare const EditHoverOver: React.FC<EditHoverOverProps>;
18
- export default EditHoverOver;
19
+ export declare function EditHoverOver(props: EditHoverOverProps): React.JSX.Element;
@@ -26,65 +26,94 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.EditHoverOver = EditHoverOver;
29
30
  const lodash_1 = require("lodash");
31
+ const expressions_1 = require("@mwater/expressions");
30
32
  const expressions_ui_1 = require("@mwater/expressions-ui");
31
33
  const react_1 = __importStar(require("react"));
32
- const ModalWindowComponent_1 = __importDefault(require("@mwater/react-library/lib/ModalWindowComponent"));
34
+ const ActionCancelModalComponent_1 = __importDefault(require("@mwater/react-library/lib/ActionCancelModalComponent"));
33
35
  const ui = __importStar(require("@mwater/react-library/lib/bootstrap"));
34
36
  const uuid_1 = __importDefault(require("uuid"));
35
- const EditHoverOver = props => {
37
+ const valueFormatter_1 = require("../valueFormatter");
38
+ const valueFormatter_2 = require("../valueFormatter");
39
+ function EditHoverOver(props) {
40
+ const { schema, dataSource, design, onDesignChange, table } = props;
36
41
  const [editing, setEditing] = (0, react_1.useState)(false);
42
+ const [draftItems, setDraftItems] = (0, react_1.useState)(undefined);
37
43
  const handleRemovePopup = () => {
38
- const design = (0, lodash_1.omit)(props.design, "hoverOver");
39
- props.onDesignChange(design);
40
- };
41
- const handleDesignChange = (items) => {
42
- const hoverOver = { ...(props.design.hoverOver ?? {}), items };
43
- const design = { ...props.design, hoverOver };
44
- return props.onDesignChange(design);
44
+ const newDesign = (0, lodash_1.omit)(design, "hoverOver");
45
+ onDesignChange(newDesign);
45
46
  };
46
47
  const handleItemChange = (item) => {
47
- const items = (props.design.hoverOver?.items ?? []).map((i) => (item.id === i.id ? item : i));
48
- const design = { ...props.design, hoverOver: { ...props.design.hoverOver, items } };
49
- return props.onDesignChange(design);
48
+ setDraftItems(draftItems?.map((i) => (item.id === i.id ? item : i)));
50
49
  };
51
50
  const handleItemDelete = (item) => {
52
- const items = (props.design.hoverOver?.items ?? []).filter((i) => item.id !== i.id);
53
- const design = { ...props.design, hoverOver: { ...props.design.hoverOver, items } };
54
- return props.onDesignChange(design);
51
+ setDraftItems(draftItems?.filter((i) => item.id !== i.id));
52
+ };
53
+ const handleAddItem = () => {
54
+ setDraftItems([...(draftItems ?? []), { id: (0, uuid_1.default)().replace(/-/g, ""), label: "" }]);
55
+ };
56
+ const handleSave = () => {
57
+ const hoverOver = { ...(design.hoverOver ?? {}), items: draftItems ?? [] };
58
+ const newDesign = { ...design, hoverOver };
59
+ onDesignChange(newDesign);
60
+ setEditing(false);
61
+ setDraftItems(undefined);
62
+ };
63
+ const handleCancel = () => {
64
+ setEditing(false);
65
+ setDraftItems(undefined);
66
+ };
67
+ const handleOpen = () => {
68
+ setDraftItems(design.hoverOver?.items ?? []);
69
+ setEditing(true);
55
70
  };
56
71
  return (react_1.default.createElement(react_1.default.Fragment, null,
57
- react_1.default.createElement("button", { className: "btn btn-link", onClick: () => setEditing(true) },
72
+ react_1.default.createElement("button", { className: "btn btn-link", onClick: handleOpen },
58
73
  react_1.default.createElement("span", { className: "fa fa-pencil" }),
59
74
  " ",
60
75
  T `Customize Hoverover`),
61
- props.design.hoverOver && (react_1.default.createElement("button", { className: "btn btn-link", onClick: handleRemovePopup },
76
+ design.hoverOver && (react_1.default.createElement("button", { className: "btn btn-link", onClick: handleRemovePopup },
62
77
  react_1.default.createElement("span", { className: "fa fa-times" }),
63
78
  " ",
64
79
  T `Remove Hover over`)),
65
- editing && (react_1.default.createElement(ModalWindowComponent_1.default, { isOpen: true, onRequestClose: () => setEditing(false) },
66
- (props.design.hoverOver?.items ?? []).length > 0 && (react_1.default.createElement("table", { className: "table" },
80
+ editing && (react_1.default.createElement(ActionCancelModalComponent_1.default, { onAction: handleSave, onCancel: handleCancel, actionLabel: T `Save`, title: T `Customize Hoverover`, size: "x-large" },
81
+ (draftItems ?? []).length > 0 && (react_1.default.createElement("table", { className: "table" },
67
82
  react_1.default.createElement("thead", null,
68
83
  react_1.default.createElement("tr", null,
69
84
  react_1.default.createElement("th", null, T `Label`),
70
85
  react_1.default.createElement("th", null, T `Value`),
71
- react_1.default.createElement("th", null))),
72
- react_1.default.createElement("tbody", null, props.design.hoverOver?.items.map((item) => (react_1.default.createElement(HoverOverItemEditor, { schema: props.schema, dataSource: props.dataSource, table: props.design.table, onItemChange: handleItemChange, onItemDelete: handleItemDelete, item: item })))))),
73
- (props.design.hoverOver?.items ?? []).length < 3 && (react_1.default.createElement("button", { className: "btn btn-link", onClick: () => handleDesignChange([
74
- ...(props.design.hoverOver?.items ?? []),
75
- { id: (0, uuid_1.default)().replace(/-/g, ""), label: "" }
76
- ]) },
77
- react_1.default.createElement("span", { className: "fa fa-plus" }),
78
- T `Add item`))))));
79
- };
80
- const HoverOverItemEditor = ({ schema, dataSource, table, item, onItemChange, onItemDelete }) => {
86
+ react_1.default.createElement("th", { style: { width: "1%", whiteSpace: "nowrap" } }, T `Format`),
87
+ react_1.default.createElement("th", { style: { width: "1%", whiteSpace: "nowrap" } }))),
88
+ react_1.default.createElement("tbody", null, draftItems?.map((item) => (react_1.default.createElement(HoverOverItemEditor, { key: item.id, schema: schema, dataSource: dataSource, table: table, onItemChange: handleItemChange, onItemDelete: handleItemDelete, item: item, aggrStatuses: props.aggrStatuses })))))),
89
+ react_1.default.createElement("button", { className: "btn btn-link", onClick: handleAddItem },
90
+ react_1.default.createElement("span", { className: "fas fa-plus me-1" }),
91
+ T `Add Item`)))));
92
+ }
93
+ function HoverOverItemEditor(props) {
94
+ const { schema, dataSource, table, item, onItemChange, onItemDelete } = props;
95
+ function renderFormat() {
96
+ const exprUtils = new expressions_1.ExprUtils(schema);
97
+ const exprType = exprUtils.getExprType(item.value ?? null);
98
+ if (!exprType) {
99
+ return null;
100
+ }
101
+ if (!(0, valueFormatter_1.canFormatType)(exprType)) {
102
+ return null;
103
+ }
104
+ const formats = (0, valueFormatter_2.getFormatOptions)(exprType);
105
+ if (!formats) {
106
+ return null;
107
+ }
108
+ return (react_1.default.createElement(ui.Select, { options: formats.map(f => ({ value: f.value, label: f.label })), value: item.format ?? (0, valueFormatter_1.getDefaultFormat)(exprType), onChange: value => onItemChange({ ...item, format: value ?? undefined }), style: { width: "auto", display: "inline-block" } }));
109
+ }
81
110
  return (react_1.default.createElement("tr", null,
82
- react_1.default.createElement("td", null,
111
+ react_1.default.createElement("td", { className: "align-middle" },
83
112
  react_1.default.createElement(ui.TextInput, { value: item.label, onChange: value => onItemChange({ ...item, label: value }) })),
84
- react_1.default.createElement("td", null,
85
- react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: schema, dataSource: dataSource, table: table, types: ["text", "number", "enum", "boolean", "date", "datetime", "id"], onChange: expr => onItemChange({ ...item, value: expr }), value: item.value ?? null, aggrStatuses: ["individual", "literal", "aggregate"] })),
86
- react_1.default.createElement("td", null,
113
+ react_1.default.createElement("td", { className: "align-middle" },
114
+ react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: schema, dataSource: dataSource, table: table, types: ["text", "number", "enum", "boolean", "date", "datetime", "id"], onChange: expr => onItemChange({ ...item, value: expr }), value: item.value ?? null, aggrStatuses: props.aggrStatuses })),
115
+ react_1.default.createElement("td", { className: "align-middle", style: { width: "1%", whiteSpace: "nowrap" } }, renderFormat()),
116
+ react_1.default.createElement("td", { className: "align-middle", style: { width: "1%", whiteSpace: "nowrap" } },
87
117
  react_1.default.createElement("button", { className: "btn btn-link", onClick: () => onItemDelete(item) },
88
118
  react_1.default.createElement("span", { className: "fa fa-close" })))));
89
- };
90
- exports.default = EditHoverOver;
119
+ }
@@ -1,14 +1,19 @@
1
1
  import React from "react";
2
- import { DataSource, Schema } from "@mwater/expressions";
2
+ import { Schema } from "@mwater/expressions";
3
3
  import { JsonQLFilter } from "..";
4
4
  import { HoverOverItem } from "./maps";
5
+ import { MapLayerDataSource } from "./MapLayerDataSource";
5
6
  export interface HoverContentProps {
6
7
  /** Schema to use */
7
8
  schema: Schema;
8
- dataSource: DataSource;
9
- filters?: JsonQLFilter[];
10
- /** Table that hover over is for */
11
- table: string;
9
+ /** Map data source */
10
+ mapLayerDataSource: MapLayerDataSource;
11
+ /** Design of the layer */
12
+ design: any;
13
+ /** Data of the current item being hovered over. e.g. { id: 123 } */
14
+ data: any;
15
+ /** Additional filters to apply to the hover over data */
16
+ filters: JsonQLFilter[];
12
17
  /** Hover over items */
13
18
  items: HoverOverItem[];
14
19
  /** Locale to use */
@@ -25,7 +25,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  const react_1 = __importStar(require("react"));
27
27
  const expressions_1 = require("@mwater/expressions");
28
- const lodash_1 = require("lodash");
29
28
  const valueFormatter_1 = require("../valueFormatter");
30
29
  const valueFormatter_2 = require("../valueFormatter");
31
30
  /** Component that displays hover over content */
@@ -37,42 +36,14 @@ const HoverContent = (props) => {
37
36
  let mounted = true;
38
37
  const items = props.items;
39
38
  if (items.length > 0) {
40
- const exprCompiler = new expressions_1.ExprCompiler(props.schema);
41
- const query = {
42
- type: "query",
43
- selects: [],
44
- from: exprCompiler.compileTable(props.table, "main"),
45
- limit: 1
46
- };
47
- items.forEach((item) => {
48
- if (item.value) {
49
- query.selects.push({
50
- type: "select",
51
- expr: exprCompiler.compileExpr({ expr: item.value, tableAlias: "main" }),
52
- alias: item.id
53
- });
39
+ props.mapLayerDataSource.getHoverOverData(props.design, props.data, props.filters).then((data) => {
40
+ if (mounted) {
41
+ setValues(data);
54
42
  }
55
- });
56
- if (props.filters) {
57
- let whereClauses = props.filters.map(f => (0, expressions_1.injectTableAlias)(f.jsonql, "main"));
58
- whereClauses = (0, lodash_1.compact)(whereClauses);
59
- // Wrap if multiple
60
- if (whereClauses.length > 1) {
61
- query.where = { type: "op", op: "and", exprs: whereClauses };
62
- }
63
- else {
64
- query.where = whereClauses[0];
65
- }
66
- }
67
- props.dataSource.performQuery(query, (error, data) => {
68
- if (!mounted) {
69
- return;
70
- }
71
- if (error) {
72
- setError(props.translate("Error loading hover data"));
73
- return;
43
+ }).catch((error) => {
44
+ if (mounted) {
45
+ setError(error.message);
74
46
  }
75
- setValues(data?.[0] ?? {});
76
47
  });
77
48
  }
78
49
  return () => {
@@ -82,7 +53,7 @@ const HoverContent = (props) => {
82
53
  if (error) {
83
54
  return react_1.default.createElement("div", { className: "text-danger" }, error);
84
55
  }
85
- return (react_1.default.createElement("div", { className: "_mviz-map-hover-content" }, props.items.map((item) => {
56
+ return (react_1.default.createElement("div", { className: "mwater-visualization-map-hover-content" }, props.items.map((item) => {
86
57
  let value = values[item.id];
87
58
  if (value != null && item.value) {
88
59
  // Get expression type
@@ -130,6 +130,25 @@ export default class Layer<LayerDesign> {
130
130
  data: any;
131
131
  event: any;
132
132
  }, options: OnGridClickOptions<LayerDesign>): OnGridClickResults;
133
+ /**
134
+ * Called when the interactivity grid is hovered over.
135
+ * arguments:
136
+ * ev: { data: interactivty data e.g. `{ id: 123 }` }
137
+ * options:
138
+ * design: design of layer
139
+ * schema: schema to use
140
+ * dataSource: data source to use
141
+ * layerDataSource: layer data source
142
+ * scopeData: current scope data if layer is scoping
143
+ * filters: compiled filters to apply to the popup
144
+ *
145
+ * Returns:
146
+ * null
147
+ * or
148
+ * {
149
+ * hoverOver: React element to put into a hover over
150
+ * }
151
+ */
133
152
  onGridHoverOver(ev: {
134
153
  data: any;
135
154
  event: any;
@@ -172,6 +191,24 @@ export default class Layer<LayerDesign> {
172
191
  } | null) => void): void;
173
192
  /** Get strings to be translated */
174
193
  getTranslatableStrings(design: LayerDesign, schema: Schema): string[];
194
+ /** Gets hover over data for hover over items. This should be implemented by layers that have hover over items.
195
+ * It will be called on the server side if using a server map data source, or on the client side if using a direct
196
+ * map data source.
197
+ */
198
+ getHoverOverData(options: {
199
+ /** Design of the layer */
200
+ design: LayerDesign;
201
+ /** Data of the current item being hovered over. e.g. { id: 123 } */
202
+ data: any;
203
+ /** Filters to apply to the hover over data, not including filtering down to the current item */
204
+ filters: JsonQLFilter[];
205
+ /** Schema to use */
206
+ schema: Schema;
207
+ /** Data source to use */
208
+ dataSource: DataSource;
209
+ }): Promise<{
210
+ [key: string]: any;
211
+ }>;
175
212
  }
176
213
  export interface LegendOptions<LayerDesign> {
177
214
  design: LayerDesign;
package/lib/maps/Layer.js CHANGED
@@ -56,6 +56,25 @@ class Layer {
56
56
  onGridClick(ev, options) {
57
57
  return null;
58
58
  }
59
+ /**
60
+ * Called when the interactivity grid is hovered over.
61
+ * arguments:
62
+ * ev: { data: interactivty data e.g. `{ id: 123 }` }
63
+ * options:
64
+ * design: design of layer
65
+ * schema: schema to use
66
+ * dataSource: data source to use
67
+ * layerDataSource: layer data source
68
+ * scopeData: current scope data if layer is scoping
69
+ * filters: compiled filters to apply to the popup
70
+ *
71
+ * Returns:
72
+ * null
73
+ * or
74
+ * {
75
+ * hoverOver: React element to put into a hover over
76
+ * }
77
+ */
59
78
  onGridHoverOver(ev, options) {
60
79
  return null;
61
80
  }
@@ -168,10 +187,10 @@ class Layer {
168
187
  const [w, s, e, n] = (0, bbox_1.default)(results[0].bounds);
169
188
  // Pad bounds to prevent too small box (100m)
170
189
  bounds = {
171
- w: w - 0.001,
172
- s: s - 0.001,
173
- e: e + 0.001,
174
- n: n + 0.001
190
+ w: Math.max(w - 0.001, -180),
191
+ s: Math.max(s - 0.001, -90),
192
+ e: Math.min(e + 0.001, 180),
193
+ n: Math.min(n + 0.001, 90)
175
194
  };
176
195
  }
177
196
  return callback(null, bounds);
@@ -182,5 +201,12 @@ class Layer {
182
201
  getTranslatableStrings(design, schema) {
183
202
  return [];
184
203
  }
204
+ /** Gets hover over data for hover over items. This should be implemented by layers that have hover over items.
205
+ * It will be called on the server side if using a server map data source, or on the client side if using a direct
206
+ * map data source.
207
+ */
208
+ getHoverOverData(options) {
209
+ return Promise.resolve({});
210
+ }
185
211
  }
186
212
  exports.default = Layer;