@mwater/visualization 5.5.0 → 5.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/lib/ColorComponent.js +2 -2
  2. package/lib/MWaterContextComponent.d.ts +1 -1
  3. package/lib/MWaterGlobalFiltersComponent.d.ts +2 -2
  4. package/lib/MWaterGlobalFiltersComponent.js +11 -20
  5. package/lib/MWaterLoaderComponent.d.ts +4 -13
  6. package/lib/MWaterLoaderComponent.js +2 -11
  7. package/lib/TranslationsTabComponent.d.ts +34 -0
  8. package/lib/TranslationsTabComponent.js +256 -0
  9. package/lib/UndoStack.d.ts +2 -1
  10. package/lib/UndoStack.js +12 -6
  11. package/lib/dashboards/DashboardComponent.js +6 -5
  12. package/lib/dashboards/DashboardDesign.d.ts +1 -1
  13. package/lib/dashboards/ServerDashboardDataSource.d.ts +0 -1
  14. package/lib/dashboards/ServerDashboardDataSource.js +0 -25
  15. package/lib/dashboards/SettingsModalComponent.js +9 -233
  16. package/lib/datagrids/DatagridComponent.js +27 -2
  17. package/lib/datagrids/DatagridDesignerComponent.d.ts +2 -3
  18. package/lib/datagrids/DatagridDesignerComponent.js +108 -120
  19. package/lib/datagrids/DatagridViewComponent.js +33 -6
  20. package/lib/datagrids/OrderBysDesignerComponent.d.ts +7 -7
  21. package/lib/datagrids/OrderBysDesignerComponent.js +19 -28
  22. package/lib/index.css +45 -2
  23. package/lib/index.d.ts +5 -5
  24. package/lib/index.js +2 -3
  25. package/lib/layouts/blocks/BlocksDisplayComponent.d.ts +8 -1
  26. package/lib/layouts/blocks/BlocksDisplayComponent.js +46 -4
  27. package/lib/maps/BufferLayer.d.ts +0 -13
  28. package/lib/maps/BufferLayer.js +24 -237
  29. package/lib/maps/BufferLayerDesign.d.ts +1 -1
  30. package/lib/maps/BufferLayerDesignerComponent.d.ts +1 -1
  31. package/lib/maps/BufferLayerDesignerComponent.js +2 -7
  32. package/lib/maps/ChoroplethLayer.d.ts +1 -16
  33. package/lib/maps/ChoroplethLayer.js +25 -358
  34. package/lib/maps/ChoroplethLayerDesign.d.ts +5 -2
  35. package/lib/maps/ChoroplethLayerDesigner.d.ts +10 -32
  36. package/lib/maps/ChoroplethLayerDesigner.js +58 -89
  37. package/lib/maps/ClusterLayer.d.ts +0 -9
  38. package/lib/maps/ClusterLayer.js +0 -250
  39. package/lib/maps/DirectMapDataSource.js +1 -48
  40. package/lib/maps/EditHoverOver.d.ts +4 -3
  41. package/lib/maps/EditHoverOver.js +3 -3
  42. package/lib/maps/GridLayer.d.ts +0 -15
  43. package/lib/maps/GridLayer.js +0 -212
  44. package/lib/maps/HoverContent.js +1 -1
  45. package/lib/maps/Layer.d.ts +1 -26
  46. package/lib/maps/Layer.js +0 -13
  47. package/lib/maps/LeafletMapComponent.js +10 -19
  48. package/lib/maps/MapComponent.d.ts +19 -35
  49. package/lib/maps/MapComponent.js +135 -77
  50. package/lib/maps/MapControlComponent.d.ts +4 -5
  51. package/lib/maps/MapControlComponent.js +5 -12
  52. package/lib/maps/MapDesign.d.ts +8 -0
  53. package/lib/maps/MapDesignerComponent.d.ts +2 -0
  54. package/lib/maps/MapDesignerComponent.js +7 -2
  55. package/lib/maps/MapLayerDataSource.d.ts +0 -4
  56. package/lib/maps/MapLayerViewDesignerComponent.d.ts +3 -1
  57. package/lib/maps/MapLayerViewDesignerComponent.js +5 -1
  58. package/lib/maps/MapLayersDesignerComponent.d.ts +2 -0
  59. package/lib/maps/MapLayersDesignerComponent.js +2 -1
  60. package/lib/maps/MapTranslationsTab.d.ts +15 -0
  61. package/lib/maps/MapTranslationsTab.js +47 -0
  62. package/lib/maps/MapUtils.d.ts +11 -0
  63. package/lib/maps/MapUtils.js +57 -1
  64. package/lib/maps/MapViewComponent.d.ts +1 -1
  65. package/lib/maps/MapViewComponent.js +1 -8
  66. package/lib/maps/MarkersLayer.d.ts +1 -14
  67. package/lib/maps/MarkersLayer.js +89 -254
  68. package/lib/maps/MarkersLayerDesign.d.ts +5 -1
  69. package/lib/maps/MarkersLayerDesignerComponent.d.ts +32 -57
  70. package/lib/maps/MarkersLayerDesignerComponent.js +158 -134
  71. package/lib/maps/ServerMapDataSource.d.ts +0 -1
  72. package/lib/maps/ServerMapDataSource.js +0 -25
  73. package/lib/maps/SwitchableTileUrlLayer.d.ts +0 -2
  74. package/lib/maps/SwitchableTileUrlLayer.js +0 -9
  75. package/lib/maps/TileUrlLayer.d.ts +0 -1
  76. package/lib/maps/TileUrlLayer.js +0 -5
  77. package/lib/maps/VectorMapViewComponent.js +13 -10
  78. package/lib/maps/symbols/font-awesome/asterisk.png +0 -0
  79. package/lib/maps/symbols/font-awesome/ban.png +0 -0
  80. package/lib/maps/symbols/font-awesome/beer.png +0 -0
  81. package/lib/maps/symbols/font-awesome/bell.png +0 -0
  82. package/lib/maps/symbols/font-awesome/bolt.png +0 -0
  83. package/lib/maps/symbols/font-awesome/building.png +0 -0
  84. package/lib/maps/symbols/font-awesome/bullseye.png +0 -0
  85. package/lib/maps/symbols/font-awesome/bus.png +0 -0
  86. package/lib/maps/symbols/font-awesome/caret-up.png +0 -0
  87. package/lib/maps/symbols/font-awesome/certificate.png +0 -0
  88. package/lib/maps/symbols/font-awesome/check-circle.png +0 -0
  89. package/lib/maps/symbols/font-awesome/check.png +0 -0
  90. package/lib/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  91. package/lib/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  92. package/lib/maps/symbols/font-awesome/cloud-rain.png +0 -0
  93. package/lib/maps/symbols/font-awesome/cloud.png +0 -0
  94. package/lib/maps/symbols/font-awesome/comment.png +0 -0
  95. package/lib/maps/symbols/font-awesome/crosshairs.png +0 -0
  96. package/lib/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  97. package/lib/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  98. package/lib/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  99. package/lib/maps/symbols/font-awesome/female.png +0 -0
  100. package/lib/maps/symbols/font-awesome/file.png +0 -0
  101. package/lib/maps/symbols/font-awesome/flag.png +0 -0
  102. package/lib/maps/symbols/font-awesome/flask.png +0 -0
  103. package/lib/maps/symbols/font-awesome/h-square.png +0 -0
  104. package/lib/maps/symbols/font-awesome/home.png +0 -0
  105. package/lib/maps/symbols/font-awesome/info-circle.png +0 -0
  106. package/lib/maps/symbols/font-awesome/male.png +0 -0
  107. package/lib/maps/symbols/font-awesome/medkit.png +0 -0
  108. package/lib/maps/symbols/font-awesome/mobile.png +0 -0
  109. package/lib/maps/symbols/font-awesome/plus-circle.png +0 -0
  110. package/lib/maps/symbols/font-awesome/plus-square.png +0 -0
  111. package/lib/maps/symbols/font-awesome/plus.png +0 -0
  112. package/lib/maps/symbols/font-awesome/square.png +0 -0
  113. package/lib/maps/symbols/font-awesome/star.png +0 -0
  114. package/lib/maps/symbols/font-awesome/thumbs-down.png +0 -0
  115. package/lib/maps/symbols/font-awesome/thumbs-up.png +0 -0
  116. package/lib/maps/symbols/font-awesome/ticket.png +0 -0
  117. package/lib/maps/symbols/font-awesome/times-circle.png +0 -0
  118. package/lib/maps/symbols/font-awesome/times.png +0 -0
  119. package/lib/maps/symbols/font-awesome/tint.png +0 -0
  120. package/lib/maps/symbols/font-awesome/tree.png +0 -0
  121. package/lib/maps/symbols/font-awesome/university.png +0 -0
  122. package/lib/maps/symbols/font-awesome/usd.png +0 -0
  123. package/lib/maps/symbols/font-awesome/user.png +0 -0
  124. package/lib/maps/symbols/font-awesome/users.png +0 -0
  125. package/lib/maps/symbols/font-awesome/wheelchair.png +0 -0
  126. package/lib/maps/symbols/sdf-ize.sh +93 -0
  127. package/lib/maps/vectorMaps.d.ts +6 -6
  128. package/lib/maps/vectorMaps.js +33 -45
  129. package/lib/mwater_table_selection/IndicatorsListComponent.d.ts +4 -2
  130. package/lib/mwater_table_selection/IndicatorsListComponent.js +103 -34
  131. package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.d.ts +18 -0
  132. package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.js +80 -0
  133. package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.d.ts +26 -0
  134. package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.js +237 -51
  135. package/lib/mwater_table_selection/MWaterTableSelectComponent.d.ts +2 -2
  136. package/lib/mwater_table_selection/MWaterTableSelectComponent.js +9 -4
  137. package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.d.ts +19 -0
  138. package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.js +111 -0
  139. package/lib/quickfilter/QuickfiltersComponent.d.ts +3 -102
  140. package/lib/quickfilter/QuickfiltersComponent.js +53 -110
  141. package/lib/quickfilter/TextLiteralComponent.d.ts +23 -47
  142. package/lib/quickfilter/TextLiteralComponent.js +85 -82
  143. package/lib/widgets/MapWidget.js +6 -3
  144. package/lib/widgets/text/ExprItemEditorComponent.d.ts +3 -8
  145. package/lib/widgets/text/ExprItemEditorComponent.js +36 -33
  146. package/lib/widgets/text/ExprUpdateModalComponent.d.ts +1 -0
  147. package/package.json +3 -4
  148. package/src/ColorComponent.tsx +2 -2
  149. package/src/MWaterContextComponent.tsx +1 -1
  150. package/src/{MWaterGlobalFiltersComponent.ts → MWaterGlobalFiltersComponent.tsx} +32 -33
  151. package/src/{MWaterLoaderComponent.ts → MWaterLoaderComponent.tsx} +17 -18
  152. package/src/TranslationsTabComponent.tsx +429 -0
  153. package/src/UndoStack.ts +14 -6
  154. package/src/dashboards/DashboardComponent.tsx +6 -5
  155. package/src/dashboards/DashboardDesign.ts +1 -1
  156. package/src/dashboards/ServerDashboardDataSource.ts +0 -31
  157. package/src/dashboards/SettingsModalComponent.tsx +27 -383
  158. package/src/datagrids/DatagridComponent.tsx +36 -2
  159. package/src/datagrids/DatagridDesignerComponent.tsx +241 -229
  160. package/src/datagrids/DatagridViewComponent.tsx +44 -7
  161. package/src/datagrids/OrderBysDesignerComponent.tsx +61 -70
  162. package/src/index.css +45 -2
  163. package/src/index.ts +5 -11
  164. package/src/layouts/blocks/BlocksDisplayComponent.tsx +60 -5
  165. package/src/maps/BufferLayer.ts +30 -263
  166. package/src/maps/BufferLayerDesign.ts +1 -1
  167. package/src/maps/BufferLayerDesignerComponent.tsx +2 -7
  168. package/src/maps/ChoroplethLayer.ts +30 -394
  169. package/src/maps/ChoroplethLayerDesign.ts +5 -2
  170. package/src/maps/ChoroplethLayerDesigner.tsx +169 -165
  171. package/src/maps/ClusterLayer.ts +0 -274
  172. package/src/maps/DirectMapDataSource.ts +2 -61
  173. package/src/maps/EditHoverOver.tsx +9 -5
  174. package/src/maps/GridLayer.ts +0 -224
  175. package/src/maps/HoverContent.tsx +1 -1
  176. package/src/maps/Layer.ts +1 -35
  177. package/src/maps/LeafletMapComponent.tsx +10 -19
  178. package/src/maps/MapComponent.tsx +448 -0
  179. package/src/maps/MapControlComponent.tsx +41 -0
  180. package/src/maps/MapDesign.ts +6 -0
  181. package/src/maps/MapDesignerComponent.tsx +18 -1
  182. package/src/maps/MapLayerDataSource.ts +0 -5
  183. package/src/maps/MapLayerViewDesignerComponent.ts +9 -2
  184. package/src/maps/MapLayersDesignerComponent.ts +4 -1
  185. package/src/maps/MapTranslationsTab.tsx +53 -0
  186. package/src/maps/MapUtils.ts +61 -1
  187. package/src/maps/MapViewComponent.tsx +2 -8
  188. package/src/maps/MarkersLayer.ts +101 -275
  189. package/src/maps/MarkersLayerDesign.ts +7 -1
  190. package/src/maps/MarkersLayerDesignerComponent.tsx +436 -0
  191. package/src/maps/ServerMapDataSource.ts +0 -31
  192. package/src/maps/SwitchableTileUrlLayer.tsx +0 -11
  193. package/src/maps/TileUrlLayer.tsx +0 -6
  194. package/src/maps/VectorMapViewComponent.tsx +15 -15
  195. package/src/maps/symbols/font-awesome/asterisk.png +0 -0
  196. package/src/maps/symbols/font-awesome/ban.png +0 -0
  197. package/src/maps/symbols/font-awesome/beer.png +0 -0
  198. package/src/maps/symbols/font-awesome/bell.png +0 -0
  199. package/src/maps/symbols/font-awesome/bolt.png +0 -0
  200. package/src/maps/symbols/font-awesome/building.png +0 -0
  201. package/src/maps/symbols/font-awesome/bullseye.png +0 -0
  202. package/src/maps/symbols/font-awesome/bus.png +0 -0
  203. package/src/maps/symbols/font-awesome/caret-up.png +0 -0
  204. package/src/maps/symbols/font-awesome/certificate.png +0 -0
  205. package/src/maps/symbols/font-awesome/check-circle.png +0 -0
  206. package/src/maps/symbols/font-awesome/check.png +0 -0
  207. package/src/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  208. package/src/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  209. package/src/maps/symbols/font-awesome/cloud-rain.png +0 -0
  210. package/src/maps/symbols/font-awesome/cloud.png +0 -0
  211. package/src/maps/symbols/font-awesome/comment.png +0 -0
  212. package/src/maps/symbols/font-awesome/crosshairs.png +0 -0
  213. package/src/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  214. package/src/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  215. package/src/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  216. package/src/maps/symbols/font-awesome/female.png +0 -0
  217. package/src/maps/symbols/font-awesome/file.png +0 -0
  218. package/src/maps/symbols/font-awesome/flag.png +0 -0
  219. package/src/maps/symbols/font-awesome/flask.png +0 -0
  220. package/src/maps/symbols/font-awesome/h-square.png +0 -0
  221. package/src/maps/symbols/font-awesome/home.png +0 -0
  222. package/src/maps/symbols/font-awesome/info-circle.png +0 -0
  223. package/src/maps/symbols/font-awesome/male.png +0 -0
  224. package/src/maps/symbols/font-awesome/medkit.png +0 -0
  225. package/src/maps/symbols/font-awesome/mobile.png +0 -0
  226. package/src/maps/symbols/font-awesome/plus-circle.png +0 -0
  227. package/src/maps/symbols/font-awesome/plus-square.png +0 -0
  228. package/src/maps/symbols/font-awesome/plus.png +0 -0
  229. package/src/maps/symbols/font-awesome/square.png +0 -0
  230. package/src/maps/symbols/font-awesome/star.png +0 -0
  231. package/src/maps/symbols/font-awesome/thumbs-down.png +0 -0
  232. package/src/maps/symbols/font-awesome/thumbs-up.png +0 -0
  233. package/src/maps/symbols/font-awesome/ticket.png +0 -0
  234. package/src/maps/symbols/font-awesome/times-circle.png +0 -0
  235. package/src/maps/symbols/font-awesome/times.png +0 -0
  236. package/src/maps/symbols/font-awesome/tint.png +0 -0
  237. package/src/maps/symbols/font-awesome/tree.png +0 -0
  238. package/src/maps/symbols/font-awesome/university.png +0 -0
  239. package/src/maps/symbols/font-awesome/usd.png +0 -0
  240. package/src/maps/symbols/font-awesome/user.png +0 -0
  241. package/src/maps/symbols/font-awesome/users.png +0 -0
  242. package/src/maps/symbols/font-awesome/wheelchair.png +0 -0
  243. package/src/maps/symbols/sdf-ize.sh +93 -0
  244. package/src/maps/vectorMaps.tsx +32 -53
  245. package/src/mwater_table_selection/IndicatorsListComponent.tsx +165 -37
  246. package/src/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.tsx +111 -0
  247. package/src/mwater_table_selection/MWaterCompleteTableSelectComponent.tsx +373 -37
  248. package/src/mwater_table_selection/MWaterTableSelectComponent.tsx +12 -8
  249. package/src/mwater_table_selection/MWaterWorkflowsSelectComponent.tsx +159 -0
  250. package/src/quickfilter/{QuickfiltersComponent.ts → QuickfiltersComponent.tsx} +165 -158
  251. package/src/quickfilter/TextLiteralComponent.tsx +197 -0
  252. package/src/widgets/MapWidget.tsx +11 -1
  253. package/src/widgets/text/ExprItemEditorComponent.tsx +83 -77
  254. package/src/widgets/text/ExprUpdateModalComponent.tsx +1 -0
  255. package/test/UndoStackTests.ts +52 -1
  256. package/.storybook/config.js +0 -7
  257. package/.storybook/head.html +0 -3
  258. package/.storybook/webpack.config.js +0 -15
  259. package/src/maps/BingLayer.ts +0 -146
  260. package/src/maps/MapComponent.ts +0 -312
  261. package/src/maps/MapControlComponent.ts +0 -46
  262. package/src/maps/MarkersLayerDesignerComponent.ts +0 -374
  263. package/src/maps/RasterMapViewComponent.ts +0 -345
  264. package/src/quickfilter/TextLiteralComponent.ts +0 -165
  265. package/stories/UpdateableComponent.js +0 -29
  266. package/stories/consoles.js +0 -202
  267. package/stories/dashboards.js +0 -217
  268. package/stories/datagridDesign.js +0 -114
  269. package/stories/datagrids.js +0 -69
  270. package/stories/dates.js +0 -80
  271. package/stories/exprcomponent.js +0 -43
  272. package/stories/index.js +0 -18
  273. package/stories/leaflet.js +0 -59
  274. package/stories/maps.js +0 -24
  275. package/stories/pivotChart.js +0 -235
@@ -18,7 +18,7 @@ import { getDefaultLayoutOptions } from "../dashboards/layoutOptions"
18
18
  import Widget from "../widgets/Widget"
19
19
  import BlocksLayoutManager from "../layouts/blocks/BlocksLayoutManager"
20
20
  import { getTranslatableStringsFromLayoutManager } from "../dashboards/DashboardUtils"
21
- import { getSimpleHoverOverData } from "./MapUtils"
21
+ import { getSimpleHoverOverData, getTranslatableStringsFromAxis, translateAxis } from "./MapUtils"
22
22
 
23
23
  /** Layer which draws a buffer around geometries (i.e. a radius circle around points) */
24
24
  export default class BufferLayer extends Layer<BufferLayerDesign> {
@@ -313,259 +313,6 @@ export default class BufferLayer extends Layer<BufferLayerDesign> {
313
313
  return query
314
314
  }
315
315
 
316
- // Gets the layer definition as JsonQL + CSS in format:
317
- // {
318
- // layers: array of { id: layer id, jsonql: jsonql that includes "the_webmercator_geom" as a column }
319
- // css: carto css
320
- // interactivity: (optional) { layer: id of layer, fields: array of field names }
321
- // }
322
- // arguments:
323
- // design: design of layer
324
- // schema: schema to use
325
- // filters: array of filters to apply. Each is { table: table id, jsonql: jsonql condition with {alias} for tableAlias. Use injectAlias to put in table alias
326
- getJsonQLCss(design: BufferLayerDesign, schema: Schema, filters: JsonQLFilter[]) {
327
- // Create design
328
- const layerDef = {
329
- layers: [{ id: "layer0", jsonql: this.createMapnikJsonQL(design, schema, filters) }],
330
- css: this.createCss(design, schema),
331
- interactivity: {
332
- layer: "layer0",
333
- fields: ["id"]
334
- }
335
- }
336
-
337
- return layerDef
338
- }
339
-
340
- createMapnikJsonQL(design: BufferLayerDesign, schema: Schema, filters: JsonQLFilter[]) {
341
- let colorExpr: JsonQLExpr
342
- const axisBuilder = new AxisBuilder({ schema })
343
- const exprCompiler = new ExprCompiler(schema)
344
-
345
- // Get radius expression
346
- const radiusCompiledExpr: JsonQLExpr = exprCompiler.compileExpr({
347
- expr: design.radiusExpr ?? { type: "literal", valueType: "number", value: design.radius },
348
- tableAlias: "main"
349
- })
350
-
351
- // Convert radius in meters to a maximum number of degrees latitude
352
- const radiusDegCompiledExpr: JsonQLExpr = { type: "op", op: "/", exprs: [radiusCompiledExpr, 100000] }
353
-
354
- /*
355
- Query:
356
- select
357
- <primary key> as id,
358
- [<color axis> as color,
359
- st_transform(<geometry axis>, 3857) as the_geom_webmercator,
360
- radius * 2 / (!pixel_width! * cos(st_ymin(st_transform(geometryExpr, 4326)) * 0.017453293) as width
361
- from <table> as main
362
- where
363
- <geometry axis> is not null
364
- * Bounding box filter for speed
365
- and <geometry axis> &&
366
- ST_Transform(ST_Expand(
367
- * Prevent 3857 overflow (i.e. > 85 degrees lat)
368
- ST_Intersection(
369
- ST_Transform(!bbox!, 4326),
370
- ST_Expand(ST_MakeEnvelope(-180, -85, 180, 85, 4326), -<radius in degrees>))
371
- , <radius in degrees>})
372
- , 3857)
373
- and <other filters>
374
- */
375
-
376
- // Compile geometry axis
377
- let geometryExpr = axisBuilder.compileAxis({ axis: design.axes.geometry!, tableAlias: "main" })
378
-
379
- // radius * 2 / (!pixel_width! * cos(st_ymin(st_transform(geometryExpr, 4326)) * 0.017453293) + 1 # add one to make always visible
380
- const widthExpr: JsonQLExpr = {
381
- type: "op",
382
- op: "+",
383
- exprs: [
384
- {
385
- type: "op",
386
- op: "/",
387
- exprs: [
388
- { type: "op", op: "*", exprs: [radiusCompiledExpr, 2] },
389
- {
390
- type: "op",
391
- op: "*",
392
- exprs: [
393
- { type: "op", op: "nullif", exprs: [{ type: "token", token: "!pixel_height!" }, 0] },
394
- {
395
- type: "op",
396
- op: "cos",
397
- exprs: [
398
- {
399
- type: "op",
400
- op: "*",
401
- exprs: [
402
- {
403
- type: "op",
404
- op: "ST_YMIN",
405
- exprs: [{ type: "op", op: "ST_Transform", exprs: [geometryExpr, 4326] }]
406
- },
407
- 0.017453293
408
- ]
409
- }
410
- ]
411
- }
412
- ]
413
- }
414
- ]
415
- },
416
- 2
417
- ]
418
- }
419
-
420
- const selects: JsonQLSelect[] = [
421
- {
422
- type: "select",
423
- expr: { type: "field", tableAlias: "main", column: schema.getTable(design.table)!.primaryKey },
424
- alias: "id"
425
- }, // main primary key as id
426
- { type: "select", expr: geometryExpr, alias: "the_geom_webmercator" },
427
- { type: "select", expr: widthExpr, alias: "width" } // Width of circles
428
- ]
429
-
430
- // Add color select if color axis
431
- if (design.axes.color) {
432
- colorExpr = axisBuilder.compileAxis({ axis: design.axes.color, tableAlias: "main" })
433
- selects.push({ type: "select", expr: colorExpr, alias: "color" })
434
- }
435
-
436
- // Select _id, location and clustered row number
437
- const query: JsonQLQuery = {
438
- type: "query",
439
- selects,
440
- from: exprCompiler.compileTable(design.table, "main")
441
- }
442
-
443
- const boundingBox: JsonQLExpr = {
444
- type: "op",
445
- op: "ST_Transform",
446
- exprs: [
447
- {
448
- type: "op",
449
- op: "ST_Expand",
450
- exprs: [
451
- {
452
- type: "op",
453
- op: "ST_Intersection",
454
- exprs: [
455
- { type: "op", op: "ST_Transform", exprs: [{ type: "token", token: "!bbox!" }, 4326] },
456
- {
457
- type: "op",
458
- op: "ST_Expand",
459
- exprs: [
460
- { type: "op", op: "ST_MakeEnvelope", exprs: [-180, -85, 180, 85, 4326] },
461
- { type: "op", op: "*", exprs: [radiusDegCompiledExpr, -1] }
462
- ]
463
- }
464
- ]
465
- },
466
- radiusDegCompiledExpr
467
- ]
468
- },
469
- 3857
470
- ]
471
- }
472
-
473
- // Create filters. First ensure geometry and limit to bounding box
474
- let whereClauses: JsonQLExpr[] = [
475
- { type: "op", op: "is not null", exprs: [geometryExpr] },
476
- {
477
- type: "op",
478
- op: "&&",
479
- exprs: [geometryExpr, boundingBox]
480
- }
481
- ]
482
-
483
- // Then add filters baked into layer
484
- if (design.filter) {
485
- whereClauses.push(exprCompiler.compileExpr({ expr: design.filter, tableAlias: "main" }))
486
- }
487
-
488
- // Then add extra filters passed in, if relevant
489
- // Get relevant filters
490
- const relevantFilters = _.where(filters, { table: design.table })
491
- for (let filter of relevantFilters) {
492
- whereClauses.push(injectTableAlias(filter.jsonql, "main"))
493
- }
494
-
495
- whereClauses = _.compact(whereClauses)
496
-
497
- // Wrap if multiple
498
- if (whereClauses.length > 1) {
499
- query.where = { type: "op", op: "and", exprs: whereClauses }
500
- } else {
501
- query.where = whereClauses[0]
502
- }
503
-
504
- // Sort order
505
- if (design.axes.color && design.axes.color.colorMap) {
506
- // TODO should use categories, not colormap order
507
- const order = design.axes.color.drawOrder || _.pluck(design.axes.color.colorMap, "value")
508
- const categories = axisBuilder.getCategories(design.axes.color, order)
509
-
510
- const cases = _.map(categories, (category, i) => {
511
- return {
512
- when:
513
- category.value != null
514
- ? ({ type: "op", op: "=", exprs: [colorExpr, category.value] } as JsonQLExpr)
515
- : ({ type: "op", op: "is null", exprs: [colorExpr] } as JsonQLExpr),
516
- then: order.indexOf(category.value) || -1
517
- }
518
- })
519
-
520
- if (cases.length > 0) {
521
- query.orderBy = [
522
- {
523
- expr: {
524
- type: "case",
525
- cases
526
- },
527
- direction: "desc" // Reverse color map order
528
- }
529
- ]
530
- }
531
- }
532
-
533
- return query
534
- }
535
-
536
- createCss(design: BufferLayerDesign, schema: Schema) {
537
- let css =
538
- `\
539
- #layer0 {
540
- marker-fill-opacity: ` +
541
- design.fillOpacity +
542
- `;
543
- marker-type: ellipse;
544
- marker-width: [width];
545
- marker-line-width: 0;
546
- marker-allow-overlap: true;
547
- marker-ignore-placement: true;
548
- marker-fill: ` +
549
- (design.color || "transparent") +
550
- `;
551
- }\
552
- `
553
-
554
- // If color axes, add color conditions
555
- if (design.axes.color != null && design.axes.color.colorMap != null) {
556
- for (let item of design.axes.color.colorMap) {
557
- // If invisible
558
- if ((design.axes.color.excludedValues || []).includes(item.value)) {
559
- css += `#layer0 [color=${JSON.stringify(item.value)}] { marker-fill-opacity: 0; }\n`
560
- } else {
561
- css += `#layer0 [color=${JSON.stringify(item.value)}] { marker-fill: ${item.color}; }\n`
562
- }
563
- }
564
- }
565
-
566
- return css
567
- }
568
-
569
316
  // Called when the interactivity grid is clicked.
570
317
  // arguments:
571
318
  // ev: { data: interactivty data e.g. `{ id: 123 }` }
@@ -760,7 +507,7 @@ marker-fill: ` +
760
507
  // Get the legend to be optionally displayed on the map. Returns
761
508
  // a React element
762
509
  getLegend(options: LegendOptions<BufferLayerDesign>): ReactNode {
763
- const { design, schema, name, dataSource, locale, filters } = options
510
+ const { design, schema, name, dataSource, locale, filters, translate } = options
764
511
  const _filters = filters.slice()
765
512
  if (design.filter != null) {
766
513
  const exprCompiler = new ExprCompiler(schema)
@@ -771,16 +518,20 @@ marker-fill: ` +
771
518
  }
772
519
 
773
520
  const axisBuilder = new AxisBuilder({ schema })
521
+
522
+ // Clean and translate axis
523
+ const axis = translateAxis(axisBuilder.cleanAxis({
524
+ axis: design.axes.color,
525
+ table: design.table,
526
+ types: ["enum", "text", "boolean", "date"],
527
+ aggrNeed: "none"
528
+ }), translate)
529
+
774
530
  return React.createElement(LayerLegendComponent, {
775
531
  schema,
776
- name,
532
+ name: translate(name),
777
533
  filters: _.compact(_filters),
778
- axis: axisBuilder.cleanAxis({
779
- axis: design.axes.color,
780
- table: design.table,
781
- types: ["enum", "text", "boolean", "date"],
782
- aggrNeed: "none"
783
- })!,
534
+ axis: axis!,
784
535
  radiusLayer: true,
785
536
  defaultColor: design.color,
786
537
  locale
@@ -869,6 +620,19 @@ marker-fill: ` +
869
620
  })
870
621
 
871
622
  draft.filter = exprCleaner.cleanExpr(design.filter || null, { table: design.table })
623
+
624
+ // Clean hover over expressions
625
+ if (design.table && design.hoverOver && design.hoverOver.items) {
626
+ for (let i = 0; i < design.hoverOver.items.length; i++) {
627
+ const item = design.hoverOver.items[i]
628
+ if (item.value) {
629
+ draft.hoverOver!.items[i].value = exprCleaner.cleanExpr(item.value || null, {
630
+ table: design.table,
631
+ aggrStatuses: ["individual", "literal"]
632
+ })
633
+ }
634
+ }
635
+ }
872
636
  })
873
637
 
874
638
  return design
@@ -919,6 +683,9 @@ marker-fill: ` +
919
683
  getTranslatableStrings(design: BufferLayerDesign, schema: Schema): string[] {
920
684
  const strings: string[] = []
921
685
 
686
+ // Add strings from axis category labels and null labels
687
+ strings.push(...getTranslatableStringsFromAxis(design.axes.color))
688
+
922
689
  // Add strings from hoverOver items
923
690
  if (design.hoverOver && design.hoverOver.items) {
924
691
  for (const item of design.hoverOver.items) {
@@ -962,7 +729,7 @@ marker-fill: ` +
962
729
  filters: options.filters,
963
730
  schema: options.schema,
964
731
  dataSource: options.dataSource,
965
- hoverOverItems: options.design.hoverOver.items,
732
+ hoverOverItems: options.design.hoverOver!.items,
966
733
  })
967
734
  }
968
735
  }
@@ -47,7 +47,7 @@ export interface BufferLayerDesign {
47
47
  popup: { items: LayoutBlock }
48
48
 
49
49
  /** Contains items: which is HoverOverItem[] */
50
- hoverOver: { items: HoverOverItem[] }
50
+ hoverOver?: { items: HoverOverItem[] }
51
51
 
52
52
  /** Customizable filtering for popup. See PopupFilterJoins.md */
53
53
  popupFilterJoins: PopupFilterJoins
@@ -14,8 +14,7 @@ import * as PopupFilterJoinsUtils from "./PopupFilterJoinsUtils"
14
14
  import { Checkbox } from "@mwater/react-library/lib/bootstrap"
15
15
  import { BufferLayerDesign } from "./BufferLayerDesign"
16
16
  import { JsonQLFilter } from "../JsonQLFilter"
17
- import { areVectorMapsEnabled } from "./vectorMaps"
18
- import EditHoverOver from "./EditHoverOver"
17
+ import { EditHoverOver } from "./EditHoverOver"
19
18
 
20
19
  export interface BufferLayerDesignerComponentProps {
21
20
  /** Schema to use */
@@ -138,11 +137,6 @@ export default class BufferLayerDesignerComponent extends React.Component<Buffer
138
137
  }
139
138
 
140
139
  renderUnionShapes() {
141
- // Only implemented for vector maps
142
- if (!areVectorMapsEnabled()) {
143
- return null
144
- }
145
-
146
140
  return (
147
141
  <div className="mb-3">
148
142
  <Checkbox
@@ -281,6 +275,7 @@ export default class BufferLayerDesignerComponent extends React.Component<Buffer
281
275
  table={this.props.design.table}
282
276
  idTable={this.props.design.table}
283
277
  defaultPopupFilterJoins={PopupFilterJoinsUtils.createDefaultPopupFilterJoins(this.props.design.table)}
278
+ aggrStatuses={["individual", "literal"]}
284
279
  />
285
280
  )
286
281
  }