@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
@@ -42,6 +42,27 @@ const layoutOptions_1 = require("../../dashboards/layoutOptions");
42
42
  that can be used to drag new items into the layout. Palette is only displayed if onItemsChange is not null
43
43
  */
44
44
  class BlocksDisplayComponent extends react_1.default.Component {
45
+ state = {
46
+ isPaletteVisible: false,
47
+ isManuallyHidden: false
48
+ };
49
+ componentDidUpdate(prevProps) {
50
+ // If editing state changes (onItemsChange becomes available/unavailable)
51
+ if (prevProps.onItemsChange !== this.props.onItemsChange) {
52
+ if (this.props.onItemsChange && !this.state.isManuallyHidden) {
53
+ this.setState({ isPaletteVisible: true });
54
+ }
55
+ else if (!this.props.onItemsChange) {
56
+ this.setState({ isPaletteVisible: false, isManuallyHidden: false });
57
+ }
58
+ }
59
+ }
60
+ handlePaletteToggle = () => {
61
+ this.setState(prevState => ({
62
+ isPaletteVisible: !prevState.isPaletteVisible,
63
+ isManuallyHidden: !prevState.isManuallyHidden
64
+ }));
65
+ };
45
66
  handleBlockDrop = (sourceBlock, targetBlock, side) => {
46
67
  // Remove source from items
47
68
  let items = blockUtils.removeBlock(this.props.items, sourceBlock);
@@ -121,8 +142,28 @@ class BlocksDisplayComponent extends react_1.default.Component {
121
142
  });
122
143
  }
123
144
  renderPalette() {
124
- return (react_1.default.createElement("div", { key: "palette", style: { width: 141, height: "100%", position: "absolute", top: 0, left: 0 } },
145
+ return (react_1.default.createElement("div", { key: "palette", style: {
146
+ width: 141,
147
+ height: "100%",
148
+ position: "absolute",
149
+ top: 0,
150
+ left: 0,
151
+ transition: "transform 0.3s ease-in-out",
152
+ transform: this.state.isPaletteVisible ? "translateX(0)" : "translateX(-100%)"
153
+ } },
125
154
  react_1.default.createElement("div", { className: "mwater-visualization-palette", style: { height: "100%" } },
155
+ react_1.default.createElement("div", { style: {
156
+ position: "absolute",
157
+ right: -14,
158
+ top: 0,
159
+ background: "#363b3e",
160
+ color: "white",
161
+ padding: "5px 3px 5px 5px",
162
+ cursor: "pointer",
163
+ borderRadius: "0 3px 3px 0",
164
+ zIndex: 1001
165
+ }, onClick: this.handlePaletteToggle },
166
+ react_1.default.createElement("i", { className: `fa fa-chevron-${this.state.isPaletteVisible ? 'left' : 'right'}` })),
126
167
  react_1.default.createElement(PaletteItemComponent_1.default, { createItem: this.createBlockItem({ type: "widget", widgetType: "Text", design: { style: "title" } }), title: react_1.default.createElement("i", { className: "fa fa-font" }), subtitle: T `Title` }),
127
168
  react_1.default.createElement(PaletteItemComponent_1.default, { createItem: this.createBlockItem({ type: "widget", widgetType: "Text", design: {} }), title: react_1.default.createElement("i", { className: "fa fa-align-left" }), subtitle: T `Text` }),
128
169
  react_1.default.createElement(PaletteItemComponent_1.default, { createItem: this.createBlockItem({ type: "widget", aspectRatio: 1.4, widgetType: "Image", design: {} }), title: react_1.default.createElement("i", { className: "fa fa-picture-o" }), subtitle: T `Image` }),
@@ -178,15 +219,16 @@ class BlocksDisplayComponent extends react_1.default.Component {
178
219
  innerParentStyle = {};
179
220
  innerParentStyle.maxWidth = layoutOptions.maximumWidth || undefined;
180
221
  return (react_1.default.createElement(layoutOptions_1.DashboardStyleWrapper, { style: { width: "100%", height: "100%", overflow: "hidden", position: "relative" }, layoutOptions: layoutOptions },
181
- this.renderPalette(),
222
+ react_1.default.createElement("div", { className: "mwater-visualization-palette-container" }, this.renderPalette()),
182
223
  react_1.default.createElement("div", { style: {
183
224
  position: "absolute",
184
- left: 141,
225
+ left: this.state.isPaletteVisible ? 141 : 0,
185
226
  top: 0,
186
227
  bottom: 0,
187
228
  right: 0,
188
229
  overflowX: "auto",
189
- overflowY: "scroll"
230
+ overflowY: "scroll",
231
+ transition: "left 0.3s ease-in-out"
190
232
  }, className: `mwater-visualization-block-parent-outer mwater-visualization-block-editing` },
191
233
  react_1.default.createElement("div", { key: "inner", className: `mwater-visualization-block-parent-inner mwater-visualization-block-parent-inner-${this.props.style || "default"}`, style: innerParentStyle }, this.renderBlock(this.props.items, false, 0)))));
192
234
  }
@@ -777,6 +777,18 @@ marker-fill: ` +
777
777
  aggrNeed: "none"
778
778
  });
779
779
  draft.filter = exprCleaner.cleanExpr(design.filter || null, { table: design.table });
780
+ // Clean hover over expressions
781
+ if (design.table && design.hoverOver && design.hoverOver.items) {
782
+ for (let i = 0; i < design.hoverOver.items.length; i++) {
783
+ const item = design.hoverOver.items[i];
784
+ if (item.value) {
785
+ draft.hoverOver.items[i].value = exprCleaner.cleanExpr(item.value || null, {
786
+ table: design.table,
787
+ aggrStatuses: ["individual", "literal"]
788
+ });
789
+ }
790
+ }
791
+ }
780
792
  });
781
793
  return design;
782
794
  }
@@ -36,7 +36,7 @@ export interface BufferLayerDesign {
36
36
  items: LayoutBlock;
37
37
  };
38
38
  /** Contains items: which is HoverOverItem[] */
39
- hoverOver: {
39
+ hoverOver?: {
40
40
  items: HoverOverItem[];
41
41
  };
42
42
  /** Customizable filtering for popup. See PopupFilterJoins.md */
@@ -39,7 +39,7 @@ const ZoomLevelsComponent_1 = __importDefault(require("./ZoomLevelsComponent"));
39
39
  const PopupFilterJoinsUtils = __importStar(require("./PopupFilterJoinsUtils"));
40
40
  const bootstrap_1 = require("@mwater/react-library/lib/bootstrap");
41
41
  const vectorMaps_1 = require("./vectorMaps");
42
- const EditHoverOver_1 = __importDefault(require("./EditHoverOver"));
42
+ const EditHoverOver_1 = require("./EditHoverOver");
43
43
  class BufferLayerDesignerComponent extends react_1.default.Component {
44
44
  handleTableChange = (table) => {
45
45
  this.props.onDesignChange({ ...this.props.design, table });
@@ -164,7 +164,7 @@ class BufferLayerDesignerComponent extends react_1.default.Component {
164
164
  if (!this.props.design.table) {
165
165
  return null;
166
166
  }
167
- return (react_1.default.createElement(EditHoverOver_1.default, { design: this.props.design, onDesignChange: this.props.onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, idTable: this.props.design.table, defaultPopupFilterJoins: PopupFilterJoinsUtils.createDefaultPopupFilterJoins(this.props.design.table) }));
167
+ return (react_1.default.createElement(EditHoverOver_1.EditHoverOver, { design: this.props.design, onDesignChange: this.props.onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, idTable: this.props.design.table, defaultPopupFilterJoins: PopupFilterJoinsUtils.createDefaultPopupFilterJoins(this.props.design.table), aggrStatuses: ["individual", "literal"] }));
168
168
  }
169
169
  render() {
170
170
  return (react_1.default.createElement("div", null,
@@ -1434,6 +1434,18 @@ class ChoroplethLayer extends Layer_1.default {
1434
1434
  else {
1435
1435
  delete draft.filter;
1436
1436
  }
1437
+ // Clean hover over expressions only for indirect mode with a valid table
1438
+ if (design.table && design.regionMode === "indirect" && design.hoverOver && design.hoverOver.items) {
1439
+ for (let i = 0; i < design.hoverOver.items.length; i++) {
1440
+ const item = design.hoverOver.items[i];
1441
+ if (item.value) {
1442
+ draft.hoverOver.items[i].value = exprCleaner.cleanExpr(item.value || null, {
1443
+ table: design.table,
1444
+ aggrStatuses: ["individual", "literal", "aggregate"]
1445
+ });
1446
+ }
1447
+ }
1448
+ }
1437
1449
  if (design.detailLevel == null) {
1438
1450
  draft.detailLevel = 0;
1439
1451
  }
@@ -50,8 +50,11 @@ export default interface ChoroplethLayerDesign {
50
50
  };
51
51
  /** customizable filtering for popup. See PopupFilterJoins.md. Only when region mode is "indirect" */
52
52
  popupFilterJoins: PopupFilterJoins;
53
- /** Hover over items to display when hovering over a region. Only when region mode is "indirect" */
54
- hoverOver: {
53
+ /** Hover over items to display when hovering over a region. Only when region mode is "indirect".
54
+ * This is an aggregate hover over, but can contain individual items. If so, only the first row
55
+ * of the resulting query will be displayed.
56
+ */
57
+ hoverOver?: {
55
58
  items: HoverOverItem[];
56
59
  };
57
60
  /** minimum zoom level */
@@ -2,9 +2,7 @@ import React from "react";
2
2
  import { Schema, DataSource, Expr } from "@mwater/expressions";
3
3
  import ChoroplethLayerDesign from "./ChoroplethLayerDesign";
4
4
  import { JsonQLFilter } from "../index";
5
- import EditPopupComponent from "./EditPopupComponent";
6
5
  import { Axis } from "../axes/Axis";
7
- import ScopeAndDetailLevelComponent from "./ScopeAndDetailLevelComponent";
8
6
  export default class ChoroplethLayerDesigner extends React.Component<{
9
7
  schema: Schema;
10
8
  dataSource: DataSource;
@@ -30,34 +28,14 @@ export default class ChoroplethLayerDesigner extends React.Component<{
30
28
  renderTable(): React.JSX.Element | null;
31
29
  renderRegionsTable(): React.JSX.Element;
32
30
  renderAdminRegionExpr(): React.JSX.Element | null;
33
- renderScopeAndDetailLevel(): React.DetailedReactHTMLElement<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> | React.CElement<import("./ScopeAndDetailLevelComponent").ScopeAndDetailLevelComponentProps, ScopeAndDetailLevelComponent>;
34
- renderDisplayNames(): React.DetailedReactHTMLElement<{
35
- className: string;
36
- }, HTMLElement>;
37
- renderColor(): React.DetailedReactHTMLElement<{
38
- className: string;
39
- }, HTMLElement> | null;
40
- renderColorAxis(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement> | null | undefined;
41
- renderFillOpacity(): React.DetailedReactHTMLElement<{
42
- className: string;
43
- }, HTMLElement>;
44
- renderBorderColor(): React.DetailedReactHTMLElement<{
45
- className: string;
46
- }, HTMLElement>;
47
- renderFilter(): React.DetailedReactHTMLElement<{
48
- className: string;
49
- }, HTMLElement> | null;
50
- renderPopup(): React.CElement<any, EditPopupComponent> | null;
51
- renderHoverOver(): React.FunctionComponentElement<{
52
- design: ChoroplethLayerDesign;
53
- onDesignChange: (design: ChoroplethLayerDesign) => void;
54
- schema: Schema;
55
- dataSource: DataSource;
56
- table: string;
57
- idTable: string;
58
- defaultPopupFilterJoins: {
59
- [tableId: string]: Expr;
60
- };
61
- }> | null;
62
- render(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
31
+ renderScopeAndDetailLevel(): React.JSX.Element;
32
+ renderDisplayNames(): React.JSX.Element;
33
+ renderColor(): React.JSX.Element | null;
34
+ renderColorAxis(): React.JSX.Element | null | undefined;
35
+ renderFillOpacity(): React.JSX.Element;
36
+ renderBorderColor(): React.JSX.Element;
37
+ renderFilter(): React.JSX.Element | null;
38
+ renderPopup(): React.JSX.Element | null;
39
+ renderHoverOver(): React.JSX.Element | null;
40
+ render(): React.JSX.Element;
63
41
  }
@@ -28,7 +28,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const lodash_1 = __importDefault(require("lodash"));
30
30
  const react_1 = __importDefault(require("react"));
31
- const R = react_1.default.createElement;
32
31
  const immer_1 = require("immer");
33
32
  const expressions_ui_1 = require("@mwater/expressions-ui");
34
33
  const expressions_1 = require("@mwater/expressions");
@@ -41,7 +40,7 @@ const ZoomLevelsComponent_1 = __importDefault(require("./ZoomLevelsComponent"));
41
40
  const ui = __importStar(require("@mwater/react-library/lib/bootstrap"));
42
41
  const AdminScopeAndDetailLevelComponent_1 = __importDefault(require("./AdminScopeAndDetailLevelComponent"));
43
42
  const ScopeAndDetailLevelComponent_1 = __importDefault(require("./ScopeAndDetailLevelComponent"));
44
- const EditHoverOver_1 = __importDefault(require("./EditHoverOver"));
43
+ const EditHoverOver_1 = require("./EditHoverOver");
45
44
  // Designer for a choropleth layer
46
45
  class ChoroplethLayerDesigner extends react_1.default.Component {
47
46
  update(mutation) {
@@ -151,7 +150,8 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
151
150
  react_1.default.createElement(expressions_ui_2.TableSelectComponent, { schema: this.props.schema, value: this.props.design.table, onChange: this.handleTableChange, filter: this.props.design.filter, onFilterChange: this.handleFilterChange })));
152
151
  }
153
152
  renderRegionsTable() {
154
- let options = lodash_1.default.map(lodash_1.default.filter(this.props.schema.getTables(), table => table.id.startsWith("regions.")), table => ({ value: table.id, label: table.name.en }));
153
+ // Regions tables are either "regions." or "regions_<name>" with a shape column
154
+ let options = lodash_1.default.map(lodash_1.default.filter(this.props.schema.getTables(), table => table.id.startsWith("regions.") || (table.id.startsWith("regions_") && this.props.schema.getColumn(table.id, "shape") != null)), table => ({ value: table.id, label: expressions_1.ExprUtils.localizeString(table.name) }));
155
155
  const regionsTable = this.props.design.regionsTable || "admin_regions";
156
156
  return (react_1.default.createElement("div", { className: "mb-3" },
157
157
  react_1.default.createElement("label", { className: "text-muted" }, T `Regions Type`),
@@ -182,39 +182,27 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
182
182
  renderScopeAndDetailLevel() {
183
183
  const regionsTable = this.props.design.regionsTable || "admin_regions";
184
184
  if (regionsTable === "admin_regions") {
185
- return R(AdminScopeAndDetailLevelComponent_1.default, {
186
- schema: this.props.schema,
187
- dataSource: this.props.dataSource,
188
- scope: this.props.design.scope,
189
- scopeLevel: this.props.design.scopeLevel || 0,
190
- detailLevel: this.props.design.detailLevel,
191
- onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange
192
- });
185
+ return react_1.default.createElement(AdminScopeAndDetailLevelComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, scope: this.props.design.scope, scopeLevel: this.props.design.scopeLevel || 0, detailLevel: this.props.design.detailLevel, onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange });
193
186
  }
194
187
  else {
195
- return R(ScopeAndDetailLevelComponent_1.default, {
196
- schema: this.props.schema,
197
- dataSource: this.props.dataSource,
198
- scope: this.props.design.scope,
199
- scopeLevel: this.props.design.scopeLevel,
200
- detailLevel: this.props.design.detailLevel,
201
- onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange,
202
- regionsTable
203
- });
188
+ return react_1.default.createElement(ScopeAndDetailLevelComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, scope: this.props.design.scope, scopeLevel: this.props.design.scopeLevel, detailLevel: this.props.design.detailLevel, onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange, regionsTable: regionsTable });
204
189
  }
205
190
  }
206
191
  renderDisplayNames() {
207
- return R("div", { className: "mb-3" }, react_1.default.createElement(ui.Checkbox, { value: this.props.design.displayNames, onChange: value => this.handleDisplayNamesChange(value) }, T `Display Region Names`));
192
+ return (react_1.default.createElement("div", { className: "mb-3" },
193
+ react_1.default.createElement(ui.Checkbox, { value: this.props.design.displayNames, onChange: value => this.handleDisplayNamesChange(value) }, T `Display Region Names`)));
208
194
  }
209
195
  renderColor() {
210
196
  // Only if plain
211
197
  if (this.props.design.regionMode !== "plain") {
212
198
  return null;
213
199
  }
214
- return R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, R("span", { className: "fas fa-tint" }), T `Fill Color`), R("div", null, R(ColorComponent_1.default, {
215
- color: this.props.design.color,
216
- onChange: this.handleColorChange
217
- })));
200
+ return (react_1.default.createElement("div", { className: "mb-3" },
201
+ react_1.default.createElement("label", { className: "text-muted" },
202
+ react_1.default.createElement("span", { className: "fas fa-tint" }),
203
+ T `Fill Color`),
204
+ react_1.default.createElement("div", null,
205
+ react_1.default.createElement(ColorComponent_1.default, { color: this.props.design.color, onChange: this.handleColorChange }))));
218
206
  }
219
207
  renderColorAxis() {
220
208
  // Not applicable if in plain mode, or if in indirect mode with no table
@@ -235,19 +223,12 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
235
223
  }
236
224
  }
237
225
  const table = this.props.design.table;
238
- return R("div", null, R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, R("span", { className: "fas fa-tint" }), T `Color By Data`), R(AxisComponent_1.default, {
239
- schema: this.props.schema,
240
- dataSource: this.props.dataSource,
241
- table: this.props.design.table,
242
- types: ["text", "enum", "boolean", "date"],
243
- aggrNeed: "required",
244
- value: this.props.design.axes.color,
245
- defaultColor: this.props.design.color,
246
- showColorMap: true,
247
- onChange: this.handleColorAxisChange,
248
- allowExcludedValues: true,
249
- filters: filters
250
- })));
226
+ return (react_1.default.createElement("div", null,
227
+ react_1.default.createElement("div", { className: "mb-3" },
228
+ react_1.default.createElement("label", { className: "text-muted" },
229
+ react_1.default.createElement("span", { className: "fas fa-tint" }),
230
+ T `Color By Data`),
231
+ react_1.default.createElement(AxisComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, types: ["text", "enum", "boolean", "date"], aggrNeed: "required", value: this.props.design.axes.color, defaultColor: this.props.design.color, showColorMap: true, onChange: this.handleColorAxisChange, allowExcludedValues: true, filters: filters }))));
251
232
  }
252
233
  else {
253
234
  // direct mode
@@ -275,19 +256,12 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
275
256
  }
276
257
  });
277
258
  }
278
- return R("div", null, R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, R("span", { className: "fas fa-tint" }), T `Color By Data`), R(AxisComponent_1.default, {
279
- schema: this.props.schema,
280
- dataSource: this.props.dataSource,
281
- table: regionsTable,
282
- types: ["text", "enum", "boolean", "date"],
283
- aggrNeed: "none",
284
- value: this.props.design.axes.color,
285
- defaultColor: this.props.design.color,
286
- showColorMap: true,
287
- onChange: this.handleColorAxisChange,
288
- allowExcludedValues: true,
289
- filters: filters
290
- })));
259
+ return (react_1.default.createElement("div", null,
260
+ react_1.default.createElement("div", { className: "mb-3" },
261
+ react_1.default.createElement("label", { className: "text-muted" },
262
+ react_1.default.createElement("span", { className: "fas fa-tint" }),
263
+ T `Color By Data`),
264
+ react_1.default.createElement(AxisComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, table: regionsTable, types: ["text", "enum", "boolean", "date"], aggrNeed: "none", value: this.props.design.axes.color, defaultColor: this.props.design.color, showColorMap: true, onChange: this.handleColorAxisChange, allowExcludedValues: true, filters: filters }))));
291
265
  }
292
266
  }
293
267
  // renderLabelAxis: ->
@@ -309,33 +283,30 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
309
283
  // showColorMap: true
310
284
  // onChange: @handleColorAxisChange)
311
285
  renderFillOpacity() {
312
- return R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, T `Fill Opacity: ${(this.props.design.fillOpacity * this.props.design.fillOpacity * 100).toFixed(0)}%`), ": ", R(rc_slider_1.default, {
313
- min: 0,
314
- max: 100,
315
- step: 1,
316
- tipTransitionName: "rc-slider-tooltip-zoom-down",
317
- value: Math.round(this.props.design.fillOpacity * this.props.design.fillOpacity * 100),
318
- onChange: (val) => this.handleFillOpacityChange(Math.sqrt(val / 100))
319
- }));
286
+ return (react_1.default.createElement("div", { className: "mb-3" },
287
+ react_1.default.createElement("label", { className: "text-muted" }, T `Fill Opacity: ${(this.props.design.fillOpacity * this.props.design.fillOpacity * 100).toFixed(0)}%`),
288
+ ": ",
289
+ react_1.default.createElement(rc_slider_1.default, { min: 0, max: 100, step: 1, tipTransitionName: "rc-slider-tooltip-zoom-down", value: Math.round(this.props.design.fillOpacity * this.props.design.fillOpacity * 100), onChange: (val) => this.handleFillOpacityChange(Math.sqrt(val / 100)) })));
320
290
  }
321
291
  renderBorderColor() {
322
- return R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, R("span", { className: "fas fa-tint" }), T `Border Color`), R("div", null, R(ColorComponent_1.default, {
323
- color: this.props.design.borderColor || "#000",
324
- onChange: this.handleBorderColorChange
325
- })));
292
+ return (react_1.default.createElement("div", { className: "mb-3" },
293
+ react_1.default.createElement("label", { className: "text-muted" },
294
+ react_1.default.createElement("span", { className: "fas fa-tint" }),
295
+ T `Border Color`),
296
+ react_1.default.createElement("div", null,
297
+ react_1.default.createElement(ColorComponent_1.default, { color: this.props.design.borderColor || "#000", onChange: this.handleBorderColorChange }))));
326
298
  }
327
299
  renderFilter() {
328
300
  // If not in indirect mode with table, hide
329
301
  if (this.props.design.regionMode !== "indirect" || !this.props.design.table) {
330
302
  return null;
331
303
  }
332
- return R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, R("span", { className: "fas fa-filter" }), T `Filters`), R("div", { style: { marginLeft: 8 } }, R(expressions_ui_1.FilterExprComponent, {
333
- schema: this.props.schema,
334
- dataSource: this.props.dataSource,
335
- onChange: this.handleFilterChange,
336
- table: this.props.design.table,
337
- value: this.props.design.filter
338
- })));
304
+ return (react_1.default.createElement("div", { className: "mb-3" },
305
+ react_1.default.createElement("label", { className: "text-muted" },
306
+ react_1.default.createElement("span", { className: "fas fa-filter" }),
307
+ T `Filters`),
308
+ react_1.default.createElement("div", { style: { marginLeft: 8 } },
309
+ react_1.default.createElement(expressions_ui_1.FilterExprComponent, { schema: this.props.schema, dataSource: this.props.dataSource, onChange: this.handleFilterChange, table: this.props.design.table, value: this.props.design.filter }))));
339
310
  }
340
311
  renderPopup() {
341
312
  // If not in indirect mode with table, hide
@@ -347,15 +318,7 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
347
318
  if (this.props.design.adminRegionExpr) {
348
319
  defaultPopupFilterJoins[this.props.design.table] = this.props.design.adminRegionExpr;
349
320
  }
350
- return R(EditPopupComponent_1.default, {
351
- design: this.props.design,
352
- onDesignChange: this.props.onDesignChange,
353
- schema: this.props.schema,
354
- dataSource: this.props.dataSource,
355
- table: this.props.design.table,
356
- idTable: regionsTable,
357
- defaultPopupFilterJoins
358
- });
321
+ return react_1.default.createElement(EditPopupComponent_1.default, { design: this.props.design, onDesignChange: this.props.onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, idTable: regionsTable, defaultPopupFilterJoins: defaultPopupFilterJoins });
359
322
  }
360
323
  renderHoverOver() {
361
324
  // If not in indirect mode with table, hide
@@ -367,18 +330,24 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
367
330
  if (this.props.design.adminRegionExpr) {
368
331
  defaultPopupFilterJoins[this.props.design.table] = this.props.design.adminRegionExpr;
369
332
  }
370
- return R(EditHoverOver_1.default, {
371
- design: this.props.design,
372
- onDesignChange: this.props.onDesignChange,
373
- schema: this.props.schema,
374
- dataSource: this.props.dataSource,
375
- table: this.props.design.table,
376
- idTable: regionsTable,
377
- defaultPopupFilterJoins
378
- });
333
+ return react_1.default.createElement(EditHoverOver_1.EditHoverOver, { design: this.props.design, onDesignChange: this.props.onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, idTable: regionsTable, defaultPopupFilterJoins: defaultPopupFilterJoins, aggrStatuses: ["individual", "aggregate", "literal"] });
379
334
  }
380
335
  render() {
381
- return R("div", null, this.renderRegionMode(), this.renderRegionsTable(), this.renderTable(), this.renderAdminRegionExpr(), this.renderScopeAndDetailLevel(), this.renderDisplayNames(), this.renderColor(), this.renderColorAxis(), this.renderFillOpacity(), this.renderBorderColor(), this.renderFilter(), this.renderPopup(), this.renderHoverOver(), R(ZoomLevelsComponent_1.default, { design: this.props.design, onDesignChange: this.props.onDesignChange }));
336
+ return (react_1.default.createElement("div", null,
337
+ this.renderRegionMode(),
338
+ this.renderRegionsTable(),
339
+ this.renderTable(),
340
+ this.renderAdminRegionExpr(),
341
+ this.renderScopeAndDetailLevel(),
342
+ this.renderDisplayNames(),
343
+ this.renderColor(),
344
+ this.renderColorAxis(),
345
+ this.renderFillOpacity(),
346
+ this.renderBorderColor(),
347
+ this.renderFilter(),
348
+ this.renderPopup(),
349
+ this.renderHoverOver(),
350
+ react_1.default.createElement(ZoomLevelsComponent_1.default, { design: this.props.design, onDesignChange: this.props.onDesignChange })));
382
351
  }
383
352
  }
384
353
  exports.default = ChoroplethLayerDesigner;
@@ -227,22 +227,12 @@ class DirectLayerDataSource {
227
227
  query.cacheExpiry = cacheExpiry;
228
228
  }
229
229
  let url = `${this.options.apiUrl}maps/tiles/{z}/{x}/{y}.${extension}?` + querystring_1.default.stringify(query);
230
- // Add subdomains: {s} will be substituted with "a", "b" or "c" in leaflet for api.mwater.co only.
231
- // Used to speed queries
232
- if (url.match(/^https:\/\/api\.mwater\.co\//)) {
233
- url = url.replace(/^https:\/\/api\.mwater\.co\//, "https://{s}-api.mwater.co/");
234
- }
235
230
  return url;
236
231
  }
237
232
  // Create query string
238
233
  createLegacyUrl(design, extension, filters) {
239
234
  let where;
240
235
  let url = `${this.options.apiUrl}maps/tiles/{z}/{x}/{y}.${extension}?type=${design.type}&radius=1000`;
241
- // Add subdomains: {s} will be substituted with "a", "b" or "c" in leaflet for api.mwater.co only.
242
- // Used to speed queries
243
- if (url.match(/^https:\/\/api\.mwater\.co\//)) {
244
- url = url.replace(/^https:\/\/api\.mwater\.co\//, "https://{s}-api.mwater.co/");
245
- }
246
236
  if (this.options.client) {
247
237
  url += `&client=${this.options.client}`;
248
238
  }
@@ -1,4 +1,4 @@
1
- import { DataSource, Schema } from "@mwater/expressions";
1
+ import { AggrStatus, DataSource, Schema } from "@mwater/expressions";
2
2
  import React from "react";
3
3
  export interface EditHoverOverProps {
4
4
  /** Schema to use */
@@ -13,6 +13,7 @@ export interface EditHoverOverProps {
13
13
  /** Table of the row that join is to. Usually same as table except for choropleth maps */
14
14
  idTable: string;
15
15
  defaultPopupFilterJoins: any;
16
+ /** Aggr statuses to allow in hover over expressions */
17
+ aggrStatuses: AggrStatus[];
16
18
  }
17
- declare function EditHoverOver(props: EditHoverOverProps): React.JSX.Element;
18
- export default EditHoverOver;
19
+ export declare function EditHoverOver(props: EditHoverOverProps): React.JSX.Element;
@@ -26,6 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.EditHoverOver = EditHoverOver;
29
30
  const lodash_1 = require("lodash");
30
31
  const expressions_1 = require("@mwater/expressions");
31
32
  const expressions_ui_1 = require("@mwater/expressions-ui");
@@ -84,7 +85,7 @@ function EditHoverOver(props) {
84
85
  react_1.default.createElement("th", null, T `Value`),
85
86
  react_1.default.createElement("th", { style: { width: "1%", whiteSpace: "nowrap" } }, T `Format`),
86
87
  react_1.default.createElement("th", { style: { width: "1%", whiteSpace: "nowrap" } }))),
87
- react_1.default.createElement("tbody", null, draftItems?.map((item) => (react_1.default.createElement(HoverOverItemEditor, { key: item.id, schema: schema, dataSource: dataSource, table: table, onItemChange: handleItemChange, onItemDelete: handleItemDelete, item: item })))))),
88
+ react_1.default.createElement("tbody", null, draftItems?.map((item) => (react_1.default.createElement(HoverOverItemEditor, { key: item.id, schema: schema, dataSource: dataSource, table: table, onItemChange: handleItemChange, onItemDelete: handleItemDelete, item: item, aggrStatuses: props.aggrStatuses })))))),
88
89
  react_1.default.createElement("button", { className: "btn btn-link", onClick: handleAddItem },
89
90
  react_1.default.createElement("span", { className: "fas fa-plus me-1" }),
90
91
  T `Add Item`)))));
@@ -110,10 +111,9 @@ function HoverOverItemEditor(props) {
110
111
  react_1.default.createElement("td", { className: "align-middle" },
111
112
  react_1.default.createElement(ui.TextInput, { value: item.label, onChange: value => onItemChange({ ...item, label: value }) })),
112
113
  react_1.default.createElement("td", { className: "align-middle" },
113
- react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: schema, dataSource: dataSource, table: table, types: ["text", "number", "enum", "boolean", "date", "datetime", "id"], onChange: expr => onItemChange({ ...item, value: expr }), value: item.value ?? null, aggrStatuses: ["individual", "literal", "aggregate"] })),
114
+ react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: schema, dataSource: dataSource, table: table, types: ["text", "number", "enum", "boolean", "date", "datetime", "id"], onChange: expr => onItemChange({ ...item, value: expr }), value: item.value ?? null, aggrStatuses: props.aggrStatuses })),
114
115
  react_1.default.createElement("td", { className: "align-middle", style: { width: "1%", whiteSpace: "nowrap" } }, renderFormat()),
115
116
  react_1.default.createElement("td", { className: "align-middle", style: { width: "1%", whiteSpace: "nowrap" } },
116
117
  react_1.default.createElement("button", { className: "btn btn-link", onClick: () => onItemDelete(item) },
117
118
  react_1.default.createElement("span", { className: "fa fa-close" })))));
118
119
  }
119
- exports.default = EditHoverOver;
@@ -53,7 +53,7 @@ const HoverContent = (props) => {
53
53
  if (error) {
54
54
  return react_1.default.createElement("div", { className: "text-danger" }, error);
55
55
  }
56
- return (react_1.default.createElement("div", { className: "_mviz-map-hover-content" }, props.items.map((item) => {
56
+ return (react_1.default.createElement("div", { className: "mwater-visualization-map-hover-content" }, props.items.map((item) => {
57
57
  let value = values[item.id];
58
58
  if (value != null && item.value) {
59
59
  // Get expression type
@@ -32,7 +32,6 @@ const react_1 = __importStar(require("react"));
32
32
  const react_dom_1 = __importDefault(require("react-dom"));
33
33
  const LeafletLoading_1 = __importDefault(require("./LeafletLoading"));
34
34
  const leaflet_1 = __importDefault(require("leaflet"));
35
- let BingLayer = require("./BingLayer");
36
35
  let UtfGridLayer = require("./UtfGridLayer");
37
36
  const R = react_1.default.createElement;
38
37
  const marker_icon_2x_png_1 = __importDefault(require("./marker-icon-2x.png"));
@@ -266,34 +265,26 @@ class LeafletMapComponent extends react_1.Component {
266
265
  }
267
266
  switch (this.props.baseLayerId) {
268
267
  case "bing_road":
269
- this.baseLayer = new BingLayer("Ao26dWY2IC8PjorsJKFaoR85EPXCnCohrJdisCWXIULAXFo0JAXquGauppTMQbyU", {
270
- type: "Road"
268
+ this.baseLayer = leaflet_1.default.tileLayer('https://tiles.stadiamaps.com/tiles/osm_bright/{z}/{x}/{y}{r}.png?api_key=835a418e-91f9-4eb8-9856-0883c3656c9d', {
269
+ maxZoom: 20,
270
+ attribution: '&copy; <a href="https://stadiamaps.com/" target="_blank">Stadia Maps</a> &copy; <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> &copy; <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a>',
271
271
  });
272
272
  break;
273
- // @baseLayer = L.tileLayer('https://{s}.api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', {
274
- // attribution: '© <a href="https://www.mapbox.com/about/maps/">Mapbox</a> © <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> <strong><a href="https://www.mapbox.com/map-feedback/" target="_blank">Improve this map</a></strong>',
275
- // tileSize: 512,
276
- // maxZoom: 21,
277
- // maxNativeZoom: 19,
278
- // subdomains: ["a", "b"],
279
- // zoomOffset: -1,
280
- // id: 'mapbox/streets-v11',
281
- // accessToken: 'pk.eyJ1IjoiZ3Jhc3NpY2siLCJhIjoiY2ozMzU1N3ZoMDA3ZDJxbzh0aTRtOTRoeSJ9.fFWBZ88vbdezyhfw-I-fag'
282
- // })
283
273
  case "bing_aerial":
284
- this.baseLayer = new BingLayer("Ao26dWY2IC8PjorsJKFaoR85EPXCnCohrJdisCWXIULAXFo0JAXquGauppTMQbyU", {
285
- type: "AerialWithLabels"
274
+ this.baseLayer = leaflet_1.default.tileLayer('https://tiles.stadiamaps.com/tiles/alidade_satellite/{z}/{x}/{y}.jpg?api_key=835a418e-91f9-4eb8-9856-0883c3656c9d', {
275
+ maxZoom: 20,
276
+ attribution: '&copy; CNES, Distribution Airbus DS, &copy; Airbus DS, &copy; PlanetObserver (Contains Copernicus Data) | &copy; <a href="https://stadiamaps.com/" target="_blank">Stadia Maps</a> &copy; <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> &copy; <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a>',
286
277
  });
287
278
  break;
288
279
  case "cartodb_positron":
289
- this.baseLayer = leaflet_1.default.tileLayer("https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png", {
290
- attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, &copy; <a href="https://cartodb.com/attributions">CartoDB</a>',
280
+ this.baseLayer = leaflet_1.default.tileLayer("https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.png?api_key=835a418e-91f9-4eb8-9856-0883c3656c9d", {
281
+ attribution: '&copy; <a href="https://stadiamaps.com/" target="_blank">Stadia Maps</a>, &copy; <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> &copy; <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a>',
291
282
  maxZoom: 21
292
283
  });
293
284
  break;
294
285
  case "cartodb_dark_matter":
295
- this.baseLayer = leaflet_1.default.tileLayer("https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png", {
296
- attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, &copy; <a href="https://cartodb.com/attributions">CartoDB</a>',
286
+ this.baseLayer = leaflet_1.default.tileLayer("https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}{r}.png?api_key=835a418e-91f9-4eb8-9856-0883c3656c9d", {
287
+ attribution: '&copy; <a href="https://stadiamaps.com/" target="_blank">Stadia Maps</a>, &copy; <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a> &copy; <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a>',
297
288
  maxZoom: 21
298
289
  });
299
290
  break;
@@ -170,7 +170,6 @@ class MapComponent extends react_1.default.Component {
170
170
  }
171
171
  render() {
172
172
  const designerVisible = !this.getDesign().hideDesignPanel;
173
- console.log("designerVisible", designerVisible);
174
173
  return R("div", {
175
174
  style: {
176
175
  width: "100%",