Skip to content

Commit ea9e64c

Browse files
authored
Connect to #2662 Geodashboard single connection support (#2780)
* Improved widgets dependencies system * Support for single map connection * removed test for old map sync switches
1 parent a5b096d commit ea9e64c

39 files changed

Lines changed: 527 additions & 157 deletions

web/client/actions/widgets.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ const UPDATE_PROPERTY = "WIDGETS:UPDATE_PROPERTY";
1717
const CHANGE_LAYOUT = "WIDGETS:CHANGE_LAYOUT";
1818
const DELETE = "WIDGETS:DELETE";
1919
const CLEAR_WIDGETS = "WIDGETS:CLEAR_WIDGETS";
20+
const ADD_DEPENDENCY = "WIDGETS:ADD_DEPENDENCY";
21+
const REMOVE_DEPENDENCY = "WIDGETS:REMOVE_DEPENDENCY";
22+
const LOAD_DEPENDENCIES = "WIDGETS:LOAD_DEPENDENCIES";
23+
const RESET_DEPENDENCIES = "WIDGETS:RESET_DEPENDENCIES";
24+
2025
const OPEN_FILTER_EDITOR = "WIDGETS:OPEN_FILTER_EDITOR";
2126
const EXPORT_CSV = "WIDGETS:EXPORT_CSV";
2227
const EXPORT_IMAGE = "WIDGETS:EXPORT_IMAGE";
@@ -146,6 +151,25 @@ const changeEditorSetting = (key, value) => ({
146151
key,
147152
value
148153
});
154+
155+
const addDependency = (key, value) => ({
156+
type: ADD_DEPENDENCY,
157+
key,
158+
value
159+
});
160+
161+
const removeDependency = (key) => ({
162+
type: REMOVE_DEPENDENCY,
163+
key
164+
});
165+
166+
const resetDependencies = () => ({
167+
type: RESET_DEPENDENCIES
168+
});
169+
const loadDependencies = (dependencies) => ({
170+
type: LOAD_DEPENDENCIES,
171+
dependencies
172+
});
149173
/**
150174
* Change the page setting of the editor
151175
* @param {number} step the page number
@@ -180,6 +204,10 @@ module.exports = {
180204
EDIT_NEW,
181205
EDITOR_CHANGE,
182206
EDITOR_SETTING_CHANGE,
207+
ADD_DEPENDENCY,
208+
REMOVE_DEPENDENCY,
209+
LOAD_DEPENDENCIES,
210+
RESET_DEPENDENCIES,
183211
DEFAULT_TARGET,
184212
OPEN_FILTER_EDITOR,
185213
EXPORT_CSV,
@@ -198,5 +226,9 @@ module.exports = {
198226
editNewWidget,
199227
onEditorChange,
200228
changeEditorSetting,
229+
addDependency,
230+
removeDependency,
231+
loadDependencies,
232+
resetDependencies,
201233
setPage
202234
};
Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
1-
/**
2-
* Copyright 2017, GeoSolutions Sas.
3-
* All rights reserved.
4-
*
5-
* This source code is licensed under the BSD-style license found in the
6-
* LICENSE file in the root directory of this source tree.
7-
*/
1+
/**
2+
* Copyright 2017, GeoSolutions Sas.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the BSD-style license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
88
const React = require('react');
99

10-
const {wizardHandlers} = require('../../../misc/wizard/enhancers');
11-
const loadingState = require('../../../misc/enhancers/loadingState')(({loading, data}) => loading || !data, {width: 500, height: 200});
10+
const { wizardHandlers } = require('../../../misc/wizard/enhancers');
11+
const loadingState = require('../../../misc/enhancers/loadingState')(({ loading, data }) => loading || !data, { width: 500, height: 200 });
1212

1313
const ChartType = require('./chart/ChartType');
1414
const wfsChartOptions = require('./common/wfsChartOptions');
1515
const ChartOptions = wfsChartOptions(require('./common/WPSWidgetOptions'));
1616
const WidgetOptions = require('./common/WidgetOptions');
1717
const sampleData = require('../../enhancers/sampleChartData');
1818
const wpsChart = require('../../enhancers/wpsChart');
19+
const dependenciesToWidget = require('../../enhancers/dependenciesToWidget');
1920
const dependenciesToFilter = require('../../enhancers/dependenciesToFilter');
2021
const emptyChartState = require('../../enhancers/emptyChartState');
2122
const errorChartState = require('../../enhancers/errorChartState');
22-
const {compose, lifecycle} = require('recompose');
23+
const { compose, lifecycle } = require('recompose');
2324
const enhancePreview = compose(
25+
dependenciesToWidget,
2426
dependenciesToFilter,
2527
wpsChart,
2628
loadingState,
@@ -41,13 +43,14 @@ const isChartOptionsValid = (options = {}) => options.aggregateFunction && optio
4143
const Wizard = wizardHandlers(require('../../../misc/wizard/WizardContainer'));
4244

4345

44-
const renderPreview = ({data = {}, layer, dependencies={}, setValid = () => {}}) => isChartOptionsValid(data.options)
46+
const renderPreview = ({ data = {}, layer, dependencies = {}, setValid = () => { } }) => isChartOptionsValid(data.options)
4547
? (<PreviewChart
4648
key="preview-chart"
4749
onLoad={() => setValid(true)}
4850
onLoadError={() => setValid(false)}
4951
isAnimationActive={false}
5052
dependencies={dependencies}
53+
dependenciesMap={data.dependenciesMap}
5154
{...sampleProps}
5255
type={data.type}
5356
legend={data.legend}
@@ -57,7 +60,7 @@ const renderPreview = ({data = {}, layer, dependencies={}, setValid = () => {}})
5760
mapSync={data.mapSync}
5861
autoColorOptions={data.autoColorOptions}
5962
options={data.options}
60-
/>)
63+
/>)
6164
: (<SampleChart
6265
key="sample-chart"
6366
isAnimationActive={false}
@@ -67,24 +70,25 @@ const renderPreview = ({data = {}, layer, dependencies={}, setValid = () => {}})
6770
legend={data.legend} />);
6871

6972
const enhanceWizard = compose(lifecycle({
70-
componentWillReceiveProps: ({data = {}, valid, setValid = () => {}} = {}) => {
73+
componentWillReceiveProps: ({ data = {}, valid, setValid = () => { } } = {}) => {
7174
if (valid && !isChartOptionsValid(data.options)) {
7275
setValid(false);
7376
}
74-
}})
77+
}
78+
})
7579
);
76-
module.exports = enhanceWizard(({onChange = () => {}, onFinish = () => {}, setPage= () => {}, setValid = () => {}, data = {}, layer ={}, step=0, types, featureTypeProperties, dependencies}) =>
80+
module.exports = enhanceWizard(({ onChange = () => { }, onFinish = () => { }, setPage = () => { }, setValid = () => { }, data = {}, layer = {}, step = 0, types, featureTypeProperties, dependencies }) =>
7781
(<Wizard
7882
step={step}
7983
setPage={setPage}
8084
onFinish={onFinish}
81-
isStepValid={ n => n === 1 ? isChartOptionsValid(data.options) : true} hideButtons>
85+
isStepValid={n => n === 1 ? isChartOptionsValid(data.options) : true} hideButtons>
8286
<ChartType
8387
key="type"
8488
type={data.type}
85-
onSelect={ i => {
89+
onSelect={i => {
8690
onChange("type", i);
87-
}}/>
91+
}} />
8892
<ChartOptions
8993
dependencies={dependencies}
9094
key="chart-options"
@@ -93,13 +97,13 @@ module.exports = enhanceWizard(({onChange = () => {}, onFinish = () => {}, setPa
9397
data={data}
9498
onChange={onChange}
9599
layer={data.layer || layer}
96-
sampleChart={renderPreview({data, layer: data.layer || layer, dependencies, setValid: v => setValid(v && isChartOptionsValid(data.options))})}
100+
sampleChart={renderPreview({ data, layer: data.layer || layer, dependencies, setValid: v => setValid(v && isChartOptionsValid(data.options)) })}
97101
/>
98102
<WidgetOptions
99103
key="widget-options"
100104
data={data}
101105
onChange={onChange}
102106
layer={data.layer || layer}
103-
sampleChart={renderPreview({data, layer: data.layer || layer, dependencies, setValid: v => setValid(v && isChartOptionsValid(data.options))})}
107+
sampleChart={renderPreview({ data, layer: data.layer || layer, dependencies, setValid: v => setValid(v && isChartOptionsValid(data.options)) })}
104108
/>
105-
</Wizard>));
109+
</Wizard>));

web/client/components/widgets/builder/wizard/CounterWizard.jsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const WidgetOptions = require('./common/WidgetOptions');
1818

1919
const wpsCounter = require('../../enhancers/wpsCounter');
2020
const dependenciesToFilter = require('../../enhancers/dependenciesToFilter');
21+
const dependenciesToWidget = require('../../enhancers/dependenciesToWidget');
2122
const emptyChartState = require('../../enhancers/emptyChartState');
2223
const errorChartState = require('../../enhancers/errorChartState');
2324

@@ -32,8 +33,8 @@ const triggerSetValid = compose(
3233
}
3334
}));
3435

35-
const enhanchePreview = compose(
36-
36+
const enhancePreview = compose(
37+
dependenciesToWidget,
3738
dependenciesToFilter,
3839
wpsCounter,
3940
triggerSetValid,
@@ -51,7 +52,7 @@ const Wizard = wizardHandlers(require('../../../misc/wizard/WizardContainer'));
5152

5253

5354
const Counter = require('../../widget/CounterView');
54-
const Preview = enhanchePreview(Counter);
55+
const Preview = enhancePreview(Counter);
5556
const CounterPreview = ({ data = {}, layer, dependencies = {}, valid, setValid = () => { } }) =>
5657
!isCounterOptionsValid(data.options)
5758
? <Counter
@@ -62,6 +63,7 @@ const CounterPreview = ({ data = {}, layer, dependencies = {}, valid, setValid =
6263
: <Preview
6364
{...sampleProps}
6465
valid={valid}
66+
dependenciesMap={data.dependenciesMap}
6567
dependencies={dependencies}
6668
setValid={setValid}
6769
type={data.type}

web/client/components/widgets/builder/wizard/chart/Toolbar.jsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,11 @@ const getSaveTooltipId = (step, {id} = {}) => {
3939
}
4040
return "widgets.builder.wizard.addToTheMap";
4141
};
42-
module.exports = ({openFilterEditor = () => {}, step = 0, editorData = {}, valid, setPage = () => {}, onFinish = () => {}} = {}) => (<Toolbar btnDefaultProps={{
42+
module.exports = ({
43+
step = 0, editorData = {}, valid, setPage = () => {}, onFinish = () => {},
44+
stepButtons = [],
45+
openFilterEditor = () => {}
46+
} = {}) => (<Toolbar btnDefaultProps={{
4347
bsStyle: "primary",
4448
bsSize: "sm"
4549
}}
@@ -48,7 +52,7 @@ module.exports = ({openFilterEditor = () => {}, step = 0, editorData = {}, valid
4852
visible: step > 0,
4953
glyph: "arrow-left",
5054
tooltipId: getBackTooltipId(step)
51-
}, {
55+
}, ...stepButtons, {
5256
visible: step > 0,
5357
onClick: openFilterEditor,
5458
glyph: "filter",

web/client/components/widgets/builder/wizard/common/WPSWidgetOptions.jsx

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ module.exports = ({
5757
showColorRampSelector: true,
5858
showLegend: true
5959
},
60-
dependencies,
6160
aggregationOptions = [],
6261
sampleChart}) => (<Row>
6362
<StepHeader title={<Message msgId={`widgets.chartOptionsTitle`} />} />
@@ -133,21 +132,6 @@ module.exports = ({
133132
onChange={v => {onChange("autoColorOptions", {...v.options, name: v.name}); }}/>
134133
</Col>
135134
</FormGroup> : null}
136-
{dependencies && dependencies.viewport
137-
? (<FormGroup controlId="mapSync" className="mapstore-block-width">
138-
<Col componentClass={ControlLabel} sm={6}>
139-
<Message msgId={`widgets.mapSync`} />
140-
</Col>
141-
<Col sm={6}>
142-
<SwitchButton
143-
checked={data.mapSync}
144-
onChange={(val) => {
145-
onChange("mapSync", val);
146-
}}
147-
/>
148-
</Col>
149-
</FormGroup>)
150-
: null}
151135
{formOptions.showLegend ? <FormGroup controlId="displayLegend">
152136
<Col componentClass={ControlLabel} sm={6}>
153137
<Message msgId={getLabelMessageId("displayLegend", data)} />

web/client/components/widgets/builder/wizard/common/__tests__/WPSWidgetOptions-test.jsx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,8 @@ describe('WPSWidgetOptions component', () => {
5555

5656

5757
ReactTestUtils.Simulate.change(inputs[3]);
58-
expect(spyonChange.calls[3].arguments[0]).toBe("mapSync");
58+
expect(spyonChange.calls[3].arguments[0]).toBe("legend");
5959
expect(spyonChange.calls[3].arguments[1]).toBe(true);
60-
61-
ReactTestUtils.Simulate.change(inputs[4]);
62-
expect(spyonChange.calls[4].arguments[0]).toBe("legend");
63-
expect(spyonChange.calls[4].arguments[1]).toBe(true);
6460
});
6561
it('Test WPSWidgetOptions onChange for counter context', () => {
6662
const actions = {
@@ -91,9 +87,5 @@ describe('WPSWidgetOptions component', () => {
9187
ReactTestUtils.Simulate.change(inputs[2], { target: { value: 'test' } });
9288
expect(spyonChange.calls[2].arguments[0]).toBe("options.seriesOptions.[0].uom");
9389
expect(spyonChange.calls[2].arguments[1]).toBe("test");
94-
95-
ReactTestUtils.Simulate.change(inputs[3]);
96-
expect(spyonChange.calls[3].arguments[0]).toBe("mapSync");
97-
expect(spyonChange.calls[3].arguments[1]).toBe(true);
9890
});
9991
});

web/client/components/widgets/builder/wizard/counter/Toolbar.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const getSaveTooltipId = (step, {id} = {}) => {
3737
}
3838
return "widgets.builder.wizard.addToTheMap";
3939
};
40-
module.exports = ({openFilterEditor = () => {}, step = 0, editorData = {}, valid, setPage = () => {}, onFinish = () => {}} = {}) => (<Toolbar btnDefaultProps={{
40+
module.exports = ({openFilterEditor = () => {}, step = 0, stepButtons = [], editorData = {}, valid, setPage = () => {}, onFinish = () => {}} = {}) => (<Toolbar btnDefaultProps={{
4141
bsStyle: "primary",
4242
bsSize: "sm"
4343
}}
@@ -46,7 +46,7 @@ module.exports = ({openFilterEditor = () => {}, step = 0, editorData = {}, valid
4646
visible: step > 0,
4747
glyph: "arrow-left",
4848
tooltipId: getBackTooltipId(step)
49-
}, {
49+
}, ...stepButtons, {
5050
visible: step === 0,
5151
onClick: openFilterEditor,
5252
glyph: "filter",

web/client/components/widgets/builder/wizard/map/Toolbar.jsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@ const React = require('react');
1010

1111
const Toolbar = require('../../../../misc/toolbar/Toolbar');
1212

13-
const getSaveTooltipId = (step, {id} = {}) => {
13+
const getSaveTooltipId = (step, { id } = {}) => {
1414
if (id) {
1515
return "widgets.builder.wizard.updateWidget";
1616
}
1717
return "widgets.builder.wizard.addToTheMap";
1818
};
1919

20-
module.exports = ({ step = 0, buttons, tocButtons = [], editorData = {}, setPage = () => {}, onFinish = () => { }, toggleLayerSelector = () => { } } = {}) => (<Toolbar btnDefaultProps={{
21-
bsStyle: "primary",
22-
bsSize: "sm"
23-
}}
24-
buttons={buttons || [ ...(step === 0 ? tocButtons : []), {
20+
module.exports = ({ step = 0, buttons, tocButtons = [], editorData = {}, setPage = () => { }, onFinish = () => { }, toggleLayerSelector = () => { } } = {}) => (<Toolbar btnDefaultProps={{
21+
bsStyle: "primary",
22+
bsSize: "sm"
23+
}}
24+
buttons={buttons || [...(step === 0 ? tocButtons : []), {
2525
onClick: () => toggleLayerSelector(true),
2626
visible: step === 0,
2727
glyph: "plus",

web/client/components/widgets/builder/wizard/table/TableOptions.jsx

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@
88
const React = require('react');
99
const { isGeometryType } = require('../../../../../utils/ogc/WFS/base');
1010
const { uniq, castArray, includes } = require('lodash');
11-
const { Row, Col, Form, FormGroup, ControlLabel, Button } = require('react-bootstrap');
11+
const { Row, Col, Form, Button } = require('react-bootstrap');
1212
const Message = require('../../../../I18N/Message');
1313
const StepHeader = require('../../../../misc/wizard/StepHeader');
14-
const SwitchButton = require('../../../../misc/switch/SwitchButton');
1514

1615
const {withProps, withHandlers, compose} = require('recompose');
1716
const updatePropertyName = (arr, name, hide) => {
@@ -39,7 +38,7 @@ const AttributeSelector = compose(withProps(
3938
)(require('../../../../data/featuregrid/AttributeTable'));
4039

4140

42-
module.exports = ({ data = { options: {} }, onChange = () => { }, dependencies, featureTypeProperties, sampleChart}) => (<Row>
41+
module.exports = ({ data = { options: {} }, onChange = () => { }, featureTypeProperties, sampleChart}) => (<Row>
4342
<StepHeader title={<Message msgId={`widgets.builder.wizard.configureTableOptions`} />} />
4443
<Col xs={12}>
4544
<div >
@@ -52,21 +51,6 @@ module.exports = ({ data = { options: {} }, onChange = () => { }, dependencies,
5251
options={data.options}
5352
onChange={onChange}
5453
attributes={featureTypeProperties}/>
55-
{dependencies && dependencies.viewport
56-
? (<FormGroup style={{ marginTop: "20px" }}controlId="mapSync" className="mapstore-block-width">
57-
<Col componentClass={ControlLabel} sm={6}>
58-
<Message msgId={`widgets.mapSync`} />
59-
</Col>
60-
<Col sm={6}>
61-
<SwitchButton
62-
checked={data.mapSync}
63-
onChange={(val) => {
64-
onChange("mapSync", val);
65-
}}
66-
/>
67-
</Col>
68-
</FormGroup>)
69-
: null}
7054
{data.options && data.options.columnSettings
7155
? <Button style={{"float": "right"}} onClick={() => onChange("options.columnSettings", undefined)}><Message msgId="widgets.builder.wizard.resetColumnsSizes" /></Button>
7256
: null

web/client/components/widgets/builder/wizard/table/Toolbar.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const getSaveTooltipId = (step, {id} = {}) => {
3131
}
3232
return "widgets.builder.wizard.addToTheMap";
3333
};
34-
module.exports = ({openFilterEditor = () => {}, step = 0, editorData = {}, setPage = () => {}, onFinish = () => {}} = {}) => (<Toolbar btnDefaultProps={{
34+
module.exports = ({ openFilterEditor = () => { }, step = 0, stepButtons = [], editorData = {}, setPage = () => {}, onFinish = () => {}} = {}) => (<Toolbar btnDefaultProps={{
3535
bsStyle: "primary",
3636
bsSize: "sm"
3737
}}
@@ -40,7 +40,7 @@ module.exports = ({openFilterEditor = () => {}, step = 0, editorData = {}, setPa
4040
visible: step > 0,
4141
glyph: "arrow-left",
4242
tooltipId: getBackTooltipId(step)
43-
}, {
43+
}, ...stepButtons, {
4444
visible: step >= 0,
4545
onClick: openFilterEditor,
4646
glyph: "filter",

0 commit comments

Comments
 (0)