@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
@@ -8,7 +8,7 @@ export interface GlobalFiltersElementFactoryProps {
8
8
  dataSource: DataSource;
9
9
  filterableTables: string[];
10
10
  globalFilters?: GlobalFilter[];
11
- onChange: (globalFilters: GlobalFilter[]) => void;
11
+ onChange?: (globalFilters: GlobalFilter[]) => void;
12
12
  /** If true, return null element if not applicable to filterableTables */
13
13
  nullIfIrrelevant?: boolean;
14
14
  }
@@ -8,10 +8,10 @@ export interface MWaterGlobalFiltersComponentProps {
8
8
  dataSource: DataSource;
9
9
  filterableTables: string[];
10
10
  globalFilters?: GlobalFilter[];
11
- onChange: (globalFilters: GlobalFilter[]) => void;
11
+ onChange?: (globalFilters: GlobalFilter[]) => void;
12
12
  }
13
13
  export default class MWaterGlobalFiltersComponent extends React.Component<MWaterGlobalFiltersComponentProps> {
14
14
  handleRegionsChange: (regions: any) => void;
15
15
  handleManagedByChange: (managedBy: any) => void;
16
- render(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
16
+ render(): React.JSX.Element;
17
17
  }
@@ -28,12 +28,14 @@ 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 ui = __importStar(require("@mwater/react-library/lib/bootstrap"));
33
32
  const expressions_ui_1 = require("@mwater/expressions-ui");
34
33
  // Control to edit the global filters (_managed_by and admin_region)
35
34
  class MWaterGlobalFiltersComponent extends react_1.default.Component {
36
35
  handleRegionsChange = (regions) => {
36
+ if (!this.props.onChange) {
37
+ return;
38
+ }
37
39
  // Remove existing filter
38
40
  const globalFilters = lodash_1.default.filter(this.props.globalFilters || [], (gf) => !(gf.op === "within any" && gf.columnId === "admin_region"));
39
41
  // Add new filter if present
@@ -48,6 +50,9 @@ class MWaterGlobalFiltersComponent extends react_1.default.Component {
48
50
  this.props.onChange(globalFilters);
49
51
  };
50
52
  handleManagedByChange = (managedBy) => {
53
+ if (!this.props.onChange) {
54
+ return;
55
+ }
51
56
  // Remove existing filter
52
57
  const globalFilters = lodash_1.default.filter(this.props.globalFilters || [], (gf) => !(gf.op === "within" && gf.columnId === "_managed_by"));
53
58
  // Add new filter if present
@@ -79,25 +84,11 @@ class MWaterGlobalFiltersComponent extends react_1.default.Component {
79
84
  else {
80
85
  adminRegions = null;
81
86
  }
82
- return R("div", null, R(ui.FormGroup, { label: T `Only sites managed by`, labelMuted: true }, R(expressions_ui_1.IdLiteralComponent, {
83
- value: managedBy,
84
- onChange: this.handleManagedByChange,
85
- idTable: "groups",
86
- schema: this.props.schema,
87
- dataSource: this.props.dataSource,
88
- placeholder: T `All Organizations`,
89
- multi: false,
90
- filter: { type: "field", tableAlias: "main", column: "canManageEntities" }
91
- })), R(ui.FormGroup, { label: T `Only sites located in`, labelMuted: true }, R(expressions_ui_1.IdLiteralComponent, {
92
- value: adminRegions,
93
- onChange: this.handleRegionsChange,
94
- idTable: "admin_regions",
95
- schema: this.props.schema,
96
- dataSource: this.props.dataSource,
97
- placeholder: T `All Regions`,
98
- multi: true,
99
- orderBy: [{ expr: { type: "field", tableAlias: "main", column: "level" }, direction: "asc" }]
100
- })));
87
+ return (react_1.default.createElement("div", null,
88
+ react_1.default.createElement(ui.FormGroup, { label: T `Only sites managed by`, labelMuted: true },
89
+ react_1.default.createElement(expressions_ui_1.IdLiteralComponent, { value: managedBy, onChange: this.props.onChange ? this.handleManagedByChange : undefined, idTable: "groups", schema: this.props.schema, dataSource: this.props.dataSource, placeholder: T `All Organizations`, multi: false, filter: { type: "field", tableAlias: "main", column: "canManageEntities" } })),
90
+ react_1.default.createElement(ui.FormGroup, { label: T `Only sites located in`, labelMuted: true },
91
+ react_1.default.createElement(expressions_ui_1.IdLiteralComponent, { value: adminRegions, onChange: this.props.onChange ? this.handleRegionsChange : undefined, idTable: "admin_regions", schema: this.props.schema, dataSource: this.props.dataSource, placeholder: T `All Regions`, multi: true, orderBy: [{ expr: { type: "field", tableAlias: "main", column: "level" }, direction: "asc" }] }))));
101
92
  }
102
93
  }
103
94
  exports.default = MWaterGlobalFiltersComponent;
@@ -1,8 +1,7 @@
1
- import React, { ReactElement } from "react";
1
+ import React, { ReactElement, ReactNode } from "react";
2
2
  import { DataSource, Schema } from "@mwater/expressions";
3
3
  import AsyncLoadComponent from "@mwater/react-library/lib/AsyncLoadComponent";
4
- import LoadingComponent from "@mwater/react-library/lib/LoadingComponent";
5
- import MWaterContextComponent, { AddLayerElementFactory } from "./MWaterContextComponent";
4
+ import { AddLayerElementFactory } from "./MWaterContextComponent";
6
5
  export interface MWaterLoaderComponentProps {
7
6
  apiUrl: string;
8
7
  client?: string;
@@ -24,7 +23,7 @@ export interface MWaterLoaderComponentProps {
24
23
  dataSource: DataSource;
25
24
  }) => ReactElement<any> | null;
26
25
  /** Custom error formatter that returns React node or string, gets passed the error response from server */
27
- errorFormatter?: (data: any, defaultError: string) => string;
26
+ errorFormatter?: (data: any, defaultError: ReactNode) => ReactNode;
28
27
  /** Origin of usage. e.g. "dashboards:43445364..." */
29
28
  origin?: string;
30
29
  }
@@ -43,13 +42,5 @@ export default class MWaterLoaderComponent extends AsyncLoadComponent<MWaterLoad
43
42
  constructor(props: MWaterLoaderComponentProps);
44
43
  isLoadNeeded(newProps: MWaterLoaderComponentProps, oldProps: MWaterLoaderComponentProps): boolean;
45
44
  load(props: MWaterLoaderComponentProps, prevProps: MWaterLoaderComponentProps, callback: any): void;
46
- render(): React.ReactElement<any, string | React.JSXElementConstructor<any>> | React.CElement<import("@mwater/react-library/lib/LoadingComponent").LoadingComponentProps, LoadingComponent> | React.CElement<{
47
- apiUrl: string;
48
- client?: string;
49
- user?: string;
50
- schema: Schema;
51
- extraTables?: string[];
52
- onExtraTablesChange?: (extraTables: string[]) => void;
53
- addLayerElementFactory?: AddLayerElementFactory;
54
- }, MWaterContextComponent> | null;
45
+ render(): React.JSX.Element | null;
55
46
  }
@@ -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 AsyncLoadComponent_1 = __importDefault(require("@mwater/react-library/lib/AsyncLoadComponent"));
10
9
  const LoadingComponent_1 = __importDefault(require("@mwater/react-library/lib/LoadingComponent"));
11
10
  const mWaterLoader_1 = __importDefault(require("./mWaterLoader"));
@@ -69,18 +68,10 @@ class MWaterLoaderComponent extends AsyncLoadComponent_1.default {
69
68
  return this.props.children(this.state.error);
70
69
  }
71
70
  // Inject context
72
- return R(MWaterContextComponent_1.default, {
73
- apiUrl: this.props.apiUrl,
74
- client: this.props.client,
75
- user: this.props.user,
76
- schema: this.state.schema,
77
- extraTables: this.props.extraTables,
78
- onExtraTablesChange: this.props.onExtraTablesChange,
79
- addLayerElementFactory: this.props.addLayerElementFactory
80
- }, this.props.children(this.state.error, {
71
+ return (react_1.default.createElement(MWaterContextComponent_1.default, { apiUrl: this.props.apiUrl, client: this.props.client, user: this.props.user, schema: this.state.schema, extraTables: this.props.extraTables, onExtraTablesChange: this.props.onExtraTablesChange, addLayerElementFactory: this.props.addLayerElementFactory }, this.props.children(this.state.error, {
81
72
  schema: this.state.schema,
82
73
  dataSource: this.state.dataSource
83
- }));
74
+ })));
84
75
  }
85
76
  }
86
77
  exports.default = MWaterLoaderComponent;
@@ -1,7 +1,8 @@
1
1
  export default class UndoStack {
2
2
  undoStack: any[];
3
3
  redoStack: any[];
4
- constructor(undoStack?: any, redoStack?: any);
4
+ maxDepth?: number;
5
+ constructor(undoStack?: any, redoStack?: any, maxDepth?: number);
5
6
  push(value: any): UndoStack;
6
7
  canUndo(): boolean;
7
8
  canRedo(): boolean;
package/lib/UndoStack.js CHANGED
@@ -8,20 +8,26 @@ const lodash_1 = __importDefault(require("lodash"));
8
8
  class UndoStack {
9
9
  undoStack;
10
10
  redoStack;
11
- constructor(undoStack, redoStack) {
11
+ maxDepth;
12
+ constructor(undoStack, redoStack, maxDepth) {
12
13
  this.undoStack = undoStack || [];
13
14
  this.redoStack = redoStack || [];
15
+ this.maxDepth = maxDepth;
14
16
  }
15
17
  // Add a value to the stack
16
18
  push(value) {
17
19
  // No trivial pushes
18
- if (lodash_1.default.isEqual(this.getValue(), value)) {
20
+ if (JSON.stringify(this.getValue()) === JSON.stringify(value)) {
19
21
  return this;
20
22
  }
21
- const undoStack = this.undoStack.slice();
23
+ let undoStack = this.undoStack.slice();
22
24
  undoStack.push(value);
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
+ }
23
29
  const redoStack = [];
24
- return new UndoStack(undoStack, redoStack);
30
+ return new UndoStack(undoStack, redoStack, this.maxDepth);
25
31
  }
26
32
  canUndo() {
27
33
  return this.undoStack.length > 1;
@@ -34,14 +40,14 @@ class UndoStack {
34
40
  const redoStack = this.redoStack.slice();
35
41
  redoStack.push(lodash_1.default.last(this.undoStack));
36
42
  const undoStack = lodash_1.default.initial(this.undoStack);
37
- return new UndoStack(undoStack, redoStack);
43
+ return new UndoStack(undoStack, redoStack, this.maxDepth);
38
44
  }
39
45
  redo() {
40
46
  // Put last redo on to undoStack
41
47
  const undoStack = this.undoStack.slice();
42
48
  undoStack.push(lodash_1.default.last(this.redoStack));
43
49
  const redoStack = lodash_1.default.initial(this.redoStack);
44
- return new UndoStack(undoStack, redoStack);
50
+ return new UndoStack(undoStack, redoStack, this.maxDepth);
45
51
  }
46
52
  // Get the current value
47
53
  getValue() {
@@ -202,25 +202,25 @@ class DashboardComponent extends react_1.default.Component {
202
202
  : undefined,
203
203
  react_1.default.createElement("a", { key: "print", className: "btn btn-link btn-sm", onClick: this.handlePrint },
204
204
  react_1.default.createElement("span", { className: "fas fa-print" }),
205
- react_1.default.createElement("span", { className: "hide-600px" },
205
+ react_1.default.createElement("span", { className: "hide-800px" },
206
206
  " ",
207
207
  T `Print`)),
208
208
  react_1.default.createElement("a", { key: "refresh", className: "btn btn-link btn-sm", onClick: this.handleRefreshData },
209
209
  react_1.default.createElement("span", { className: "fas fa-sync" }),
210
- react_1.default.createElement("span", { className: "hide-600px" },
210
+ react_1.default.createElement("span", { className: "hide-800px" },
211
211
  " ",
212
212
  T `Refresh`)),
213
213
  this.state.hideQuickfilters && this.props.design.quickfilters && this.props.design.quickfilters.length > 0
214
214
  ? react_1.default.createElement("a", { key: "showQuickfilters", className: "btn btn-link btn-sm", onClick: this.handleShowQuickfilters },
215
215
  react_1.default.createElement("span", { className: "fa fa-filter" }),
216
- react_1.default.createElement("span", { className: "hide-600px" },
216
+ react_1.default.createElement("span", { className: "hide-800px" },
217
217
  " ",
218
218
  T `Show Quickfilters`))
219
219
  : undefined,
220
220
  this.state.editing
221
221
  ? react_1.default.createElement("a", { key: "settings", className: "btn btn-link btn-sm", onClick: this.handleSettings },
222
222
  react_1.default.createElement("span", { className: "fas fa-cog" }),
223
- react_1.default.createElement("span", { className: "hide-600px" },
223
+ react_1.default.createElement("span", { className: "hide-800px" },
224
224
  " ",
225
225
  T `Settings`))
226
226
  : undefined,
@@ -271,6 +271,7 @@ class DashboardComponent extends react_1.default.Component {
271
271
  react_1.default.createElement("div", { style: {
272
272
  display: "grid",
273
273
  gridTemplateRows: this.props.hideTitleBar ? "auto 1fr" : "auto auto 1fr",
274
+ gridTemplateColumns: "minmax(0, 1fr)",
274
275
  height: "100%"
275
276
  } },
276
277
  !this.props.hideTitleBar ? this.renderTitleBar() : undefined,
@@ -34,6 +34,6 @@ export interface DashboardDesign {
34
34
  };
35
35
  /** true to enable implicit filtering (see ImplicitFilterBuilder). Defaults to true for older dashboards. */
36
36
  implicitFiltersEnabled?: boolean;
37
- /** array of global filters. See below. */
37
+ /** Array of global filters */
38
38
  globalFilters?: GlobalFilter[];
39
39
  }
@@ -298,22 +298,12 @@ class ServerWidgetLayerDataSource {
298
298
  query.cacheExpiry = cacheExpiry;
299
299
  }
300
300
  let url = `${this.options.apiUrl}maps/tiles/{z}/{x}/{y}.${extension}?` + querystring_1.default.stringify(query);
301
- // Add subdomains: {s} will be substituted with "a", "b" or "c" in leaflet for api.mwater.co only.
302
- // Used to speed queries
303
- if (url.match(/^https:\/\/api\.mwater\.co\//)) {
304
- url = url.replace(/^https:\/\/api\.mwater\.co\//, "https://{s}-api.mwater.co/");
305
- }
306
301
  return url;
307
302
  }
308
303
  // Create query string
309
304
  createLegacyUrl(design, extension, filters) {
310
305
  let where;
311
306
  let url = `${this.options.apiUrl}maps/tiles/{z}/{x}/{y}.${extension}?type=${design.type}&radius=1000`;
312
- // Add subdomains: {s} will be substituted with "a", "b" or "c" in leaflet for api.mwater.co only.
313
- // Used to speed queries
314
- if (url.match(/^https:\/\/api\.mwater\.co\//)) {
315
- url = url.replace(/^https:\/\/api\.mwater\.co\//, "https://{s}-api.mwater.co/");
316
- }
317
307
  if (this.options.client) {
318
308
  url += `&client=${this.options.client}`;
319
309
  }
@@ -149,7 +149,7 @@ function LanguageTab({ design, onDesignChange, schema }) {
149
149
  for (const locale of design.otherLocales || []) {
150
150
  const translatedCount = translatableStrings.filter(str => design.translations?.[locale]?.[str] != null).length;
151
151
  // Round down to nearest percent
152
- percentages[locale] = Math.floor((translatedCount / totalStrings) * 100);
152
+ percentages[locale] = (totalStrings > 0) ? Math.floor((translatedCount / totalStrings) * 100) : 0;
153
153
  }
154
154
  return percentages;
155
155
  }, [design.translations, design.otherLocales, translatableStrings]);
@@ -342,8 +342,28 @@ exports.default = (0, react_1.forwardRef)(function DatagridComponent(props, ref)
342
342
  return (react_1.default.createElement(DatagridViewComponent_1.default, { ref: datagridViewRef, width: size.width - 1, height: size.height - 1, pageSize: 100, schema: schema, dataSource: dataSource, datagridDataSource: datagridDataSource, design: cleanedDesign, filters: activeFilters, onDesignChange: onDesignChange, onRowClick: onRowClick, onRowDoubleClick: onRowDoubleClick, selectedRows: dataEditingEnabled && props.onRowsDelete != null ? selectedRows : undefined, onSelectedRowsChange: dataEditingEnabled && props.onRowsDelete != null ? setSelectedRows : undefined, canEditExpr: dataEditingEnabled ? canEditExpr : undefined, updateExprValues: dataEditingEnabled ? updateExprValues : undefined, refreshKey: refreshKey }));
343
343
  }
344
344
  else if (onDesignChange) {
345
- return (react_1.default.createElement("div", { style: { textAlign: "center", marginTop: size.height / 2 } },
346
- react_1.default.createElement("a", { className: "btn btn-link", onClick: handleEdit }, T `Click Here to Configure`)));
345
+ return (react_1.default.createElement("div", { style: {
346
+ display: "flex",
347
+ flexDirection: "column",
348
+ alignItems: "center",
349
+ justifyContent: "center",
350
+ height: "100%",
351
+ padding: "40px"
352
+ } },
353
+ react_1.default.createElement("div", { style: {
354
+ textAlign: "center",
355
+ marginBottom: "24px"
356
+ } },
357
+ react_1.default.createElement("i", { className: "fas fa-table text-muted", style: {
358
+ fontSize: "48px",
359
+ marginBottom: "16px"
360
+ } }),
361
+ react_1.default.createElement("div", { style: {
362
+ fontSize: "14px"
363
+ }, className: "text-muted" }, T `Configure a data source and columns to get started.`)),
364
+ react_1.default.createElement("button", { className: "btn btn-primary", onClick: handleEdit },
365
+ react_1.default.createElement("i", { className: "fas fa-cog", style: { marginRight: "8px" } }),
366
+ T `Configure`)));
347
367
  }
348
368
  else {
349
369
  return null;
@@ -1,6 +1,5 @@
1
1
  import React from "react";
2
2
  import { DataSource, Schema } from "@mwater/expressions";
3
- import TabbedComponent from "@mwater/react-library/lib/TabbedComponent";
4
3
  import { DatagridDesign } from "..";
5
4
  export interface DatagridDesignerComponentProps {
6
5
  /** schema to use */
@@ -18,6 +17,6 @@ export default class DatagridDesignerComponent extends React.Component<DatagridD
18
17
  handleFilterChange: (filter: any) => void;
19
18
  handleGlobalFiltersChange: (globalFilters: any) => void;
20
19
  handleOrderBysChange: (orderBys: any) => void;
21
- renderTabs(): React.CElement<any, TabbedComponent>;
22
- render(): React.DetailedReactHTMLElement<React.HTMLAttributes<HTMLElement>, HTMLElement>;
20
+ renderTabs(): React.JSX.Element;
21
+ render(): React.JSX.Element;
23
22
  }