@mwater/visualization 5.5.0 → 5.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/MWaterContextComponent.d.ts +1 -1
- package/lib/MWaterGlobalFiltersComponent.d.ts +2 -2
- package/lib/MWaterGlobalFiltersComponent.js +11 -20
- package/lib/MWaterLoaderComponent.d.ts +4 -13
- package/lib/MWaterLoaderComponent.js +2 -11
- package/lib/UndoStack.d.ts +2 -1
- package/lib/UndoStack.js +12 -6
- package/lib/dashboards/DashboardComponent.js +5 -4
- package/lib/dashboards/DashboardDesign.d.ts +1 -1
- package/lib/dashboards/ServerDashboardDataSource.js +0 -10
- package/lib/dashboards/SettingsModalComponent.js +1 -1
- package/lib/datagrids/DatagridComponent.js +22 -2
- package/lib/datagrids/DatagridDesignerComponent.d.ts +2 -3
- package/lib/datagrids/DatagridDesignerComponent.js +108 -120
- package/lib/datagrids/DatagridViewComponent.js +3 -2
- package/lib/datagrids/OrderBysDesignerComponent.d.ts +7 -7
- package/lib/datagrids/OrderBysDesignerComponent.js +19 -28
- package/lib/index.css +45 -2
- package/lib/index.d.ts +5 -5
- package/lib/index.js +2 -3
- package/lib/layouts/blocks/BlocksDisplayComponent.d.ts +8 -1
- package/lib/layouts/blocks/BlocksDisplayComponent.js +46 -4
- package/lib/maps/BufferLayer.js +12 -0
- package/lib/maps/BufferLayerDesign.d.ts +1 -1
- package/lib/maps/BufferLayerDesignerComponent.js +2 -2
- package/lib/maps/ChoroplethLayer.js +12 -0
- package/lib/maps/ChoroplethLayerDesign.d.ts +5 -2
- package/lib/maps/ChoroplethLayerDesigner.d.ts +10 -32
- package/lib/maps/ChoroplethLayerDesigner.js +58 -89
- package/lib/maps/DirectMapDataSource.js +0 -10
- package/lib/maps/EditHoverOver.d.ts +4 -3
- package/lib/maps/EditHoverOver.js +3 -3
- package/lib/maps/HoverContent.js +1 -1
- package/lib/maps/LeafletMapComponent.js +10 -19
- package/lib/maps/MapComponent.js +0 -1
- package/lib/maps/MapUtils.js +10 -1
- package/lib/maps/MarkersLayer.js +18 -2
- package/lib/maps/MarkersLayerDesign.d.ts +1 -1
- package/lib/maps/MarkersLayerDesignerComponent.d.ts +12 -41
- package/lib/maps/MarkersLayerDesignerComponent.js +81 -111
- package/lib/maps/ServerMapDataSource.js +0 -10
- package/lib/maps/VectorMapViewComponent.js +1 -9
- package/lib/maps/symbols/font-awesome/asterisk.png +0 -0
- package/lib/maps/symbols/font-awesome/ban.png +0 -0
- package/lib/maps/symbols/font-awesome/beer.png +0 -0
- package/lib/maps/symbols/font-awesome/bell.png +0 -0
- package/lib/maps/symbols/font-awesome/bolt.png +0 -0
- package/lib/maps/symbols/font-awesome/building.png +0 -0
- package/lib/maps/symbols/font-awesome/bullseye.png +0 -0
- package/lib/maps/symbols/font-awesome/bus.png +0 -0
- package/lib/maps/symbols/font-awesome/caret-up.png +0 -0
- package/lib/maps/symbols/font-awesome/certificate.png +0 -0
- package/lib/maps/symbols/font-awesome/check-circle.png +0 -0
- package/lib/maps/symbols/font-awesome/check.png +0 -0
- package/lib/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
- package/lib/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
- package/lib/maps/symbols/font-awesome/cloud-rain.png +0 -0
- package/lib/maps/symbols/font-awesome/cloud.png +0 -0
- package/lib/maps/symbols/font-awesome/comment.png +0 -0
- package/lib/maps/symbols/font-awesome/crosshairs.png +0 -0
- package/lib/maps/symbols/font-awesome/dot-circle-o.png +0 -0
- package/lib/maps/symbols/font-awesome/exclamation-circle.png +0 -0
- package/lib/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
- package/lib/maps/symbols/font-awesome/female.png +0 -0
- package/lib/maps/symbols/font-awesome/file.png +0 -0
- package/lib/maps/symbols/font-awesome/flag.png +0 -0
- package/lib/maps/symbols/font-awesome/flask.png +0 -0
- package/lib/maps/symbols/font-awesome/h-square.png +0 -0
- package/lib/maps/symbols/font-awesome/home.png +0 -0
- package/lib/maps/symbols/font-awesome/info-circle.png +0 -0
- package/lib/maps/symbols/font-awesome/male.png +0 -0
- package/lib/maps/symbols/font-awesome/medkit.png +0 -0
- package/lib/maps/symbols/font-awesome/mobile.png +0 -0
- package/lib/maps/symbols/font-awesome/plus-circle.png +0 -0
- package/lib/maps/symbols/font-awesome/plus-square.png +0 -0
- package/lib/maps/symbols/font-awesome/plus.png +0 -0
- package/lib/maps/symbols/font-awesome/square.png +0 -0
- package/lib/maps/symbols/font-awesome/star.png +0 -0
- package/lib/maps/symbols/font-awesome/thumbs-down.png +0 -0
- package/lib/maps/symbols/font-awesome/thumbs-up.png +0 -0
- package/lib/maps/symbols/font-awesome/ticket.png +0 -0
- package/lib/maps/symbols/font-awesome/times-circle.png +0 -0
- package/lib/maps/symbols/font-awesome/times.png +0 -0
- package/lib/maps/symbols/font-awesome/tint.png +0 -0
- package/lib/maps/symbols/font-awesome/tree.png +0 -0
- package/lib/maps/symbols/font-awesome/university.png +0 -0
- package/lib/maps/symbols/font-awesome/usd.png +0 -0
- package/lib/maps/symbols/font-awesome/user.png +0 -0
- package/lib/maps/symbols/font-awesome/users.png +0 -0
- package/lib/maps/symbols/font-awesome/wheelchair.png +0 -0
- package/lib/maps/symbols/sdf-ize.sh +93 -0
- package/lib/maps/vectorMaps.d.ts +1 -0
- package/lib/maps/vectorMaps.js +20 -36
- package/lib/mwater_table_selection/IndicatorsListComponent.d.ts +4 -2
- package/lib/mwater_table_selection/IndicatorsListComponent.js +103 -34
- package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.d.ts +18 -0
- package/lib/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.js +80 -0
- package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.d.ts +26 -0
- package/lib/mwater_table_selection/MWaterCompleteTableSelectComponent.js +237 -51
- package/lib/mwater_table_selection/MWaterTableSelectComponent.d.ts +2 -2
- package/lib/mwater_table_selection/MWaterTableSelectComponent.js +9 -4
- package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.d.ts +19 -0
- package/lib/mwater_table_selection/MWaterWorkflowsSelectComponent.js +111 -0
- package/lib/quickfilter/QuickfiltersComponent.d.ts +3 -102
- package/lib/quickfilter/QuickfiltersComponent.js +53 -110
- package/lib/quickfilter/TextLiteralComponent.d.ts +23 -47
- package/lib/quickfilter/TextLiteralComponent.js +85 -82
- package/lib/widgets/MapWidget.js +4 -2
- package/lib/widgets/text/ExprItemEditorComponent.d.ts +3 -8
- package/lib/widgets/text/ExprItemEditorComponent.js +36 -33
- package/lib/widgets/text/ExprUpdateModalComponent.d.ts +1 -0
- package/package.json +2 -3
- package/src/MWaterContextComponent.tsx +1 -1
- package/src/{MWaterGlobalFiltersComponent.ts → MWaterGlobalFiltersComponent.tsx} +32 -33
- package/src/{MWaterLoaderComponent.ts → MWaterLoaderComponent.tsx} +17 -18
- package/src/UndoStack.ts +14 -6
- package/src/dashboards/DashboardComponent.tsx +5 -4
- package/src/dashboards/DashboardDesign.ts +1 -1
- package/src/dashboards/ServerDashboardDataSource.ts +0 -12
- package/src/dashboards/SettingsModalComponent.tsx +1 -1
- package/src/datagrids/DatagridComponent.tsx +30 -2
- package/src/datagrids/DatagridDesignerComponent.tsx +241 -229
- package/src/datagrids/DatagridViewComponent.tsx +3 -2
- package/src/datagrids/OrderBysDesignerComponent.tsx +61 -70
- package/src/index.css +45 -2
- package/src/index.ts +5 -11
- package/src/layouts/blocks/BlocksDisplayComponent.tsx +60 -5
- package/src/maps/BufferLayer.ts +14 -1
- package/src/maps/BufferLayerDesign.ts +1 -1
- package/src/maps/BufferLayerDesignerComponent.tsx +2 -1
- package/src/maps/ChoroplethLayer.ts +20 -7
- package/src/maps/ChoroplethLayerDesign.ts +5 -2
- package/src/maps/ChoroplethLayerDesigner.tsx +169 -165
- package/src/maps/DirectMapDataSource.ts +0 -12
- package/src/maps/EditHoverOver.tsx +9 -5
- package/src/maps/HoverContent.tsx +1 -1
- package/src/maps/LeafletMapComponent.tsx +10 -19
- package/src/maps/MapComponent.ts +0 -1
- package/src/maps/MapUtils.ts +13 -1
- package/src/maps/MarkersLayer.ts +22 -5
- package/src/maps/MarkersLayerDesign.ts +1 -1
- package/src/maps/MarkersLayerDesignerComponent.tsx +360 -0
- package/src/maps/ServerMapDataSource.ts +0 -12
- package/src/maps/VectorMapViewComponent.tsx +2 -13
- package/src/maps/symbols/font-awesome/asterisk.png +0 -0
- package/src/maps/symbols/font-awesome/ban.png +0 -0
- package/src/maps/symbols/font-awesome/beer.png +0 -0
- package/src/maps/symbols/font-awesome/bell.png +0 -0
- package/src/maps/symbols/font-awesome/bolt.png +0 -0
- package/src/maps/symbols/font-awesome/building.png +0 -0
- package/src/maps/symbols/font-awesome/bullseye.png +0 -0
- package/src/maps/symbols/font-awesome/bus.png +0 -0
- package/src/maps/symbols/font-awesome/caret-up.png +0 -0
- package/src/maps/symbols/font-awesome/certificate.png +0 -0
- package/src/maps/symbols/font-awesome/check-circle.png +0 -0
- package/src/maps/symbols/font-awesome/check.png +0 -0
- package/src/maps/symbols/font-awesome/chevron-circle-down.png +0 -0
- package/src/maps/symbols/font-awesome/chevron-circle-up.png +0 -0
- package/src/maps/symbols/font-awesome/cloud-rain.png +0 -0
- package/src/maps/symbols/font-awesome/cloud.png +0 -0
- package/src/maps/symbols/font-awesome/comment.png +0 -0
- package/src/maps/symbols/font-awesome/crosshairs.png +0 -0
- package/src/maps/symbols/font-awesome/dot-circle-o.png +0 -0
- package/src/maps/symbols/font-awesome/exclamation-circle.png +0 -0
- package/src/maps/symbols/font-awesome/exclamation-triangle.png +0 -0
- package/src/maps/symbols/font-awesome/female.png +0 -0
- package/src/maps/symbols/font-awesome/file.png +0 -0
- package/src/maps/symbols/font-awesome/flag.png +0 -0
- package/src/maps/symbols/font-awesome/flask.png +0 -0
- package/src/maps/symbols/font-awesome/h-square.png +0 -0
- package/src/maps/symbols/font-awesome/home.png +0 -0
- package/src/maps/symbols/font-awesome/info-circle.png +0 -0
- package/src/maps/symbols/font-awesome/male.png +0 -0
- package/src/maps/symbols/font-awesome/medkit.png +0 -0
- package/src/maps/symbols/font-awesome/mobile.png +0 -0
- package/src/maps/symbols/font-awesome/plus-circle.png +0 -0
- package/src/maps/symbols/font-awesome/plus-square.png +0 -0
- package/src/maps/symbols/font-awesome/plus.png +0 -0
- package/src/maps/symbols/font-awesome/square.png +0 -0
- package/src/maps/symbols/font-awesome/star.png +0 -0
- package/src/maps/symbols/font-awesome/thumbs-down.png +0 -0
- package/src/maps/symbols/font-awesome/thumbs-up.png +0 -0
- package/src/maps/symbols/font-awesome/ticket.png +0 -0
- package/src/maps/symbols/font-awesome/times-circle.png +0 -0
- package/src/maps/symbols/font-awesome/times.png +0 -0
- package/src/maps/symbols/font-awesome/tint.png +0 -0
- package/src/maps/symbols/font-awesome/tree.png +0 -0
- package/src/maps/symbols/font-awesome/university.png +0 -0
- package/src/maps/symbols/font-awesome/usd.png +0 -0
- package/src/maps/symbols/font-awesome/user.png +0 -0
- package/src/maps/symbols/font-awesome/users.png +0 -0
- package/src/maps/symbols/font-awesome/wheelchair.png +0 -0
- package/src/maps/symbols/sdf-ize.sh +93 -0
- package/src/maps/vectorMaps.tsx +20 -44
- package/src/mwater_table_selection/IndicatorsListComponent.tsx +165 -37
- package/src/mwater_table_selection/MWaterCalculatedDataSourcesListComponent.tsx +111 -0
- package/src/mwater_table_selection/MWaterCompleteTableSelectComponent.tsx +373 -37
- package/src/mwater_table_selection/MWaterTableSelectComponent.tsx +12 -8
- package/src/mwater_table_selection/MWaterWorkflowsSelectComponent.tsx +159 -0
- package/src/quickfilter/{QuickfiltersComponent.ts → QuickfiltersComponent.tsx} +165 -158
- package/src/quickfilter/TextLiteralComponent.tsx +197 -0
- package/src/widgets/MapWidget.tsx +9 -1
- package/src/widgets/text/ExprItemEditorComponent.tsx +83 -77
- package/src/widgets/text/ExprUpdateModalComponent.tsx +1 -0
- package/test/UndoStackTests.ts +52 -1
- package/.storybook/config.js +0 -7
- package/.storybook/head.html +0 -3
- package/.storybook/webpack.config.js +0 -15
- package/src/maps/BingLayer.ts +0 -146
- package/src/maps/MarkersLayerDesignerComponent.ts +0 -374
- package/src/quickfilter/TextLiteralComponent.ts +0 -165
- package/stories/UpdateableComponent.js +0 -29
- package/stories/consoles.js +0 -202
- package/stories/dashboards.js +0 -217
- package/stories/datagridDesign.js +0 -114
- package/stories/datagrids.js +0 -69
- package/stories/dates.js +0 -80
- package/stories/exprcomponent.js +0 -43
- package/stories/index.js +0 -18
- package/stories/leaflet.js +0 -59
- package/stories/maps.js +0 -24
- package/stories/pivotChart.js +0 -235
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import PropTypes from "prop-types"
|
|
2
1
|
import _ from "lodash"
|
|
3
2
|
import React from "react"
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { DataSource, ExprUtils, Schema } from "@mwater/expressions"
|
|
3
|
+
import { DataSource, Schema } from "@mwater/expressions"
|
|
7
4
|
import { ExprComponent } from "@mwater/expressions-ui"
|
|
8
|
-
import {
|
|
5
|
+
import { Toggle } from "@mwater/react-library/lib/bootstrap"
|
|
6
|
+
import { DatagridDesignOrderBy } from "./DatagridDesign"
|
|
9
7
|
|
|
10
8
|
export interface OrderBysDesignerComponentProps {
|
|
11
9
|
/** schema to use */
|
|
@@ -13,10 +11,9 @@ export interface OrderBysDesignerComponentProps {
|
|
|
13
11
|
/** dataSource to use */
|
|
14
12
|
dataSource: DataSource
|
|
15
13
|
table: string
|
|
16
|
-
|
|
17
|
-
orderBys: any
|
|
14
|
+
orderBys: DatagridDesignOrderBy[]
|
|
18
15
|
/** Called when columns changes */
|
|
19
|
-
onChange:
|
|
16
|
+
onChange: (orderBys: DatagridDesignOrderBy[]) => void
|
|
20
17
|
}
|
|
21
18
|
|
|
22
19
|
// Edits an orderBys which is a list of expressions and directions. See README.md
|
|
@@ -42,40 +39,38 @@ export default class OrderBysDesignerComponent extends React.Component<OrderBysD
|
|
|
42
39
|
}
|
|
43
40
|
|
|
44
41
|
render() {
|
|
45
|
-
return
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
})
|
|
58
|
-
}),
|
|
42
|
+
return (
|
|
43
|
+
<div>
|
|
44
|
+
{_.map(this.props.orderBys, (orderBy, index) => {
|
|
45
|
+
return <OrderByDesignerComponent
|
|
46
|
+
key={index}
|
|
47
|
+
schema={this.props.schema}
|
|
48
|
+
table={this.props.table}
|
|
49
|
+
dataSource={this.props.dataSource}
|
|
50
|
+
orderBy={orderBy}
|
|
51
|
+
onChange={this.handleChange.bind(null, index)}
|
|
52
|
+
onRemove={this.handleRemove.bind(null, index)}
|
|
53
|
+
/>
|
|
54
|
+
})}
|
|
59
55
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
)
|
|
56
|
+
<button
|
|
57
|
+
key="add"
|
|
58
|
+
type="button"
|
|
59
|
+
className="btn btn-link"
|
|
60
|
+
onClick={this.handleAdd}
|
|
61
|
+
>
|
|
62
|
+
<span className="fas fa-plus" />
|
|
63
|
+
{" " + T`Add Ordering`}
|
|
64
|
+
</button>
|
|
65
|
+
</div>
|
|
71
66
|
)
|
|
72
67
|
}
|
|
73
68
|
}
|
|
74
69
|
|
|
75
70
|
interface OrderByDesignerComponentProps {
|
|
76
|
-
orderBy:
|
|
77
|
-
onChange:
|
|
78
|
-
onRemove:
|
|
71
|
+
orderBy: DatagridDesignOrderBy
|
|
72
|
+
onChange: (orderBy: DatagridDesignOrderBy) => void
|
|
73
|
+
onRemove: () => void
|
|
79
74
|
schema: Schema
|
|
80
75
|
dataSource: DataSource
|
|
81
76
|
table?: string
|
|
@@ -86,43 +81,39 @@ class OrderByDesignerComponent extends React.Component<OrderByDesignerComponentP
|
|
|
86
81
|
return this.props.onChange(_.extend({}, this.props.orderBy, { expr }))
|
|
87
82
|
}
|
|
88
83
|
|
|
89
|
-
handleDirectionChange = (
|
|
90
|
-
return this.props.onChange(_.extend({}, this.props.orderBy, { direction
|
|
84
|
+
handleDirectionChange = (direction: string) => {
|
|
85
|
+
return this.props.onChange(_.extend({}, this.props.orderBy, { direction }))
|
|
91
86
|
}
|
|
92
87
|
|
|
93
88
|
render() {
|
|
94
|
-
return
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
{ className: "btn btn-sm btn-link", type: "button", onClick: this.props.onRemove },
|
|
123
|
-
R("span", { className: "fas fa-times" })
|
|
124
|
-
)
|
|
125
|
-
)
|
|
89
|
+
return (
|
|
90
|
+
<div style={{ display: "flex", alignItems: "center", gap: "8px", marginBottom: "8px" }}>
|
|
91
|
+
<div style={{ flex: 1 }}>
|
|
92
|
+
<ExprComponent
|
|
93
|
+
schema={this.props.schema}
|
|
94
|
+
dataSource={this.props.dataSource}
|
|
95
|
+
table={this.props.table}
|
|
96
|
+
types={["text", "number", "boolean", "date", "datetime"]}
|
|
97
|
+
aggrStatuses={["individual", "literal", "aggregate"]}
|
|
98
|
+
value={this.props.orderBy.expr}
|
|
99
|
+
onChange={this.handleExprChange}
|
|
100
|
+
/>
|
|
101
|
+
</div>
|
|
102
|
+
<div style={{ display: "flex", alignItems: "center", gap: "8px" }}>
|
|
103
|
+
<Toggle
|
|
104
|
+
size="xs"
|
|
105
|
+
value={this.props.orderBy.direction}
|
|
106
|
+
onChange={this.handleDirectionChange}
|
|
107
|
+
options={[
|
|
108
|
+
{ value: "asc", label: T`Ascending` },
|
|
109
|
+
{ value: "desc", label: T`Descending` }
|
|
110
|
+
]}
|
|
111
|
+
/>
|
|
112
|
+
<button className="btn btn-sm btn-link" type="button" onClick={this.props.onRemove}>
|
|
113
|
+
<span className="fas fa-times" />
|
|
114
|
+
</button>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
126
117
|
)
|
|
127
118
|
}
|
|
128
119
|
}
|
package/src/index.css
CHANGED
|
@@ -55,6 +55,12 @@ Lato, Lora, Inter, Merriweather, Roboto
|
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
@media only screen and (max-width: 800px) {
|
|
59
|
+
.hide-800px {
|
|
60
|
+
display: none;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
58
64
|
/* Dashed thresholds */
|
|
59
65
|
.bb-grid line {
|
|
60
66
|
stroke-dasharray: 3;
|
|
@@ -133,6 +139,20 @@ Lato, Lora, Inter, Merriweather, Roboto
|
|
|
133
139
|
visibility: visible;
|
|
134
140
|
}
|
|
135
141
|
|
|
142
|
+
/* Use these to make a grandchild that displays only when parent is hovered */
|
|
143
|
+
.hover-display-parent > * > .hover-display-grandchild {
|
|
144
|
+
visibility: hidden;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.hover-display-parent:hover > * > .hover-display-grandchild {
|
|
148
|
+
visibility: visible;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* Use these to set a faint background on hover */
|
|
152
|
+
.hover-grey:hover {
|
|
153
|
+
background-color: #f8f8f8;
|
|
154
|
+
}
|
|
155
|
+
|
|
136
156
|
.bb-title {
|
|
137
157
|
font: 14px sans-serif;
|
|
138
158
|
font-weight: bold;
|
|
@@ -342,6 +362,29 @@ Lato, Lora, Inter, Merriweather, Roboto
|
|
|
342
362
|
background-color: #363b3e;
|
|
343
363
|
padding: 5px;
|
|
344
364
|
padding-top: 6px;
|
|
365
|
+
transform: translateX(-100%);
|
|
366
|
+
animation: slideIn 0.3s ease-in-out;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
@keyframes slideIn {
|
|
370
|
+
from {
|
|
371
|
+
transform: translateX(-100%);
|
|
372
|
+
}
|
|
373
|
+
to {
|
|
374
|
+
transform: translateX(0);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.mwater-visualization-palette-container {
|
|
379
|
+
position: absolute;
|
|
380
|
+
top: 0;
|
|
381
|
+
left: 0;
|
|
382
|
+
height: 100%;
|
|
383
|
+
z-index: 1000;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
.mwater-visualization-palette-container:not(.hidden) .mwater-visualization-palette {
|
|
387
|
+
transform: translateX(0);
|
|
345
388
|
}
|
|
346
389
|
|
|
347
390
|
.mwater-visualization-palette-item {
|
|
@@ -543,11 +586,11 @@ Lato, Lora, Inter, Merriweather, Roboto
|
|
|
543
586
|
background-color: rgba(0, 0, 0, 0.075);
|
|
544
587
|
}
|
|
545
588
|
|
|
546
|
-
.
|
|
589
|
+
.mwater-visualization-cursor-hover:hover {
|
|
547
590
|
cursor: move;
|
|
548
591
|
}
|
|
549
592
|
|
|
550
|
-
.
|
|
593
|
+
.mwater-visualization-map-hover-content {
|
|
551
594
|
display: grid;
|
|
552
595
|
grid-template-columns: 1fr 2fr;
|
|
553
596
|
grid-auto-rows: min-content;
|
package/src/index.ts
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
|
|
3
|
-
MapBounds,
|
|
4
|
-
TileLayer,
|
|
5
|
-
GeoJsonLayer,
|
|
6
|
-
MapLayer
|
|
7
|
-
} from "./maps/LeafletMapComponent"
|
|
1
|
+
export { default as LeafletMapComponent } from "./maps/LeafletMapComponent"
|
|
2
|
+
export type { MapBounds, TileLayer, GeoJsonLayer, MapLayer } from "./maps/LeafletMapComponent"
|
|
8
3
|
|
|
9
4
|
export { default as DateRangeComponent } from "./DateRangeComponent"
|
|
10
5
|
|
|
@@ -18,7 +13,7 @@ export { default as DashboardComponent } from "./dashboards/DashboardComponent"
|
|
|
18
13
|
export { default as DashboardDataSource } from "./dashboards/DashboardDataSource"
|
|
19
14
|
export { default as DirectDashboardDataSource } from "./dashboards/DirectDashboardDataSource"
|
|
20
15
|
export * from "./dashboards/DashboardDesign"
|
|
21
|
-
export { MapDesign, MapLayerView } from "./maps/MapDesign"
|
|
16
|
+
export type { MapDesign, MapLayerView } from "./maps/MapDesign"
|
|
22
17
|
|
|
23
18
|
export { default as compressJson } from "./compressJson"
|
|
24
19
|
|
|
@@ -32,7 +27,7 @@ export { default as Widget } from "./widgets/Widget"
|
|
|
32
27
|
export { default as DatagridUtils } from "./datagrids/DatagridUtils"
|
|
33
28
|
|
|
34
29
|
export * from "./maps/MapViewComponent"
|
|
35
|
-
export { MapScope } from "./maps/MapUtils"
|
|
30
|
+
export type { MapScope } from "./maps/MapUtils"
|
|
36
31
|
|
|
37
32
|
export { languages } from "./languages"
|
|
38
33
|
|
|
@@ -41,7 +36,7 @@ export { default as MWaterContextComponent } from "./MWaterContextComponent"
|
|
|
41
36
|
|
|
42
37
|
export { default as mWaterLoader } from "./mWaterLoader"
|
|
43
38
|
|
|
44
|
-
export { WidgetDataSource } from "./widgets/WidgetDataSource"
|
|
39
|
+
export type { WidgetDataSource } from "./widgets/WidgetDataSource"
|
|
45
40
|
export { default as DirectWidgetDataSource } from "./widgets/DirectWidgetDataSource"
|
|
46
41
|
|
|
47
42
|
import "leaflet/dist/leaflet.css"
|
|
@@ -55,7 +50,6 @@ export { setMapTilerApiKey } from "./maps/vectorMaps"
|
|
|
55
50
|
|
|
56
51
|
export { default as UndoStack } from "./UndoStack"
|
|
57
52
|
export { default as DashboardViewComponent } from "./dashboards/DashboardViewComponent"
|
|
58
|
-
export let BingLayer = require("./maps/BingLayer")
|
|
59
53
|
export let UtfGridLayer = require("./maps/UtfGridLayer")
|
|
60
54
|
export { default as LayerFactory } from "./maps/LayerFactory"
|
|
61
55
|
export { default as MapDesignerComponent } from "./maps/MapDesignerComponent"
|
|
@@ -38,11 +38,39 @@ export interface BlocksDisplayComponentProps {
|
|
|
38
38
|
cantPasteMessage?: string
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
interface BlocksDisplayComponentState {
|
|
42
|
+
isPaletteVisible: boolean
|
|
43
|
+
isManuallyHidden: boolean
|
|
44
|
+
}
|
|
45
|
+
|
|
41
46
|
/**
|
|
42
47
|
Renders the complete layout of the blocks and also optionally a palette to the left
|
|
43
48
|
that can be used to drag new items into the layout. Palette is only displayed if onItemsChange is not null
|
|
44
49
|
*/
|
|
45
|
-
class BlocksDisplayComponent extends React.Component<BlocksDisplayComponentProps> {
|
|
50
|
+
class BlocksDisplayComponent extends React.Component<BlocksDisplayComponentProps, BlocksDisplayComponentState> {
|
|
51
|
+
state: BlocksDisplayComponentState = {
|
|
52
|
+
isPaletteVisible: false,
|
|
53
|
+
isManuallyHidden: false
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
componentDidUpdate(prevProps: BlocksDisplayComponentProps) {
|
|
57
|
+
// If editing state changes (onItemsChange becomes available/unavailable)
|
|
58
|
+
if (prevProps.onItemsChange !== this.props.onItemsChange) {
|
|
59
|
+
if (this.props.onItemsChange && !this.state.isManuallyHidden) {
|
|
60
|
+
this.setState({ isPaletteVisible: true })
|
|
61
|
+
} else if (!this.props.onItemsChange) {
|
|
62
|
+
this.setState({ isPaletteVisible: false, isManuallyHidden: false })
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
handlePaletteToggle = () => {
|
|
68
|
+
this.setState(prevState => ({
|
|
69
|
+
isPaletteVisible: !prevState.isPaletteVisible,
|
|
70
|
+
isManuallyHidden: !prevState.isManuallyHidden
|
|
71
|
+
}))
|
|
72
|
+
}
|
|
73
|
+
|
|
46
74
|
handleBlockDrop = (sourceBlock: LayoutBlock, targetBlock: LayoutBlock, side: "top" | "left" | "right" | "bottom") => {
|
|
47
75
|
// Remove source from items
|
|
48
76
|
let items = blockUtils.removeBlock(this.props.items, sourceBlock)!
|
|
@@ -219,8 +247,32 @@ class BlocksDisplayComponent extends React.Component<BlocksDisplayComponentProps
|
|
|
219
247
|
|
|
220
248
|
renderPalette() {
|
|
221
249
|
return (
|
|
222
|
-
<div key="palette" style={{
|
|
250
|
+
<div key="palette" style={{
|
|
251
|
+
width: 141,
|
|
252
|
+
height: "100%",
|
|
253
|
+
position: "absolute",
|
|
254
|
+
top: 0,
|
|
255
|
+
left: 0,
|
|
256
|
+
transition: "transform 0.3s ease-in-out",
|
|
257
|
+
transform: this.state.isPaletteVisible ? "translateX(0)" : "translateX(-100%)"
|
|
258
|
+
}}>
|
|
223
259
|
<div className="mwater-visualization-palette" style={{ height: "100%" }}>
|
|
260
|
+
<div
|
|
261
|
+
style={{
|
|
262
|
+
position: "absolute",
|
|
263
|
+
right: -14,
|
|
264
|
+
top: 0,
|
|
265
|
+
background: "#363b3e",
|
|
266
|
+
color: "white",
|
|
267
|
+
padding: "5px 3px 5px 5px",
|
|
268
|
+
cursor: "pointer",
|
|
269
|
+
borderRadius: "0 3px 3px 0",
|
|
270
|
+
zIndex: 1001
|
|
271
|
+
}}
|
|
272
|
+
onClick={this.handlePaletteToggle}
|
|
273
|
+
>
|
|
274
|
+
<i className={`fa fa-chevron-${this.state.isPaletteVisible ? 'left' : 'right'}`} />
|
|
275
|
+
</div>
|
|
224
276
|
<PaletteItemComponent
|
|
225
277
|
createItem={this.createBlockItem({ type: "widget", widgetType: "Text", design: { style: "title" } })}
|
|
226
278
|
title={<i className="fa fa-font" />}
|
|
@@ -345,16 +397,19 @@ class BlocksDisplayComponent extends React.Component<BlocksDisplayComponentProps
|
|
|
345
397
|
style={{ width: "100%", height: "100%", overflow: "hidden", position: "relative" }}
|
|
346
398
|
layoutOptions={layoutOptions}
|
|
347
399
|
>
|
|
348
|
-
|
|
400
|
+
<div className="mwater-visualization-palette-container">
|
|
401
|
+
{this.renderPalette()}
|
|
402
|
+
</div>
|
|
349
403
|
<div
|
|
350
404
|
style={{
|
|
351
405
|
position: "absolute",
|
|
352
|
-
left: 141,
|
|
406
|
+
left: this.state.isPaletteVisible ? 141 : 0,
|
|
353
407
|
top: 0,
|
|
354
408
|
bottom: 0,
|
|
355
409
|
right: 0,
|
|
356
410
|
overflowX: "auto",
|
|
357
|
-
overflowY: "scroll"
|
|
411
|
+
overflowY: "scroll",
|
|
412
|
+
transition: "left 0.3s ease-in-out"
|
|
358
413
|
}}
|
|
359
414
|
className={`mwater-visualization-block-parent-outer mwater-visualization-block-editing`}
|
|
360
415
|
>
|
package/src/maps/BufferLayer.ts
CHANGED
|
@@ -869,6 +869,19 @@ marker-fill: ` +
|
|
|
869
869
|
})
|
|
870
870
|
|
|
871
871
|
draft.filter = exprCleaner.cleanExpr(design.filter || null, { table: design.table })
|
|
872
|
+
|
|
873
|
+
// Clean hover over expressions
|
|
874
|
+
if (design.table && design.hoverOver && design.hoverOver.items) {
|
|
875
|
+
for (let i = 0; i < design.hoverOver.items.length; i++) {
|
|
876
|
+
const item = design.hoverOver.items[i]
|
|
877
|
+
if (item.value) {
|
|
878
|
+
draft.hoverOver!.items[i].value = exprCleaner.cleanExpr(item.value || null, {
|
|
879
|
+
table: design.table,
|
|
880
|
+
aggrStatuses: ["individual", "literal"]
|
|
881
|
+
})
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
}
|
|
872
885
|
})
|
|
873
886
|
|
|
874
887
|
return design
|
|
@@ -962,7 +975,7 @@ marker-fill: ` +
|
|
|
962
975
|
filters: options.filters,
|
|
963
976
|
schema: options.schema,
|
|
964
977
|
dataSource: options.dataSource,
|
|
965
|
-
hoverOverItems: options.design.hoverOver
|
|
978
|
+
hoverOverItems: options.design.hoverOver!.items,
|
|
966
979
|
})
|
|
967
980
|
}
|
|
968
981
|
}
|
|
@@ -47,7 +47,7 @@ export interface BufferLayerDesign {
|
|
|
47
47
|
popup: { items: LayoutBlock }
|
|
48
48
|
|
|
49
49
|
/** Contains items: which is HoverOverItem[] */
|
|
50
|
-
hoverOver
|
|
50
|
+
hoverOver?: { items: HoverOverItem[] }
|
|
51
51
|
|
|
52
52
|
/** Customizable filtering for popup. See PopupFilterJoins.md */
|
|
53
53
|
popupFilterJoins: PopupFilterJoins
|
|
@@ -15,7 +15,7 @@ import { Checkbox } from "@mwater/react-library/lib/bootstrap"
|
|
|
15
15
|
import { BufferLayerDesign } from "./BufferLayerDesign"
|
|
16
16
|
import { JsonQLFilter } from "../JsonQLFilter"
|
|
17
17
|
import { areVectorMapsEnabled } from "./vectorMaps"
|
|
18
|
-
import EditHoverOver from "./EditHoverOver"
|
|
18
|
+
import { EditHoverOver } from "./EditHoverOver"
|
|
19
19
|
|
|
20
20
|
export interface BufferLayerDesignerComponentProps {
|
|
21
21
|
/** Schema to use */
|
|
@@ -281,6 +281,7 @@ export default class BufferLayerDesignerComponent extends React.Component<Buffer
|
|
|
281
281
|
table={this.props.design.table}
|
|
282
282
|
idTable={this.props.design.table}
|
|
283
283
|
defaultPopupFilterJoins={PopupFilterJoinsUtils.createDefaultPopupFilterJoins(this.props.design.table)}
|
|
284
|
+
aggrStatuses={["individual", "literal"]}
|
|
284
285
|
/>
|
|
285
286
|
)
|
|
286
287
|
}
|
|
@@ -914,7 +914,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
|
|
|
914
914
|
|
|
915
915
|
// Scope overall
|
|
916
916
|
if (design.scope) {
|
|
917
|
-
;(query.where as JsonQLOp).exprs.push({
|
|
917
|
+
; (query.where as JsonQLOp).exprs.push({
|
|
918
918
|
type: "op",
|
|
919
919
|
op: "=",
|
|
920
920
|
exprs: [
|
|
@@ -927,7 +927,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
|
|
|
927
927
|
// Add filters on regions to outer query
|
|
928
928
|
for (const filter of filters) {
|
|
929
929
|
if (filter.table == regionsTable) {
|
|
930
|
-
;(query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions"))
|
|
930
|
+
; (query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions"))
|
|
931
931
|
}
|
|
932
932
|
}
|
|
933
933
|
|
|
@@ -1062,7 +1062,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
|
|
|
1062
1062
|
|
|
1063
1063
|
// Scope overall
|
|
1064
1064
|
if (design.scope) {
|
|
1065
|
-
;(query.where as JsonQLOp).exprs.push({
|
|
1065
|
+
; (query.where as JsonQLOp).exprs.push({
|
|
1066
1066
|
type: "op",
|
|
1067
1067
|
op: "=",
|
|
1068
1068
|
exprs: [
|
|
@@ -1075,7 +1075,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
|
|
|
1075
1075
|
// Add filters on regions to outer query
|
|
1076
1076
|
for (const filter of filters) {
|
|
1077
1077
|
if (filter.table == regionsTable) {
|
|
1078
|
-
;(query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions2"))
|
|
1078
|
+
; (query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions2"))
|
|
1079
1079
|
}
|
|
1080
1080
|
}
|
|
1081
1081
|
|
|
@@ -1148,7 +1148,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
|
|
|
1148
1148
|
|
|
1149
1149
|
// Scope overall
|
|
1150
1150
|
if (design.scope) {
|
|
1151
|
-
;(query.where as JsonQLOp).exprs.push({
|
|
1151
|
+
; (query.where as JsonQLOp).exprs.push({
|
|
1152
1152
|
type: "op",
|
|
1153
1153
|
op: "=",
|
|
1154
1154
|
exprs: [
|
|
@@ -1161,7 +1161,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
|
|
|
1161
1161
|
// Add filters on regions to outer query
|
|
1162
1162
|
for (const filter of filters) {
|
|
1163
1163
|
if (filter.table == regionsTable) {
|
|
1164
|
-
;(query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions"))
|
|
1164
|
+
; (query.where as JsonQLOp).exprs.push(injectTableAlias(filter.jsonql, "regions"))
|
|
1165
1165
|
}
|
|
1166
1166
|
}
|
|
1167
1167
|
|
|
@@ -1600,6 +1600,19 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
|
|
|
1600
1600
|
delete draft.filter
|
|
1601
1601
|
}
|
|
1602
1602
|
|
|
1603
|
+
// Clean hover over expressions only for indirect mode with a valid table
|
|
1604
|
+
if (design.table && design.regionMode === "indirect" && design.hoverOver && design.hoverOver.items) {
|
|
1605
|
+
for (let i = 0; i < design.hoverOver.items.length; i++) {
|
|
1606
|
+
const item = design.hoverOver.items[i]
|
|
1607
|
+
if (item.value) {
|
|
1608
|
+
draft.hoverOver!.items[i].value = exprCleaner.cleanExpr(item.value || null, {
|
|
1609
|
+
table: design.table,
|
|
1610
|
+
aggrStatuses: ["individual", "literal", "aggregate"]
|
|
1611
|
+
})
|
|
1612
|
+
}
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1603
1616
|
if (design.detailLevel == null) {
|
|
1604
1617
|
draft.detailLevel = 0
|
|
1605
1618
|
}
|
|
@@ -1746,7 +1759,7 @@ export default class ChoroplethLayer extends Layer<ChoroplethLayerDesign> {
|
|
|
1746
1759
|
filters: popupFilters,
|
|
1747
1760
|
schema: options.schema,
|
|
1748
1761
|
dataSource: options.dataSource,
|
|
1749
|
-
hoverOverItems: options.design.hoverOver
|
|
1762
|
+
hoverOverItems: options.design.hoverOver!.items,
|
|
1750
1763
|
})
|
|
1751
1764
|
}
|
|
1752
1765
|
}
|
|
@@ -65,8 +65,11 @@ export default interface ChoroplethLayerDesign {
|
|
|
65
65
|
/** customizable filtering for popup. See PopupFilterJoins.md. Only when region mode is "indirect" */
|
|
66
66
|
popupFilterJoins: PopupFilterJoins
|
|
67
67
|
|
|
68
|
-
/** Hover over items to display when hovering over a region. Only when region mode is "indirect"
|
|
69
|
-
|
|
68
|
+
/** Hover over items to display when hovering over a region. Only when region mode is "indirect".
|
|
69
|
+
* This is an aggregate hover over, but can contain individual items. If so, only the first row
|
|
70
|
+
* of the resulting query will be displayed.
|
|
71
|
+
*/
|
|
72
|
+
hoverOver?: { items: HoverOverItem[] }
|
|
70
73
|
|
|
71
74
|
/** minimum zoom level */
|
|
72
75
|
minZoom?: number
|