Skip to content

Commit

Permalink
Merge branch 'widgets' of github.com:offtherailz/MapStore2 into widgets
Browse files Browse the repository at this point in the history
  • Loading branch information
offtherailz committed Nov 16, 2017
2 parents fd1bac3 + 2ebed8a commit 8ee504a
Show file tree
Hide file tree
Showing 23 changed files with 345 additions and 41 deletions.
3 changes: 2 additions & 1 deletion web/client/actions/__tests__/print-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ describe('Test correctness of the print actions', () => {
});

it('configurePrintMap', () => {
const retVal = configurePrintMap({x: 1, y: 1}, 5, 6, 2.0, [], 'EPSG:4326');
const retVal = configurePrintMap({x: 1, y: 1}, 5, 6, 2.0, [], 'EPSG:4326', 'en-US');
expect(retVal).toExist();
expect(retVal.type).toBe(CONFIGURE_PRINT_MAP);
expect(retVal.center).toExist();
Expand All @@ -74,6 +74,7 @@ describe('Test correctness of the print actions', () => {
expect(retVal.layers).toExist();
expect(retVal.layers.length).toBe(0);
expect(retVal.projection).toBe('EPSG:4326');
expect(retVal.currentLocale).toBe('en-US');
});

it('changePrintZoomLevel', () => {
Expand Down
11 changes: 6 additions & 5 deletions web/client/actions/layerCapabilities.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ const WCS = require('../api/WCS');

const LayersUtils = require('../utils/LayersUtils');

const _ = require('lodash');
const {get, head} = require('lodash');

function getDescribeLayer(url, layer, options) {
return (dispatch /* , getState */) => {
return WMS.describeLayer(url, layer.name, options).then((describeLayer) => {
if (describeLayer && describeLayer.owsType === "WFS") {
return WFS.describeFeatureType(url, describeLayer.name).then((describeFeatureType) => {
// TODO move the management of this geometryType in the proper components, getting the describeFeatureType entry:
let types = _.get(describeFeatureType, "complexType[0].complexContent.extension.sequence.element");
let geometryType = _.head(types && types.filter( elem => elem.name === "the_geom" || elem.type.prefix.indexOf("gml") === 0));
let types = get(describeFeatureType, "complexType[0].complexContent.extension.sequence.element");
let geometryType = head(types && types.filter( elem => elem.name === "the_geom" || elem.type.prefix.indexOf("gml") === 0));
geometryType = geometryType && geometryType.type.localPart;
describeLayer.geometryType = geometryType && geometryType.split("PropertyType")[0];
return dispatch(updateNode(layer.id, "id", {describeLayer, describeFeatureType}));
Expand All @@ -32,7 +32,7 @@ function getDescribeLayer(url, layer, options) {
} else if ( describeLayer && describeLayer.owsType === "WCS" ) {
WCS.describeCoverage(url, describeLayer.name).then((describeCoverage) => {
// TODO move the management of this bands in the proper components, getting the describeFeatureType entry:
let axis = _.get(describeCoverage, "wcs:CoverageDescriptions.wcs:CoverageDescription.wcs:Range.wcs:Field.wcs:Axis.wcs:AvailableKeys.wcs:Key");
let axis = get(describeCoverage, "wcs:CoverageDescriptions.wcs:CoverageDescription.wcs:Range.wcs:Field.wcs:Axis.wcs:AvailableKeys.wcs:Key");
if (axis && typeof axis === "string") {
describeLayer.bands = [1 + ""];
} else {
Expand Down Expand Up @@ -65,14 +65,15 @@ function getLayerCapabilities(layer, options) {
dispatch(updateNode(layer.id, "id", {
capabilities: layerCapability,
capabilitiesLoading: null,
description: layerCapability._abstract,
boundingBox: layerCapability.latLonBoundingBox,
availableStyles: layerCapability.style && (Array.isArray(layerCapability.style) ? layerCapability.style : [layerCapability.style])
}));
}
// return dispatch(updateNode(layer.id, "id", {capabilities: capabilities || {"error": "no describe Layer found"}}));

}).catch((error) => {
dispatch(updateNode(layer.id, "id", {capabilitiesLoading: null, capabilities: {error: "error getting capabilities", details: error}} ));
dispatch(updateNode(layer.id, "id", {capabilitiesLoading: null, capabilities: {error: "error getting capabilities", details: error}, description: null} ));

// return dispatch(updateNode(layer.id, "id", {capabilities: capabilities || {"error": "no describe Layer found"}}));

Expand Down
5 changes: 3 additions & 2 deletions web/client/actions/print.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,15 +105,16 @@ function setPrintParameter(name, value) {
};
}

function configurePrintMap(center, zoom, scaleZoom, scale, layers, projection) {
function configurePrintMap(center, zoom, scaleZoom, scale, layers, projection, currentLocale) {
return {
type: CONFIGURE_PRINT_MAP,
center,
zoom,
scaleZoom,
scale,
layers,
projection
projection,
currentLocale
};
}

Expand Down
8 changes: 8 additions & 0 deletions web/client/components/TOC/fragments/SettingsModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
const React = require('react');
const PropTypes = require('prop-types');
const {Button, Glyphicon, Tabs, Tab} = require('react-bootstrap');
const {isNil} = require('lodash');

require("./css/settingsModal.css");

Expand Down Expand Up @@ -90,6 +91,13 @@ class SettingsModal extends React.Component {
originalSettings: this.props.element
});
}
componentWillReceiveProps(newProps) {
// an empty description does not trigger the single layer getCapabilites,
// it does only for missing description
if (!this.props.settings.expanded && newProps.settings.expanded && isNil(newProps.element.description) && newProps.element.type === "wms") {
this.props.retrieveLayerData(newProps.element);
}
}

componentWillUpdate(newProps, newState) {
if (this.props.settings.expanded && !newProps.settings.expanded && !newState.save) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,20 @@ describe('TOC SettingsModal', () => {
const el = document.getElementById('mapstore-layer-settings');
expect(el).toExist();
});

it('trigger retrieveLayerData in componentWillReceiveProps', () => {
const cmp = ReactDOM.render(<SettingsModal element={{id: 'layer001', capabilitiesLoading: true}} settings={{expanded: false}}/>, document.getElementById("container"));
const cmp2 = ReactDOM.render(<SettingsModal element={{id: 'layer001', type: "wms", capabilitiesLoading: true}} settings={{expanded: true}}/>, document.getElementById("container"));
const el = document.getElementById('mapstore-layer-settings');
const textarea = document.getElementsByTagName('textarea')[0];
expect(el).toExist();
expect(cmp).toExist();
expect(cmp2).toExist();
expect(textarea).toNotExist();
const cmp3 = ReactDOM.render(<SettingsModal element={{id: 'layer001', type: "wms", capabilitiesLoading: false, description: "description of layer"}} settings={{expanded: true}}/>, document.getElementById("container"));
expect(cmp3).toExist();
const textareaAfterLoading = document.getElementsByTagName('textarea')[0];
expect(textareaAfterLoading).toExist();
expect(textareaAfterLoading.value).toBe("description of layer");
});
});
12 changes: 12 additions & 0 deletions web/client/components/TOC/fragments/settings/General.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

const React = require('react');
const PropTypes = require('prop-types');
const Spinner = require('react-spinkit');
const {FormControl, FormGroup, ControlLabel, InputGroup} = require('react-bootstrap');
const Message = require('../../../I18N/Message');
const {SimpleSelect} = require('react-selectize');
Expand Down Expand Up @@ -82,6 +83,17 @@ class General extends React.Component {
disabled
onChange={this.updateEntry.bind(null, "name")}/>
</FormGroup>
<FormGroup>
<ControlLabel><Message msgId="layerProperties.description" /></ControlLabel>
{this.props.element.capabilitiesLoading ? <Spinner spinnerName="circle"/> :
<FormControl
value={this.props.element.description}
key="description"
rows="2"
componentClass="textarea"
style={{ resize: "vertical", minHeight: "33px" }}
onChange={this.updateEntry.bind(null, "description")}/>}
</FormGroup>
{ this.props.nodeType === 'layers' ?
<div>
<label key="group-label" className="control-label"><Message msgId="layerProperties.group" /></label>
Expand Down
2 changes: 2 additions & 0 deletions web/client/components/catalog/RecordItem.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ class RecordItem extends React.Component {
dimensions: this.props.record.dimensions || [],
name: wms.params && wms.params.name,
title: this.props.record.title || wms.params && wms.params.name,
description: this.props.record.description || "",
bbox: {
crs: this.props.record.boundingBox.crs,
bounds: {
Expand Down Expand Up @@ -259,6 +260,7 @@ class RecordItem extends React.Component {
name: wmts.params && wmts.params.name,
title: this.props.record.title || wmts.params && wmts.params.name,
matrixIds: this.props.record.matrixIds || [],
description: this.props.record.description || "",
tileMatrixSet: this.props.record.tileMatrixSet || [],
bbox: {
crs: this.props.record.boundingBox.crs,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ const EXPRESSION_TESTS = [
[" ", "=", undefined],
["ZZZ", "=", undefined]
];
const testExperssion = (spyonChange, spyonValueChange, rawValue, expectedOperator, expectedValue) => {
const testExpression = (spyonChange, spyonValueChange, rawValue, expectedOperator, expectedValue) => {
const input = document.getElementsByTagName("input")[0];
input.value = rawValue;
ReactTestUtils.Simulate.change(input);
Expand Down Expand Up @@ -95,6 +95,6 @@ describe('Test for NumberFilter component', () => {
const spyonChange = expect.spyOn(actions, 'onChange');
const spyonValueChange = expect.spyOn(actions, 'onValueChange');
ReactDOM.render(<NumberFilter onChange={actions.onChange} onValueChange={actions.onValueChange} />, document.getElementById("container"));
EXPRESSION_TESTS.map( params => testExperssion(spyonChange, spyonValueChange, ...params));
EXPRESSION_TESTS.map( params => testExpression(spyonChange, spyonValueChange, ...params));
});
});
13 changes: 13 additions & 0 deletions web/client/new.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,19 @@
"source": "OpenTopoMap",
"group": "background",
"visibility": false
},
{
"source": "ol",
"group": "background",
"title": "Empty Background",
"fixed": true,
"type": "empty",
"visibility": false,
"args": [
"Empty Background", {
"visibility": false
}
]
}
]
}
Expand Down
19 changes: 12 additions & 7 deletions web/client/plugins/Print.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const assign = require('object-assign');
const {head} = require('lodash');

const {scalesSelector} = require('../selectors/map');
const {currentLocaleSelector} = require('../selectors/locale');

require('./print/print.css');

Expand Down Expand Up @@ -91,7 +92,8 @@ class Print extends React.Component {
defaultBackground: PropTypes.string,
closeGlyph: PropTypes.string,
submitConfig: PropTypes.object,
previewOptions: PropTypes.object
previewOptions: PropTypes.object,
currentLocale: PropTypes.string
};

static contextTypes = {
Expand Down Expand Up @@ -150,7 +152,8 @@ class Print extends React.Component {
previewOptions: {
buttonStyle: "primary"
},
style: {}
style: {},
currentLocale: 'en-US'
};

componentWillMount() {
Expand Down Expand Up @@ -326,10 +329,10 @@ class Print extends React.Component {
const scaleZoom = PrintUtils.getNearestZoom(newMap.zoom, scales);

this.props.configurePrintMap(newMap.center, mapZoom, scaleZoom, scales[scaleZoom],
this.filterLayers(newPrintSpec), newMap.projection);
this.filterLayers(newPrintSpec), newMap.projection, this.props.currentLocale);
} else {
this.props.configurePrintMap(newMap.center, newMap.zoom, newMap.zoom, this.props.scales[newMap.zoom],
this.filterLayers(newPrintSpec), newMap.projection);
this.filterLayers(newPrintSpec), newMap.projection, this.props.currentLocale);
}
}
};
Expand All @@ -351,8 +354,9 @@ const selector = createSelector([
mapSelector,
layersSelector,
scalesSelector,
(state) => state.browser && (!state.browser.ie || state.browser.ie11)
], (open, capabilities, printSpec, pdfUrl, error, map, layers, scales, usePreview) => ({
(state) => state.browser && (!state.browser.ie || state.browser.ie11),
currentLocaleSelector
], (open, capabilities, printSpec, pdfUrl, error, map, layers, scales, usePreview, currentLocale) => ({
open,
capabilities,
printSpec,
Expand All @@ -361,7 +365,8 @@ const selector = createSelector([
map,
layers: layers.filter(l => !l.loadingError),
scales,
usePreview
usePreview,
currentLocale
}));

const PrintPlugin = connect(selector, {
Expand Down
13 changes: 13 additions & 0 deletions web/client/reducers/__tests__/config-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,19 @@ describe('Test the mapConfig reducer', () => {
expect(state.layers.length).toBe(1);
expect(state.layers[0].apiKey).toBe(null);
});
it('checks if empty background layer type is changed accordingly', () => {
const state = mapConfig({}, {type: 'MAP_CONFIG_LOADED', config: { version: 2, map: { center: {x: 1, y: 1}, zoom: 11, layers: [{type: 'ol', group: "background"}] }}});
expect(state.map.zoom).toExist();
expect(state.map.center).toExist();
expect(state.map.center.crs).toExist();
expect(state.layers).toExist();
expect(state.layers.length).toBe(1);
expect(state.layers[0].type).toBe("empty");
const state2 = mapConfig({}, {type: 'MAP_CONFIG_LOADED', config: { version: 2, map: { center: {x: 1, y: 1}, zoom: 11, layers: [{type: 'OpenLayers.Layer', group: "background"}] }}});
expect(state2.layers).toExist();
expect(state2.layers.length).toBe(1);
expect(state2.layers[0].type).toBe("empty");
});

it('creates an error on wrongly loaded config', () => {
var state = mapConfig({}, {type: 'MAP_CONFIG_LOAD_ERROR', error: 'error'});
Expand Down
75 changes: 75 additions & 0 deletions web/client/reducers/__tests__/print-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,79 @@ describe('Test the print reducer', () => {
});
expect(state.pdfUrl).toNotExist();
});

it('configure print map title with current locale', () => {
const state = print({capabilities: {}, spec: {}}, {
type: CONFIGURE_PRINT_MAP,
center: {x: 1, y: 1},
zoom: 5,
scaleZoom: 6,
scale: 10000,
layers: [{
title: {
'default': 'Layer',
'it-IT': 'Livello'
}
}],
projection: 'EPSG:4326',
currentLocale: 'it-IT'
});
expect(state.map).toExist();
expect(state.map.center).toExist();
expect(state.map.center.x).toBe(1);
expect(state.map.zoom).toBe(5);
expect(state.map.scale).toBe(10000);
expect(state.map.layers.length).toBe(1);
expect(state.map.layers[0].title).toBe('Livello');
expect(state.map.projection).toBe('EPSG:4326');
});

it('configure print map title with current locale and no data', () => {
const state = print({capabilities: {}, spec: {}}, {
type: CONFIGURE_PRINT_MAP,
center: {x: 1, y: 1},
zoom: 5,
scaleZoom: 6,
scale: 10000,
layers: [{
title: {
'default': 'Layer',
'it-IT': 'Livello'
}
}],
projection: 'EPSG:4326',
currentLocale: 'en-US'
});
expect(state.map).toExist();
expect(state.map.center).toExist();
expect(state.map.center.x).toBe(1);
expect(state.map.zoom).toBe(5);
expect(state.map.scale).toBe(10000);
expect(state.map.layers.length).toBe(1);
expect(state.map.layers[0].title).toBe('Layer');
expect(state.map.projection).toBe('EPSG:4326');
});

it('configure print map title with current locale and no object title', () => {
const state = print({capabilities: {}, spec: {}}, {
type: CONFIGURE_PRINT_MAP,
center: {x: 1, y: 1},
zoom: 5,
scaleZoom: 6,
scale: 10000,
layers: [{
title: 'Layer001'
}],
projection: 'EPSG:4326',
currentLocale: 'en-US'
});
expect(state.map).toExist();
expect(state.map.center).toExist();
expect(state.map.center.x).toBe(1);
expect(state.map.zoom).toBe(5);
expect(state.map.scale).toBe(10000);
expect(state.map.layers.length).toBe(1);
expect(state.map.layers[0].title).toBe('Layer001');
expect(state.map.projection).toBe('EPSG:4326');
});
});
Loading

0 comments on commit 8ee504a

Please sign in to comment.