@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
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const lodash_1 = __importDefault(require("lodash"));
7
7
  const react_1 = __importDefault(require("react"));
8
- const R = react_1.default.createElement;
9
8
  const expressions_1 = require("@mwater/expressions");
10
9
  const expressions_ui_1 = require("@mwater/expressions-ui");
11
10
  const expressions_ui_2 = require("@mwater/expressions-ui");
@@ -53,40 +52,44 @@ class ExprItemEditorComponent extends react_1.default.Component {
53
52
  if (!formats) {
54
53
  return null;
55
54
  }
56
- return R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, T `Format`), ": ", R("select", {
57
- value: this.props.exprItem.format != null ? this.props.exprItem.format : (0, valueFormatter_2.getDefaultFormat)(exprType),
58
- className: "form-select",
59
- style: { width: "auto", display: "inline-block" },
60
- onChange: this.handleFormatChange
61
- }, lodash_1.default.map(formats, (format) => R("option", { key: format.value, value: format.value }, format.label))));
55
+ return (react_1.default.createElement("div", { className: "mb-3" },
56
+ react_1.default.createElement("label", { className: "text-muted" }, T `Format`),
57
+ ": ",
58
+ react_1.default.createElement("select", { value: this.props.exprItem.format != null ? this.props.exprItem.format : (0, valueFormatter_2.getDefaultFormat)(exprType), className: "form-select", style: { width: "auto", display: "inline-block" }, onChange: this.handleFormatChange }, lodash_1.default.map(formats, (format) => react_1.default.createElement("option", { key: format.value, value: format.value }, format.label)))));
62
59
  }
63
60
  render() {
64
- return R("div", { style: { paddingBottom: 200 } }, R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, R("i", { className: "fa fa-database" }), " ", T `Data Source`), ": ", R(expressions_ui_2.TableSelectComponent, {
65
- schema: this.props.schema,
66
- value: this.state.table,
67
- onChange: this.handleTableChange
68
- }), R("br")), this.state.table
69
- ? R("div", { className: "mb-3" }, R("label", { className: "text-muted" }, T `Field`), ": ", R(expressions_ui_1.ExprComponent, {
70
- schema: this.props.schema,
71
- dataSource: this.props.dataSource,
72
- table: this.state.table,
73
- types: ["text", "number", "enum", "date", "datetime", "boolean", "enumset", "geometry"],
74
- value: this.props.exprItem.expr,
75
- aggrStatuses: ["individual", "literal", "aggregate"],
76
- onChange: this.handleExprChange
77
- }))
78
- : undefined, this.state.table && this.props.exprItem.expr
79
- ? R("div", { className: "mb-3" }, react_1.default.createElement(bootstrap_1.Checkbox, { key: "includeLabel", value: this.props.exprItem.includeLabel, onChange: this.handleIncludeLabelChange }, T `Include Label`), this.props.exprItem.includeLabel
80
- ? R("input", {
81
- key: "labelText",
82
- className: "form-control",
83
- type: "text",
84
- value: this.props.exprItem.labelText || "",
85
- onChange: this.handleLabelTextChange,
86
- placeholder: new expressions_1.ExprUtils(this.props.schema).summarizeExpr(this.props.exprItem.expr) + ": "
87
- })
88
- : undefined)
89
- : undefined, this.renderFormat());
61
+ const exprValidator = new expressions_1.ExprValidator(this.props.schema);
62
+ const error = exprValidator.validateExpr(this.props.exprItem.expr, {
63
+ table: this.state.table,
64
+ aggrStatuses: ["individual", "literal", "aggregate"]
65
+ });
66
+ return (react_1.default.createElement("div", { style: { paddingBottom: 200 } },
67
+ react_1.default.createElement("div", { className: "mb-3" },
68
+ react_1.default.createElement("label", { className: "text-muted" },
69
+ react_1.default.createElement("i", { className: "fa fa-database" }),
70
+ " ",
71
+ T `Data Source`),
72
+ ": ",
73
+ react_1.default.createElement(expressions_ui_2.TableSelectComponent, { schema: this.props.schema, value: this.state.table, onChange: this.handleTableChange }),
74
+ react_1.default.createElement("br", null)),
75
+ this.state.table
76
+ ? (react_1.default.createElement("div", { className: "mb-3" },
77
+ react_1.default.createElement("label", { className: "text-muted" }, T `Field`),
78
+ ": ",
79
+ react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: this.props.schema, dataSource: this.props.dataSource, table: this.state.table, types: ["text", "number", "enum", "date", "datetime", "boolean", "enumset", "geometry"], value: this.props.exprItem.expr, aggrStatuses: ["individual", "literal", "aggregate"], onChange: this.handleExprChange })))
80
+ : undefined,
81
+ error ? react_1.default.createElement("div", { className: "alert alert-danger" },
82
+ react_1.default.createElement("i", { className: "fa fa-exclamation-circle" }),
83
+ " ",
84
+ error) : undefined,
85
+ this.state.table && this.props.exprItem.expr
86
+ ? (react_1.default.createElement("div", { className: "mb-3" },
87
+ react_1.default.createElement(bootstrap_1.Checkbox, { key: "includeLabel", value: this.props.exprItem.includeLabel, onChange: this.handleIncludeLabelChange }, T `Include Label`),
88
+ this.props.exprItem.includeLabel
89
+ ? react_1.default.createElement("input", { key: "labelText", className: "form-control", type: "text", value: this.props.exprItem.labelText || "", onChange: this.handleLabelTextChange, placeholder: new expressions_1.ExprUtils(this.props.schema).summarizeExpr(this.props.exprItem.expr) + ": " })
90
+ : undefined))
91
+ : undefined,
92
+ this.renderFormat()));
90
93
  }
91
94
  }
92
95
  exports.default = ExprItemEditorComponent;
@@ -6,6 +6,7 @@ export interface ExprUpdateModalComponentProps {
6
6
  schema: Schema;
7
7
  /** Data source to use to get values */
8
8
  dataSource: DataSource;
9
+ /** Optional table that will be filtered to have a single row present. Widget designer should optionally account for this */
9
10
  singleRowTable?: string;
10
11
  }
11
12
  interface ExprUpdateModalComponentState {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mwater/visualization",
3
- "version": "5.5.0",
3
+ "version": "5.6.0",
4
4
  "description": "Visualization library",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -36,7 +36,7 @@
36
36
  "d3-tip": "^0.9.0",
37
37
  "dayjs": "^1.11.10",
38
38
  "dompurify": "^1.0.11",
39
- "ez-localize": "^2.13.0",
39
+ "ez-localize": "^2.15.0",
40
40
  "file-saver": "^2.0.5",
41
41
  "immer": "^8.0.0",
42
42
  "immutable-setter": "^1.1.1",
@@ -74,7 +74,6 @@
74
74
  "xlsx-js-style": "^1.2.0"
75
75
  },
76
76
  "devDependencies": {
77
- "@kadira/storybook": "^2.21.0",
78
77
  "@types/chai": "^4.3.0",
79
78
  "@types/color": "^3.0.2",
80
79
  "@types/d3": "^5.16.4",
@@ -18,7 +18,7 @@ export interface GlobalFiltersElementFactoryProps {
18
18
  dataSource: DataSource
19
19
  filterableTables: string[]
20
20
  globalFilters?: GlobalFilter[]
21
- onChange: (globalFilters: GlobalFilter[]) => void
21
+ onChange?: (globalFilters: GlobalFilter[]) => void
22
22
 
23
23
  /** If true, return null element if not applicable to filterableTables */
24
24
  nullIfIrrelevant?: boolean
@@ -1,6 +1,5 @@
1
1
  import _ from "lodash"
2
2
  import React from "react"
3
- const R = React.createElement
4
3
 
5
4
  import * as ui from "@mwater/react-library/lib/bootstrap"
6
5
  import { IdLiteralComponent } from "@mwater/expressions-ui"
@@ -14,12 +13,14 @@ export interface MWaterGlobalFiltersComponentProps {
14
13
  dataSource: DataSource
15
14
  filterableTables: string[]
16
15
  globalFilters?: GlobalFilter[]
17
- onChange: (globalFilters: GlobalFilter[]) => void
16
+ onChange?: (globalFilters: GlobalFilter[]) => void
18
17
  }
19
18
 
20
19
  // Control to edit the global filters (_managed_by and admin_region)
21
20
  export default class MWaterGlobalFiltersComponent extends React.Component<MWaterGlobalFiltersComponentProps> {
22
21
  handleRegionsChange = (regions: any) => {
22
+ if (!this.props.onChange) { return }
23
+
23
24
  // Remove existing filter
24
25
  const globalFilters = _.filter(
25
26
  this.props.globalFilters || [],
@@ -40,6 +41,8 @@ export default class MWaterGlobalFiltersComponent extends React.Component<MWater
40
41
  }
41
42
 
42
43
  handleManagedByChange = (managedBy: any) => {
44
+ if (!this.props.onChange) { return }
45
+
43
46
  // Remove existing filter
44
47
  const globalFilters = _.filter(
45
48
  this.props.globalFilters || [],
@@ -80,38 +83,34 @@ export default class MWaterGlobalFiltersComponent extends React.Component<MWater
80
83
  adminRegions = null
81
84
  }
82
85
 
83
- return R(
84
- "div",
85
- null,
86
- R(
87
- ui.FormGroup,
88
- { label: T`Only sites managed by`, labelMuted: true },
89
- R(IdLiteralComponent, {
90
- value: managedBy,
91
- onChange: this.handleManagedByChange,
92
- idTable: "groups",
93
- schema: this.props.schema,
94
- dataSource: this.props.dataSource,
95
- placeholder: T`All Organizations`,
96
- multi: false,
97
- filter: { type: "field", tableAlias: "main", column: "canManageEntities" }
98
- })
99
- ),
86
+ return (
87
+ <div>
88
+ <ui.FormGroup label={T`Only sites managed by`} labelMuted={true}>
89
+ <IdLiteralComponent
90
+ value={managedBy}
91
+ onChange={ this.props.onChange ? this.handleManagedByChange : undefined}
92
+ idTable="groups"
93
+ schema={this.props.schema}
94
+ dataSource={this.props.dataSource}
95
+ placeholder={T`All Organizations`}
96
+ multi={false}
97
+ filter={{ type: "field", tableAlias: "main", column: "canManageEntities" }}
98
+ />
99
+ </ui.FormGroup>
100
100
 
101
- R(
102
- ui.FormGroup,
103
- { label: T`Only sites located in`, labelMuted: true },
104
- R(IdLiteralComponent, {
105
- value: adminRegions,
106
- onChange: this.handleRegionsChange,
107
- idTable: "admin_regions",
108
- schema: this.props.schema,
109
- dataSource: this.props.dataSource,
110
- placeholder: T`All Regions`,
111
- multi: true,
112
- orderBy: [{ expr: { type: "field", tableAlias: "main", column: "level" }, direction: "asc" }]
113
- })
114
- )
101
+ <ui.FormGroup label={T`Only sites located in`} labelMuted={true}>
102
+ <IdLiteralComponent
103
+ value={adminRegions}
104
+ onChange={this.props.onChange ? this.handleRegionsChange : undefined}
105
+ idTable="admin_regions"
106
+ schema={this.props.schema}
107
+ dataSource={this.props.dataSource}
108
+ placeholder={T`All Regions`}
109
+ multi={true}
110
+ orderBy={[{ expr: { type: "field", tableAlias: "main", column: "level" }, direction: "asc" }]}
111
+ />
112
+ </ui.FormGroup>
113
+ </div>
115
114
  )
116
115
  }
117
116
  }
@@ -1,6 +1,5 @@
1
1
  import _ from "lodash"
2
- import React, { ReactElement } from "react"
3
- const R = React.createElement
2
+ import React, { ReactElement, ReactNode } from "react"
4
3
 
5
4
  import { DataSource, Schema } from "@mwater/expressions"
6
5
  import AsyncLoadComponent from "@mwater/react-library/lib/AsyncLoadComponent"
@@ -26,7 +25,7 @@ export interface MWaterLoaderComponentProps {
26
25
  addLayerElementFactory?: AddLayerElementFactory
27
26
  children: (error: any, config?: { schema: Schema; dataSource: DataSource }) => ReactElement<any> | null
28
27
  /** Custom error formatter that returns React node or string, gets passed the error response from server */
29
- errorFormatter?: (data: any, defaultError: string) => string
28
+ errorFormatter?: (data: any, defaultError: ReactNode) => ReactNode
30
29
  /** Origin of usage. e.g. "dashboards:43445364..." */
31
30
  origin?: string
32
31
  }
@@ -110,21 +109,21 @@ export default class MWaterLoaderComponent extends AsyncLoadComponent<
110
109
  }
111
110
 
112
111
  // Inject context
113
- return R(
114
- MWaterContextComponent,
115
- {
116
- apiUrl: this.props.apiUrl,
117
- client: this.props.client,
118
- user: this.props.user,
119
- schema: this.state.schema!,
120
- extraTables: this.props.extraTables,
121
- onExtraTablesChange: this.props.onExtraTablesChange,
122
- addLayerElementFactory: this.props.addLayerElementFactory
123
- },
124
- this.props.children(this.state.error, {
125
- schema: this.state.schema!,
126
- dataSource: this.state.dataSource!
127
- })
112
+ return (
113
+ <MWaterContextComponent
114
+ apiUrl={this.props.apiUrl}
115
+ client={this.props.client}
116
+ user={this.props.user}
117
+ schema={this.state.schema!}
118
+ extraTables={this.props.extraTables}
119
+ onExtraTablesChange={this.props.onExtraTablesChange}
120
+ addLayerElementFactory={this.props.addLayerElementFactory}
121
+ >
122
+ {this.props.children(this.state.error, {
123
+ schema: this.state.schema!,
124
+ dataSource: this.state.dataSource!
125
+ })}
126
+ </MWaterContextComponent>
128
127
  )
129
128
  }
130
129
  }
package/src/UndoStack.ts CHANGED
@@ -4,24 +4,32 @@ import _ from "lodash"
4
4
  export default class UndoStack {
5
5
  undoStack: any[]
6
6
  redoStack: any[]
7
+ maxDepth?: number
7
8
 
8
- constructor(undoStack?: any, redoStack?: any) {
9
+ constructor(undoStack?: any, redoStack?: any, maxDepth?: number) {
9
10
  this.undoStack = undoStack || []
10
11
  this.redoStack = redoStack || []
12
+ this.maxDepth = maxDepth
11
13
  }
12
14
 
13
15
  // Add a value to the stack
14
16
  push(value: any) {
15
17
  // No trivial pushes
16
- if (_.isEqual(this.getValue(), value)) {
18
+ if (JSON.stringify(this.getValue()) === JSON.stringify(value)) {
17
19
  return this
18
20
  }
19
21
 
20
- const undoStack = this.undoStack.slice()
22
+ let undoStack = this.undoStack.slice()
21
23
  undoStack.push(value)
24
+
25
+ // Limit stack depth if maxDepth is set
26
+ if (this.maxDepth && undoStack.length > this.maxDepth) {
27
+ undoStack = undoStack.slice(undoStack.length - this.maxDepth)
28
+ }
29
+
22
30
  const redoStack: any = []
23
31
 
24
- return new UndoStack(undoStack, redoStack)
32
+ return new UndoStack(undoStack, redoStack, this.maxDepth)
25
33
  }
26
34
 
27
35
  canUndo() {
@@ -39,7 +47,7 @@ export default class UndoStack {
39
47
 
40
48
  const undoStack = _.initial(this.undoStack)
41
49
 
42
- return new UndoStack(undoStack, redoStack)
50
+ return new UndoStack(undoStack, redoStack, this.maxDepth)
43
51
  }
44
52
 
45
53
  redo() {
@@ -49,7 +57,7 @@ export default class UndoStack {
49
57
 
50
58
  const redoStack = _.initial(this.redoStack)
51
59
 
52
- return new UndoStack(undoStack, redoStack)
60
+ return new UndoStack(undoStack, redoStack, this.maxDepth)
53
61
  }
54
62
 
55
63
  // Get the current value
@@ -304,23 +304,23 @@ export default class DashboardComponent extends React.Component<DashboardCompone
304
304
  : undefined}
305
305
  <a key="print" className="btn btn-link btn-sm" onClick={this.handlePrint}>
306
306
  <span className="fas fa-print"/>
307
- <span className="hide-600px"> {T`Print`}</span>
307
+ <span className="hide-800px"> {T`Print`}</span>
308
308
  </a>
309
309
  <a key="refresh" className="btn btn-link btn-sm" onClick={this.handleRefreshData}>
310
310
  <span className="fas fa-sync"/>
311
- <span className="hide-600px"> {T`Refresh`}</span>
311
+ <span className="hide-800px"> {T`Refresh`}</span>
312
312
  </a>
313
313
  {this.state.hideQuickfilters && this.props.design.quickfilters && this.props.design.quickfilters.length > 0
314
314
  ? <a key="showQuickfilters" className="btn btn-link btn-sm" onClick={this.handleShowQuickfilters}>
315
315
  <span className="fa fa-filter"/>
316
- <span className="hide-600px"> {T`Show Quickfilters`}</span>
316
+ <span className="hide-800px"> {T`Show Quickfilters`}</span>
317
317
  </a>
318
318
  : undefined}
319
319
 
320
320
  {this.state.editing
321
321
  ? <a key="settings" className="btn btn-link btn-sm" onClick={this.handleSettings}>
322
322
  <span className="fas fa-cog"/>
323
- <span className="hide-600px"> {T`Settings`}</span>
323
+ <span className="hide-800px"> {T`Settings`}</span>
324
324
  </a>
325
325
  : undefined}
326
326
  {this.state.editing ? this.renderStyle() : undefined}
@@ -435,6 +435,7 @@ export default class DashboardComponent extends React.Component<DashboardCompone
435
435
  <div style={{
436
436
  display: "grid",
437
437
  gridTemplateRows: this.props.hideTitleBar ? "auto 1fr" : "auto auto 1fr",
438
+ gridTemplateColumns: "minmax(0, 1fr)",
438
439
  height: "100%"
439
440
  }}>
440
441
  {!this.props.hideTitleBar ? this.renderTitleBar() : undefined}
@@ -39,6 +39,6 @@ export interface DashboardDesign {
39
39
  /** true to enable implicit filtering (see ImplicitFilterBuilder). Defaults to true for older dashboards. */
40
40
  implicitFiltersEnabled?: boolean
41
41
 
42
- /** array of global filters. See below. */
42
+ /** Array of global filters */
43
43
  globalFilters?: GlobalFilter[]
44
44
  }
@@ -407,12 +407,6 @@ class ServerWidgetLayerDataSource implements MapLayerDataSource {
407
407
 
408
408
  let url = `${this.options.apiUrl}maps/tiles/{z}/{x}/{y}.${extension}?` + querystring.stringify(query)
409
409
 
410
- // Add subdomains: {s} will be substituted with "a", "b" or "c" in leaflet for api.mwater.co only.
411
- // Used to speed queries
412
- if (url.match(/^https:\/\/api\.mwater\.co\//)) {
413
- url = url.replace(/^https:\/\/api\.mwater\.co\//, "https://{s}-api.mwater.co/")
414
- }
415
-
416
410
  return url
417
411
  }
418
412
 
@@ -421,12 +415,6 @@ class ServerWidgetLayerDataSource implements MapLayerDataSource {
421
415
  let where
422
416
  let url = `${this.options.apiUrl}maps/tiles/{z}/{x}/{y}.${extension}?type=${design.type}&radius=1000`
423
417
 
424
- // Add subdomains: {s} will be substituted with "a", "b" or "c" in leaflet for api.mwater.co only.
425
- // Used to speed queries
426
- if (url.match(/^https:\/\/api\.mwater\.co\//)) {
427
- url = url.replace(/^https:\/\/api\.mwater\.co\//, "https://{s}-api.mwater.co/")
428
- }
429
-
430
418
  if (this.options.client) {
431
419
  url += `&client=${this.options.client}`
432
420
  }
@@ -259,7 +259,7 @@ function LanguageTab({ design, onDesignChange, schema }: LanguageTabProps) {
259
259
  ).length
260
260
 
261
261
  // Round down to nearest percent
262
- percentages[locale] = Math.floor((translatedCount / totalStrings) * 100)
262
+ percentages[locale] = (totalStrings > 0) ? Math.floor((translatedCount / totalStrings) * 100) : 0
263
263
  }
264
264
 
265
265
  return percentages
@@ -529,8 +529,36 @@ export default forwardRef<DatagridComponentRef, DatagridComponentProps>(function
529
529
  )
530
530
  } else if (onDesignChange) {
531
531
  return (
532
- <div style={{ textAlign: "center", marginTop: size.height / 2 }}>
533
- <a className="btn btn-link" onClick={handleEdit}>{T`Click Here to Configure`}</a>
532
+ <div style={{
533
+ display: "flex",
534
+ flexDirection: "column",
535
+ alignItems: "center",
536
+ justifyContent: "center",
537
+ height: "100%",
538
+ padding: "40px"
539
+ }}>
540
+ <div style={{
541
+ textAlign: "center",
542
+ marginBottom: "24px"
543
+ }}>
544
+ <i className="fas fa-table text-muted" style={{
545
+ fontSize: "48px",
546
+ marginBottom: "16px"
547
+ }} />
548
+ <div style={{
549
+ fontSize: "14px"
550
+ }} className="text-muted">
551
+ {T`Configure a data source and columns to get started.`}
552
+ </div>
553
+ </div>
554
+
555
+ <button
556
+ className="btn btn-primary"
557
+ onClick={handleEdit}
558
+ >
559
+ <i className="fas fa-cog" style={{ marginRight: "8px" }} />
560
+ {T`Configure`}
561
+ </button>
534
562
  </div>
535
563
  )
536
564
  } else {