@mwater/visualization 5.5.0 → 5.6.1
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/ColorComponent.js +2 -2
- 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/TranslationsTabComponent.d.ts +34 -0
- package/lib/TranslationsTabComponent.js +256 -0
- package/lib/UndoStack.d.ts +2 -1
- package/lib/UndoStack.js +12 -6
- package/lib/dashboards/DashboardComponent.js +6 -5
- package/lib/dashboards/DashboardDesign.d.ts +1 -1
- package/lib/dashboards/ServerDashboardDataSource.d.ts +0 -1
- package/lib/dashboards/ServerDashboardDataSource.js +0 -25
- package/lib/dashboards/SettingsModalComponent.js +9 -233
- package/lib/datagrids/DatagridComponent.js +27 -2
- package/lib/datagrids/DatagridDesignerComponent.d.ts +2 -3
- package/lib/datagrids/DatagridDesignerComponent.js +108 -120
- package/lib/datagrids/DatagridViewComponent.js +33 -6
- 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 +0 -13
- package/lib/maps/BufferLayer.js +24 -237
- package/lib/maps/BufferLayerDesign.d.ts +1 -1
- package/lib/maps/BufferLayerDesignerComponent.d.ts +1 -1
- package/lib/maps/BufferLayerDesignerComponent.js +2 -7
- package/lib/maps/ChoroplethLayer.d.ts +1 -16
- package/lib/maps/ChoroplethLayer.js +25 -358
- 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/ClusterLayer.d.ts +0 -9
- package/lib/maps/ClusterLayer.js +0 -250
- package/lib/maps/DirectMapDataSource.js +1 -48
- package/lib/maps/EditHoverOver.d.ts +4 -3
- package/lib/maps/EditHoverOver.js +3 -3
- package/lib/maps/GridLayer.d.ts +0 -15
- package/lib/maps/GridLayer.js +0 -212
- package/lib/maps/HoverContent.js +1 -1
- package/lib/maps/Layer.d.ts +1 -26
- package/lib/maps/Layer.js +0 -13
- package/lib/maps/LeafletMapComponent.js +10 -19
- package/lib/maps/MapComponent.d.ts +19 -35
- package/lib/maps/MapComponent.js +135 -77
- package/lib/maps/MapControlComponent.d.ts +4 -5
- package/lib/maps/MapControlComponent.js +5 -12
- package/lib/maps/MapDesign.d.ts +8 -0
- package/lib/maps/MapDesignerComponent.d.ts +2 -0
- package/lib/maps/MapDesignerComponent.js +7 -2
- package/lib/maps/MapLayerDataSource.d.ts +0 -4
- package/lib/maps/MapLayerViewDesignerComponent.d.ts +3 -1
- package/lib/maps/MapLayerViewDesignerComponent.js +5 -1
- package/lib/maps/MapLayersDesignerComponent.d.ts +2 -0
- package/lib/maps/MapLayersDesignerComponent.js +2 -1
- package/lib/maps/MapTranslationsTab.d.ts +15 -0
- package/lib/maps/MapTranslationsTab.js +47 -0
- package/lib/maps/MapUtils.d.ts +11 -0
- package/lib/maps/MapUtils.js +57 -1
- package/lib/maps/MapViewComponent.d.ts +1 -1
- package/lib/maps/MapViewComponent.js +1 -8
- package/lib/maps/MarkersLayer.d.ts +1 -14
- package/lib/maps/MarkersLayer.js +89 -254
- package/lib/maps/MarkersLayerDesign.d.ts +5 -1
- package/lib/maps/MarkersLayerDesignerComponent.d.ts +32 -57
- package/lib/maps/MarkersLayerDesignerComponent.js +158 -134
- package/lib/maps/ServerMapDataSource.d.ts +0 -1
- package/lib/maps/ServerMapDataSource.js +0 -25
- package/lib/maps/SwitchableTileUrlLayer.d.ts +0 -2
- package/lib/maps/SwitchableTileUrlLayer.js +0 -9
- package/lib/maps/TileUrlLayer.d.ts +0 -1
- package/lib/maps/TileUrlLayer.js +0 -5
- package/lib/maps/VectorMapViewComponent.js +13 -10
- 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 +6 -6
- package/lib/maps/vectorMaps.js +33 -45
- 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 +6 -3
- 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 +3 -4
- package/src/ColorComponent.tsx +2 -2
- package/src/MWaterContextComponent.tsx +1 -1
- package/src/{MWaterGlobalFiltersComponent.ts → MWaterGlobalFiltersComponent.tsx} +32 -33
- package/src/{MWaterLoaderComponent.ts → MWaterLoaderComponent.tsx} +17 -18
- package/src/TranslationsTabComponent.tsx +429 -0
- package/src/UndoStack.ts +14 -6
- package/src/dashboards/DashboardComponent.tsx +6 -5
- package/src/dashboards/DashboardDesign.ts +1 -1
- package/src/dashboards/ServerDashboardDataSource.ts +0 -31
- package/src/dashboards/SettingsModalComponent.tsx +27 -383
- package/src/datagrids/DatagridComponent.tsx +36 -2
- package/src/datagrids/DatagridDesignerComponent.tsx +241 -229
- package/src/datagrids/DatagridViewComponent.tsx +44 -7
- 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 +30 -263
- package/src/maps/BufferLayerDesign.ts +1 -1
- package/src/maps/BufferLayerDesignerComponent.tsx +2 -7
- package/src/maps/ChoroplethLayer.ts +30 -394
- package/src/maps/ChoroplethLayerDesign.ts +5 -2
- package/src/maps/ChoroplethLayerDesigner.tsx +169 -165
- package/src/maps/ClusterLayer.ts +0 -274
- package/src/maps/DirectMapDataSource.ts +2 -61
- package/src/maps/EditHoverOver.tsx +9 -5
- package/src/maps/GridLayer.ts +0 -224
- package/src/maps/HoverContent.tsx +1 -1
- package/src/maps/Layer.ts +1 -35
- package/src/maps/LeafletMapComponent.tsx +10 -19
- package/src/maps/MapComponent.tsx +448 -0
- package/src/maps/MapControlComponent.tsx +41 -0
- package/src/maps/MapDesign.ts +6 -0
- package/src/maps/MapDesignerComponent.tsx +18 -1
- package/src/maps/MapLayerDataSource.ts +0 -5
- package/src/maps/MapLayerViewDesignerComponent.ts +9 -2
- package/src/maps/MapLayersDesignerComponent.ts +4 -1
- package/src/maps/MapTranslationsTab.tsx +53 -0
- package/src/maps/MapUtils.ts +61 -1
- package/src/maps/MapViewComponent.tsx +2 -8
- package/src/maps/MarkersLayer.ts +101 -275
- package/src/maps/MarkersLayerDesign.ts +7 -1
- package/src/maps/MarkersLayerDesignerComponent.tsx +436 -0
- package/src/maps/ServerMapDataSource.ts +0 -31
- package/src/maps/SwitchableTileUrlLayer.tsx +0 -11
- package/src/maps/TileUrlLayer.tsx +0 -6
- package/src/maps/VectorMapViewComponent.tsx +15 -15
- 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 +32 -53
- 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 +11 -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/MapComponent.ts +0 -312
- package/src/maps/MapControlComponent.ts +0 -46
- package/src/maps/MarkersLayerDesignerComponent.ts +0 -374
- package/src/maps/RasterMapViewComponent.ts +0 -345
- 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
|
@@ -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;
|
|
@@ -9,15 +9,6 @@ export default class ClusterLayer extends Layer<ClusterLayerDesign> {
|
|
|
9
9
|
getLayerDefinitionType(): "VectorTile";
|
|
10
10
|
getVectorTile(design: ClusterLayerDesign, sourceId: string, schema: Schema, filters: JsonQLFilter[], opacity: number): VectorTileDef;
|
|
11
11
|
createJsonQL(design: ClusterLayerDesign, schema: Schema, filters: JsonQLFilter[]): JsonQLQuery;
|
|
12
|
-
getJsonQLCss(design: ClusterLayerDesign, schema: Schema, filters: JsonQLFilter[]): {
|
|
13
|
-
layers: {
|
|
14
|
-
id: string;
|
|
15
|
-
jsonql: JsonQLQuery;
|
|
16
|
-
}[];
|
|
17
|
-
css: string;
|
|
18
|
-
};
|
|
19
|
-
createMapnikJsonQL(design: ClusterLayerDesign, schema: Schema, filters: JsonQLFilter[]): JsonQLQuery;
|
|
20
|
-
createCss(design: ClusterLayerDesign, schema: Schema): string;
|
|
21
12
|
getBounds(design: ClusterLayerDesign, schema: Schema, dataSource: DataSource, filters: JsonQLFilter[], callback: any): void;
|
|
22
13
|
getMinZoom(design: ClusterLayerDesign): number | undefined;
|
|
23
14
|
getMaxZoom(design: ClusterLayerDesign): number;
|
package/lib/maps/ClusterLayer.js
CHANGED
|
@@ -295,256 +295,6 @@ class ClusterLayer extends Layer_1.default {
|
|
|
295
295
|
};
|
|
296
296
|
return query;
|
|
297
297
|
}
|
|
298
|
-
// Gets the layer definition as JsonQL + CSS in format:
|
|
299
|
-
// {
|
|
300
|
-
// layers: array of { id: layer id, jsonql: jsonql that includes "the_webmercator_geom" as a column }
|
|
301
|
-
// css: carto css
|
|
302
|
-
// interactivity: (optional) { layer: id of layer, fields: array of field names }
|
|
303
|
-
// }
|
|
304
|
-
// arguments:
|
|
305
|
-
// design: design of layer
|
|
306
|
-
// schema: schema to use
|
|
307
|
-
// filters: array of filters to apply. Each is { table: table id, jsonql: jsonql condition with {alias} for tableAlias. Use injectAlias to put in table alias
|
|
308
|
-
getJsonQLCss(design, schema, filters) {
|
|
309
|
-
// Create design
|
|
310
|
-
const layerDef = {
|
|
311
|
-
layers: [{ id: "layer0", jsonql: this.createMapnikJsonQL(design, schema, filters) }],
|
|
312
|
-
css: this.createCss(design, schema)
|
|
313
|
-
// interactivity: {
|
|
314
|
-
// layer: "layer0"
|
|
315
|
-
// fields: ["id"]
|
|
316
|
-
// }
|
|
317
|
-
};
|
|
318
|
-
return layerDef;
|
|
319
|
-
}
|
|
320
|
-
createMapnikJsonQL(design, schema, filters) {
|
|
321
|
-
const axisBuilder = new AxisBuilder_1.default({ schema });
|
|
322
|
-
const exprCompiler = new expressions_1.ExprCompiler(schema);
|
|
323
|
-
/*
|
|
324
|
-
Query:
|
|
325
|
-
Works by first snapping to grid and then clustering the clusters with slower DBSCAN method
|
|
326
|
-
|
|
327
|
-
select
|
|
328
|
-
ST_Centroid(ST_Collect(center)) as the_geom_webmercator,
|
|
329
|
-
sum(cnt) as cnt,
|
|
330
|
-
log(sum(cnt)) * 6 + 14 as size from
|
|
331
|
-
(
|
|
332
|
-
select
|
|
333
|
-
ST_ClusterDBSCAN(center, (!pixel_width!*30 + !pixel_height!*30)/2, 1) over () as clust,
|
|
334
|
-
sub1.center as center,
|
|
335
|
-
cnt as cnt
|
|
336
|
-
from
|
|
337
|
-
(
|
|
338
|
-
select
|
|
339
|
-
count(*) as cnt,
|
|
340
|
-
ST_Centroid(ST_Collect(<geometry axis>)) as center,
|
|
341
|
-
round(ST_XMin(<geometry axis>) / (!pixel_width!*40)) as gridx,
|
|
342
|
-
round(ST_YMin(<geometry axis>) / (!pixel_width!*40)) as gridy,
|
|
343
|
-
from <table> as main
|
|
344
|
-
where <geometry axis> && !bbox!
|
|
345
|
-
and <geometry axis> is not null
|
|
346
|
-
and <other filters>
|
|
347
|
-
group by 3, 4
|
|
348
|
-
) as sub1
|
|
349
|
-
) as sub2
|
|
350
|
-
group by sub2.clust
|
|
351
|
-
|
|
352
|
-
*/
|
|
353
|
-
// Compile geometry axis
|
|
354
|
-
let geometryExpr = axisBuilder.compileAxis({ axis: design.axes.geometry, tableAlias: "main" });
|
|
355
|
-
// ST_Centroid(ST_Collect(<geometry axis>))
|
|
356
|
-
let centerExpr = {
|
|
357
|
-
type: "op",
|
|
358
|
-
op: "ST_Centroid",
|
|
359
|
-
exprs: [
|
|
360
|
-
{
|
|
361
|
-
type: "op",
|
|
362
|
-
op: "ST_Collect",
|
|
363
|
-
exprs: [geometryExpr]
|
|
364
|
-
}
|
|
365
|
-
]
|
|
366
|
-
};
|
|
367
|
-
const gridXExpr = {
|
|
368
|
-
type: "op",
|
|
369
|
-
op: "round",
|
|
370
|
-
exprs: [
|
|
371
|
-
{
|
|
372
|
-
type: "op",
|
|
373
|
-
op: "/",
|
|
374
|
-
exprs: [
|
|
375
|
-
{ type: "op", op: "ST_XMin", exprs: [geometryExpr] },
|
|
376
|
-
{ type: "op", op: "*", exprs: [{ type: "token", token: "!pixel_width!" }, 40] }
|
|
377
|
-
]
|
|
378
|
-
}
|
|
379
|
-
]
|
|
380
|
-
};
|
|
381
|
-
const gridYExpr = {
|
|
382
|
-
type: "op",
|
|
383
|
-
op: "round",
|
|
384
|
-
exprs: [
|
|
385
|
-
{
|
|
386
|
-
type: "op",
|
|
387
|
-
op: "/",
|
|
388
|
-
exprs: [
|
|
389
|
-
{ type: "op", op: "ST_YMin", exprs: [geometryExpr] },
|
|
390
|
-
{ type: "op", op: "*", exprs: [{ type: "token", token: "!pixel_height!" }, 5] }
|
|
391
|
-
]
|
|
392
|
-
}
|
|
393
|
-
]
|
|
394
|
-
};
|
|
395
|
-
// Create inner query
|
|
396
|
-
const innerQuery = {
|
|
397
|
-
type: "query",
|
|
398
|
-
selects: [
|
|
399
|
-
{ type: "select", expr: { type: "op", op: "count", exprs: [] }, alias: "cnt" },
|
|
400
|
-
{ type: "select", expr: centerExpr, alias: "center" },
|
|
401
|
-
{ type: "select", expr: gridXExpr, alias: "gridx" },
|
|
402
|
-
{ type: "select", expr: gridYExpr, alias: "gridy" }
|
|
403
|
-
],
|
|
404
|
-
from: exprCompiler.compileTable(design.table, "main"),
|
|
405
|
-
groupBy: [3, 4]
|
|
406
|
-
};
|
|
407
|
-
// Create filters. First ensure geometry and limit to bounding box
|
|
408
|
-
let whereClauses = [
|
|
409
|
-
{
|
|
410
|
-
type: "op",
|
|
411
|
-
op: "&&",
|
|
412
|
-
exprs: [geometryExpr, { type: "token", token: "!bbox!" }]
|
|
413
|
-
}
|
|
414
|
-
];
|
|
415
|
-
// Then add filters baked into layer
|
|
416
|
-
if (design.filter) {
|
|
417
|
-
whereClauses.push(exprCompiler.compileExpr({ expr: design.filter || null, tableAlias: "main" }));
|
|
418
|
-
}
|
|
419
|
-
// Then add extra filters passed in, if relevant
|
|
420
|
-
// Get relevant filters
|
|
421
|
-
const relevantFilters = lodash_1.default.where(filters, { table: design.table });
|
|
422
|
-
for (let filter of relevantFilters) {
|
|
423
|
-
whereClauses.push((0, expressions_1.injectTableAlias)(filter.jsonql, "main"));
|
|
424
|
-
}
|
|
425
|
-
whereClauses = lodash_1.default.compact(whereClauses);
|
|
426
|
-
// Wrap if multiple
|
|
427
|
-
if (whereClauses.length > 1) {
|
|
428
|
-
innerQuery.where = { type: "op", op: "and", exprs: whereClauses };
|
|
429
|
-
}
|
|
430
|
-
else {
|
|
431
|
-
innerQuery.where = whereClauses[0];
|
|
432
|
-
}
|
|
433
|
-
// Create next level
|
|
434
|
-
// select
|
|
435
|
-
// ST_ClusterDBSCAN(center, (!pixel_width!*30 + !pixel_height!*30)/2, 1) over () as clust,
|
|
436
|
-
// sub1.center as center,
|
|
437
|
-
// cnt as cnt from () as innerquery
|
|
438
|
-
const clustExpr = {
|
|
439
|
-
type: "op",
|
|
440
|
-
op: "ST_ClusterDBSCAN",
|
|
441
|
-
exprs: [
|
|
442
|
-
{ type: "field", tableAlias: "innerquery", column: "center" },
|
|
443
|
-
{
|
|
444
|
-
type: "op",
|
|
445
|
-
op: "/",
|
|
446
|
-
exprs: [
|
|
447
|
-
{
|
|
448
|
-
type: "op",
|
|
449
|
-
op: "+",
|
|
450
|
-
exprs: [
|
|
451
|
-
{ type: "op", op: "*", exprs: [{ type: "token", token: "!pixel_width!" }, 30] },
|
|
452
|
-
{ type: "op", op: "*", exprs: [{ type: "token", token: "!pixel_height!" }, 30] }
|
|
453
|
-
]
|
|
454
|
-
},
|
|
455
|
-
2
|
|
456
|
-
]
|
|
457
|
-
},
|
|
458
|
-
1
|
|
459
|
-
],
|
|
460
|
-
over: {}
|
|
461
|
-
};
|
|
462
|
-
const inner2Query = {
|
|
463
|
-
type: "query",
|
|
464
|
-
selects: [
|
|
465
|
-
{ type: "select", expr: clustExpr, alias: "clust" },
|
|
466
|
-
{ type: "select", expr: { type: "field", tableAlias: "innerquery", column: "center" }, alias: "center" },
|
|
467
|
-
{ type: "select", expr: { type: "field", tableAlias: "innerquery", column: "cnt" }, alias: "cnt" }
|
|
468
|
-
],
|
|
469
|
-
from: { type: "subquery", query: innerQuery, alias: "innerquery" }
|
|
470
|
-
};
|
|
471
|
-
// Create final level
|
|
472
|
-
// ST_Centroid(ST_Collect(center)) as the_geom_webmercator,
|
|
473
|
-
// sum(cnt) as cnt,
|
|
474
|
-
// log(sum(cnt)) * 6 + 14 as size from
|
|
475
|
-
// ST_Centroid(ST_Collect(center))
|
|
476
|
-
centerExpr = {
|
|
477
|
-
type: "op",
|
|
478
|
-
op: "ST_Centroid",
|
|
479
|
-
exprs: [
|
|
480
|
-
{
|
|
481
|
-
type: "op",
|
|
482
|
-
op: "ST_Collect",
|
|
483
|
-
exprs: [{ type: "field", tableAlias: "inner2query", column: "center" }]
|
|
484
|
-
}
|
|
485
|
-
]
|
|
486
|
-
};
|
|
487
|
-
const cntExpr = {
|
|
488
|
-
type: "op",
|
|
489
|
-
op: "sum",
|
|
490
|
-
exprs: [{ type: "field", tableAlias: "inner2query", column: "cnt" }]
|
|
491
|
-
};
|
|
492
|
-
const sizeExpr = {
|
|
493
|
-
type: "op",
|
|
494
|
-
op: "+",
|
|
495
|
-
exprs: [{ type: "op", op: "*", exprs: [{ type: "op", op: "log", exprs: [cntExpr] }, 6] }, 14]
|
|
496
|
-
};
|
|
497
|
-
const query = {
|
|
498
|
-
type: "query",
|
|
499
|
-
selects: [
|
|
500
|
-
{ type: "select", expr: centerExpr, alias: "the_geom_webmercator" },
|
|
501
|
-
{ type: "select", expr: cntExpr, alias: "cnt" },
|
|
502
|
-
{ type: "select", expr: sizeExpr, alias: "size" }
|
|
503
|
-
],
|
|
504
|
-
from: { type: "subquery", query: inner2Query, alias: "inner2query" },
|
|
505
|
-
groupBy: [{ type: "field", tableAlias: "inner2query", column: "clust" }]
|
|
506
|
-
};
|
|
507
|
-
return query;
|
|
508
|
-
}
|
|
509
|
-
createCss(design, schema) {
|
|
510
|
-
const css = `\
|
|
511
|
-
#layer0 [cnt>1] {
|
|
512
|
-
marker-width: [size];
|
|
513
|
-
marker-line-color: white;
|
|
514
|
-
marker-line-width: 4;
|
|
515
|
-
marker-line-opacity: 0.6;
|
|
516
|
-
marker-placement: point;
|
|
517
|
-
marker-type: ellipse;
|
|
518
|
-
marker-allow-overlap: true;
|
|
519
|
-
marker-fill: ` +
|
|
520
|
-
(design.fillColor || "#337ab7") +
|
|
521
|
-
`;
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
#layer0::l1 [cnt>1] {
|
|
525
|
-
text-name: [cnt];
|
|
526
|
-
text-face-name: 'Arial Bold';
|
|
527
|
-
text-allow-overlap: true;
|
|
528
|
-
text-fill: ` +
|
|
529
|
-
(design.textColor || "white") +
|
|
530
|
-
`;
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
#layer0 [cnt=1] {
|
|
534
|
-
marker-width: 10;
|
|
535
|
-
marker-line-color: white;
|
|
536
|
-
marker-line-width: 2;
|
|
537
|
-
marker-line-opacity: 0.6;
|
|
538
|
-
marker-placement: point;
|
|
539
|
-
marker-type: ellipse;
|
|
540
|
-
marker-allow-overlap: true;
|
|
541
|
-
marker-fill: ` +
|
|
542
|
-
(design.fillColor || "#337ab7") +
|
|
543
|
-
`;
|
|
544
|
-
}\
|
|
545
|
-
`;
|
|
546
|
-
return css;
|
|
547
|
-
}
|
|
548
298
|
// # Called when the interactivity grid is clicked.
|
|
549
299
|
// # arguments:
|
|
550
300
|
// # ev: { data: interactivty data e.g. `{ id: 123 }` }
|
|
@@ -35,7 +35,6 @@ const LayerFactory_1 = __importDefault(require("./LayerFactory"));
|
|
|
35
35
|
const MapBoundsCalculator_1 = __importDefault(require("./MapBoundsCalculator"));
|
|
36
36
|
const DirectWidgetDataSource_1 = __importDefault(require("../widgets/DirectWidgetDataSource"));
|
|
37
37
|
const compressJson_1 = __importDefault(require("../compressJson"));
|
|
38
|
-
const querystring_1 = __importDefault(require("querystring"));
|
|
39
38
|
const QuickfilterUtils = __importStar(require("../quickfilter/QuickfilterUtils"));
|
|
40
39
|
const react_1 = require("react");
|
|
41
40
|
const useStableCallback_1 = require("@mwater/react-library/lib/useStableCallback");
|
|
@@ -175,26 +174,7 @@ class DirectLayerDataSource {
|
|
|
175
174
|
if (layer.getLayerDefinitionType() === "TileUrl") {
|
|
176
175
|
return layer.getTileUrl(design, filters);
|
|
177
176
|
}
|
|
178
|
-
|
|
179
|
-
const jsonqlCss = layer.getJsonQLCss(design, this.options.schema, filters);
|
|
180
|
-
return this.createUrl("png", jsonqlCss);
|
|
181
|
-
}
|
|
182
|
-
// Get the url for the interactivity tiles with the specified filters applied
|
|
183
|
-
// Called with (design, filters) where design is the design of the layer and filters are filters to apply. Returns URL
|
|
184
|
-
getUtfGridUrl(design, filters) {
|
|
185
|
-
// Create layer
|
|
186
|
-
const layer = LayerFactory_1.default.createLayer(this.options.layerView.type);
|
|
187
|
-
// Handle special cases
|
|
188
|
-
if (this.options.layerView.type === "MWaterServer") {
|
|
189
|
-
return this.createLegacyUrl(design, "grid.json", filters);
|
|
190
|
-
}
|
|
191
|
-
// If layer has tiles url directly available
|
|
192
|
-
if (layer.getLayerDefinitionType() === "TileUrl") {
|
|
193
|
-
return layer.getUtfGridUrl(design, filters);
|
|
194
|
-
}
|
|
195
|
-
// Get JsonQLCss
|
|
196
|
-
const jsonqlCss = layer.getJsonQLCss(design, this.options.schema, filters);
|
|
197
|
-
return this.createUrl("grid.json", jsonqlCss);
|
|
177
|
+
throw new Error("Layer type not supported: " + this.options.layerView.type);
|
|
198
178
|
}
|
|
199
179
|
// Gets widget data source for a popup widget
|
|
200
180
|
getPopupWidgetDataSource(design, widgetId) {
|
|
@@ -213,36 +193,9 @@ class DirectLayerDataSource {
|
|
|
213
193
|
});
|
|
214
194
|
}
|
|
215
195
|
// Create query string
|
|
216
|
-
createUrl(extension, jsonqlCss) {
|
|
217
|
-
const query = {
|
|
218
|
-
type: "jsonql",
|
|
219
|
-
design: (0, compressJson_1.default)(jsonqlCss)
|
|
220
|
-
};
|
|
221
|
-
if (this.options.client) {
|
|
222
|
-
query.client = this.options.client;
|
|
223
|
-
}
|
|
224
|
-
// Make URL change when cache expired
|
|
225
|
-
const cacheExpiry = this.options.dataSource.getCacheExpiry();
|
|
226
|
-
if (cacheExpiry) {
|
|
227
|
-
query.cacheExpiry = cacheExpiry;
|
|
228
|
-
}
|
|
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
|
-
return url;
|
|
236
|
-
}
|
|
237
|
-
// Create query string
|
|
238
196
|
createLegacyUrl(design, extension, filters) {
|
|
239
197
|
let where;
|
|
240
198
|
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
199
|
if (this.options.client) {
|
|
247
200
|
url += `&client=${this.options.client}`;
|
|
248
201
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DataSource, Schema } from "@mwater/expressions";
|
|
1
|
+
import { AggrStatus, DataSource, Schema } from "@mwater/expressions";
|
|
2
2
|
import React from "react";
|
|
3
3
|
export interface EditHoverOverProps {
|
|
4
4
|
/** Schema to use */
|
|
@@ -13,6 +13,7 @@ export interface EditHoverOverProps {
|
|
|
13
13
|
/** Table of the row that join is to. Usually same as table except for choropleth maps */
|
|
14
14
|
idTable: string;
|
|
15
15
|
defaultPopupFilterJoins: any;
|
|
16
|
+
/** Aggr statuses to allow in hover over expressions */
|
|
17
|
+
aggrStatuses: AggrStatus[];
|
|
16
18
|
}
|
|
17
|
-
declare function EditHoverOver(props: EditHoverOverProps): React.JSX.Element;
|
|
18
|
-
export default EditHoverOver;
|
|
19
|
+
export declare function EditHoverOver(props: EditHoverOverProps): React.JSX.Element;
|
|
@@ -26,6 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.EditHoverOver = EditHoverOver;
|
|
29
30
|
const lodash_1 = require("lodash");
|
|
30
31
|
const expressions_1 = require("@mwater/expressions");
|
|
31
32
|
const expressions_ui_1 = require("@mwater/expressions-ui");
|
|
@@ -84,7 +85,7 @@ function EditHoverOver(props) {
|
|
|
84
85
|
react_1.default.createElement("th", null, T `Value`),
|
|
85
86
|
react_1.default.createElement("th", { style: { width: "1%", whiteSpace: "nowrap" } }, T `Format`),
|
|
86
87
|
react_1.default.createElement("th", { style: { width: "1%", whiteSpace: "nowrap" } }))),
|
|
87
|
-
react_1.default.createElement("tbody", null, draftItems?.map((item) => (react_1.default.createElement(HoverOverItemEditor, { key: item.id, schema: schema, dataSource: dataSource, table: table, onItemChange: handleItemChange, onItemDelete: handleItemDelete, item: item })))))),
|
|
88
|
+
react_1.default.createElement("tbody", null, draftItems?.map((item) => (react_1.default.createElement(HoverOverItemEditor, { key: item.id, schema: schema, dataSource: dataSource, table: table, onItemChange: handleItemChange, onItemDelete: handleItemDelete, item: item, aggrStatuses: props.aggrStatuses })))))),
|
|
88
89
|
react_1.default.createElement("button", { className: "btn btn-link", onClick: handleAddItem },
|
|
89
90
|
react_1.default.createElement("span", { className: "fas fa-plus me-1" }),
|
|
90
91
|
T `Add Item`)))));
|
|
@@ -110,10 +111,9 @@ function HoverOverItemEditor(props) {
|
|
|
110
111
|
react_1.default.createElement("td", { className: "align-middle" },
|
|
111
112
|
react_1.default.createElement(ui.TextInput, { value: item.label, onChange: value => onItemChange({ ...item, label: value }) })),
|
|
112
113
|
react_1.default.createElement("td", { className: "align-middle" },
|
|
113
|
-
react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: schema, dataSource: dataSource, table: table, types: ["text", "number", "enum", "boolean", "date", "datetime", "id"], onChange: expr => onItemChange({ ...item, value: expr }), value: item.value ?? null, aggrStatuses:
|
|
114
|
+
react_1.default.createElement(expressions_ui_1.ExprComponent, { schema: schema, dataSource: dataSource, table: table, types: ["text", "number", "enum", "boolean", "date", "datetime", "id"], onChange: expr => onItemChange({ ...item, value: expr }), value: item.value ?? null, aggrStatuses: props.aggrStatuses })),
|
|
114
115
|
react_1.default.createElement("td", { className: "align-middle", style: { width: "1%", whiteSpace: "nowrap" } }, renderFormat()),
|
|
115
116
|
react_1.default.createElement("td", { className: "align-middle", style: { width: "1%", whiteSpace: "nowrap" } },
|
|
116
117
|
react_1.default.createElement("button", { className: "btn btn-link", onClick: () => onItemDelete(item) },
|
|
117
118
|
react_1.default.createElement("span", { className: "fa fa-close" })))));
|
|
118
119
|
}
|
|
119
|
-
exports.default = EditHoverOver;
|
package/lib/maps/GridLayer.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React, { ReactNode } from "react";
|
|
2
2
|
import Layer, { LegendOptions, VectorTileDef } from "./Layer";
|
|
3
3
|
import { Schema, DataSource } from "@mwater/expressions";
|
|
4
|
-
import { LayerDefinition } from "./maps";
|
|
5
4
|
import { JsonQLFilter } from "../index";
|
|
6
5
|
import GridLayerDesign from "./GridLayerDesign";
|
|
7
6
|
import { JsonQLQuery } from "@mwater/jsonql";
|
|
@@ -11,20 +10,6 @@ export default class GridLayer extends Layer<GridLayerDesign> {
|
|
|
11
10
|
getLayerDefinitionType(): "VectorTile";
|
|
12
11
|
getVectorTile(design: GridLayerDesign, sourceId: string, schema: Schema, filters: JsonQLFilter[], opacity: number): VectorTileDef;
|
|
13
12
|
createJsonQL(design: GridLayerDesign, schema: Schema, filters: JsonQLFilter[]): JsonQLQuery;
|
|
14
|
-
/** Gets the layer definition as JsonQL + CSS in format:
|
|
15
|
-
* {
|
|
16
|
-
* layers: array of { id: layer id, jsonql: jsonql that includes "the_webmercator_geom" as a column }
|
|
17
|
-
* css: carto css
|
|
18
|
-
* interactivity: (optional) { layer: id of layer, fields: array of field names }
|
|
19
|
-
* }
|
|
20
|
-
* arguments:
|
|
21
|
-
* design: design of layer
|
|
22
|
-
* schema: schema to use
|
|
23
|
-
* filters: array of filters to apply
|
|
24
|
-
*/
|
|
25
|
-
getJsonQLCss(design: GridLayerDesign, schema: Schema, filters: JsonQLFilter[]): LayerDefinition;
|
|
26
|
-
createMapnikJsonQL(design: GridLayerDesign, schema: Schema, filters: JsonQLFilter[]): JsonQLQuery;
|
|
27
|
-
createCss(design: GridLayerDesign, schema: Schema, filters: JsonQLFilter[]): string;
|
|
28
13
|
getMinZoom(design: GridLayerDesign): number | undefined;
|
|
29
14
|
getMaxZoom(design: GridLayerDesign): number;
|
|
30
15
|
/** Get the legend to be optionally displayed on the map. Returns
|