@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
@@ -1,374 +0,0 @@
1
- import _ from "lodash"
2
- import React from "react"
3
- const R = React.createElement
4
- import { FilterExprComponent } from "@mwater/expressions-ui"
5
- import { DataSource, ExprUtils, 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 EditPopupComponent from "./EditPopupComponent"
11
- import ZoomLevelsComponent from "./ZoomLevelsComponent"
12
- import MarkerSymbolSelectComponent from "./MarkerSymbolSelectComponent"
13
- import * as PopupFilterJoinsUtils from "./PopupFilterJoinsUtils"
14
- import * as ui from "@mwater/react-library/lib/bootstrap"
15
- import EditHoverOver from "./EditHoverOver"
16
- import { MarkersLayerDesign } from "./MarkersLayerDesign"
17
- import { default as Rcslider } from "rc-slider"
18
-
19
- export interface MarkersLayerDesignerComponentProps {
20
- /** Schema to use */
21
- schema: Schema
22
- dataSource: DataSource
23
- /** Design of the marker layer */
24
- design: MarkersLayerDesign
25
- /** Called with new design */
26
- onDesignChange: any
27
- filters?: any
28
- }
29
-
30
- // Designer for a markers layer
31
- export default class MarkersLayerDesignerComponent extends React.Component<MarkersLayerDesignerComponentProps> {
32
- // Apply updates to design
33
- update(updates: any) {
34
- return this.props.onDesignChange(_.extend({}, this.props.design, updates))
35
- }
36
-
37
- // Update axes with specified changes
38
- updateAxes(changes: any) {
39
- const axes = _.extend({}, this.props.design.axes, changes)
40
- return this.update({ axes })
41
- }
42
-
43
- handleTableChange = (table: any) => {
44
- return this.update({ table })
45
- }
46
- handleGeometryAxisChange = (axis: any) => {
47
- return this.updateAxes({ geometry: axis })
48
- }
49
- handleColorAxisChange = (axis: any) => {
50
- return this.updateAxes({ color: axis })
51
- }
52
- handleFilterChange = (expr: any) => {
53
- return this.update({ filter: expr })
54
- }
55
- handleColorChange = (color: any) => {
56
- return this.update({ color })
57
- }
58
- handlePolygonBorderColorChange = (polygonBorderColor: any) => {
59
- return this.update({ polygonBorderColor })
60
- }
61
- handlePolygonFillOpacityChange = (polygonFillOpacity: any) => {
62
- return this.update({ polygonFillOpacity: polygonFillOpacity / 100 })
63
- }
64
- handleSymbolChange = (symbol: any) => {
65
- return this.update({ symbol })
66
- }
67
- handleNameChange = (e: any) => {
68
- return this.update({ name: e.target.value })
69
- }
70
- handleMarkerSizeChange = (markerSize: any) => {
71
- return this.update({ markerSize })
72
- }
73
- handleLineWidthChange = (lineWidth: any) => {
74
- return this.update({ lineWidth })
75
- }
76
-
77
- renderTable() {
78
- return R(
79
- "div",
80
- { className: "mb-3" },
81
- R("label", { className: "text-muted" }, R("i", { className: "fa fa-database" }), " ", T`Data Source`),
82
- R(
83
- "div",
84
- { style: { marginLeft: 10 } },
85
- R(TableSelectComponent, {
86
- schema: this.props.schema,
87
- value: this.props.design.table,
88
- onChange: this.handleTableChange,
89
- filter: this.props.design.filter,
90
- onFilterChange: this.handleFilterChange
91
- })
92
- )
93
- )
94
- }
95
-
96
- renderGeometryAxis() {
97
- if (!this.props.design.table) {
98
- return
99
- }
100
-
101
- const title = R("span", null, R("span", { className: "fas fa-map-marker-alt" }), " ", T`Location`)
102
-
103
- const filters = _.clone(this.props.filters) || []
104
-
105
- if (this.props.design.filter != null) {
106
- const exprCompiler = new ExprCompiler(this.props.schema)
107
- const jsonql = exprCompiler.compileExpr({ expr: this.props.design.filter, tableAlias: "{alias}" })
108
- if (jsonql) {
109
- filters.push({ table: (this.props.design.filter as OpExpr).table, jsonql })
110
- }
111
- }
112
-
113
- return R(
114
- "div",
115
- { className: "mb-3" },
116
- R("label", { className: "text-muted" }, title),
117
- R(
118
- "div",
119
- { style: { marginLeft: 10 } },
120
- R(AxisComponent, {
121
- schema: this.props.schema,
122
- dataSource: this.props.dataSource,
123
- table: this.props.design.table,
124
- types: ["geometry"],
125
- aggrNeed: "none",
126
- value: this.props.design.axes.geometry,
127
- onChange: this.handleGeometryAxisChange,
128
- filters
129
- })
130
- )
131
- )
132
- }
133
-
134
- renderColor() {
135
- if (!this.props.design.axes.geometry) {
136
- return
137
- }
138
-
139
- const filters = _.clone(this.props.filters) || []
140
-
141
- if (this.props.design.filter != null) {
142
- const exprCompiler = new ExprCompiler(this.props.schema)
143
- const jsonql = exprCompiler.compileExpr({ expr: this.props.design.filter, tableAlias: "{alias}" })
144
- if (jsonql) {
145
- filters.push({ table: (this.props.design.filter as OpExpr).table, jsonql })
146
- }
147
- }
148
-
149
- return R(
150
- "div",
151
- null,
152
- !this.props.design.axes.color
153
- ? R(
154
- "div",
155
- { className: "mb-3" },
156
- R("label", { className: "text-muted" }, R("span", { className: "fas fa-tint" }), T`Color`),
157
-
158
- R(
159
- "div",
160
- null,
161
- R(ColorComponent, {
162
- color: this.props.design.color,
163
- onChange: this.handleColorChange
164
- })
165
- )
166
- )
167
- : undefined,
168
-
169
- R(
170
- "div",
171
- { className: "mb-3" },
172
- R("label", { className: "text-muted" }, R("span", { className: "fas fa-tint" }), T`Color By Data`),
173
-
174
- R(AxisComponent, {
175
- schema: this.props.schema,
176
- dataSource: this.props.dataSource,
177
- table: this.props.design.table,
178
- types: ["text", "enum", "boolean", "date"],
179
- aggrNeed: "none",
180
- value: this.props.design.axes.color,
181
- defaultColor: this.props.design.color,
182
- showColorMap: true,
183
- onChange: this.handleColorAxisChange,
184
- allowExcludedValues: true,
185
- filters
186
- })
187
- )
188
- )
189
- }
190
-
191
- renderSymbol() {
192
- if (!this.props.design.axes.geometry) {
193
- return
194
- }
195
-
196
- return R(MarkerSymbolSelectComponent, { symbol: this.props.design.symbol, onChange: this.handleSymbolChange })
197
- }
198
-
199
- renderMarkerSize() {
200
- if (!this.props.design.axes.geometry) {
201
- return
202
- }
203
-
204
- return R(
205
- "div",
206
- { className: "mb-3" },
207
- R("label", { className: "text-muted" }, T`Marker Size`),
208
- R(ui.Select, {
209
- value: this.props.design.markerSize || 10,
210
- options: [
211
- { value: 5, label: T`Extra small` },
212
- { value: 8, label: T`Small` },
213
- { value: 10, label: T`Normal` },
214
- { value: 13, label: T`Large` },
215
- { value: 16, label: T`Extra large` }
216
- ],
217
- onChange: this.handleMarkerSizeChange
218
- })
219
- )
220
- }
221
-
222
- renderLineWidth() {
223
- if (!this.props.design.axes.geometry) {
224
- return
225
- }
226
-
227
- return R(
228
- "div",
229
- { className: "mb-3" },
230
- R("label", { className: "text-muted" }, T`Line Width (for shapes)`),
231
- R(ui.Select, {
232
- value: this.props.design.lineWidth != null ? this.props.design.lineWidth : 3,
233
- options: [
234
- { value: 0, label: T`None` },
235
- { value: 1, label: T`1 pixel` },
236
- { value: 2, label: T`2 pixels` },
237
- { value: 3, label: T`3 pixels` },
238
- { value: 4, label: T`4 pixels` },
239
- { value: 5, label: T`5 pixels` },
240
- { value: 6, label: T`6 pixels` }
241
- ],
242
- onChange: this.handleLineWidthChange
243
- })
244
- )
245
- }
246
-
247
- renderPolygonBorderColor() {
248
- if (!this.props.design.axes.geometry) {
249
- return
250
- }
251
-
252
- return R(
253
- "div",
254
- { className: "mb-3" },
255
- R("label", { className: "text-muted" }, T`Polygon border color (blank for same as fill color)`),
256
- R(
257
- "div",
258
- null,
259
- R(ColorComponent, {
260
- color: this.props.design.polygonBorderColor,
261
- onChange: this.handlePolygonBorderColorChange
262
- })
263
- )
264
- )
265
- }
266
-
267
- renderPolygonFillOpacity() {
268
- if (!this.props.design.axes.geometry) {
269
- return
270
- }
271
-
272
- const opacity = this.props.design.polygonFillOpacity != null ? this.props.design.polygonFillOpacity : 0.25
273
-
274
- return R(
275
- "div",
276
- { className: "mb-3"},
277
- R("label", { className: "text-muted" }, R("span", null, T`Polygon Fill Opacity: ${Math.round(opacity * 100)}%`)),
278
- R(
279
- "div",
280
- { style: { padding: "10px" } },
281
- React.createElement(Rcslider, {
282
- min: 0,
283
- max: 100,
284
- step: 1,
285
- tipTransitionName: "rc-slider-tooltip-zoom-down",
286
- value: opacity * 100,
287
- onChange: this.handlePolygonFillOpacityChange
288
- })
289
- )
290
- )
291
- }
292
-
293
- renderFilter() {
294
- // If no data, hide
295
- if (!this.props.design.axes.geometry) {
296
- return null
297
- }
298
-
299
- return R(
300
- "div",
301
- { className: "mb-3" },
302
- R("label", { className: "text-muted" }, R("span", { className: "fas fa-filter" }), T`Filters`),
303
- R(
304
- "div",
305
- { style: { marginLeft: 8 } },
306
- R(FilterExprComponent, {
307
- schema: this.props.schema,
308
- dataSource: this.props.dataSource,
309
- onChange: this.handleFilterChange,
310
- table: this.props.design.table,
311
- value: this.props.design.filter
312
- })
313
- )
314
- )
315
- }
316
-
317
- renderPopup() {
318
- if (!this.props.design.table) {
319
- return null
320
- }
321
-
322
- return R(EditPopupComponent, {
323
- design: this.props.design,
324
- onDesignChange: this.props.onDesignChange,
325
- schema: this.props.schema,
326
- dataSource: this.props.dataSource,
327
- table: this.props.design.table,
328
- idTable: this.props.design.table,
329
- defaultPopupFilterJoins: PopupFilterJoinsUtils.createDefaultPopupFilterJoins(this.props.design.table)
330
- })
331
- }
332
-
333
- renderHoverOver() {
334
- if (!this.props.design.table) {
335
- return null
336
- }
337
-
338
- return R(EditHoverOver, {
339
- design: this.props.design,
340
- onDesignChange: this.props.onDesignChange,
341
- schema: this.props.schema,
342
- dataSource: this.props.dataSource,
343
- table: this.props.design.table,
344
- idTable: this.props.design.table,
345
- defaultPopupFilterJoins: PopupFilterJoinsUtils.createDefaultPopupFilterJoins(this.props.design.table)
346
- })
347
- }
348
-
349
- render() {
350
- return R(
351
- "div",
352
- null,
353
- this.renderTable(),
354
- this.renderGeometryAxis(),
355
- this.renderColor(),
356
- this.renderSymbol(),
357
- this.renderMarkerSize(),
358
- R(ui.CollapsibleSection, {
359
- label: T`Shape Options`,
360
- labelMuted: true
361
- }, [
362
- this.renderLineWidth(),
363
- this.renderPolygonBorderColor(),
364
- this.renderPolygonFillOpacity(),
365
- ]),
366
- this.renderFilter(),
367
- this.renderPopup(),
368
- this.renderHoverOver(),
369
- this.props.design.table
370
- ? R(ZoomLevelsComponent, { design: this.props.design, onDesignChange: this.props.onDesignChange })
371
- : undefined
372
- )
373
- }
374
- }
@@ -1,345 +0,0 @@
1
- import _ from "lodash"
2
- import React, { ReactNode } from "react"
3
- const R = React.createElement
4
- import LeafletMapComponent, { TileLayer } from "./LeafletMapComponent"
5
- import { ExprUtils, Schema, DataSource } from "@mwater/expressions"
6
- import LayerFactory from "./LayerFactory"
7
- import ModalPopupComponent from "@mwater/react-library/lib/ModalPopupComponent"
8
- import * as MapUtils from "./MapUtils"
9
- import { LayerSwitcherComponent } from "./LayerSwitcherComponent"
10
- import { default as LegendComponent } from "./LegendComponent"
11
- import { JsonQLFilter } from "../JsonQLFilter"
12
- import { MapDesign } from "./MapDesign"
13
- import { LocaleContext } from "@mwater/expressions-ui"
14
- import { MapViewComponentProps } from "./MapViewComponent"
15
-
16
- export interface RasterMapViewComponentProps extends MapViewComponentProps {
17
- /** Called with underlying leaflet map component */
18
- leafletMapRef?: (map: LeafletMapComponent | null) => void
19
- }
20
-
21
- /** Component that displays just the map, using raster tile technology */
22
- export default class RasterMapViewComponent extends React.Component<
23
- RasterMapViewComponentProps,
24
- {
25
- popupContents: ReactNode
26
- legendHidden: boolean
27
- }
28
- > {
29
- static contextType = LocaleContext
30
-
31
- leafletMap?: LeafletMapComponent | null
32
-
33
- constructor(props: any) {
34
- super(props)
35
-
36
- const initialLegendDisplay = props.design.initialLegendDisplay || "open"
37
-
38
- this.state = {
39
- popupContents: null, // Element in the popup
40
- legendHidden: initialLegendDisplay === "closed" || (props.width < 500 && initialLegendDisplay === "closedIfSmall")
41
- }
42
- }
43
-
44
- componentDidMount() {
45
- // Autozoom
46
- if (this.props.design.autoBounds) {
47
- return this.performAutoZoom()
48
- }
49
- }
50
-
51
- componentDidUpdate(prevProps: any) {
52
- if (this.props.design.autoBounds) {
53
- // Autozoom if filters or autozoom changed
54
- if (
55
- !_.isEqual(this.props.design.filters, prevProps.design.filters) ||
56
- !_.isEqual(this.props.design.globalFilters, prevProps.design.globalFilters) ||
57
- !_.isEqual(this.props.extraFilters, prevProps.extraFilters) ||
58
- !prevProps.design.autoBounds
59
- ) {
60
- return this.performAutoZoom()
61
- }
62
- } else {
63
- // Update bounds
64
- if (!_.isEqual(this.props.design.bounds, prevProps.design.bounds)) {
65
- return this.leafletMap?.setBounds(this.props.design.bounds)
66
- }
67
- }
68
- }
69
-
70
- performAutoZoom() {
71
- return this.props.mapDataSource.getBounds(
72
- this.props.design,
73
- this.getCompiledFilters(),
74
- (error: any, bounds: any) => {
75
- if (bounds) {
76
- this.leafletMap?.setBounds(bounds, 0.2)
77
-
78
- // Also record if editable as part of bounds
79
- if (this.props.onDesignChange != null) {
80
- return this.props.onDesignChange(_.extend({}, this.props.design, { bounds }))
81
- }
82
- }
83
- }
84
- )
85
- }
86
-
87
- handleBoundsChange = (bounds: any) => {
88
- // Ignore if readonly
89
- if (this.props.onDesignChange == null) {
90
- return
91
- }
92
-
93
- if (this.props.zoomLocked) {
94
- return
95
- }
96
-
97
- // Ignore if autoBounds
98
- if (this.props.design.autoBounds) {
99
- return
100
- }
101
-
102
- const design = _.extend({}, this.props.design, { bounds }) as MapDesign
103
- return this.props.onDesignChange(design)
104
- }
105
-
106
- handleGridClick = (layerViewId: any, ev: any) => {
107
- const layerView = _.findWhere(this.props.design.layerViews, { id: layerViewId })!
108
-
109
- // Create layer
110
- const layer = LayerFactory.createLayer(layerView.type)
111
-
112
- // Clean design (prevent ever displaying invalid/legacy designs)
113
- const design = layer.cleanDesign(layerView.design, this.props.schema)
114
-
115
- // Handle click of layer
116
- // TODO not translated
117
- const results = layer.onGridClick(ev, {
118
- design,
119
- schema: this.props.schema,
120
- dataSource: this.props.dataSource,
121
- layerDataSource: this.props.mapDataSource.getLayerDataSource(layerViewId),
122
- scopeData: this.props.scope?.data?.layerViewId === layerViewId ? this.props.scope!.data.data : undefined,
123
- filters: this.getCompiledFilters(),
124
- locale: this.context,
125
- translate: (input: string) => input
126
- })
127
-
128
- if (!results) {
129
- return
130
- }
131
-
132
- // Handle popup first
133
- if (results.popup) {
134
- this.setState({ popupContents: results.popup })
135
- }
136
-
137
- // Handle onRowClick case
138
- if (results.row && this.props.onRowClick) {
139
- this.props.onRowClick(results.row.tableId, results.row.primaryKey)
140
- }
141
-
142
- // Handle scoping
143
- if (this.props.onScopeChange && _.has(results, "scope")) {
144
- let scope
145
- if (results.scope) {
146
- // Encode layer view id into scope
147
- scope = {
148
- name: results.scope.name,
149
- filter: results.scope.filter,
150
- data: { layerViewId, data: results.scope.data }
151
- }
152
- } else {
153
- scope = null
154
- }
155
-
156
- return this.props.onScopeChange(scope)
157
- }
158
- }
159
-
160
- // Get filters from extraFilters combined with map filters
161
- getCompiledFilters() {
162
- return (this.props.extraFilters || []).concat(
163
- MapUtils.getCompiledFilters(
164
- this.props.design,
165
- this.props.schema,
166
- MapUtils.getFilterableTables(this.props.design, this.props.schema)
167
- )
168
- )
169
- }
170
-
171
- renderLegend() {
172
- if (this.state.legendHidden) {
173
- return R(HiddenLegend, { onShow: () => this.setState({ legendHidden: false }) })
174
- } else {
175
- return R(LegendComponent, {
176
- schema: this.props.schema,
177
- layerViews: this.props.design.layerViews,
178
- filters: this.getCompiledFilters(),
179
- dataSource: this.props.dataSource,
180
- locale: this.context,
181
- translate: this.props.translate ?? ((input: string) => input),
182
- onHide: () => this.setState({ legendHidden: true }),
183
- zoom: null
184
- })
185
- }
186
- }
187
-
188
- renderPopup() {
189
- if (!this.state.popupContents) {
190
- return null
191
- }
192
-
193
- return R(
194
- ModalPopupComponent,
195
- {
196
- onClose: () => this.setState({ popupContents: null }),
197
- showCloseX: true,
198
- size: "x-large"
199
- },
200
- // Render in fixed height div so that dashboard doesn't collapse to nothing
201
- R("div", { style: { height: "80vh" } }, this.state.popupContents),
202
- R(
203
- "div",
204
- { style: { textAlign: "right", marginTop: 10 } },
205
- R("button", { className: "btn btn-secondary", onClick: () => this.setState({ popupContents: null }) }, T`Close`)
206
- )
207
- )
208
- }
209
-
210
- render() {
211
- let design, scopedCompiledFilters
212
- const compiledFilters = this.getCompiledFilters()
213
-
214
- // Determine scoped filters
215
- if (this.props.scope) {
216
- scopedCompiledFilters = compiledFilters.concat([this.props.scope.filter])
217
- } else {
218
- scopedCompiledFilters = compiledFilters
219
- }
220
-
221
- // Convert to leaflet layers, if layers are valid
222
- const leafletLayers = []
223
- for (let index = 0; index < this.props.design.layerViews.length; index++) {
224
- // Create layer
225
- const layerView = this.props.design.layerViews[index]
226
- const layer = LayerFactory.createLayer(layerView.type)
227
-
228
- // Clean design (prevent ever displaying invalid/legacy designs)
229
- design = layer.cleanDesign(layerView.design, this.props.schema)
230
-
231
- // Ignore if invalid
232
- if (layer.validateDesign(design, this.props.schema)) {
233
- continue
234
- }
235
-
236
- // Get layer data source
237
- const layerDataSource = this.props.mapDataSource.getLayerDataSource(layerView.id)
238
-
239
- // If layer is scoping, fade opacity and add extra filtered version
240
- const isScoping = this.props.scope && this.props.scope.data.layerViewId === layerView.id
241
-
242
- // Create leafletLayer
243
- let leafletLayer: TileLayer = {
244
- tileUrl: layerDataSource.getTileUrl(design, isScoping ? compiledFilters : scopedCompiledFilters)!,
245
- utfGridUrl: this.props.disableInteraction
246
- ? undefined
247
- : layerDataSource.getUtfGridUrl(design, isScoping ? compiledFilters : scopedCompiledFilters) ?? undefined,
248
- visible: layerView.visible,
249
- opacity: isScoping ? layerView.opacity * 0.3 : layerView.opacity,
250
- minZoom: layer.getMinZoom(design) ?? undefined,
251
- maxZoom: layer.getMaxZoom(design) ?? undefined,
252
- onGridClick: this.handleGridClick.bind(null, layerView.id)
253
- }
254
-
255
- leafletLayers.push(leafletLayer)
256
-
257
- // Add scoped layer if scoping
258
- if (isScoping) {
259
- leafletLayer = {
260
- tileUrl: layerDataSource.getTileUrl(design, scopedCompiledFilters)!,
261
- utfGridUrl: this.props.disableInteraction
262
- ? undefined
263
- : layerDataSource.getUtfGridUrl(design, scopedCompiledFilters) ?? undefined,
264
- visible: layerView.visible,
265
- opacity: layerView.opacity,
266
- minZoom: layer.getMinZoom(design) ?? undefined,
267
- maxZoom: layer.getMaxZoom(design) ?? undefined,
268
- onGridClick: this.handleGridClick.bind(null, layerView.id)
269
- }
270
-
271
- leafletLayers.push(leafletLayer)
272
- }
273
- }
274
-
275
- return R(
276
- "div",
277
- { style: { width: this.props.width, height: this.props.height, position: "relative" } },
278
- this.renderPopup(),
279
- R(
280
- "div",
281
- { style: { position: "absolute", maxWidth: 250, top: 10, right: 10, zIndex: 999, userSelect: "none" } },
282
- R(
283
- "div",
284
- { style: { display: "flex", gap: 6, position: "relative", flexDirection: "column", alignItems: "right" } },
285
- this.props.onDesignChange && this.props.design.showLayerSwitcher
286
- ? R(LayerSwitcherComponent, {
287
- design: this.props.design,
288
- onDesignChange: this.props.onDesignChange,
289
- translate: this.props.translate ?? (() => "")
290
- })
291
- : undefined
292
- )
293
- ),
294
-
295
- R(LeafletMapComponent, {
296
- ref: (c: LeafletMapComponent | null) => {
297
- this.leafletMap = c
298
- if (this.props.leafletMapRef) {
299
- this.props.leafletMapRef(c)
300
- }
301
- },
302
- initialBounds: this.props.design.bounds,
303
- baseLayerId: this.props.design.baseLayer,
304
- baseLayerOpacity: this.props.design.baseLayerOpacity ?? undefined,
305
- layers: leafletLayers,
306
- width: this.props.width,
307
- height: this.props.height,
308
- legend: this.renderLegend(),
309
- dragging: this.props.dragging,
310
- touchZoom: this.props.touchZoom,
311
- scrollWheelZoom: this.props.scrollWheelZoom,
312
- onBoundsChange: this.handleBoundsChange,
313
- extraAttribution: this.props.design.attribution,
314
- loadingSpinner: true,
315
- maxZoom: this.props.design.maxZoom ?? undefined,
316
- showZoomControlOnHover: true
317
- })
318
- )
319
- }
320
- }
321
-
322
- // Legend display tab at bottom right
323
- class HiddenLegend extends React.Component<{ onShow: () => void }> {
324
- render() {
325
- const style = {
326
- zIndex: 1000,
327
- backgroundColor: "white",
328
- position: "absolute",
329
- bottom: 34,
330
- right: 0,
331
- fontSize: 14,
332
- color: "#337ab7",
333
- cursor: "pointer",
334
- paddingTop: 4,
335
- paddingBottom: 3,
336
- paddingLeft: 3,
337
- paddingRight: 3,
338
- borderRadius: "4px 0px 0px 4px",
339
- border: "solid 1px #AAA",
340
- borderRight: "none"
341
- }
342
-
343
- return R("div", { style, onClick: this.props.onShow }, R("i", { className: "fa fa-angle-double-left" }))
344
- }
345
- }