@mwater/visualization 5.5.0 → 5.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/lib/MWaterContextComponent.d.ts +1 -1
  2. package/lib/MWaterGlobalFiltersComponent.d.ts +2 -2
  3. package/lib/MWaterGlobalFiltersComponent.js +11 -20
  4. package/lib/MWaterLoaderComponent.d.ts +4 -13
  5. package/lib/MWaterLoaderComponent.js +2 -11
  6. package/lib/UndoStack.d.ts +2 -1
  7. package/lib/UndoStack.js +12 -6
  8. package/lib/dashboards/DashboardComponent.js +5 -4
  9. package/lib/dashboards/DashboardDesign.d.ts +1 -1
  10. package/lib/dashboards/ServerDashboardDataSource.js +0 -10
  11. package/lib/dashboards/SettingsModalComponent.js +1 -1
  12. package/lib/datagrids/DatagridComponent.js +22 -2
  13. package/lib/datagrids/DatagridDesignerComponent.d.ts +2 -3
  14. package/lib/datagrids/DatagridDesignerComponent.js +108 -120
  15. package/lib/datagrids/DatagridViewComponent.js +3 -2
  16. package/lib/datagrids/OrderBysDesignerComponent.d.ts +7 -7
  17. package/lib/datagrids/OrderBysDesignerComponent.js +19 -28
  18. package/lib/index.css +45 -2
  19. package/lib/index.d.ts +5 -5
  20. package/lib/index.js +2 -3
  21. package/lib/layouts/blocks/BlocksDisplayComponent.d.ts +8 -1
  22. package/lib/layouts/blocks/BlocksDisplayComponent.js +46 -4
  23. package/lib/maps/BufferLayer.js +12 -0
  24. package/lib/maps/BufferLayerDesign.d.ts +1 -1
  25. package/lib/maps/BufferLayerDesignerComponent.js +2 -2
  26. package/lib/maps/ChoroplethLayer.js +12 -0
  27. package/lib/maps/ChoroplethLayerDesign.d.ts +5 -2
  28. package/lib/maps/ChoroplethLayerDesigner.d.ts +10 -32
  29. package/lib/maps/ChoroplethLayerDesigner.js +58 -89
  30. package/lib/maps/DirectMapDataSource.js +0 -10
  31. package/lib/maps/EditHoverOver.d.ts +4 -3
  32. package/lib/maps/EditHoverOver.js +3 -3
  33. package/lib/maps/HoverContent.js +1 -1
  34. package/lib/maps/LeafletMapComponent.js +10 -19
  35. package/lib/maps/MapComponent.js +0 -1
  36. package/lib/maps/MapUtils.js +10 -1
  37. package/lib/maps/MarkersLayer.js +18 -2
  38. package/lib/maps/MarkersLayerDesign.d.ts +1 -1
  39. package/lib/maps/MarkersLayerDesignerComponent.d.ts +12 -41
  40. package/lib/maps/MarkersLayerDesignerComponent.js +81 -111
  41. package/lib/maps/ServerMapDataSource.js +0 -10
  42. package/lib/maps/VectorMapViewComponent.js +1 -9
  43. package/lib/maps/symbols/font-awesome/asterisk.png +0 -0
  44. package/lib/maps/symbols/font-awesome/ban.png +0 -0
  45. package/lib/maps/symbols/font-awesome/beer.png +0 -0
  46. package/lib/maps/symbols/font-awesome/bell.png +0 -0
  47. package/lib/maps/symbols/font-awesome/bolt.png +0 -0
  48. package/lib/maps/symbols/font-awesome/building.png +0 -0
  49. package/lib/maps/symbols/font-awesome/bullseye.png +0 -0
  50. package/lib/maps/symbols/font-awesome/bus.png +0 -0
  51. package/lib/maps/symbols/font-awesome/caret-up.png +0 -0
  52. package/lib/maps/symbols/font-awesome/certificate.png +0 -0
  53. package/lib/maps/symbols/font-awesome/check-circle.png +0 -0
  54. package/lib/maps/symbols/font-awesome/check.png +0 -0
  55. package/lib/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  56. package/lib/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  57. package/lib/maps/symbols/font-awesome/cloud-rain.png +0 -0
  58. package/lib/maps/symbols/font-awesome/cloud.png +0 -0
  59. package/lib/maps/symbols/font-awesome/comment.png +0 -0
  60. package/lib/maps/symbols/font-awesome/crosshairs.png +0 -0
  61. package/lib/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  62. package/lib/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  63. package/lib/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  64. package/lib/maps/symbols/font-awesome/female.png +0 -0
  65. package/lib/maps/symbols/font-awesome/file.png +0 -0
  66. package/lib/maps/symbols/font-awesome/flag.png +0 -0
  67. package/lib/maps/symbols/font-awesome/flask.png +0 -0
  68. package/lib/maps/symbols/font-awesome/h-square.png +0 -0
  69. package/lib/maps/symbols/font-awesome/home.png +0 -0
  70. package/lib/maps/symbols/font-awesome/info-circle.png +0 -0
  71. package/lib/maps/symbols/font-awesome/male.png +0 -0
  72. package/lib/maps/symbols/font-awesome/medkit.png +0 -0
  73. package/lib/maps/symbols/font-awesome/mobile.png +0 -0
  74. package/lib/maps/symbols/font-awesome/plus-circle.png +0 -0
  75. package/lib/maps/symbols/font-awesome/plus-square.png +0 -0
  76. package/lib/maps/symbols/font-awesome/plus.png +0 -0
  77. package/lib/maps/symbols/font-awesome/square.png +0 -0
  78. package/lib/maps/symbols/font-awesome/star.png +0 -0
  79. package/lib/maps/symbols/font-awesome/thumbs-down.png +0 -0
  80. package/lib/maps/symbols/font-awesome/thumbs-up.png +0 -0
  81. package/lib/maps/symbols/font-awesome/ticket.png +0 -0
  82. package/lib/maps/symbols/font-awesome/times-circle.png +0 -0
  83. package/lib/maps/symbols/font-awesome/times.png +0 -0
  84. package/lib/maps/symbols/font-awesome/tint.png +0 -0
  85. package/lib/maps/symbols/font-awesome/tree.png +0 -0
  86. package/lib/maps/symbols/font-awesome/university.png +0 -0
  87. package/lib/maps/symbols/font-awesome/usd.png +0 -0
  88. package/lib/maps/symbols/font-awesome/user.png +0 -0
  89. package/lib/maps/symbols/font-awesome/users.png +0 -0
  90. package/lib/maps/symbols/font-awesome/wheelchair.png +0 -0
  91. package/lib/maps/symbols/sdf-ize.sh +93 -0
  92. package/lib/maps/vectorMaps.d.ts +1 -0
  93. package/lib/maps/vectorMaps.js +20 -36
  94. package/lib/mwater_table_selection/IndicatorsListComponent.d.ts +4 -2
  95. package/lib/mwater_table_selection/IndicatorsListComponent.js +103 -34
  96. package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.d.ts +18 -0
  97. package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.js +80 -0
  98. package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.d.ts +26 -0
  99. package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.js +237 -51
  100. package/lib/mwater_table_selection/MWaterTableSelectComponent.d.ts +2 -2
  101. package/lib/mwater_table_selection/MWaterTableSelectComponent.js +9 -4
  102. package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.d.ts +19 -0
  103. package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.js +111 -0
  104. package/lib/quickfilter/QuickfiltersComponent.d.ts +3 -102
  105. package/lib/quickfilter/QuickfiltersComponent.js +53 -110
  106. package/lib/quickfilter/TextLiteralComponent.d.ts +23 -47
  107. package/lib/quickfilter/TextLiteralComponent.js +85 -82
  108. package/lib/widgets/MapWidget.js +4 -2
  109. package/lib/widgets/text/ExprItemEditorComponent.d.ts +3 -8
  110. package/lib/widgets/text/ExprItemEditorComponent.js +36 -33
  111. package/lib/widgets/text/ExprUpdateModalComponent.d.ts +1 -0
  112. package/package.json +2 -3
  113. package/src/MWaterContextComponent.tsx +1 -1
  114. package/src/{MWaterGlobalFiltersComponent.ts → MWaterGlobalFiltersComponent.tsx} +32 -33
  115. package/src/{MWaterLoaderComponent.ts → MWaterLoaderComponent.tsx} +17 -18
  116. package/src/UndoStack.ts +14 -6
  117. package/src/dashboards/DashboardComponent.tsx +5 -4
  118. package/src/dashboards/DashboardDesign.ts +1 -1
  119. package/src/dashboards/ServerDashboardDataSource.ts +0 -12
  120. package/src/dashboards/SettingsModalComponent.tsx +1 -1
  121. package/src/datagrids/DatagridComponent.tsx +30 -2
  122. package/src/datagrids/DatagridDesignerComponent.tsx +241 -229
  123. package/src/datagrids/DatagridViewComponent.tsx +3 -2
  124. package/src/datagrids/OrderBysDesignerComponent.tsx +61 -70
  125. package/src/index.css +45 -2
  126. package/src/index.ts +5 -11
  127. package/src/layouts/blocks/BlocksDisplayComponent.tsx +60 -5
  128. package/src/maps/BufferLayer.ts +14 -1
  129. package/src/maps/BufferLayerDesign.ts +1 -1
  130. package/src/maps/BufferLayerDesignerComponent.tsx +2 -1
  131. package/src/maps/ChoroplethLayer.ts +20 -7
  132. package/src/maps/ChoroplethLayerDesign.ts +5 -2
  133. package/src/maps/ChoroplethLayerDesigner.tsx +169 -165
  134. package/src/maps/DirectMapDataSource.ts +0 -12
  135. package/src/maps/EditHoverOver.tsx +9 -5
  136. package/src/maps/HoverContent.tsx +1 -1
  137. package/src/maps/LeafletMapComponent.tsx +10 -19
  138. package/src/maps/MapComponent.ts +0 -1
  139. package/src/maps/MapUtils.ts +13 -1
  140. package/src/maps/MarkersLayer.ts +22 -5
  141. package/src/maps/MarkersLayerDesign.ts +1 -1
  142. package/src/maps/MarkersLayerDesignerComponent.tsx +360 -0
  143. package/src/maps/ServerMapDataSource.ts +0 -12
  144. package/src/maps/VectorMapViewComponent.tsx +2 -13
  145. package/src/maps/symbols/font-awesome/asterisk.png +0 -0
  146. package/src/maps/symbols/font-awesome/ban.png +0 -0
  147. package/src/maps/symbols/font-awesome/beer.png +0 -0
  148. package/src/maps/symbols/font-awesome/bell.png +0 -0
  149. package/src/maps/symbols/font-awesome/bolt.png +0 -0
  150. package/src/maps/symbols/font-awesome/building.png +0 -0
  151. package/src/maps/symbols/font-awesome/bullseye.png +0 -0
  152. package/src/maps/symbols/font-awesome/bus.png +0 -0
  153. package/src/maps/symbols/font-awesome/caret-up.png +0 -0
  154. package/src/maps/symbols/font-awesome/certificate.png +0 -0
  155. package/src/maps/symbols/font-awesome/check-circle.png +0 -0
  156. package/src/maps/symbols/font-awesome/check.png +0 -0
  157. package/src/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
  158. package/src/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
  159. package/src/maps/symbols/font-awesome/cloud-rain.png +0 -0
  160. package/src/maps/symbols/font-awesome/cloud.png +0 -0
  161. package/src/maps/symbols/font-awesome/comment.png +0 -0
  162. package/src/maps/symbols/font-awesome/crosshairs.png +0 -0
  163. package/src/maps/symbols/font-awesome/dot-circle-o.png +0 -0
  164. package/src/maps/symbols/font-awesome/exclamation-circle.png +0 -0
  165. package/src/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
  166. package/src/maps/symbols/font-awesome/female.png +0 -0
  167. package/src/maps/symbols/font-awesome/file.png +0 -0
  168. package/src/maps/symbols/font-awesome/flag.png +0 -0
  169. package/src/maps/symbols/font-awesome/flask.png +0 -0
  170. package/src/maps/symbols/font-awesome/h-square.png +0 -0
  171. package/src/maps/symbols/font-awesome/home.png +0 -0
  172. package/src/maps/symbols/font-awesome/info-circle.png +0 -0
  173. package/src/maps/symbols/font-awesome/male.png +0 -0
  174. package/src/maps/symbols/font-awesome/medkit.png +0 -0
  175. package/src/maps/symbols/font-awesome/mobile.png +0 -0
  176. package/src/maps/symbols/font-awesome/plus-circle.png +0 -0
  177. package/src/maps/symbols/font-awesome/plus-square.png +0 -0
  178. package/src/maps/symbols/font-awesome/plus.png +0 -0
  179. package/src/maps/symbols/font-awesome/square.png +0 -0
  180. package/src/maps/symbols/font-awesome/star.png +0 -0
  181. package/src/maps/symbols/font-awesome/thumbs-down.png +0 -0
  182. package/src/maps/symbols/font-awesome/thumbs-up.png +0 -0
  183. package/src/maps/symbols/font-awesome/ticket.png +0 -0
  184. package/src/maps/symbols/font-awesome/times-circle.png +0 -0
  185. package/src/maps/symbols/font-awesome/times.png +0 -0
  186. package/src/maps/symbols/font-awesome/tint.png +0 -0
  187. package/src/maps/symbols/font-awesome/tree.png +0 -0
  188. package/src/maps/symbols/font-awesome/university.png +0 -0
  189. package/src/maps/symbols/font-awesome/usd.png +0 -0
  190. package/src/maps/symbols/font-awesome/user.png +0 -0
  191. package/src/maps/symbols/font-awesome/users.png +0 -0
  192. package/src/maps/symbols/font-awesome/wheelchair.png +0 -0
  193. package/src/maps/symbols/sdf-ize.sh +93 -0
  194. package/src/maps/vectorMaps.tsx +20 -44
  195. package/src/mwater_table_selection/IndicatorsListComponent.tsx +165 -37
  196. package/src/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.tsx +111 -0
  197. package/src/mwater_table_selection/MWaterCompleteTableSelectComponent.tsx +373 -37
  198. package/src/mwater_table_selection/MWaterTableSelectComponent.tsx +12 -8
  199. package/src/mwater_table_selection/MWaterWorkflowsSelectComponent.tsx +159 -0
  200. package/src/quickfilter/{QuickfiltersComponent.ts → QuickfiltersComponent.tsx} +165 -158
  201. package/src/quickfilter/TextLiteralComponent.tsx +197 -0
  202. package/src/widgets/MapWidget.tsx +9 -1
  203. package/src/widgets/text/ExprItemEditorComponent.tsx +83 -77
  204. package/src/widgets/text/ExprUpdateModalComponent.tsx +1 -0
  205. package/test/UndoStackTests.ts +52 -1
  206. package/.storybook/config.js +0 -7
  207. package/.storybook/head.html +0 -3
  208. package/.storybook/webpack.config.js +0 -15
  209. package/src/maps/BingLayer.ts +0 -146
  210. package/src/maps/MarkersLayerDesignerComponent.ts +0 -374
  211. package/src/quickfilter/TextLiteralComponent.ts +0 -165
  212. package/stories/UpdateableComponent.js +0 -29
  213. package/stories/consoles.js +0 -202
  214. package/stories/dashboards.js +0 -217
  215. package/stories/datagridDesign.js +0 -114
  216. package/stories/datagrids.js +0 -69
  217. package/stories/dates.js +0 -80
  218. package/stories/exprcomponent.js +0 -43
  219. package/stories/index.js +0 -18
  220. package/stories/leaflet.js +0 -59
  221. package/stories/maps.js +0 -24
  222. package/stories/pivotChart.js +0 -235
@@ -1,11 +1,9 @@
1
- import PropTypes from "prop-types"
2
1
  import _ from "lodash"
3
2
  import React from "react"
4
- const R = React.createElement
5
-
6
- import { DataSource, ExprUtils, Schema } from "@mwater/expressions"
3
+ import { DataSource, Schema } from "@mwater/expressions"
7
4
  import { ExprComponent } from "@mwater/expressions-ui"
8
- import { Checkbox } from "@mwater/react-library/lib/bootstrap"
5
+ import { Toggle } from "@mwater/react-library/lib/bootstrap"
6
+ import { DatagridDesignOrderBy } from "./DatagridDesign"
9
7
 
10
8
  export interface OrderBysDesignerComponentProps {
11
9
  /** schema to use */
@@ -13,10 +11,9 @@ export interface OrderBysDesignerComponentProps {
13
11
  /** dataSource to use */
14
12
  dataSource: DataSource
15
13
  table: string
16
- /** Columns list See README.md of this folder */
17
- orderBys: any
14
+ orderBys: DatagridDesignOrderBy[]
18
15
  /** Called when columns changes */
19
- onChange: any
16
+ onChange: (orderBys: DatagridDesignOrderBy[]) => void
20
17
  }
21
18
 
22
19
  // Edits an orderBys which is a list of expressions and directions. See README.md
@@ -42,40 +39,38 @@ export default class OrderBysDesignerComponent extends React.Component<OrderBysD
42
39
  }
43
40
 
44
41
  render() {
45
- return R(
46
- "div",
47
- null,
48
- _.map(this.props.orderBys, (orderBy, index) => {
49
- return R(OrderByDesignerComponent, {
50
- key: index,
51
- schema: this.props.schema,
52
- table: this.props.table,
53
- dataSource: this.props.dataSource,
54
- orderBy,
55
- onChange: this.handleChange.bind(null, index),
56
- onRemove: this.handleRemove.bind(null, index)
57
- })
58
- }),
42
+ return (
43
+ <div>
44
+ {_.map(this.props.orderBys, (orderBy, index) => {
45
+ return <OrderByDesignerComponent
46
+ key={index}
47
+ schema={this.props.schema}
48
+ table={this.props.table}
49
+ dataSource={this.props.dataSource}
50
+ orderBy={orderBy}
51
+ onChange={this.handleChange.bind(null, index)}
52
+ onRemove={this.handleRemove.bind(null, index)}
53
+ />
54
+ })}
59
55
 
60
- R(
61
- "button",
62
- {
63
- key: "add",
64
- type: "button",
65
- className: "btn btn-link",
66
- onClick: this.handleAdd
67
- },
68
- R("span", { className: "fas fa-plus" }),
69
- " " + T`Add Ordering`
70
- )
56
+ <button
57
+ key="add"
58
+ type="button"
59
+ className="btn btn-link"
60
+ onClick={this.handleAdd}
61
+ >
62
+ <span className="fas fa-plus" />
63
+ {" " + T`Add Ordering`}
64
+ </button>
65
+ </div>
71
66
  )
72
67
  }
73
68
  }
74
69
 
75
70
  interface OrderByDesignerComponentProps {
76
- orderBy: any
77
- onChange: any
78
- onRemove: any
71
+ orderBy: DatagridDesignOrderBy
72
+ onChange: (orderBy: DatagridDesignOrderBy) => void
73
+ onRemove: () => void
79
74
  schema: Schema
80
75
  dataSource: DataSource
81
76
  table?: string
@@ -86,43 +81,39 @@ class OrderByDesignerComponent extends React.Component<OrderByDesignerComponentP
86
81
  return this.props.onChange(_.extend({}, this.props.orderBy, { expr }))
87
82
  }
88
83
 
89
- handleDirectionChange = (value: any) => {
90
- return this.props.onChange(_.extend({}, this.props.orderBy, { direction: value ? "desc" : "asc" }))
84
+ handleDirectionChange = (direction: string) => {
85
+ return this.props.onChange(_.extend({}, this.props.orderBy, { direction }))
91
86
  }
92
87
 
93
88
  render() {
94
- return R(
95
- "div",
96
- { className: "row" },
97
- R(
98
- "div",
99
- { className: "col-7" },
100
- R(ExprComponent, {
101
- schema: this.props.schema,
102
- dataSource: this.props.dataSource,
103
- table: this.props.table,
104
- types: ["text", "number", "boolean", "date", "datetime"],
105
- aggrStatuses: ["individual", "literal", "aggregate"],
106
- value: this.props.orderBy.expr,
107
- onChange: this.handleExprChange
108
- })
109
- ),
110
- R(
111
- "div",
112
- { className: "col-3" },
113
- <Checkbox inline value={this.props.orderBy.direction === "desc"} onChange={this.handleDirectionChange}>
114
- {T`Reverse`}
115
- </Checkbox>
116
- ),
117
- R(
118
- "div",
119
- { className: "col-1" },
120
- R(
121
- "button",
122
- { className: "btn btn-sm btn-link", type: "button", onClick: this.props.onRemove },
123
- R("span", { className: "fas fa-times" })
124
- )
125
- )
89
+ return (
90
+ <div style={{ display: "flex", alignItems: "center", gap: "8px", marginBottom: "8px" }}>
91
+ <div style={{ flex: 1 }}>
92
+ <ExprComponent
93
+ schema={this.props.schema}
94
+ dataSource={this.props.dataSource}
95
+ table={this.props.table}
96
+ types={["text", "number", "boolean", "date", "datetime"]}
97
+ aggrStatuses={["individual", "literal", "aggregate"]}
98
+ value={this.props.orderBy.expr}
99
+ onChange={this.handleExprChange}
100
+ />
101
+ </div>
102
+ <div style={{ display: "flex", alignItems: "center", gap: "8px" }}>
103
+ <Toggle
104
+ size="xs"
105
+ value={this.props.orderBy.direction}
106
+ onChange={this.handleDirectionChange}
107
+ options={[
108
+ { value: "asc", label: T`Ascending` },
109
+ { value: "desc", label: T`Descending` }
110
+ ]}
111
+ />
112
+ <button className="btn btn-sm btn-link" type="button" onClick={this.props.onRemove}>
113
+ <span className="fas fa-times" />
114
+ </button>
115
+ </div>
116
+ </div>
126
117
  )
127
118
  }
128
119
  }
package/src/index.css CHANGED
@@ -55,6 +55,12 @@ Lato, Lora, Inter, Merriweather, Roboto
55
55
  }
56
56
  }
57
57
 
58
+ @media only screen and (max-width: 800px) {
59
+ .hide-800px {
60
+ display: none;
61
+ }
62
+ }
63
+
58
64
  /* Dashed thresholds */
59
65
  .bb-grid line {
60
66
  stroke-dasharray: 3;
@@ -133,6 +139,20 @@ Lato, Lora, Inter, Merriweather, Roboto
133
139
  visibility: visible;
134
140
  }
135
141
 
142
+ /* Use these to make a grandchild that displays only when parent is hovered */
143
+ .hover-display-parent > * > .hover-display-grandchild {
144
+ visibility: hidden;
145
+ }
146
+
147
+ .hover-display-parent:hover > * > .hover-display-grandchild {
148
+ visibility: visible;
149
+ }
150
+
151
+ /* Use these to set a faint background on hover */
152
+ .hover-grey:hover {
153
+ background-color: #f8f8f8;
154
+ }
155
+
136
156
  .bb-title {
137
157
  font: 14px sans-serif;
138
158
  font-weight: bold;
@@ -342,6 +362,29 @@ Lato, Lora, Inter, Merriweather, Roboto
342
362
  background-color: #363b3e;
343
363
  padding: 5px;
344
364
  padding-top: 6px;
365
+ transform: translateX(-100%);
366
+ animation: slideIn 0.3s ease-in-out;
367
+ }
368
+
369
+ @keyframes slideIn {
370
+ from {
371
+ transform: translateX(-100%);
372
+ }
373
+ to {
374
+ transform: translateX(0);
375
+ }
376
+ }
377
+
378
+ .mwater-visualization-palette-container {
379
+ position: absolute;
380
+ top: 0;
381
+ left: 0;
382
+ height: 100%;
383
+ z-index: 1000;
384
+ }
385
+
386
+ .mwater-visualization-palette-container:not(.hidden) .mwater-visualization-palette {
387
+ transform: translateX(0);
345
388
  }
346
389
 
347
390
  .mwater-visualization-palette-item {
@@ -543,11 +586,11 @@ Lato, Lora, Inter, Merriweather, Roboto
543
586
  background-color: rgba(0, 0, 0, 0.075);
544
587
  }
545
588
 
546
- ._mviz-move:hover {
589
+ .mwater-visualization-cursor-hover:hover {
547
590
  cursor: move;
548
591
  }
549
592
 
550
- ._mviz-map-hover-content {
593
+ .mwater-visualization-map-hover-content {
551
594
  display: grid;
552
595
  grid-template-columns: 1fr 2fr;
553
596
  grid-auto-rows: min-content;
package/src/index.ts CHANGED
@@ -1,10 +1,5 @@
1
- export {
2
- default as LeafletMapComponent,
3
- MapBounds,
4
- TileLayer,
5
- GeoJsonLayer,
6
- MapLayer
7
- } from "./maps/LeafletMapComponent"
1
+ export { default as LeafletMapComponent } from "./maps/LeafletMapComponent"
2
+ export type { MapBounds, TileLayer, GeoJsonLayer, MapLayer } from "./maps/LeafletMapComponent"
8
3
 
9
4
  export { default as DateRangeComponent } from "./DateRangeComponent"
10
5
 
@@ -18,7 +13,7 @@ export { default as DashboardComponent } from "./dashboards/DashboardComponent"
18
13
  export { default as DashboardDataSource } from "./dashboards/DashboardDataSource"
19
14
  export { default as DirectDashboardDataSource } from "./dashboards/DirectDashboardDataSource"
20
15
  export * from "./dashboards/DashboardDesign"
21
- export { MapDesign, MapLayerView } from "./maps/MapDesign"
16
+ export type { MapDesign, MapLayerView } from "./maps/MapDesign"
22
17
 
23
18
  export { default as compressJson } from "./compressJson"
24
19
 
@@ -32,7 +27,7 @@ export { default as Widget } from "./widgets/Widget"
32
27
  export { default as DatagridUtils } from "./datagrids/DatagridUtils"
33
28
 
34
29
  export * from "./maps/MapViewComponent"
35
- export { MapScope } from "./maps/MapUtils"
30
+ export type { MapScope } from "./maps/MapUtils"
36
31
 
37
32
  export { languages } from "./languages"
38
33
 
@@ -41,7 +36,7 @@ export { default as MWaterContextComponent } from "./MWaterContextComponent"
41
36
 
42
37
  export { default as mWaterLoader } from "./mWaterLoader"
43
38
 
44
- export { WidgetDataSource } from "./widgets/WidgetDataSource"
39
+ export type { WidgetDataSource } from "./widgets/WidgetDataSource"
45
40
  export { default as DirectWidgetDataSource } from "./widgets/DirectWidgetDataSource"
46
41
 
47
42
  import "leaflet/dist/leaflet.css"
@@ -55,7 +50,6 @@ export { setMapTilerApiKey } from "./maps/vectorMaps"
55
50
 
56
51
  export { default as UndoStack } from "./UndoStack"
57
52
  export { default as DashboardViewComponent } from "./dashboards/DashboardViewComponent"
58
- export let BingLayer = require("./maps/BingLayer")
59
53
  export let UtfGridLayer = require("./maps/UtfGridLayer")
60
54
  export { default as LayerFactory } from "./maps/LayerFactory"
61
55
  export { default as MapDesignerComponent } from "./maps/MapDesignerComponent"
@@ -38,11 +38,39 @@ export interface BlocksDisplayComponentProps {
38
38
  cantPasteMessage?: string
39
39
  }
40
40
 
41
+ interface BlocksDisplayComponentState {
42
+ isPaletteVisible: boolean
43
+ isManuallyHidden: boolean
44
+ }
45
+
41
46
  /**
42
47
  Renders the complete layout of the blocks and also optionally a palette to the left
43
48
  that can be used to drag new items into the layout. Palette is only displayed if onItemsChange is not null
44
49
  */
45
- class BlocksDisplayComponent extends React.Component<BlocksDisplayComponentProps> {
50
+ class BlocksDisplayComponent extends React.Component<BlocksDisplayComponentProps, BlocksDisplayComponentState> {
51
+ state: BlocksDisplayComponentState = {
52
+ isPaletteVisible: false,
53
+ isManuallyHidden: false
54
+ }
55
+
56
+ componentDidUpdate(prevProps: BlocksDisplayComponentProps) {
57
+ // If editing state changes (onItemsChange becomes available/unavailable)
58
+ if (prevProps.onItemsChange !== this.props.onItemsChange) {
59
+ if (this.props.onItemsChange && !this.state.isManuallyHidden) {
60
+ this.setState({ isPaletteVisible: true })
61
+ } else if (!this.props.onItemsChange) {
62
+ this.setState({ isPaletteVisible: false, isManuallyHidden: false })
63
+ }
64
+ }
65
+ }
66
+
67
+ handlePaletteToggle = () => {
68
+ this.setState(prevState => ({
69
+ isPaletteVisible: !prevState.isPaletteVisible,
70
+ isManuallyHidden: !prevState.isManuallyHidden
71
+ }))
72
+ }
73
+
46
74
  handleBlockDrop = (sourceBlock: LayoutBlock, targetBlock: LayoutBlock, side: "top" | "left" | "right" | "bottom") => {
47
75
  // Remove source from items
48
76
  let items = blockUtils.removeBlock(this.props.items, sourceBlock)!
@@ -219,8 +247,32 @@ class BlocksDisplayComponent extends React.Component<BlocksDisplayComponentProps
219
247
 
220
248
  renderPalette() {
221
249
  return (
222
- <div key="palette" style={{ width: 141, height: "100%", position: "absolute", top: 0, left: 0 }}>
250
+ <div key="palette" style={{
251
+ width: 141,
252
+ height: "100%",
253
+ position: "absolute",
254
+ top: 0,
255
+ left: 0,
256
+ transition: "transform 0.3s ease-in-out",
257
+ transform: this.state.isPaletteVisible ? "translateX(0)" : "translateX(-100%)"
258
+ }}>
223
259
  <div className="mwater-visualization-palette" style={{ height: "100%" }}>
260
+ <div
261
+ style={{
262
+ position: "absolute",
263
+ right: -14,
264
+ top: 0,
265
+ background: "#363b3e",
266
+ color: "white",
267
+ padding: "5px 3px 5px 5px",
268
+ cursor: "pointer",
269
+ borderRadius: "0 3px 3px 0",
270
+ zIndex: 1001
271
+ }}
272
+ onClick={this.handlePaletteToggle}
273
+ >
274
+ <i className={`fa fa-chevron-${this.state.isPaletteVisible ? 'left' : 'right'}`} />
275
+ </div>
224
276
  <PaletteItemComponent
225
277
  createItem={this.createBlockItem({ type: "widget", widgetType: "Text", design: { style: "title" } })}
226
278
  title={<i className="fa fa-font" />}
@@ -345,16 +397,19 @@ class BlocksDisplayComponent extends React.Component<BlocksDisplayComponentProps
345
397
  style={{ width: "100%", height: "100%", overflow: "hidden", position: "relative" }}
346
398
  layoutOptions={layoutOptions}
347
399
  >
348
- {this.renderPalette()}
400
+ <div className="mwater-visualization-palette-container">
401
+ {this.renderPalette()}
402
+ </div>
349
403
  <div
350
404
  style={{
351
405
  position: "absolute",
352
- left: 141,
406
+ left: this.state.isPaletteVisible ? 141 : 0,
353
407
  top: 0,
354
408
  bottom: 0,
355
409
  right: 0,
356
410
  overflowX: "auto",
357
- overflowY: "scroll"
411
+ overflowY: "scroll",
412
+ transition: "left 0.3s ease-in-out"
358
413
  }}
359
414
  className={`mwater-visualization-block-parent-outer mwater-visualization-block-editing`}
360
415
  >
@@ -869,6 +869,19 @@ marker-fill: ` +
869
869
  })
870
870
 
871
871
  draft.filter = exprCleaner.cleanExpr(design.filter || null, { table: design.table })
872
+
873
+ // Clean hover over expressions
874
+ if (design.table && design.hoverOver && design.hoverOver.items) {
875
+ for (let i = 0; i < design.hoverOver.items.length; i++) {
876
+ const item = design.hoverOver.items[i]
877
+ if (item.value) {
878
+ draft.hoverOver!.items[i].value = exprCleaner.cleanExpr(item.value || null, {
879
+ table: design.table,
880
+ aggrStatuses: ["individual", "literal"]
881
+ })
882
+ }
883
+ }
884
+ }
872
885
  })
873
886
 
874
887
  return design
@@ -962,7 +975,7 @@ marker-fill: ` +
962
975
  filters: options.filters,
963
976
  schema: options.schema,
964
977
  dataSource: options.dataSource,
965
- hoverOverItems: options.design.hoverOver.items,
978
+ hoverOverItems: options.design.hoverOver!.items,
966
979
  })
967
980
  }
968
981
  }
@@ -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
@@ -15,7 +15,7 @@ import { Checkbox } from "@mwater/react-library/lib/bootstrap"
15
15
  import { BufferLayerDesign } from "./BufferLayerDesign"
16
16
  import { JsonQLFilter } from "../JsonQLFilter"
17
17
  import { areVectorMapsEnabled } from "./vectorMaps"
18
- import EditHoverOver from "./EditHoverOver"
18
+ import { EditHoverOver } from "./EditHoverOver"
19
19
 
20
20
  export interface BufferLayerDesignerComponentProps {
21
21
  /** Schema to use */
@@ -281,6 +281,7 @@ export default class BufferLayerDesignerComponent extends React.Component<Buffer
281
281
  table={this.props.design.table}
282
282
  idTable={this.props.design.table}
283
283
  defaultPopupFilterJoins={PopupFilterJoinsUtils.createDefaultPopupFilterJoins(this.props.design.table)}
284
+ aggrStatuses={["individual", "literal"]}
284
285
  />
285
286
  )
286
287
  }
@@ -914,7 +914,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
914
914
 
915
915
  // Scope overall
916
916
  if (design.scope) {
917
- ;(query.where as JsonQLOp).exprs.push({
917
+ ; (query.where as JsonQLOp).exprs.push({
918
918
  type: "op",
919
919
  op: "=",
920
920
  exprs: [
@@ -927,7 +927,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
927
927
  // Add filters on regions to outer query
928
928
  for (const filter of filters) {
929
929
  if (filter.table == regionsTable) {
930
- ;(query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions"))
930
+ ; (query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions"))
931
931
  }
932
932
  }
933
933
 
@@ -1062,7 +1062,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
1062
1062
 
1063
1063
  // Scope overall
1064
1064
  if (design.scope) {
1065
- ;(query.where as JsonQLOp).exprs.push({
1065
+ ; (query.where as JsonQLOp).exprs.push({
1066
1066
  type: "op",
1067
1067
  op: "=",
1068
1068
  exprs: [
@@ -1075,7 +1075,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
1075
1075
  // Add filters on regions to outer query
1076
1076
  for (const filter of filters) {
1077
1077
  if (filter.table == regionsTable) {
1078
- ;(query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions2"))
1078
+ ; (query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions2"))
1079
1079
  }
1080
1080
  }
1081
1081
 
@@ -1148,7 +1148,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
1148
1148
 
1149
1149
  // Scope overall
1150
1150
  if (design.scope) {
1151
- ;(query.where as JsonQLOp).exprs.push({
1151
+ ; (query.where as JsonQLOp).exprs.push({
1152
1152
  type: "op",
1153
1153
  op: "=",
1154
1154
  exprs: [
@@ -1161,7 +1161,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
1161
1161
  // Add filters on regions to outer query
1162
1162
  for (const filter of filters) {
1163
1163
  if (filter.table == regionsTable) {
1164
- ;(query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions"))
1164
+ ; (query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions"))
1165
1165
  }
1166
1166
  }
1167
1167
 
@@ -1600,6 +1600,19 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
1600
1600
  delete draft.filter
1601
1601
  }
1602
1602
 
1603
+ // Clean hover over expressions only for indirect mode with a valid table
1604
+ if (design.table && design.regionMode === "indirect" && design.hoverOver && design.hoverOver.items) {
1605
+ for (let i = 0; i < design.hoverOver.items.length; i++) {
1606
+ const item = design.hoverOver.items[i]
1607
+ if (item.value) {
1608
+ draft.hoverOver!.items[i].value = exprCleaner.cleanExpr(item.value || null, {
1609
+ table: design.table,
1610
+ aggrStatuses: ["individual", "literal", "aggregate"]
1611
+ })
1612
+ }
1613
+ }
1614
+ }
1615
+
1603
1616
  if (design.detailLevel == null) {
1604
1617
  draft.detailLevel = 0
1605
1618
  }
@@ -1746,7 +1759,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
1746
1759
  filters: popupFilters,
1747
1760
  schema: options.schema,
1748
1761
  dataSource: options.dataSource,
1749
- hoverOverItems: options.design.hoverOver.items,
1762
+ hoverOverItems: options.design.hoverOver!.items,
1750
1763
  })
1751
1764
  }
1752
1765
  }
@@ -65,8 +65,11 @@ export default interface ChoroplethLayerDesign {
65
65
  /** customizable filtering for popup. See PopupFilterJoins.md. Only when region mode is "indirect" */
66
66
  popupFilterJoins: PopupFilterJoins
67
67
 
68
- /** Hover over items to display when hovering over a region. Only when region mode is "indirect" */
69
- hoverOver: { items: HoverOverItem[] }
68
+ /** Hover over items to display when hovering over a region. Only when region mode is "indirect".
69
+ * This is an aggregate hover over, but can contain individual items. If so, only the first row
70
+ * of the resulting query will be displayed.
71
+ */
72
+ hoverOver?: { items: HoverOverItem[] }
70
73
 
71
74
  /** minimum zoom level */
72
75
  minZoom?: number