@mwater/visualization 5.4.5 → 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/MWaterContextComponent.js +1 -1
- package/lib/MWaterGlobalFiltersComponent.d.ts +2 -2
- package/lib/MWaterGlobalFiltersComponent.js +11 -20
- package/lib/MWaterLoaderComponent.d.ts +5 -14
- package/lib/MWaterLoaderComponent.js +2 -11
- package/lib/UndoStack.d.ts +2 -1
- package/lib/UndoStack.js +12 -6
- package/lib/dashboards/DashboardComponent.js +7 -5
- package/lib/dashboards/DashboardDesign.d.ts +1 -1
- package/lib/dashboards/LayoutOptionsComponent.js +18 -11
- package/lib/dashboards/ServerDashboardDataSource.d.ts +10 -1
- package/lib/dashboards/ServerDashboardDataSource.js +29 -10
- package/lib/dashboards/SettingsModalComponent.js +1 -1
- package/lib/dashboards/layoutOptions.d.ts +5 -1
- package/lib/datagrids/DatagridComponent.js +23 -3
- 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/ExprCellComponent.d.ts +1 -0
- package/lib/datagrids/ExprCellComponent.js +22 -20
- 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.d.ts +18 -0
- package/lib/maps/BufferLayer.js +36 -14
- package/lib/maps/BufferLayerDesign.d.ts +1 -1
- package/lib/maps/BufferLayerDesignerComponent.js +2 -2
- package/lib/maps/ChoroplethLayer.d.ts +18 -0
- package/lib/maps/ChoroplethLayer.js +46 -25
- package/lib/maps/ChoroplethLayerDesign.d.ts +7 -3
- package/lib/maps/ChoroplethLayerDesigner.d.ts +10 -22
- package/lib/maps/ChoroplethLayerDesigner.js +58 -89
- package/lib/maps/DirectMapDataSource.js +17 -10
- package/lib/maps/EditHoverOver.d.ts +4 -3
- package/lib/maps/EditHoverOver.js +64 -35
- package/lib/maps/HoverContent.d.ts +10 -5
- package/lib/maps/HoverContent.js +7 -36
- package/lib/maps/Layer.d.ts +37 -0
- package/lib/maps/Layer.js +30 -4
- package/lib/maps/LeafletMapComponent.js +10 -19
- package/lib/maps/MWaterServerLayer.d.ts +2 -2
- package/lib/maps/MWaterServerLayer.js +6 -6
- package/lib/maps/MapComponent.js +0 -1
- package/lib/maps/MapLayerDataSource.d.ts +9 -0
- package/lib/maps/MapUtils.d.ts +19 -1
- package/lib/maps/MapUtils.js +80 -1
- package/lib/maps/MarkersLayer.d.ts +18 -0
- package/lib/maps/MarkersLayer.js +42 -26
- package/lib/maps/MarkersLayerDesign.d.ts +1 -1
- package/lib/maps/MarkersLayerDesignerComponent.d.ts +12 -28
- package/lib/maps/MarkersLayerDesignerComponent.js +81 -111
- package/lib/maps/RasterMapViewComponent.js +1 -1
- package/lib/maps/ServerMapDataSource.d.ts +9 -0
- package/lib/maps/ServerMapDataSource.js +29 -10
- package/lib/maps/VectorMapViewComponent.js +7 -15
- package/lib/maps/maps.d.ts +4 -2
- 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/FormsListComponent.d.ts +33 -0
- package/lib/mwater_table_selection/FormsListComponent.js +141 -0
- package/lib/mwater_table_selection/IndicatorsListComponent.d.ts +49 -0
- package/lib/mwater_table_selection/IndicatorsListComponent.js +251 -0
- package/lib/mwater_table_selection/IssuesListComponent.d.ts +29 -0
- package/lib/mwater_table_selection/IssuesListComponent.js +123 -0
- package/lib/mwater_table_selection/MWaterAccountingSystemListComponent.d.ts +20 -0
- package/lib/mwater_table_selection/MWaterAccountingSystemListComponent.js +157 -0
- package/lib/mwater_table_selection/MWaterAssetSystemsListComponent.d.ts +17 -0
- package/lib/mwater_table_selection/MWaterAssetSystemsListComponent.js +79 -0
- 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 +63 -0
- package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.js +461 -0
- package/lib/mwater_table_selection/MWaterCustomTablesetListComponent.d.ts +17 -0
- package/lib/mwater_table_selection/MWaterCustomTablesetListComponent.js +94 -0
- package/lib/mwater_table_selection/MWaterMetricsTableListComponent.d.ts +17 -0
- package/lib/mwater_table_selection/MWaterMetricsTableListComponent.js +80 -0
- package/lib/mwater_table_selection/MWaterTableSelectComponent.d.ts +32 -0
- package/lib/mwater_table_selection/MWaterTableSelectComponent.js +163 -0
- 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/charts/Chart.d.ts +11 -0
- package/lib/widgets/charts/Chart.js +15 -0
- package/lib/widgets/charts/ChartWidgetComponent.d.ts +1 -0
- package/lib/widgets/charts/ChartWidgetComponent.js +27 -1
- package/lib/widgets/charts/layered/LayeredChartDesign.d.ts +1 -1
- package/lib/widgets/charts/layered/LayeredChartDesignerComponent.d.ts +1 -1
- package/lib/widgets/charts/layered/LayeredChartDesignerComponent.js +5 -12
- package/lib/widgets/charts/layered/LayeredChartLayerDesignerComponent.d.ts +43 -57
- package/lib/widgets/charts/layered/LayeredChartLayerDesignerComponent.js +113 -110
- package/lib/widgets/charts/layered/LayeredChartUtils.d.ts +2 -1
- package/lib/widgets/charts/layered/LayeredChartUtils.js +0 -2
- package/lib/widgets/charts/pivot/PivotChart.d.ts +2 -0
- package/lib/widgets/charts/pivot/PivotChart.js +156 -0
- package/lib/widgets/charts/pivot/PivotChartDesignerComponent.d.ts +5 -20
- package/lib/widgets/charts/pivot/PivotChartDesignerComponent.js +31 -61
- package/lib/widgets/charts/pivot/PivotChartLayoutBuilder.d.ts +4 -0
- package/lib/widgets/charts/pivot/PivotChartLayoutBuilder.js +4 -2
- package/lib/widgets/charts/pivot/PivotChartLayoutComponent.d.ts +5 -44
- package/lib/widgets/charts/pivot/PivotChartLayoutComponent.js +38 -63
- package/lib/widgets/charts/pivot/SegmentDesignerComponent.d.ts +7 -68
- package/lib/widgets/charts/pivot/SegmentDesignerComponent.js +58 -106
- package/lib/widgets/charts/table/TableChart.d.ts +2 -0
- package/lib/widgets/charts/table/TableChart.js +172 -1
- package/lib/widgets/charts/table/TableChartDesignerComponent.d.ts +7 -17
- package/lib/widgets/charts/table/TableChartDesignerComponent.js +79 -95
- package/lib/widgets/charts/table/TableChartViewComponent.d.ts +1 -7
- package/lib/widgets/charts/table/TableChartViewComponent.js +19 -27
- 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 +4 -10
- package/src/MWaterContextComponent.tsx +2 -2
- package/src/{MWaterGlobalFiltersComponent.ts → MWaterGlobalFiltersComponent.tsx} +32 -33
- package/src/{MWaterLoaderComponent.ts → MWaterLoaderComponent.tsx} +18 -19
- package/src/UndoStack.ts +14 -6
- package/src/dashboards/DashboardComponent.tsx +7 -5
- package/src/dashboards/DashboardDesign.ts +1 -1
- package/src/dashboards/LayoutOptionsComponent.tsx +22 -10
- package/src/dashboards/ServerDashboardDataSource.ts +36 -13
- package/src/dashboards/SettingsModalComponent.tsx +1 -1
- package/src/dashboards/layoutOptions.tsx +5 -1
- package/src/datagrids/DatagridComponent.tsx +31 -3
- package/src/datagrids/DatagridDesignerComponent.tsx +241 -229
- package/src/datagrids/DatagridViewComponent.tsx +3 -2
- package/src/datagrids/ExprCellComponent.tsx +23 -20
- 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 +48 -20
- package/src/maps/BufferLayerDesign.ts +1 -1
- package/src/maps/BufferLayerDesignerComponent.tsx +2 -1
- package/src/maps/ChoroplethLayer.ts +70 -39
- package/src/maps/ChoroplethLayerDesign.ts +6 -2
- package/src/maps/ChoroplethLayerDesigner.tsx +171 -167
- package/src/maps/DirectMapDataSource.ts +21 -13
- package/src/maps/EditHoverOver.tsx +98 -54
- package/src/maps/HoverContent.tsx +17 -48
- package/src/maps/Layer.ts +42 -4
- package/src/maps/LeafletMapComponent.tsx +10 -19
- package/src/maps/MWaterServerLayer.ts +6 -6
- package/src/maps/MapComponent.ts +0 -1
- package/src/maps/MapLayerDataSource.ts +8 -0
- package/src/maps/MapUtils.ts +82 -3
- package/src/maps/MarkersLayer.ts +54 -27
- package/src/maps/MarkersLayerDesign.ts +1 -1
- package/src/maps/MarkersLayerDesignerComponent.tsx +360 -0
- package/src/maps/RasterMapViewComponent.ts +1 -1
- package/src/maps/ServerMapDataSource.ts +35 -12
- package/src/maps/VectorMapViewComponent.tsx +8 -19
- package/src/maps/maps.ts +4 -2
- 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/FormsListComponent.tsx +188 -0
- package/src/mwater_table_selection/IndicatorsListComponent.tsx +411 -0
- package/src/mwater_table_selection/IssuesListComponent.tsx +167 -0
- package/src/mwater_table_selection/MWaterAccountingSystemListComponent.tsx +225 -0
- package/src/{MWaterAssetSystemsListComponent.tsx → mwater_table_selection/MWaterAssetSystemsListComponent.tsx} +2 -2
- package/src/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.tsx +111 -0
- package/src/mwater_table_selection/MWaterCompleteTableSelectComponent.tsx +713 -0
- package/src/{MWaterCustomTablesetListComponent.tsx → mwater_table_selection/MWaterCustomTablesetListComponent.tsx} +1 -1
- package/src/{MWaterMetricsTableListComponent.tsx → mwater_table_selection/MWaterMetricsTableListComponent.tsx} +1 -1
- package/src/{MWaterTableSelectComponent.tsx → mwater_table_selection/MWaterTableSelectComponent.tsx} +91 -90
- 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/charts/Chart.ts +17 -0
- package/src/widgets/charts/ChartWidgetComponent.tsx +36 -1
- package/src/widgets/charts/layered/LayeredChartDesign.ts +1 -1
- package/src/widgets/charts/layered/LayeredChartDesignerComponent.tsx +23 -24
- package/src/widgets/charts/layered/LayeredChartLayerDesignerComponent.tsx +260 -211
- package/src/widgets/charts/layered/LayeredChartUtils.ts +7 -7
- package/src/widgets/charts/pivot/PivotChart.ts +191 -0
- package/src/widgets/charts/pivot/PivotChartDesignerComponent.tsx +124 -129
- package/src/widgets/charts/pivot/PivotChartLayoutBuilder.ts +4 -2
- package/src/widgets/charts/pivot/PivotChartLayoutComponent.tsx +120 -149
- package/src/widgets/charts/pivot/SegmentDesignerComponent.tsx +178 -198
- package/src/widgets/charts/table/TableChart.ts +177 -1
- package/src/widgets/charts/table/TableChartDesignerComponent.tsx +422 -0
- package/src/widgets/charts/table/{TableChartViewComponent.ts → TableChartViewComponent.tsx} +65 -60
- 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 -4
- package/.storybook/webpack.config.js +0 -15
- package/src/MWaterCompleteTableSelectComponent.tsx +0 -975
- package/src/maps/BingLayer.ts +0 -146
- package/src/maps/MarkersLayerDesignerComponent.ts +0 -374
- package/src/quickfilter/TextLiteralComponent.ts +0 -165
- package/src/widgets/charts/table/TableChartDesignerComponent.ts +0 -441
- 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
|
@@ -28,7 +28,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
const lodash_1 = __importDefault(require("lodash"));
|
|
30
30
|
const react_1 = __importDefault(require("react"));
|
|
31
|
-
const R = react_1.default.createElement;
|
|
32
31
|
const immer_1 = require("immer");
|
|
33
32
|
const expressions_ui_1 = require("@mwater/expressions-ui");
|
|
34
33
|
const expressions_1 = require("@mwater/expressions");
|
|
@@ -41,7 +40,7 @@ const ZoomLevelsComponent_1 = __importDefault(require("./ZoomLevelsComponent"));
|
|
|
41
40
|
const ui = __importStar(require("@mwater/react-library/lib/bootstrap"));
|
|
42
41
|
const AdminScopeAndDetailLevelComponent_1 = __importDefault(require("./AdminScopeAndDetailLevelComponent"));
|
|
43
42
|
const ScopeAndDetailLevelComponent_1 = __importDefault(require("./ScopeAndDetailLevelComponent"));
|
|
44
|
-
const EditHoverOver_1 =
|
|
43
|
+
const EditHoverOver_1 = require("./EditHoverOver");
|
|
45
44
|
// Designer for a choropleth layer
|
|
46
45
|
class ChoroplethLayerDesigner extends react_1.default.Component {
|
|
47
46
|
update(mutation) {
|
|
@@ -151,7 +150,8 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
|
|
|
151
150
|
react_1.default.createElement(expressions_ui_2.TableSelectComponent, { schema: this.props.schema, value: this.props.design.table, onChange: this.handleTableChange, filter: this.props.design.filter, onFilterChange: this.handleFilterChange })));
|
|
152
151
|
}
|
|
153
152
|
renderRegionsTable() {
|
|
154
|
-
|
|
153
|
+
// Regions tables are either "regions." or "regions_<name>" with a shape column
|
|
154
|
+
let options = lodash_1.default.map(lodash_1.default.filter(this.props.schema.getTables(), table => table.id.startsWith("regions.") || (table.id.startsWith("regions_") && this.props.schema.getColumn(table.id, "shape") != null)), table => ({ value: table.id, label: expressions_1.ExprUtils.localizeString(table.name) }));
|
|
155
155
|
const regionsTable = this.props.design.regionsTable || "admin_regions";
|
|
156
156
|
return (react_1.default.createElement("div", { className: "mb-3" },
|
|
157
157
|
react_1.default.createElement("label", { className: "text-muted" }, T `Regions Type`),
|
|
@@ -182,39 +182,27 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
|
|
|
182
182
|
renderScopeAndDetailLevel() {
|
|
183
183
|
const regionsTable = this.props.design.regionsTable || "admin_regions";
|
|
184
184
|
if (regionsTable === "admin_regions") {
|
|
185
|
-
return
|
|
186
|
-
schema: this.props.schema,
|
|
187
|
-
dataSource: this.props.dataSource,
|
|
188
|
-
scope: this.props.design.scope,
|
|
189
|
-
scopeLevel: this.props.design.scopeLevel || 0,
|
|
190
|
-
detailLevel: this.props.design.detailLevel,
|
|
191
|
-
onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange
|
|
192
|
-
});
|
|
185
|
+
return react_1.default.createElement(AdminScopeAndDetailLevelComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, scope: this.props.design.scope, scopeLevel: this.props.design.scopeLevel || 0, detailLevel: this.props.design.detailLevel, onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange });
|
|
193
186
|
}
|
|
194
187
|
else {
|
|
195
|
-
return
|
|
196
|
-
schema: this.props.schema,
|
|
197
|
-
dataSource: this.props.dataSource,
|
|
198
|
-
scope: this.props.design.scope,
|
|
199
|
-
scopeLevel: this.props.design.scopeLevel,
|
|
200
|
-
detailLevel: this.props.design.detailLevel,
|
|
201
|
-
onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange,
|
|
202
|
-
regionsTable
|
|
203
|
-
});
|
|
188
|
+
return react_1.default.createElement(ScopeAndDetailLevelComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, scope: this.props.design.scope, scopeLevel: this.props.design.scopeLevel, detailLevel: this.props.design.detailLevel, onScopeAndDetailLevelChange: this.handleScopeAndDetailLevelChange, regionsTable: regionsTable });
|
|
204
189
|
}
|
|
205
190
|
}
|
|
206
191
|
renderDisplayNames() {
|
|
207
|
-
return
|
|
192
|
+
return (react_1.default.createElement("div", { className: "mb-3" },
|
|
193
|
+
react_1.default.createElement(ui.Checkbox, { value: this.props.design.displayNames, onChange: value => this.handleDisplayNamesChange(value) }, T `Display Region Names`)));
|
|
208
194
|
}
|
|
209
195
|
renderColor() {
|
|
210
196
|
// Only if plain
|
|
211
197
|
if (this.props.design.regionMode !== "plain") {
|
|
212
198
|
return null;
|
|
213
199
|
}
|
|
214
|
-
return
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
200
|
+
return (react_1.default.createElement("div", { className: "mb-3" },
|
|
201
|
+
react_1.default.createElement("label", { className: "text-muted" },
|
|
202
|
+
react_1.default.createElement("span", { className: "fas fa-tint" }),
|
|
203
|
+
T `Fill Color`),
|
|
204
|
+
react_1.default.createElement("div", null,
|
|
205
|
+
react_1.default.createElement(ColorComponent_1.default, { color: this.props.design.color, onChange: this.handleColorChange }))));
|
|
218
206
|
}
|
|
219
207
|
renderColorAxis() {
|
|
220
208
|
// Not applicable if in plain mode, or if in indirect mode with no table
|
|
@@ -235,19 +223,12 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
|
|
|
235
223
|
}
|
|
236
224
|
}
|
|
237
225
|
const table = this.props.design.table;
|
|
238
|
-
return
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
value: this.props.design.axes.color,
|
|
245
|
-
defaultColor: this.props.design.color,
|
|
246
|
-
showColorMap: true,
|
|
247
|
-
onChange: this.handleColorAxisChange,
|
|
248
|
-
allowExcludedValues: true,
|
|
249
|
-
filters: filters
|
|
250
|
-
})));
|
|
226
|
+
return (react_1.default.createElement("div", null,
|
|
227
|
+
react_1.default.createElement("div", { className: "mb-3" },
|
|
228
|
+
react_1.default.createElement("label", { className: "text-muted" },
|
|
229
|
+
react_1.default.createElement("span", { className: "fas fa-tint" }),
|
|
230
|
+
T `Color By Data`),
|
|
231
|
+
react_1.default.createElement(AxisComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, types: ["text", "enum", "boolean", "date"], aggrNeed: "required", value: this.props.design.axes.color, defaultColor: this.props.design.color, showColorMap: true, onChange: this.handleColorAxisChange, allowExcludedValues: true, filters: filters }))));
|
|
251
232
|
}
|
|
252
233
|
else {
|
|
253
234
|
// direct mode
|
|
@@ -275,19 +256,12 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
|
|
|
275
256
|
}
|
|
276
257
|
});
|
|
277
258
|
}
|
|
278
|
-
return
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
value: this.props.design.axes.color,
|
|
285
|
-
defaultColor: this.props.design.color,
|
|
286
|
-
showColorMap: true,
|
|
287
|
-
onChange: this.handleColorAxisChange,
|
|
288
|
-
allowExcludedValues: true,
|
|
289
|
-
filters: filters
|
|
290
|
-
})));
|
|
259
|
+
return (react_1.default.createElement("div", null,
|
|
260
|
+
react_1.default.createElement("div", { className: "mb-3" },
|
|
261
|
+
react_1.default.createElement("label", { className: "text-muted" },
|
|
262
|
+
react_1.default.createElement("span", { className: "fas fa-tint" }),
|
|
263
|
+
T `Color By Data`),
|
|
264
|
+
react_1.default.createElement(AxisComponent_1.default, { schema: this.props.schema, dataSource: this.props.dataSource, table: regionsTable, types: ["text", "enum", "boolean", "date"], aggrNeed: "none", value: this.props.design.axes.color, defaultColor: this.props.design.color, showColorMap: true, onChange: this.handleColorAxisChange, allowExcludedValues: true, filters: filters }))));
|
|
291
265
|
}
|
|
292
266
|
}
|
|
293
267
|
// renderLabelAxis: ->
|
|
@@ -309,33 +283,30 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
|
|
|
309
283
|
// showColorMap: true
|
|
310
284
|
// onChange: @handleColorAxisChange)
|
|
311
285
|
renderFillOpacity() {
|
|
312
|
-
return
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
step: 1,
|
|
316
|
-
tipTransitionName: "rc-slider-tooltip-zoom-down",
|
|
317
|
-
value: Math.round(this.props.design.fillOpacity * this.props.design.fillOpacity * 100),
|
|
318
|
-
onChange: (val) => this.handleFillOpacityChange(Math.sqrt(val / 100))
|
|
319
|
-
}));
|
|
286
|
+
return (react_1.default.createElement("div", { className: "mb-3" },
|
|
287
|
+
react_1.default.createElement("label", { className: "text-muted" }, T `Fill Opacity: ${(this.props.design.fillOpacity * this.props.design.fillOpacity * 100).toFixed(0)}%`),
|
|
288
|
+
": ",
|
|
289
|
+
react_1.default.createElement(rc_slider_1.default, { min: 0, max: 100, step: 1, tipTransitionName: "rc-slider-tooltip-zoom-down", value: Math.round(this.props.design.fillOpacity * this.props.design.fillOpacity * 100), onChange: (val) => this.handleFillOpacityChange(Math.sqrt(val / 100)) })));
|
|
320
290
|
}
|
|
321
291
|
renderBorderColor() {
|
|
322
|
-
return
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
292
|
+
return (react_1.default.createElement("div", { className: "mb-3" },
|
|
293
|
+
react_1.default.createElement("label", { className: "text-muted" },
|
|
294
|
+
react_1.default.createElement("span", { className: "fas fa-tint" }),
|
|
295
|
+
T `Border Color`),
|
|
296
|
+
react_1.default.createElement("div", null,
|
|
297
|
+
react_1.default.createElement(ColorComponent_1.default, { color: this.props.design.borderColor || "#000", onChange: this.handleBorderColorChange }))));
|
|
326
298
|
}
|
|
327
299
|
renderFilter() {
|
|
328
300
|
// If not in indirect mode with table, hide
|
|
329
301
|
if (this.props.design.regionMode !== "indirect" || !this.props.design.table) {
|
|
330
302
|
return null;
|
|
331
303
|
}
|
|
332
|
-
return
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
})));
|
|
304
|
+
return (react_1.default.createElement("div", { className: "mb-3" },
|
|
305
|
+
react_1.default.createElement("label", { className: "text-muted" },
|
|
306
|
+
react_1.default.createElement("span", { className: "fas fa-filter" }),
|
|
307
|
+
T `Filters`),
|
|
308
|
+
react_1.default.createElement("div", { style: { marginLeft: 8 } },
|
|
309
|
+
react_1.default.createElement(expressions_ui_1.FilterExprComponent, { schema: this.props.schema, dataSource: this.props.dataSource, onChange: this.handleFilterChange, table: this.props.design.table, value: this.props.design.filter }))));
|
|
339
310
|
}
|
|
340
311
|
renderPopup() {
|
|
341
312
|
// If not in indirect mode with table, hide
|
|
@@ -347,15 +318,7 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
|
|
|
347
318
|
if (this.props.design.adminRegionExpr) {
|
|
348
319
|
defaultPopupFilterJoins[this.props.design.table] = this.props.design.adminRegionExpr;
|
|
349
320
|
}
|
|
350
|
-
return
|
|
351
|
-
design: this.props.design,
|
|
352
|
-
onDesignChange: this.props.onDesignChange,
|
|
353
|
-
schema: this.props.schema,
|
|
354
|
-
dataSource: this.props.dataSource,
|
|
355
|
-
table: this.props.design.table,
|
|
356
|
-
idTable: regionsTable,
|
|
357
|
-
defaultPopupFilterJoins
|
|
358
|
-
});
|
|
321
|
+
return react_1.default.createElement(EditPopupComponent_1.default, { design: this.props.design, onDesignChange: this.props.onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, idTable: regionsTable, defaultPopupFilterJoins: defaultPopupFilterJoins });
|
|
359
322
|
}
|
|
360
323
|
renderHoverOver() {
|
|
361
324
|
// If not in indirect mode with table, hide
|
|
@@ -367,18 +330,24 @@ class ChoroplethLayerDesigner extends react_1.default.Component {
|
|
|
367
330
|
if (this.props.design.adminRegionExpr) {
|
|
368
331
|
defaultPopupFilterJoins[this.props.design.table] = this.props.design.adminRegionExpr;
|
|
369
332
|
}
|
|
370
|
-
return
|
|
371
|
-
design: this.props.design,
|
|
372
|
-
onDesignChange: this.props.onDesignChange,
|
|
373
|
-
schema: this.props.schema,
|
|
374
|
-
dataSource: this.props.dataSource,
|
|
375
|
-
table: this.props.design.table,
|
|
376
|
-
idTable: regionsTable,
|
|
377
|
-
defaultPopupFilterJoins
|
|
378
|
-
});
|
|
333
|
+
return react_1.default.createElement(EditHoverOver_1.EditHoverOver, { design: this.props.design, onDesignChange: this.props.onDesignChange, schema: this.props.schema, dataSource: this.props.dataSource, table: this.props.design.table, idTable: regionsTable, defaultPopupFilterJoins: defaultPopupFilterJoins, aggrStatuses: ["individual", "aggregate", "literal"] });
|
|
379
334
|
}
|
|
380
335
|
render() {
|
|
381
|
-
return
|
|
336
|
+
return (react_1.default.createElement("div", null,
|
|
337
|
+
this.renderRegionMode(),
|
|
338
|
+
this.renderRegionsTable(),
|
|
339
|
+
this.renderTable(),
|
|
340
|
+
this.renderAdminRegionExpr(),
|
|
341
|
+
this.renderScopeAndDetailLevel(),
|
|
342
|
+
this.renderDisplayNames(),
|
|
343
|
+
this.renderColor(),
|
|
344
|
+
this.renderColorAxis(),
|
|
345
|
+
this.renderFillOpacity(),
|
|
346
|
+
this.renderBorderColor(),
|
|
347
|
+
this.renderFilter(),
|
|
348
|
+
this.renderPopup(),
|
|
349
|
+
this.renderHoverOver(),
|
|
350
|
+
react_1.default.createElement(ZoomLevelsComponent_1.default, { design: this.props.design, onDesignChange: this.props.onDesignChange })));
|
|
382
351
|
}
|
|
383
352
|
}
|
|
384
353
|
exports.default = ChoroplethLayerDesigner;
|
|
@@ -227,22 +227,12 @@ class DirectLayerDataSource {
|
|
|
227
227
|
query.cacheExpiry = cacheExpiry;
|
|
228
228
|
}
|
|
229
229
|
let url = `${this.options.apiUrl}maps/tiles/{z}/{x}/{y}.${extension}?` + querystring_1.default.stringify(query);
|
|
230
|
-
// Add subdomains: {s} will be substituted with "a", "b" or "c" in leaflet for api.mwater.co only.
|
|
231
|
-
// Used to speed queries
|
|
232
|
-
if (url.match(/^https:\/\/api\.mwater\.co\//)) {
|
|
233
|
-
url = url.replace(/^https:\/\/api\.mwater\.co\//, "https://{s}-api.mwater.co/");
|
|
234
|
-
}
|
|
235
230
|
return url;
|
|
236
231
|
}
|
|
237
232
|
// Create query string
|
|
238
233
|
createLegacyUrl(design, extension, filters) {
|
|
239
234
|
let where;
|
|
240
235
|
let url = `${this.options.apiUrl}maps/tiles/{z}/{x}/{y}.${extension}?type=${design.type}&radius=1000`;
|
|
241
|
-
// Add subdomains: {s} will be substituted with "a", "b" or "c" in leaflet for api.mwater.co only.
|
|
242
|
-
// Used to speed queries
|
|
243
|
-
if (url.match(/^https:\/\/api\.mwater\.co\//)) {
|
|
244
|
-
url = url.replace(/^https:\/\/api\.mwater\.co\//, "https://{s}-api.mwater.co/");
|
|
245
|
-
}
|
|
246
236
|
if (this.options.client) {
|
|
247
237
|
url += `&client=${this.options.client}`;
|
|
248
238
|
}
|
|
@@ -262,4 +252,21 @@ class DirectLayerDataSource {
|
|
|
262
252
|
}
|
|
263
253
|
return url;
|
|
264
254
|
}
|
|
255
|
+
/** Gets hover over data for hover over items
|
|
256
|
+
* @param design The design of the layer
|
|
257
|
+
* @param data The data of the current item being hovered over. e.g. { id: 123 }
|
|
258
|
+
* @param filters The filters to apply to the hover over data, not including filtering down to the current item
|
|
259
|
+
* @returns A promise that resolves to the hover over data, indexed by the id of the hover over item
|
|
260
|
+
*/
|
|
261
|
+
getHoverOverData(design, data, filters) {
|
|
262
|
+
// Create layer
|
|
263
|
+
const layer = LayerFactory_1.default.createLayer(this.options.layerView.type);
|
|
264
|
+
return layer.getHoverOverData({
|
|
265
|
+
design,
|
|
266
|
+
data,
|
|
267
|
+
filters,
|
|
268
|
+
schema: this.options.schema,
|
|
269
|
+
dataSource: this.options.dataSource,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
265
272
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DataSource, Schema } from "@mwater/expressions";
|
|
1
|
+
import { AggrStatus, DataSource, Schema } from "@mwater/expressions";
|
|
2
2
|
import React from "react";
|
|
3
3
|
export interface EditHoverOverProps {
|
|
4
4
|
/** Schema to use */
|
|
@@ -13,6 +13,7 @@ export interface EditHoverOverProps {
|
|
|
13
13
|
/** Table of the row that join is to. Usually same as table except for choropleth maps */
|
|
14
14
|
idTable: string;
|
|
15
15
|
defaultPopupFilterJoins: any;
|
|
16
|
+
/** Aggr statuses to allow in hover over expressions */
|
|
17
|
+
aggrStatuses: AggrStatus[];
|
|
16
18
|
}
|
|
17
|
-
declare
|
|
18
|
-
export default EditHoverOver;
|
|
19
|
+
export declare function EditHoverOver(props: EditHoverOverProps): React.JSX.Element;
|
|
@@ -26,65 +26,94 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.EditHoverOver = EditHoverOver;
|
|
29
30
|
const lodash_1 = require("lodash");
|
|
31
|
+
const expressions_1 = require("@mwater/expressions");
|
|
30
32
|
const expressions_ui_1 = require("@mwater/expressions-ui");
|
|
31
33
|
const react_1 = __importStar(require("react"));
|
|
32
|
-
const
|
|
34
|
+
const ActionCancelModalComponent_1 = __importDefault(require("@mwater/react-library/lib/ActionCancelModalComponent"));
|
|
33
35
|
const ui = __importStar(require("@mwater/react-library/lib/bootstrap"));
|
|
34
36
|
const uuid_1 = __importDefault(require("uuid"));
|
|
35
|
-
const
|
|
37
|
+
const valueFormatter_1 = require("../valueFormatter");
|
|
38
|
+
const valueFormatter_2 = require("../valueFormatter");
|
|
39
|
+
function EditHoverOver(props) {
|
|
40
|
+
const { schema, dataSource, design, onDesignChange, table } = props;
|
|
36
41
|
const [editing, setEditing] = (0, react_1.useState)(false);
|
|
42
|
+
const [draftItems, setDraftItems] = (0, react_1.useState)(undefined);
|
|
37
43
|
const handleRemovePopup = () => {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
};
|
|
41
|
-
const handleDesignChange = (items) => {
|
|
42
|
-
const hoverOver = { ...(props.design.hoverOver ?? {}), items };
|
|
43
|
-
const design = { ...props.design, hoverOver };
|
|
44
|
-
return props.onDesignChange(design);
|
|
44
|
+
const newDesign = (0, lodash_1.omit)(design, "hoverOver");
|
|
45
|
+
onDesignChange(newDesign);
|
|
45
46
|
};
|
|
46
47
|
const handleItemChange = (item) => {
|
|
47
|
-
|
|
48
|
-
const design = { ...props.design, hoverOver: { ...props.design.hoverOver, items } };
|
|
49
|
-
return props.onDesignChange(design);
|
|
48
|
+
setDraftItems(draftItems?.map((i) => (item.id === i.id ? item : i)));
|
|
50
49
|
};
|
|
51
50
|
const handleItemDelete = (item) => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
setDraftItems(draftItems?.filter((i) => item.id !== i.id));
|
|
52
|
+
};
|
|
53
|
+
const handleAddItem = () => {
|
|
54
|
+
setDraftItems([...(draftItems ?? []), { id: (0, uuid_1.default)().replace(/-/g, ""), label: "" }]);
|
|
55
|
+
};
|
|
56
|
+
const handleSave = () => {
|
|
57
|
+
const hoverOver = { ...(design.hoverOver ?? {}), items: draftItems ?? [] };
|
|
58
|
+
const newDesign = { ...design, hoverOver };
|
|
59
|
+
onDesignChange(newDesign);
|
|
60
|
+
setEditing(false);
|
|
61
|
+
setDraftItems(undefined);
|
|
62
|
+
};
|
|
63
|
+
const handleCancel = () => {
|
|
64
|
+
setEditing(false);
|
|
65
|
+
setDraftItems(undefined);
|
|
66
|
+
};
|
|
67
|
+
const handleOpen = () => {
|
|
68
|
+
setDraftItems(design.hoverOver?.items ?? []);
|
|
69
|
+
setEditing(true);
|
|
55
70
|
};
|
|
56
71
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
57
|
-
react_1.default.createElement("button", { className: "btn btn-link", onClick:
|
|
72
|
+
react_1.default.createElement("button", { className: "btn btn-link", onClick: handleOpen },
|
|
58
73
|
react_1.default.createElement("span", { className: "fa fa-pencil" }),
|
|
59
74
|
" ",
|
|
60
75
|
T `Customize Hoverover`),
|
|
61
|
-
|
|
76
|
+
design.hoverOver && (react_1.default.createElement("button", { className: "btn btn-link", onClick: handleRemovePopup },
|
|
62
77
|
react_1.default.createElement("span", { className: "fa fa-times" }),
|
|
63
78
|
" ",
|
|
64
79
|
T `Remove Hover over`)),
|
|
65
|
-
editing && (react_1.default.createElement(
|
|
66
|
-
(
|
|
80
|
+
editing && (react_1.default.createElement(ActionCancelModalComponent_1.default, { onAction: handleSave, onCancel: handleCancel, actionLabel: T `Save`, title: T `Customize Hoverover`, size: "x-large" },
|
|
81
|
+
(draftItems ?? []).length > 0 && (react_1.default.createElement("table", { className: "table" },
|
|
67
82
|
react_1.default.createElement("thead", null,
|
|
68
83
|
react_1.default.createElement("tr", null,
|
|
69
84
|
react_1.default.createElement("th", null, T `Label`),
|
|
70
85
|
react_1.default.createElement("th", null, T `Value`),
|
|
71
|
-
react_1.default.createElement("th",
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
};
|
|
80
|
-
|
|
86
|
+
react_1.default.createElement("th", { style: { width: "1%", whiteSpace: "nowrap" } }, T `Format`),
|
|
87
|
+
react_1.default.createElement("th", { style: { width: "1%", whiteSpace: "nowrap" } }))),
|
|
88
|
+
react_1.default.createElement("tbody", null, draftItems?.map((item) => (react_1.default.createElement(HoverOverItemEditor, { key: item.id, schema: schema, dataSource: dataSource, table: table, onItemChange: handleItemChange, onItemDelete: handleItemDelete, item: item, aggrStatuses: props.aggrStatuses })))))),
|
|
89
|
+
react_1.default.createElement("button", { className: "btn btn-link", onClick: handleAddItem },
|
|
90
|
+
react_1.default.createElement("span", { className: "fas fa-plus me-1" }),
|
|
91
|
+
T `Add Item`)))));
|
|
92
|
+
}
|
|
93
|
+
function HoverOverItemEditor(props) {
|
|
94
|
+
const { schema, dataSource, table, item, onItemChange, onItemDelete } = props;
|
|
95
|
+
function renderFormat() {
|
|
96
|
+
const exprUtils = new expressions_1.ExprUtils(schema);
|
|
97
|
+
const exprType = exprUtils.getExprType(item.value ?? null);
|
|
98
|
+
if (!exprType) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
if (!(0, valueFormatter_1.canFormatType)(exprType)) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const formats = (0, valueFormatter_2.getFormatOptions)(exprType);
|
|
105
|
+
if (!formats) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
return (react_1.default.createElement(ui.Select, { options: formats.map(f => ({ value: f.value, label: f.label })), value: item.format ?? (0, valueFormatter_1.getDefaultFormat)(exprType), onChange: value => onItemChange({ ...item, format: value ?? undefined }), style: { width: "auto", display: "inline-block" } }));
|
|
109
|
+
}
|
|
81
110
|
return (react_1.default.createElement("tr", null,
|
|
82
|
-
react_1.default.createElement("td",
|
|
111
|
+
react_1.default.createElement("td", { className: "align-middle" },
|
|
83
112
|
react_1.default.createElement(ui.TextInput, { value: item.label, onChange: value => onItemChange({ ...item, label: value }) })),
|
|
84
|
-
react_1.default.createElement("td",
|
|
85
|
-
react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: schema, dataSource: dataSource, table: table, types: ["text", "number", "enum", "boolean", "date", "datetime", "id"], onChange: expr => onItemChange({ ...item, value: expr }), value: item.value ?? null, aggrStatuses:
|
|
86
|
-
react_1.default.createElement("td",
|
|
113
|
+
react_1.default.createElement("td", { className: "align-middle" },
|
|
114
|
+
react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: schema, dataSource: dataSource, table: table, types: ["text", "number", "enum", "boolean", "date", "datetime", "id"], onChange: expr => onItemChange({ ...item, value: expr }), value: item.value ?? null, aggrStatuses: props.aggrStatuses })),
|
|
115
|
+
react_1.default.createElement("td", { className: "align-middle", style: { width: "1%", whiteSpace: "nowrap" } }, renderFormat()),
|
|
116
|
+
react_1.default.createElement("td", { className: "align-middle", style: { width: "1%", whiteSpace: "nowrap" } },
|
|
87
117
|
react_1.default.createElement("button", { className: "btn btn-link", onClick: () => onItemDelete(item) },
|
|
88
118
|
react_1.default.createElement("span", { className: "fa fa-close" })))));
|
|
89
|
-
}
|
|
90
|
-
exports.default = EditHoverOver;
|
|
119
|
+
}
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { Schema } from "@mwater/expressions";
|
|
3
3
|
import { JsonQLFilter } from "..";
|
|
4
4
|
import { HoverOverItem } from "./maps";
|
|
5
|
+
import { MapLayerDataSource } from "./MapLayerDataSource";
|
|
5
6
|
export interface HoverContentProps {
|
|
6
7
|
/** Schema to use */
|
|
7
8
|
schema: Schema;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
|
|
9
|
+
/** Map data source */
|
|
10
|
+
mapLayerDataSource: MapLayerDataSource;
|
|
11
|
+
/** Design of the layer */
|
|
12
|
+
design: any;
|
|
13
|
+
/** Data of the current item being hovered over. e.g. { id: 123 } */
|
|
14
|
+
data: any;
|
|
15
|
+
/** Additional filters to apply to the hover over data */
|
|
16
|
+
filters: JsonQLFilter[];
|
|
12
17
|
/** Hover over items */
|
|
13
18
|
items: HoverOverItem[];
|
|
14
19
|
/** Locale to use */
|
package/lib/maps/HoverContent.js
CHANGED
|
@@ -25,7 +25,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
const react_1 = __importStar(require("react"));
|
|
27
27
|
const expressions_1 = require("@mwater/expressions");
|
|
28
|
-
const lodash_1 = require("lodash");
|
|
29
28
|
const valueFormatter_1 = require("../valueFormatter");
|
|
30
29
|
const valueFormatter_2 = require("../valueFormatter");
|
|
31
30
|
/** Component that displays hover over content */
|
|
@@ -37,42 +36,14 @@ const HoverContent = (props) => {
|
|
|
37
36
|
let mounted = true;
|
|
38
37
|
const items = props.items;
|
|
39
38
|
if (items.length > 0) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
selects: [],
|
|
44
|
-
from: exprCompiler.compileTable(props.table, "main"),
|
|
45
|
-
limit: 1
|
|
46
|
-
};
|
|
47
|
-
items.forEach((item) => {
|
|
48
|
-
if (item.value) {
|
|
49
|
-
query.selects.push({
|
|
50
|
-
type: "select",
|
|
51
|
-
expr: exprCompiler.compileExpr({ expr: item.value, tableAlias: "main" }),
|
|
52
|
-
alias: item.id
|
|
53
|
-
});
|
|
39
|
+
props.mapLayerDataSource.getHoverOverData(props.design, props.data, props.filters).then((data) => {
|
|
40
|
+
if (mounted) {
|
|
41
|
+
setValues(data);
|
|
54
42
|
}
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
whereClauses = (0, lodash_1.compact)(whereClauses);
|
|
59
|
-
// Wrap if multiple
|
|
60
|
-
if (whereClauses.length > 1) {
|
|
61
|
-
query.where = { type: "op", op: "and", exprs: whereClauses };
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
query.where = whereClauses[0];
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
props.dataSource.performQuery(query, (error, data) => {
|
|
68
|
-
if (!mounted) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (error) {
|
|
72
|
-
setError(props.translate("Error loading hover data"));
|
|
73
|
-
return;
|
|
43
|
+
}).catch((error) => {
|
|
44
|
+
if (mounted) {
|
|
45
|
+
setError(error.message);
|
|
74
46
|
}
|
|
75
|
-
setValues(data?.[0] ?? {});
|
|
76
47
|
});
|
|
77
48
|
}
|
|
78
49
|
return () => {
|
|
@@ -82,7 +53,7 @@ const HoverContent = (props) => {
|
|
|
82
53
|
if (error) {
|
|
83
54
|
return react_1.default.createElement("div", { className: "text-danger" }, error);
|
|
84
55
|
}
|
|
85
|
-
return (react_1.default.createElement("div", { className: "
|
|
56
|
+
return (react_1.default.createElement("div", { className: "mwater-visualization-map-hover-content" }, props.items.map((item) => {
|
|
86
57
|
let value = values[item.id];
|
|
87
58
|
if (value != null && item.value) {
|
|
88
59
|
// Get expression type
|
package/lib/maps/Layer.d.ts
CHANGED
|
@@ -130,6 +130,25 @@ export default class Layer<LayerDesign> {
|
|
|
130
130
|
data: any;
|
|
131
131
|
event: any;
|
|
132
132
|
}, options: OnGridClickOptions<LayerDesign>): OnGridClickResults;
|
|
133
|
+
/**
|
|
134
|
+
* Called when the interactivity grid is hovered over.
|
|
135
|
+
* arguments:
|
|
136
|
+
* ev: { data: interactivty data e.g. `{ id: 123 }` }
|
|
137
|
+
* options:
|
|
138
|
+
* design: design of layer
|
|
139
|
+
* schema: schema to use
|
|
140
|
+
* dataSource: data source to use
|
|
141
|
+
* layerDataSource: layer data source
|
|
142
|
+
* scopeData: current scope data if layer is scoping
|
|
143
|
+
* filters: compiled filters to apply to the popup
|
|
144
|
+
*
|
|
145
|
+
* Returns:
|
|
146
|
+
* null
|
|
147
|
+
* or
|
|
148
|
+
* {
|
|
149
|
+
* hoverOver: React element to put into a hover over
|
|
150
|
+
* }
|
|
151
|
+
*/
|
|
133
152
|
onGridHoverOver(ev: {
|
|
134
153
|
data: any;
|
|
135
154
|
event: any;
|
|
@@ -172,6 +191,24 @@ export default class Layer<LayerDesign> {
|
|
|
172
191
|
} | null) => void): void;
|
|
173
192
|
/** Get strings to be translated */
|
|
174
193
|
getTranslatableStrings(design: LayerDesign, schema: Schema): string[];
|
|
194
|
+
/** Gets hover over data for hover over items. This should be implemented by layers that have hover over items.
|
|
195
|
+
* It will be called on the server side if using a server map data source, or on the client side if using a direct
|
|
196
|
+
* map data source.
|
|
197
|
+
*/
|
|
198
|
+
getHoverOverData(options: {
|
|
199
|
+
/** Design of the layer */
|
|
200
|
+
design: LayerDesign;
|
|
201
|
+
/** Data of the current item being hovered over. e.g. { id: 123 } */
|
|
202
|
+
data: any;
|
|
203
|
+
/** Filters to apply to the hover over data, not including filtering down to the current item */
|
|
204
|
+
filters: JsonQLFilter[];
|
|
205
|
+
/** Schema to use */
|
|
206
|
+
schema: Schema;
|
|
207
|
+
/** Data source to use */
|
|
208
|
+
dataSource: DataSource;
|
|
209
|
+
}): Promise<{
|
|
210
|
+
[key: string]: any;
|
|
211
|
+
}>;
|
|
175
212
|
}
|
|
176
213
|
export interface LegendOptions<LayerDesign> {
|
|
177
214
|
design: LayerDesign;
|
package/lib/maps/Layer.js
CHANGED
|
@@ -56,6 +56,25 @@ class Layer {
|
|
|
56
56
|
onGridClick(ev, options) {
|
|
57
57
|
return null;
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Called when the interactivity grid is hovered over.
|
|
61
|
+
* arguments:
|
|
62
|
+
* ev: { data: interactivty data e.g. `{ id: 123 }` }
|
|
63
|
+
* options:
|
|
64
|
+
* design: design of layer
|
|
65
|
+
* schema: schema to use
|
|
66
|
+
* dataSource: data source to use
|
|
67
|
+
* layerDataSource: layer data source
|
|
68
|
+
* scopeData: current scope data if layer is scoping
|
|
69
|
+
* filters: compiled filters to apply to the popup
|
|
70
|
+
*
|
|
71
|
+
* Returns:
|
|
72
|
+
* null
|
|
73
|
+
* or
|
|
74
|
+
* {
|
|
75
|
+
* hoverOver: React element to put into a hover over
|
|
76
|
+
* }
|
|
77
|
+
*/
|
|
59
78
|
onGridHoverOver(ev, options) {
|
|
60
79
|
return null;
|
|
61
80
|
}
|
|
@@ -168,10 +187,10 @@ class Layer {
|
|
|
168
187
|
const [w, s, e, n] = (0, bbox_1.default)(results[0].bounds);
|
|
169
188
|
// Pad bounds to prevent too small box (100m)
|
|
170
189
|
bounds = {
|
|
171
|
-
w: w - 0.001,
|
|
172
|
-
s: s - 0.001,
|
|
173
|
-
e: e + 0.001,
|
|
174
|
-
n: n + 0.001
|
|
190
|
+
w: Math.max(w - 0.001, -180),
|
|
191
|
+
s: Math.max(s - 0.001, -90),
|
|
192
|
+
e: Math.min(e + 0.001, 180),
|
|
193
|
+
n: Math.min(n + 0.001, 90)
|
|
175
194
|
};
|
|
176
195
|
}
|
|
177
196
|
return callback(null, bounds);
|
|
@@ -182,5 +201,12 @@ class Layer {
|
|
|
182
201
|
getTranslatableStrings(design, schema) {
|
|
183
202
|
return [];
|
|
184
203
|
}
|
|
204
|
+
/** Gets hover over data for hover over items. This should be implemented by layers that have hover over items.
|
|
205
|
+
* It will be called on the server side if using a server map data source, or on the client side if using a direct
|
|
206
|
+
* map data source.
|
|
207
|
+
*/
|
|
208
|
+
getHoverOverData(options) {
|
|
209
|
+
return Promise.resolve({});
|
|
210
|
+
}
|
|
185
211
|
}
|
|
186
212
|
exports.default = Layer;
|