@mwater/visualization 5.4.1 → 5.4.2

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 (269) hide show
  1. package/lib/ColorComponent.js +2 -1
  2. package/lib/IdSelection.d.ts +16 -0
  3. package/lib/IdSelection.js +59 -0
  4. package/lib/MWaterAddRelatedIndicatorComponent.js +2 -2
  5. package/lib/MWaterCompleteTableSelectComponent.d.ts +3 -8
  6. package/lib/MWaterCompleteTableSelectComponent.js +36 -42
  7. package/lib/MWaterLoaderComponent.d.ts +11 -10
  8. package/lib/MWaterLoaderComponent.js +1 -1
  9. package/lib/MWaterResponsesFilterComponent.js +1 -1
  10. package/lib/MWaterTableSelectComponent.d.ts +0 -1
  11. package/lib/MWaterTableSelectComponent.js +4 -6
  12. package/lib/autotranslate.d.ts +20 -0
  13. package/lib/autotranslate.js +122 -0
  14. package/lib/axes/AxisBuilder.js +3 -3
  15. package/lib/axes/AxisColorEditorComponent.js +4 -0
  16. package/lib/axes/AxisComponent.d.ts +8 -12
  17. package/lib/axes/AxisComponent.js +32 -80
  18. package/lib/axes/CategoryMapComponent.js +4 -4
  19. package/lib/axes/RangesComponent.js +2 -2
  20. package/lib/dashboards/DashboardComponent.d.ts +6 -0
  21. package/lib/dashboards/DashboardComponent.js +44 -12
  22. package/lib/dashboards/DashboardDesign.d.ts +11 -2
  23. package/lib/dashboards/DashboardUtils.d.ts +5 -0
  24. package/lib/dashboards/DashboardUtils.js +30 -0
  25. package/lib/dashboards/DashboardViewComponent.d.ts +2 -0
  26. package/lib/dashboards/DashboardViewComponent.js +16 -3
  27. package/lib/dashboards/ServerDashboardDataSource.js +2 -1
  28. package/lib/dashboards/SettingsModalComponent.d.ts +1 -1
  29. package/lib/dashboards/SettingsModalComponent.js +256 -19
  30. package/lib/dashboards/WidgetComponent.d.ts +6 -3
  31. package/lib/dashboards/WidgetComponent.js +3 -1
  32. package/lib/datagrids/CellEditor.d.ts +19 -0
  33. package/lib/datagrids/CellEditor.js +223 -0
  34. package/lib/datagrids/DatagridComponent.d.ts +18 -87
  35. package/lib/datagrids/DatagridComponent.js +304 -222
  36. package/lib/datagrids/DatagridViewComponent.d.ts +15 -53
  37. package/lib/datagrids/DatagridViewComponent.js +256 -257
  38. package/lib/datagrids/DirectDatagridDataSource.js +2 -3
  39. package/lib/datagrids/ExprCellComponent.d.ts +8 -15
  40. package/lib/datagrids/ExprCellComponent.js +11 -15
  41. package/lib/datagrids/FindReplaceModalComponent.d.ts +4 -6
  42. package/lib/datagrids/FindReplaceModalComponent.js +38 -75
  43. package/lib/index.css +1 -1
  44. package/lib/index.d.ts +0 -1
  45. package/lib/index.js +0 -1
  46. package/lib/layouts/blocks/HorizontalBlockComponent.js +2 -2
  47. package/lib/mWaterLoader.d.ts +1 -1
  48. package/lib/maps/BufferLayer.d.ts +7 -5
  49. package/lib/maps/BufferLayer.js +69 -48
  50. package/lib/maps/BufferLayerDesign.d.ts +21 -14
  51. package/lib/maps/BufferLayerDesignerComponent.d.ts +16 -31
  52. package/lib/maps/BufferLayerDesignerComponent.js +68 -102
  53. package/lib/maps/ChoroplethLayer.d.ts +5 -4
  54. package/lib/maps/ChoroplethLayer.js +32 -9
  55. package/lib/maps/ChoroplethLayerDesign.d.ts +6 -2
  56. package/lib/maps/ChoroplethLayerDesigner.js +4 -2
  57. package/lib/maps/ClusterLayer.d.ts +3 -4
  58. package/lib/maps/ClusterLayer.js +2 -1
  59. package/lib/maps/DetailLevelSelectComponent.js +1 -1
  60. package/lib/maps/DirectMapDataSource.js +2 -1
  61. package/lib/maps/EditPopupComponent.js +5 -3
  62. package/lib/maps/GridLayer.d.ts +3 -4
  63. package/lib/maps/GridLayer.js +2 -1
  64. package/lib/maps/GridLayerDesigner.js +5 -3
  65. package/lib/maps/HoverContent.d.ts +11 -3
  66. package/lib/maps/HoverContent.js +25 -9
  67. package/lib/maps/Layer.d.ts +24 -3
  68. package/lib/maps/Layer.js +5 -1
  69. package/lib/maps/LayerFactory.js +0 -8
  70. package/lib/maps/LayerLegendComponent.js +0 -1
  71. package/lib/maps/LayerSwitcherComponent.d.ts +1 -0
  72. package/lib/maps/LayerSwitcherComponent.js +1 -1
  73. package/lib/maps/LeafletMapComponent.js +3 -1
  74. package/lib/maps/LegendComponent.d.ts +1 -0
  75. package/lib/maps/LegendComponent.js +9 -1
  76. package/lib/maps/MWaterServerLayer.d.ts +2 -2
  77. package/lib/maps/MWaterServerLayer.js +2 -2
  78. package/lib/maps/MapComponent.js +3 -3
  79. package/lib/maps/MapDesign.d.ts +2 -0
  80. package/lib/maps/MapDesignerComponent.d.ts +4 -3
  81. package/lib/maps/MapDesignerComponent.js +68 -74
  82. package/lib/maps/MapLayerViewDesignerComponent.js +2 -2
  83. package/lib/maps/MapUtils.d.ts +4 -0
  84. package/lib/maps/MapUtils.js +19 -0
  85. package/lib/maps/MapViewComponent.d.ts +8 -3
  86. package/lib/maps/MarkersLayer.d.ts +5 -4
  87. package/lib/maps/MarkersLayer.js +33 -7
  88. package/lib/maps/MarkersLayerDesign.d.ts +19 -16
  89. package/lib/maps/PopupFilterJoinsUtils.d.ts +6 -3
  90. package/lib/maps/PopupFilterJoinsUtils.js +0 -6
  91. package/lib/maps/RasterMapViewComponent.d.ts +3 -31
  92. package/lib/maps/RasterMapViewComponent.js +7 -2
  93. package/lib/maps/ServerMapDataSource.js +2 -1
  94. package/lib/maps/SwitchableTileUrlLayer.d.ts +3 -3
  95. package/lib/maps/SwitchableTileUrlLayer.js +2 -1
  96. package/lib/maps/TileUrlLayer.d.ts +4 -5
  97. package/lib/maps/TileUrlLayer.js +2 -1
  98. package/lib/maps/VectorMapViewComponent.d.ts +5 -37
  99. package/lib/maps/VectorMapViewComponent.js +19 -8
  100. package/lib/maps/maps.d.ts +3 -0
  101. package/lib/quickfilter/QuickfiltersComponent.d.ts +2 -0
  102. package/lib/quickfilter/QuickfiltersComponent.js +9 -7
  103. package/lib/quickfilter/QuickfiltersDesignComponent.d.ts +1 -1
  104. package/lib/quickfilter/QuickfiltersDesignComponent.js +19 -35
  105. package/lib/richtext/ExprItemsHtmlConverter.d.ts +5 -2
  106. package/lib/richtext/ExprItemsHtmlConverter.js +4 -4
  107. package/lib/richtext/ExprItemsTranslator.d.ts +5 -0
  108. package/lib/richtext/ExprItemsTranslator.js +149 -0
  109. package/lib/richtext/ItemsHtmlConverter.d.ts +1 -1
  110. package/lib/richtext/ItemsHtmlConverter.js +31 -15
  111. package/lib/wellknown.js +12 -9
  112. package/lib/widgets/IFrameWidget.d.ts +4 -4
  113. package/lib/widgets/ImageWidget.d.ts +7 -4
  114. package/lib/widgets/ImageWidget.js +9 -1
  115. package/lib/widgets/ImageWidgetComponent.d.ts +1 -0
  116. package/lib/widgets/ImageWidgetComponent.js +1 -1
  117. package/lib/widgets/MapWidget.d.ts +5 -48
  118. package/lib/widgets/MapWidget.js +26 -63
  119. package/lib/widgets/MarkdownWidget.d.ts +3 -0
  120. package/lib/widgets/MarkdownWidget.js +3 -0
  121. package/lib/widgets/TOCWidget.d.ts +15 -27
  122. package/lib/widgets/TOCWidget.js +107 -183
  123. package/lib/widgets/Widget.d.ts +18 -7
  124. package/lib/widgets/Widget.js +4 -0
  125. package/lib/widgets/WidgetScopesViewComponent.js +1 -1
  126. package/lib/widgets/charts/Chart.d.ts +10 -1
  127. package/lib/widgets/charts/Chart.js +22 -11
  128. package/lib/widgets/charts/ChartViewComponent.d.ts +4 -0
  129. package/lib/widgets/charts/ChartViewComponent.js +6 -3
  130. package/lib/widgets/charts/ChartWidget.d.ts +2 -0
  131. package/lib/widgets/charts/ChartWidget.js +9 -1
  132. package/lib/widgets/charts/ChartWidgetComponent.d.ts +4 -0
  133. package/lib/widgets/charts/ChartWidgetComponent.js +2 -2
  134. package/lib/widgets/charts/calendar/CalendarChart.d.ts +1 -0
  135. package/lib/widgets/charts/calendar/CalendarChart.js +26 -0
  136. package/lib/widgets/charts/calendar/CalendarChartViewComponent.js +3 -1
  137. package/lib/widgets/charts/imagemosaic/ImageMosaicChart.d.ts +1 -0
  138. package/lib/widgets/charts/imagemosaic/ImageMosaicChart.js +8 -0
  139. package/lib/widgets/charts/layered/LayeredChart.d.ts +2 -0
  140. package/lib/widgets/charts/layered/LayeredChart.js +63 -3
  141. package/lib/widgets/charts/layered/LayeredChartCompiler.d.ts +1 -1
  142. package/lib/widgets/charts/layered/LayeredChartCompiler.js +1 -1
  143. package/lib/widgets/charts/layered/LayeredChartDesignerComponent.js +2 -2
  144. package/lib/widgets/charts/layered/LayeredChartViewComponent.js +8 -3
  145. package/lib/widgets/charts/pivot/PivotChart.d.ts +1 -0
  146. package/lib/widgets/charts/pivot/PivotChart.js +63 -0
  147. package/lib/widgets/charts/pivot/PivotChartLayoutComponent.js +1 -1
  148. package/lib/widgets/charts/pivot/SegmentDesignerComponent.js +7 -4
  149. package/lib/widgets/charts/table/OrderingsComponent.js +1 -1
  150. package/lib/widgets/charts/table/TableChart.d.ts +1 -0
  151. package/lib/widgets/charts/table/TableChart.js +15 -0
  152. package/lib/widgets/text/TextComponent.d.ts +11 -4
  153. package/lib/widgets/text/TextComponent.js +11 -8
  154. package/lib/widgets/text/TextWidget.d.ts +6 -3
  155. package/lib/widgets/text/TextWidget.js +7 -1
  156. package/lib/widgets/text/TextWidgetComponent.d.ts +4 -0
  157. package/lib/widgets/text/TextWidgetComponent.js +7 -1
  158. package/lib/widgets/text/TextWidgetDesign.d.ts +2 -4
  159. package/lib/widgets/text/TextWidgetDesign.js +1 -1
  160. package/package.json +7 -8
  161. package/src/ColorComponent.tsx +1 -2
  162. package/src/IdSelection.ts +62 -0
  163. package/src/MWaterAddRelatedIndicatorComponent.ts +3 -2
  164. package/src/MWaterCompleteTableSelectComponent.tsx +36 -46
  165. package/src/MWaterLoaderComponent.ts +28 -26
  166. package/src/MWaterResponsesFilterComponent.ts +5 -2
  167. package/src/MWaterTableSelectComponent.tsx +5 -9
  168. package/src/autotranslate.ts +141 -0
  169. package/src/axes/AxisBuilder.ts +3 -3
  170. package/src/axes/AxisColorEditorComponent.tsx +5 -0
  171. package/src/axes/{AxisComponent.ts → AxisComponent.tsx} +106 -106
  172. package/src/axes/CategoryMapComponent.ts +4 -4
  173. package/src/axes/RangesComponent.ts +3 -2
  174. package/src/dashboards/DashboardComponent.tsx +79 -14
  175. package/src/dashboards/DashboardDesign.ts +9 -2
  176. package/src/dashboards/DashboardUtils.ts +39 -0
  177. package/src/dashboards/DashboardViewComponent.tsx +22 -3
  178. package/src/dashboards/ServerDashboardDataSource.ts +2 -1
  179. package/src/dashboards/SettingsModalComponent.tsx +450 -35
  180. package/src/dashboards/WidgetComponent.tsx +12 -6
  181. package/src/datagrids/CellEditor.tsx +354 -0
  182. package/src/datagrids/DatagridComponent.tsx +646 -0
  183. package/src/datagrids/DatagridViewComponent.tsx +539 -0
  184. package/src/datagrids/DirectDatagridDataSource.ts +2 -3
  185. package/src/datagrids/{ExprCellComponent.ts → ExprCellComponent.tsx} +28 -23
  186. package/src/datagrids/{FindReplaceModalComponent.ts → FindReplaceModalComponent.tsx} +109 -122
  187. package/src/index.css +1 -1
  188. package/src/index.ts +0 -1
  189. package/src/layouts/blocks/HorizontalBlockComponent.ts +2 -2
  190. package/src/mWaterLoader.ts +1 -1
  191. package/src/maps/BufferLayer.ts +83 -60
  192. package/src/maps/BufferLayerDesign.ts +20 -14
  193. package/src/maps/BufferLayerDesignerComponent.tsx +309 -0
  194. package/src/maps/ChoroplethLayer.ts +40 -19
  195. package/src/maps/ChoroplethLayerDesign.ts +4 -2
  196. package/src/maps/ChoroplethLayerDesigner.tsx +4 -2
  197. package/src/maps/ClusterLayer.ts +4 -10
  198. package/src/maps/DetailLevelSelectComponent.ts +1 -1
  199. package/src/maps/DirectMapDataSource.ts +2 -1
  200. package/src/maps/EditPopupComponent.ts +7 -3
  201. package/src/maps/GridLayer.ts +4 -10
  202. package/src/maps/GridLayerDesigner.tsx +5 -3
  203. package/src/maps/HoverContent.tsx +40 -16
  204. package/src/maps/Layer.ts +28 -10
  205. package/src/maps/LayerFactory.ts +0 -8
  206. package/src/maps/LayerLegendComponent.ts +2 -4
  207. package/src/maps/LayerSwitcherComponent.tsx +6 -2
  208. package/src/maps/LeafletMapComponent.tsx +3 -1
  209. package/src/maps/LegendComponent.tsx +10 -1
  210. package/src/maps/MWaterServerLayer.ts +3 -3
  211. package/src/maps/MapComponent.ts +3 -3
  212. package/src/maps/MapDesign.ts +3 -0
  213. package/src/maps/MapDesignerComponent.tsx +165 -162
  214. package/src/maps/MapLayerViewDesignerComponent.ts +2 -2
  215. package/src/maps/MapUtils.ts +24 -0
  216. package/src/maps/MapViewComponent.tsx +11 -3
  217. package/src/maps/MarkersLayer.ts +44 -18
  218. package/src/maps/MarkersLayerDesign.ts +19 -16
  219. package/src/maps/PopupFilterJoinsUtils.ts +6 -2
  220. package/src/maps/RasterMapViewComponent.ts +9 -45
  221. package/src/maps/ServerMapDataSource.ts +2 -2
  222. package/src/maps/SwitchableTileUrlLayer.tsx +4 -10
  223. package/src/maps/TileUrlLayer.tsx +4 -10
  224. package/src/maps/VectorMapViewComponent.tsx +28 -55
  225. package/src/maps/maps.ts +3 -0
  226. package/src/quickfilter/QuickfiltersComponent.ts +13 -7
  227. package/src/quickfilter/QuickfiltersDesignComponent.tsx +56 -74
  228. package/src/richtext/ExprItemsHtmlConverter.ts +9 -5
  229. package/src/richtext/ExprItemsTranslator.ts +176 -0
  230. package/src/richtext/ItemsHtmlConverter.ts +33 -18
  231. package/src/wellknown.ts +33 -30
  232. package/src/widgets/ImageWidget.ts +10 -1
  233. package/src/widgets/ImageWidgetComponent.ts +3 -2
  234. package/src/widgets/{MapWidget.ts → MapWidget.tsx} +90 -101
  235. package/src/widgets/MarkdownWidget.ts +3 -0
  236. package/src/widgets/TOCWidget.tsx +281 -0
  237. package/src/widgets/Widget.ts +25 -5
  238. package/src/widgets/WidgetScopesViewComponent.ts +2 -1
  239. package/src/widgets/charts/Chart.ts +31 -12
  240. package/src/widgets/charts/ChartViewComponent.ts +13 -3
  241. package/src/widgets/charts/ChartWidget.ts +11 -1
  242. package/src/widgets/charts/ChartWidgetComponent.tsx +9 -1
  243. package/src/widgets/charts/calendar/CalendarChart.ts +29 -0
  244. package/src/widgets/charts/calendar/CalendarChartViewComponent.tsx +3 -1
  245. package/src/widgets/charts/imagemosaic/ImageMosaicChart.ts +9 -0
  246. package/src/widgets/charts/layered/LayeredChart.ts +71 -3
  247. package/src/widgets/charts/layered/LayeredChartCompiler.ts +2 -2
  248. package/src/widgets/charts/layered/LayeredChartDesignerComponent.tsx +4 -2
  249. package/src/widgets/charts/layered/LayeredChartViewComponent.ts +10 -4
  250. package/src/widgets/charts/pivot/PivotChart.ts +73 -0
  251. package/src/widgets/charts/pivot/PivotChartLayoutComponent.tsx +1 -1
  252. package/src/widgets/charts/pivot/SegmentDesignerComponent.tsx +6 -4
  253. package/src/widgets/charts/table/OrderingsComponent.tsx +2 -1
  254. package/src/widgets/charts/table/TableChart.ts +17 -0
  255. package/src/widgets/text/TextComponent.tsx +22 -12
  256. package/src/widgets/text/TextWidget.ts +9 -2
  257. package/src/widgets/text/TextWidgetComponent.tsx +16 -1
  258. package/src/widgets/text/TextWidgetDesign.ts +4 -7
  259. package/test/IdSelectionTests.ts +54 -0
  260. package/test/LayeredChartCompilerTests.ts +0 -2
  261. package/test/richtext/ExprItemsTranslatorTests.ts +144 -0
  262. package/test/wellknownTests.ts +144 -0
  263. package/src/datagrids/DatagridComponent.ts +0 -478
  264. package/src/datagrids/DatagridViewComponent.ts +0 -464
  265. package/src/datagrids/EditExprCellComponent.tsx +0 -305
  266. package/src/datagrids/README.md +0 -3
  267. package/src/maps/BufferLayerDesignerComponent.ts +0 -311
  268. package/src/widgets/TOCWidget.ts +0 -326
  269. package/test/LegoLayoutEngineTests.ts +0 -69
@@ -0,0 +1,309 @@
1
+ import _ from "lodash"
2
+ import React from "react"
3
+
4
+ import { ExprComponent, FilterExprComponent } from "@mwater/expressions-ui"
5
+ import { DataSource, Expr, OpExpr, Schema } from "@mwater/expressions"
6
+ import { ExprCompiler } from "@mwater/expressions"
7
+ import AxisComponent from "../axes/AxisComponent"
8
+ import ColorComponent from "../ColorComponent"
9
+ import { TableSelectComponent } from "@mwater/expressions-ui"
10
+ import { default as Rcslider } from "rc-slider"
11
+ import EditPopupComponent from "./EditPopupComponent"
12
+ import ZoomLevelsComponent from "./ZoomLevelsComponent"
13
+ import * as PopupFilterJoinsUtils from "./PopupFilterJoinsUtils"
14
+ import { Checkbox } from "@mwater/react-library/lib/bootstrap"
15
+ import { BufferLayerDesign } from "./BufferLayerDesign"
16
+ import { JsonQLFilter } from "../JsonQLFilter"
17
+ import { areVectorMapsEnabled } from "./vectorMaps"
18
+ import EditHoverOver from "./EditHoverOver"
19
+
20
+ export interface BufferLayerDesignerComponentProps {
21
+ /** Schema to use */
22
+ schema: Schema
23
+ dataSource: DataSource
24
+ /** Design of the design */
25
+ design: BufferLayerDesign
26
+ /** Called with new design */
27
+ onDesignChange: (design: BufferLayerDesign) => void
28
+ filters?: JsonQLFilter[]
29
+ }
30
+
31
+ export default class BufferLayerDesignerComponent extends React.Component<BufferLayerDesignerComponentProps> {
32
+ handleTableChange = (table: string) => {
33
+ this.props.onDesignChange({ ...this.props.design, table })
34
+ }
35
+
36
+ handleRadiusExprChange = (expr: Expr) => {
37
+ const radius = expr?.type === "literal" ? expr.value : null
38
+ this.props.onDesignChange({ ...this.props.design, radiusExpr: expr, radius })
39
+ }
40
+
41
+ handleGeometryAxisChange = (axis: any) => {
42
+ this.props.onDesignChange({ ...this.props.design, axes: { ...this.props.design.axes, geometry: axis } })
43
+ }
44
+
45
+ handleFilterChange = (filter: Expr) => {
46
+ this.props.onDesignChange({ ...this.props.design, filter })
47
+ }
48
+
49
+ handleColorChange = (color: string) => {
50
+ this.props.onDesignChange({ ...this.props.design, color })
51
+ }
52
+
53
+ handleColorAxisChange = (axis: any) => {
54
+ this.props.onDesignChange({ ...this.props.design, axes: { ...this.props.design.axes, color: axis } })
55
+ }
56
+
57
+ handleFillOpacityChange = (fillOpacity: number) => {
58
+ this.props.onDesignChange({ ...this.props.design, fillOpacity: fillOpacity / 100 })
59
+ }
60
+
61
+ handleUnionShapesChange = (unionShapes: boolean) => {
62
+ this.props.onDesignChange({ ...this.props.design, unionShapes })
63
+ }
64
+
65
+ renderTable() {
66
+ return (
67
+ <div className="mb-3">
68
+ <label className="text-muted"><i className="fa fa-database" /> {T`Data Source`}</label>
69
+ <div style={{ marginLeft: 10 }}>
70
+ <TableSelectComponent
71
+ schema={this.props.schema}
72
+ value={this.props.design.table}
73
+ onChange={this.handleTableChange}
74
+ filter={this.props.design.filter}
75
+ onFilterChange={this.handleFilterChange}
76
+ />
77
+ </div>
78
+ </div>
79
+ )
80
+ }
81
+
82
+ renderGeometryAxis() {
83
+ if (!this.props.design.table) {
84
+ return
85
+ }
86
+
87
+ const title = (
88
+ <span>
89
+ <span className="fas fa-map-marker-alt" /> {T`Circle Centers`}
90
+ </span>
91
+ )
92
+
93
+ const filters = _.clone(this.props.filters) || []
94
+
95
+ if (this.props.design.filter != null) {
96
+ const exprCompiler = new ExprCompiler(this.props.schema)
97
+ const jsonql = exprCompiler.compileExpr({ expr: this.props.design.filter, tableAlias: "{alias}" })
98
+ if (jsonql) {
99
+ filters.push({ table: (this.props.design.filter as OpExpr).table!, jsonql })
100
+ }
101
+ }
102
+
103
+ return (
104
+ <div className="mb-3">
105
+ <label className="text-muted">{title}</label>
106
+ <div style={{ marginLeft: 10 }}>
107
+ <AxisComponent
108
+ schema={this.props.schema}
109
+ dataSource={this.props.dataSource}
110
+ table={this.props.design.table}
111
+ types={["geometry"]}
112
+ aggrNeed="none"
113
+ value={this.props.design.axes.geometry}
114
+ onChange={this.handleGeometryAxisChange}
115
+ filters={filters}
116
+ />
117
+ </div>
118
+ </div>
119
+ )
120
+ }
121
+
122
+ renderRadius() {
123
+ const radiusExpr = this.props.design.radiusExpr ?? { type: "literal", valueType: "number", value: this.props.design.radius }
124
+
125
+ return (
126
+ <div className="mb-3">
127
+ <label className="text-muted">{T`Radius (meters)`}</label>:
128
+ <ExprComponent
129
+ schema={this.props.schema}
130
+ value={radiusExpr}
131
+ onChange={this.handleRadiusExprChange}
132
+ dataSource={this.props.dataSource}
133
+ table={this.props.design.table}
134
+ types={["number"]}
135
+ />
136
+ </div>
137
+ )
138
+ }
139
+
140
+ renderUnionShapes() {
141
+ // Only implemented for vector maps
142
+ if (!areVectorMapsEnabled()) {
143
+ return null
144
+ }
145
+
146
+ return (
147
+ <div className="mb-3">
148
+ <Checkbox
149
+ value={this.props.design.unionShapes}
150
+ onChange={this.handleUnionShapesChange}
151
+ >
152
+ {T`Combine circles (advanced)`}
153
+ </Checkbox>
154
+ </div>
155
+ )
156
+ }
157
+
158
+ renderColor() {
159
+ if (!this.props.design.axes.geometry) {
160
+ return
161
+ }
162
+
163
+ const filters = _.clone(this.props.filters) || []
164
+
165
+ if (this.props.design.filter != null) {
166
+ const exprCompiler = new ExprCompiler(this.props.schema)
167
+ const jsonql = exprCompiler.compileExpr({ expr: this.props.design.filter, tableAlias: "{alias}" })
168
+ if (jsonql) {
169
+ filters.push({ table: (this.props.design.filter as OpExpr).table!, jsonql })
170
+ }
171
+ }
172
+
173
+ return (
174
+ <div>
175
+ {!this.props.design.axes.color && (
176
+ <div className="mb-3">
177
+ <label className="text-muted">
178
+ <span className="fas fa-tint" />{T`Circle Color`}
179
+ </label>
180
+ <div>
181
+ <ColorComponent
182
+ color={this.props.design.color}
183
+ onChange={this.handleColorChange}
184
+ />
185
+ </div>
186
+ </div>
187
+ )}
188
+
189
+ <div className="mb-3">
190
+ <label className="text-muted">
191
+ <span className="fas fa-tint" />{T`Color By Data`}
192
+ </label>
193
+ <AxisComponent
194
+ schema={this.props.schema}
195
+ dataSource={this.props.dataSource}
196
+ table={this.props.design.table}
197
+ types={["text", "enum", "boolean", "date"]}
198
+ aggrNeed="none"
199
+ value={this.props.design.axes.color}
200
+ defaultColor={this.props.design.color}
201
+ showColorMap={true}
202
+ onChange={this.handleColorAxisChange}
203
+ allowExcludedValues={true}
204
+ reorderable={true}
205
+ filters={filters}
206
+ />
207
+ </div>
208
+ </div>
209
+ )
210
+ }
211
+
212
+ renderFillOpacity() {
213
+ return (
214
+ <div className="mb-3">
215
+ <label className="text-muted">{T`Circle Opacity (%)`}</label>:
216
+ <Rcslider
217
+ min={0}
218
+ max={100}
219
+ step={1}
220
+ tipTransitionName="rc-slider-tooltip-zoom-down"
221
+ value={this.props.design.fillOpacity * 100}
222
+ onChange={this.handleFillOpacityChange}
223
+ />
224
+ </div>
225
+ )
226
+ }
227
+
228
+ renderFilter() {
229
+ // If no data, hide
230
+ if (!this.props.design.axes.geometry) {
231
+ return null
232
+ }
233
+
234
+ return (
235
+ <div className="mb-3">
236
+ <label className="text-muted">
237
+ <span className="fas fa-filter" />{T`Filters`}
238
+ </label>
239
+ <div style={{ marginLeft: 8 }}>
240
+ <FilterExprComponent
241
+ schema={this.props.schema}
242
+ dataSource={this.props.dataSource}
243
+ onChange={this.handleFilterChange}
244
+ table={this.props.design.table}
245
+ value={this.props.design.filter}
246
+ />
247
+ </div>
248
+ </div>
249
+ )
250
+ }
251
+
252
+ renderPopup() {
253
+ if (!this.props.design.table) {
254
+ return null
255
+ }
256
+
257
+ return (
258
+ <EditPopupComponent
259
+ design={this.props.design}
260
+ onDesignChange={this.props.onDesignChange}
261
+ schema={this.props.schema}
262
+ dataSource={this.props.dataSource}
263
+ table={this.props.design.table}
264
+ idTable={this.props.design.table}
265
+ defaultPopupFilterJoins={PopupFilterJoinsUtils.createDefaultPopupFilterJoins(this.props.design.table)}
266
+ />
267
+ )
268
+ }
269
+
270
+ renderHoverOver() {
271
+ if (!this.props.design.table) {
272
+ return null
273
+ }
274
+
275
+ return (
276
+ <EditHoverOver
277
+ design={this.props.design}
278
+ onDesignChange={this.props.onDesignChange}
279
+ schema={this.props.schema}
280
+ dataSource={this.props.dataSource}
281
+ table={this.props.design.table}
282
+ idTable={this.props.design.table}
283
+ defaultPopupFilterJoins={PopupFilterJoinsUtils.createDefaultPopupFilterJoins(this.props.design.table)}
284
+ />
285
+ )
286
+ }
287
+
288
+ render() {
289
+ return (
290
+ <div>
291
+ {this.renderTable()}
292
+ {this.renderGeometryAxis()}
293
+ {this.renderRadius()}
294
+ {this.renderUnionShapes()}
295
+ {this.renderColor()}
296
+ {this.renderFillOpacity()}
297
+ {this.renderFilter()}
298
+ {this.renderPopup()}
299
+ {this.renderHoverOver()}
300
+ {this.props.design.table && (
301
+ <ZoomLevelsComponent
302
+ design={this.props.design}
303
+ onDesignChange={this.props.onDesignChange}
304
+ />
305
+ )}
306
+ </div>
307
+ )
308
+ }
309
+ }
@@ -1,9 +1,9 @@
1
1
  import _ from "lodash"
2
- import React from "react"
2
+ import React, { ReactNode } from "react"
3
3
 
4
4
  import { original, produce } from "immer"
5
5
 
6
- import Layer, { OnGridClickOptions, OnGridHoverOptions, VectorTileDef } from "./Layer"
6
+ import Layer, { OnGridClickOptions, OnGridHoverOptions, VectorTileDef, LegendOptions } from "./Layer"
7
7
  import {
8
8
  ExprUtils,
9
9
  ExprCompiler,
@@ -26,6 +26,9 @@ import * as PopupFilterJoinsUtils from "./PopupFilterJoinsUtils"
26
26
  import { LayerSpecification } from "maplibre-gl"
27
27
  import HoverContent from "./HoverContent"
28
28
  import { getDefaultLayoutOptions } from "../dashboards/layoutOptions"
29
+ import Widget from "../widgets/Widget"
30
+ import BlocksLayoutManager from "../layouts/blocks/BlocksLayoutManager"
31
+ import { getTranslatableStringsFromLayoutManager } from "../dashboards/DashboardUtils"
29
32
 
30
33
  export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
31
34
  /** Gets the type of layer definition */
@@ -1336,7 +1339,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
1336
1339
  items: clickOptions.design.popup.items,
1337
1340
  layoutOptions: getDefaultLayoutOptions("default"),
1338
1341
  renderWidget: (options: any) => {
1339
- const widget = WidgetFactory.createWidget(options.type)
1342
+ const widget = WidgetFactory.createWidget(options.type) as Widget
1340
1343
 
1341
1344
  // Create filters for single row
1342
1345
  const filters = clickOptions.filters.concat(popupFilters)
@@ -1354,10 +1357,10 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
1354
1357
  design: options.design,
1355
1358
  scope: null,
1356
1359
  filters,
1357
- onScopeChange: null,
1358
- onDesignChange: null,
1359
1360
  width: options.width,
1360
- height: options.height
1361
+ height: options.height,
1362
+ locale: clickOptions.locale,
1363
+ translate: clickOptions.translate
1361
1364
  })
1362
1365
  }
1363
1366
  })
@@ -1414,8 +1417,11 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
1414
1417
  key: ev.data.id,
1415
1418
  schema: hoverOptions.schema,
1416
1419
  dataSource: hoverOptions.dataSource,
1417
- design: hoverOptions.design,
1418
- filters: popupFilters
1420
+ table,
1421
+ items: hoverOptions.design.hoverOver.items,
1422
+ filters: popupFilters,
1423
+ locale: hoverOptions.locale,
1424
+ translate: hoverOptions.translate
1419
1425
  })
1420
1426
  }
1421
1427
 
@@ -1489,17 +1495,8 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
1489
1495
 
1490
1496
  // Get the legend to be optionally displayed on the map. Returns
1491
1497
  // a React element
1492
- getLegend(
1493
- design: ChoroplethLayerDesign,
1494
- schema: Schema,
1495
- name: string,
1496
- dataSource: DataSource,
1497
- locale: string,
1498
- filters: JsonQLFilter[]
1499
- ) {
1500
- if (filters == null) {
1501
- filters = []
1502
- }
1498
+ getLegend(options: LegendOptions<ChoroplethLayerDesign>): ReactNode {
1499
+ const { design, schema, name, dataSource, locale, filters } = options
1503
1500
  const _filters = filters.slice()
1504
1501
  if (design.filter != null) {
1505
1502
  const exprCompiler = new ExprCompiler(schema)
@@ -1710,4 +1707,28 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
1710
1707
  }
1711
1708
  })
1712
1709
  }
1710
+
1711
+ /** Get strings to be translated */
1712
+ getTranslatableStrings(design: ChoroplethLayerDesign, schema: Schema): string[] {
1713
+ const strings: string[] = []
1714
+
1715
+ // Add strings from hoverOver items
1716
+ if (design.hoverOver && design.hoverOver.items) {
1717
+ for (const item of design.hoverOver.items) {
1718
+ if (item.label) {
1719
+ strings.push(item.label)
1720
+ }
1721
+ }
1722
+ }
1723
+
1724
+ // Add strings from popup items using a layout manager approach
1725
+ if (design.popup && design.popup.items) {
1726
+ const layoutManager = new BlocksLayoutManager()
1727
+ const popupStrings = getTranslatableStringsFromLayoutManager(layoutManager, design.popup.items, schema)
1728
+ strings.push(...popupStrings)
1729
+ }
1730
+
1731
+ // Remove duplicates
1732
+ return _.uniq(strings)
1733
+ }
1713
1734
  }
@@ -1,6 +1,8 @@
1
1
  import { Expr } from "@mwater/expressions"
2
2
  import { Axis } from "../axes/Axis"
3
3
  import { HoverOverItem } from "./maps"
4
+ import { LayoutBlock } from "../layouts/blocks/blockUtils"
5
+ import { PopupFilterJoins } from "./PopupFilterJoinsUtils"
4
6
 
5
7
  /**
6
8
  * Layer that is composed of regions colored. Now extended to any other regions as well, so name
@@ -58,12 +60,12 @@ export default interface ChoroplethLayerDesign {
58
60
  displayNames: boolean
59
61
 
60
62
  /** contains items: which is BlocksLayoutManager items. Will be displayed when the region is clicked. Only when region mode is "indirect" */
61
- popup: any
63
+ popup: { items: LayoutBlock }
62
64
 
63
65
  hoverOver: { items: HoverOverItem[] }
64
66
 
65
67
  /** customizable filtering for popup. See PopupFilterJoins.md. Only when region mode is "indirect" */
66
- popupFilterJoins: any
68
+ popupFilterJoins: PopupFilterJoins
67
69
 
68
70
  /** minimum zoom level */
69
71
  minZoom?: number
@@ -173,7 +173,8 @@ export default class ChoroplethLayerDesigner extends React.Component<{
173
173
  <div className="mb-3">
174
174
  <label className="text-muted">
175
175
  <i className="fa fa-database" />
176
- {T` Data Source`}
176
+ {" "}
177
+ {T`Data Source`}
177
178
  </label>
178
179
  <TableSelectComponent
179
180
  schema={this.props.schema}
@@ -230,7 +231,8 @@ export default class ChoroplethLayerDesigner extends React.Component<{
230
231
  <div className="mb-3">
231
232
  <label className="text-muted">
232
233
  <i className="fas fa-map-marker-alt" />
233
- {T` Location`}
234
+ {" "}
235
+ {T`Location`}
234
236
  </label>
235
237
  <div style={{ marginLeft: 8 }}>
236
238
  <ExprComponent
@@ -2,11 +2,11 @@ import produce, { original } from "immer"
2
2
  import { JsonQLExpr, JsonQLQuery, JsonQLScalar } from "@mwater/jsonql"
3
3
  import _ from "lodash"
4
4
  import { DataSource, ExprCleaner, ExprCompiler, ExprValidator, injectTableAlias, Schema } from "@mwater/expressions"
5
- import React from "react"
5
+ import React, { ReactNode } from "react"
6
6
  import { JsonQLFilter } from "../JsonQLFilter"
7
7
  import AxisBuilder from "../axes/AxisBuilder"
8
8
  import { ClusterLayerDesign } from "./ClusterLayerDesign"
9
- import Layer, { VectorTileDef } from "./Layer"
9
+ import Layer, { LegendOptions, VectorTileDef } from "./Layer"
10
10
  import LayerLegendComponent from "./LayerLegendComponent"
11
11
  import { LayerSpecification } from "maplibre-gl"
12
12
 
@@ -705,14 +705,8 @@ export default class ClusterLayer extends Layer<ClusterLayerDesign> {
705
705
 
706
706
  // Get the legend to be optionally displayed on the map. Returns
707
707
  // a React element
708
- getLegend(
709
- design: ClusterLayerDesign,
710
- schema: Schema,
711
- name: string,
712
- dataSource: DataSource,
713
- locale: string,
714
- filters: JsonQLFilter[] = []
715
- ) {
708
+ getLegend(options: LegendOptions<ClusterLayerDesign>): ReactNode {
709
+ const { design, schema, name, dataSource, locale, filters } = options
716
710
  const _filters = filters.slice()
717
711
  if (design.filter != null) {
718
712
  const exprCompiler = new ExprCompiler(schema)
@@ -113,7 +113,7 @@ export default class DetailLevelSelectComponent extends React.Component<
113
113
  onChange: (opt: any) => this.props.onChange(opt.value)
114
114
  })
115
115
  } else {
116
- return R("div", { className: "text-muted" }, R("i", { className: "fa fa-spinner fa-spin" }), T` Loading...`)
116
+ return R("div", { className: "text-muted" }, R("i", { className: "fa fa-spinner fa-spin" }), " ", T`Loading...`)
117
117
  }
118
118
  }
119
119
  }
@@ -161,7 +161,8 @@ async function getVectorTileFromDirectRequest(options: {
161
161
  }
162
162
  const { token, expires } = await response.json()
163
163
 
164
- return { url: apiUrl + `vector_tiles/tiles/{z}/{x}/{y}?token=${token}`, expires }
164
+ // Client isn't necessary, but allows tracking of usage easier
165
+ return { url: apiUrl + `vector_tiles/tiles/{z}/{x}/{y}?token=${token}&client=${client ?? ""}`, expires }
165
166
  }
166
167
 
167
168
  /**
@@ -56,7 +56,8 @@ export default class EditPopupComponent extends React.Component<EditPopupCompone
56
56
  "a",
57
57
  { className: "btn btn-link", onClick: () => this.setState({ editing: true }) },
58
58
  R("i", { className: "fa fa-pencil" }),
59
- T` Customize Popup`
59
+ " ",
60
+ T`Customize Popup`
60
61
  ),
61
62
 
62
63
  this.props.design.popup
@@ -64,7 +65,8 @@ export default class EditPopupComponent extends React.Component<EditPopupCompone
64
65
  "a",
65
66
  { className: "btn btn-link", onClick: this.handleRemovePopup },
66
67
  R("i", { className: "fa fa-times" }),
67
- T` Remove Popup`
68
+ " ",
69
+ T`Remove Popup`
68
70
  )
69
71
  : undefined,
70
72
 
@@ -107,10 +109,12 @@ export default class EditPopupComponent extends React.Component<EditPopupCompone
107
109
  design: options.design,
108
110
  scope: null,
109
111
  filters: [],
110
- onScopeChange: () => {},
111
112
  onDesignChange: options.onDesignChange,
112
113
  width: options.width,
113
114
  height: options.height,
115
+ // TODO: fix
116
+ locale: "en",
117
+ translate: (input: string) => input,
114
118
  singleRowTable: this.props.table
115
119
  })
116
120
  }
@@ -1,7 +1,7 @@
1
1
  import _ from "lodash"
2
- import React from "react"
2
+ import React, { ReactNode } from "react"
3
3
 
4
- import Layer, { VectorTileDef } from "./Layer"
4
+ import Layer, { LegendOptions, VectorTileDef } from "./Layer"
5
5
  import {
6
6
  ExprUtils,
7
7
  ExprCompiler,
@@ -625,14 +625,8 @@ export default class GridLayer extends Layer<GridLayerDesign> {
625
625
 
626
626
  /** Get the legend to be optionally displayed on the map. Returns
627
627
  * a React element */
628
- getLegend(
629
- design: GridLayerDesign,
630
- schema: Schema,
631
- name: string,
632
- dataSource: DataSource,
633
- locale: string,
634
- filters: JsonQLFilter[]
635
- ) {
628
+ getLegend(options: LegendOptions<GridLayerDesign>): ReactNode {
629
+ const { design, schema, name, dataSource, locale, filters } = options
636
630
  const axisBuilder = new AxisBuilder({ schema })
637
631
 
638
632
  return React.createElement(LayerLegendComponent, {
@@ -146,7 +146,8 @@ export default class GridLayerDesigner extends React.Component<{
146
146
  <div className="mb-3">
147
147
  <label className="text-muted">
148
148
  <i className="fa fa-database" />
149
- {T` Data Source`}
149
+ {" "}
150
+ {T`Data Source`}
150
151
  </label>
151
152
  <TableSelectComponent
152
153
  schema={this.props.schema}
@@ -169,7 +170,8 @@ export default class GridLayerDesigner extends React.Component<{
169
170
  <div className="mb-3">
170
171
  <label className="text-muted">
171
172
  <i className="fas fa-map-marker-alt" />
172
- {T` Location`}
173
+ {" "}
174
+ {T`Location`}
173
175
  </label>
174
176
  <div style={{ marginLeft: 8 }}>
175
177
  <ExprComponent
@@ -272,7 +274,7 @@ export default class GridLayerDesigner extends React.Component<{
272
274
  return R(
273
275
  "div",
274
276
  { className: "mb-3" },
275
- R("label", { className: "text-muted" }, R("span", { className: "fas fa-filter" }), T` Filters`),
277
+ R("label", { className: "text-muted" }, R("span", { className: "fas fa-filter" }), " ", T`Filters`),
276
278
  R(
277
279
  "div",
278
280
  { style: { marginLeft: 8 } },