@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.
- package/lib/MWaterContextComponent.d.ts +1 -1
- package/lib/MWaterGlobalFiltersComponent.d.ts +2 -2
- package/lib/MWaterGlobalFiltersComponent.js +11 -20
- package/lib/MWaterLoaderComponent.d.ts +4 -13
- package/lib/MWaterLoaderComponent.js +2 -11
- package/lib/UndoStack.d.ts +2 -1
- package/lib/UndoStack.js +12 -6
- package/lib/dashboards/DashboardComponent.js +5 -4
- package/lib/dashboards/DashboardDesign.d.ts +1 -1
- package/lib/dashboards/ServerDashboardDataSource.js +0 -10
- package/lib/dashboards/SettingsModalComponent.js +1 -1
- package/lib/datagrids/DatagridComponent.js +22 -2
- package/lib/datagrids/DatagridDesignerComponent.d.ts +2 -3
- package/lib/datagrids/DatagridDesignerComponent.js +108 -120
- package/lib/datagrids/DatagridViewComponent.js +3 -2
- package/lib/datagrids/OrderBysDesignerComponent.d.ts +7 -7
- package/lib/datagrids/OrderBysDesignerComponent.js +19 -28
- package/lib/index.css +45 -2
- package/lib/index.d.ts +5 -5
- package/lib/index.js +2 -3
- package/lib/layouts/blocks/BlocksDisplayComponent.d.ts +8 -1
- package/lib/layouts/blocks/BlocksDisplayComponent.js +46 -4
- package/lib/maps/BufferLayer.js +12 -0
- package/lib/maps/BufferLayerDesign.d.ts +1 -1
- package/lib/maps/BufferLayerDesignerComponent.js +2 -2
- package/lib/maps/ChoroplethLayer.js +12 -0
- package/lib/maps/ChoroplethLayerDesign.d.ts +5 -2
- package/lib/maps/ChoroplethLayerDesigner.d.ts +10 -32
- package/lib/maps/ChoroplethLayerDesigner.js +58 -89
- package/lib/maps/DirectMapDataSource.js +0 -10
- package/lib/maps/EditHoverOver.d.ts +4 -3
- package/lib/maps/EditHoverOver.js +3 -3
- package/lib/maps/HoverContent.js +1 -1
- package/lib/maps/LeafletMapComponent.js +10 -19
- package/lib/maps/MapComponent.js +0 -1
- package/lib/maps/MapUtils.js +10 -1
- package/lib/maps/MarkersLayer.js +18 -2
- package/lib/maps/MarkersLayerDesign.d.ts +1 -1
- package/lib/maps/MarkersLayerDesignerComponent.d.ts +12 -41
- package/lib/maps/MarkersLayerDesignerComponent.js +81 -111
- package/lib/maps/ServerMapDataSource.js +0 -10
- package/lib/maps/VectorMapViewComponent.js +1 -9
- package/lib/maps/symbols/font-awesome/asterisk.png +0 -0
- package/lib/maps/symbols/font-awesome/ban.png +0 -0
- package/lib/maps/symbols/font-awesome/beer.png +0 -0
- package/lib/maps/symbols/font-awesome/bell.png +0 -0
- package/lib/maps/symbols/font-awesome/bolt.png +0 -0
- package/lib/maps/symbols/font-awesome/building.png +0 -0
- package/lib/maps/symbols/font-awesome/bullseye.png +0 -0
- package/lib/maps/symbols/font-awesome/bus.png +0 -0
- package/lib/maps/symbols/font-awesome/caret-up.png +0 -0
- package/lib/maps/symbols/font-awesome/certificate.png +0 -0
- package/lib/maps/symbols/font-awesome/check-circle.png +0 -0
- package/lib/maps/symbols/font-awesome/check.png +0 -0
- package/lib/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
- package/lib/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
- package/lib/maps/symbols/font-awesome/cloud-rain.png +0 -0
- package/lib/maps/symbols/font-awesome/cloud.png +0 -0
- package/lib/maps/symbols/font-awesome/comment.png +0 -0
- package/lib/maps/symbols/font-awesome/crosshairs.png +0 -0
- package/lib/maps/symbols/font-awesome/dot-circle-o.png +0 -0
- package/lib/maps/symbols/font-awesome/exclamation-circle.png +0 -0
- package/lib/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
- package/lib/maps/symbols/font-awesome/female.png +0 -0
- package/lib/maps/symbols/font-awesome/file.png +0 -0
- package/lib/maps/symbols/font-awesome/flag.png +0 -0
- package/lib/maps/symbols/font-awesome/flask.png +0 -0
- package/lib/maps/symbols/font-awesome/h-square.png +0 -0
- package/lib/maps/symbols/font-awesome/home.png +0 -0
- package/lib/maps/symbols/font-awesome/info-circle.png +0 -0
- package/lib/maps/symbols/font-awesome/male.png +0 -0
- package/lib/maps/symbols/font-awesome/medkit.png +0 -0
- package/lib/maps/symbols/font-awesome/mobile.png +0 -0
- package/lib/maps/symbols/font-awesome/plus-circle.png +0 -0
- package/lib/maps/symbols/font-awesome/plus-square.png +0 -0
- package/lib/maps/symbols/font-awesome/plus.png +0 -0
- package/lib/maps/symbols/font-awesome/square.png +0 -0
- package/lib/maps/symbols/font-awesome/star.png +0 -0
- package/lib/maps/symbols/font-awesome/thumbs-down.png +0 -0
- package/lib/maps/symbols/font-awesome/thumbs-up.png +0 -0
- package/lib/maps/symbols/font-awesome/ticket.png +0 -0
- package/lib/maps/symbols/font-awesome/times-circle.png +0 -0
- package/lib/maps/symbols/font-awesome/times.png +0 -0
- package/lib/maps/symbols/font-awesome/tint.png +0 -0
- package/lib/maps/symbols/font-awesome/tree.png +0 -0
- package/lib/maps/symbols/font-awesome/university.png +0 -0
- package/lib/maps/symbols/font-awesome/usd.png +0 -0
- package/lib/maps/symbols/font-awesome/user.png +0 -0
- package/lib/maps/symbols/font-awesome/users.png +0 -0
- package/lib/maps/symbols/font-awesome/wheelchair.png +0 -0
- package/lib/maps/symbols/sdf-ize.sh +93 -0
- package/lib/maps/vectorMaps.d.ts +1 -0
- package/lib/maps/vectorMaps.js +20 -36
- package/lib/mwater_table_selection/IndicatorsListComponent.d.ts +4 -2
- package/lib/mwater_table_selection/IndicatorsListComponent.js +103 -34
- package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.d.ts +18 -0
- package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.js +80 -0
- package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.d.ts +26 -0
- package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.js +237 -51
- package/lib/mwater_table_selection/MWaterTableSelectComponent.d.ts +2 -2
- package/lib/mwater_table_selection/MWaterTableSelectComponent.js +9 -4
- package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.d.ts +19 -0
- package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.js +111 -0
- package/lib/quickfilter/QuickfiltersComponent.d.ts +3 -102
- package/lib/quickfilter/QuickfiltersComponent.js +53 -110
- package/lib/quickfilter/TextLiteralComponent.d.ts +23 -47
- package/lib/quickfilter/TextLiteralComponent.js +85 -82
- package/lib/widgets/MapWidget.js +4 -2
- package/lib/widgets/text/ExprItemEditorComponent.d.ts +3 -8
- package/lib/widgets/text/ExprItemEditorComponent.js +36 -33
- package/lib/widgets/text/ExprUpdateModalComponent.d.ts +1 -0
- package/package.json +2 -3
- package/src/MWaterContextComponent.tsx +1 -1
- package/src/{MWaterGlobalFiltersComponent.ts → MWaterGlobalFiltersComponent.tsx} +32 -33
- package/src/{MWaterLoaderComponent.ts → MWaterLoaderComponent.tsx} +17 -18
- package/src/UndoStack.ts +14 -6
- package/src/dashboards/DashboardComponent.tsx +5 -4
- package/src/dashboards/DashboardDesign.ts +1 -1
- package/src/dashboards/ServerDashboardDataSource.ts +0 -12
- package/src/dashboards/SettingsModalComponent.tsx +1 -1
- package/src/datagrids/DatagridComponent.tsx +30 -2
- package/src/datagrids/DatagridDesignerComponent.tsx +241 -229
- package/src/datagrids/DatagridViewComponent.tsx +3 -2
- package/src/datagrids/OrderBysDesignerComponent.tsx +61 -70
- package/src/index.css +45 -2
- package/src/index.ts +5 -11
- package/src/layouts/blocks/BlocksDisplayComponent.tsx +60 -5
- package/src/maps/BufferLayer.ts +14 -1
- package/src/maps/BufferLayerDesign.ts +1 -1
- package/src/maps/BufferLayerDesignerComponent.tsx +2 -1
- package/src/maps/ChoroplethLayer.ts +20 -7
- package/src/maps/ChoroplethLayerDesign.ts +5 -2
- package/src/maps/ChoroplethLayerDesigner.tsx +169 -165
- package/src/maps/DirectMapDataSource.ts +0 -12
- package/src/maps/EditHoverOver.tsx +9 -5
- package/src/maps/HoverContent.tsx +1 -1
- package/src/maps/LeafletMapComponent.tsx +10 -19
- package/src/maps/MapComponent.ts +0 -1
- package/src/maps/MapUtils.ts +13 -1
- package/src/maps/MarkersLayer.ts +22 -5
- package/src/maps/MarkersLayerDesign.ts +1 -1
- package/src/maps/MarkersLayerDesignerComponent.tsx +360 -0
- package/src/maps/ServerMapDataSource.ts +0 -12
- package/src/maps/VectorMapViewComponent.tsx +2 -13
- package/src/maps/symbols/font-awesome/asterisk.png +0 -0
- package/src/maps/symbols/font-awesome/ban.png +0 -0
- package/src/maps/symbols/font-awesome/beer.png +0 -0
- package/src/maps/symbols/font-awesome/bell.png +0 -0
- package/src/maps/symbols/font-awesome/bolt.png +0 -0
- package/src/maps/symbols/font-awesome/building.png +0 -0
- package/src/maps/symbols/font-awesome/bullseye.png +0 -0
- package/src/maps/symbols/font-awesome/bus.png +0 -0
- package/src/maps/symbols/font-awesome/caret-up.png +0 -0
- package/src/maps/symbols/font-awesome/certificate.png +0 -0
- package/src/maps/symbols/font-awesome/check-circle.png +0 -0
- package/src/maps/symbols/font-awesome/check.png +0 -0
- package/src/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
- package/src/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
- package/src/maps/symbols/font-awesome/cloud-rain.png +0 -0
- package/src/maps/symbols/font-awesome/cloud.png +0 -0
- package/src/maps/symbols/font-awesome/comment.png +0 -0
- package/src/maps/symbols/font-awesome/crosshairs.png +0 -0
- package/src/maps/symbols/font-awesome/dot-circle-o.png +0 -0
- package/src/maps/symbols/font-awesome/exclamation-circle.png +0 -0
- package/src/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
- package/src/maps/symbols/font-awesome/female.png +0 -0
- package/src/maps/symbols/font-awesome/file.png +0 -0
- package/src/maps/symbols/font-awesome/flag.png +0 -0
- package/src/maps/symbols/font-awesome/flask.png +0 -0
- package/src/maps/symbols/font-awesome/h-square.png +0 -0
- package/src/maps/symbols/font-awesome/home.png +0 -0
- package/src/maps/symbols/font-awesome/info-circle.png +0 -0
- package/src/maps/symbols/font-awesome/male.png +0 -0
- package/src/maps/symbols/font-awesome/medkit.png +0 -0
- package/src/maps/symbols/font-awesome/mobile.png +0 -0
- package/src/maps/symbols/font-awesome/plus-circle.png +0 -0
- package/src/maps/symbols/font-awesome/plus-square.png +0 -0
- package/src/maps/symbols/font-awesome/plus.png +0 -0
- package/src/maps/symbols/font-awesome/square.png +0 -0
- package/src/maps/symbols/font-awesome/star.png +0 -0
- package/src/maps/symbols/font-awesome/thumbs-down.png +0 -0
- package/src/maps/symbols/font-awesome/thumbs-up.png +0 -0
- package/src/maps/symbols/font-awesome/ticket.png +0 -0
- package/src/maps/symbols/font-awesome/times-circle.png +0 -0
- package/src/maps/symbols/font-awesome/times.png +0 -0
- package/src/maps/symbols/font-awesome/tint.png +0 -0
- package/src/maps/symbols/font-awesome/tree.png +0 -0
- package/src/maps/symbols/font-awesome/university.png +0 -0
- package/src/maps/symbols/font-awesome/usd.png +0 -0
- package/src/maps/symbols/font-awesome/user.png +0 -0
- package/src/maps/symbols/font-awesome/users.png +0 -0
- package/src/maps/symbols/font-awesome/wheelchair.png +0 -0
- package/src/maps/symbols/sdf-ize.sh +93 -0
- package/src/maps/vectorMaps.tsx +20 -44
- package/src/mwater_table_selection/IndicatorsListComponent.tsx +165 -37
- package/src/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.tsx +111 -0
- package/src/mwater_table_selection/MWaterCompleteTableSelectComponent.tsx +373 -37
- package/src/mwater_table_selection/MWaterTableSelectComponent.tsx +12 -8
- package/src/mwater_table_selection/MWaterWorkflowsSelectComponent.tsx +159 -0
- package/src/quickfilter/{QuickfiltersComponent.ts → QuickfiltersComponent.tsx} +165 -158
- package/src/quickfilter/TextLiteralComponent.tsx +197 -0
- package/src/widgets/MapWidget.tsx +9 -1
- package/src/widgets/text/ExprItemEditorComponent.tsx +83 -77
- package/src/widgets/text/ExprUpdateModalComponent.tsx +1 -0
- package/test/UndoStackTests.ts +52 -1
- package/.storybook/config.js +0 -7
- package/.storybook/head.html +0 -3
- package/.storybook/webpack.config.js +0 -15
- package/src/maps/BingLayer.ts +0 -146
- package/src/maps/MarkersLayerDesignerComponent.ts +0 -374
- package/src/quickfilter/TextLiteralComponent.ts +0 -165
- package/stories/UpdateableComponent.js +0 -29
- package/stories/consoles.js +0 -202
- package/stories/dashboards.js +0 -217
- package/stories/datagridDesign.js +0 -114
- package/stories/datagrids.js +0 -69
- package/stories/dates.js +0 -80
- package/stories/exprcomponent.js +0 -43
- package/stories/index.js +0 -18
- package/stories/leaflet.js +0 -59
- package/stories/maps.js +0 -24
- 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
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
onChange: this.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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:
|
|
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
|
|
114
|
-
MWaterContextComponent
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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 (
|
|
18
|
+
if (JSON.stringify(this.getValue()) === JSON.stringify(value)) {
|
|
17
19
|
return this
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
/**
|
|
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={{
|
|
533
|
-
|
|
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 {
|