Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
kappu72 committed Jul 2, 2019
1 parent dd08a07 commit 109d92c
Show file tree
Hide file tree
Showing 35 changed files with 1,107 additions and 175 deletions.
66 changes: 66 additions & 0 deletions web/client/actions/__tests__/filterHistory-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* Copyright 2019, GeoSolutions Sas.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/

var expect = require('expect');
const {
OPEN_QUERY_BUILDER,
openQueryBuilder,
INIT_FILTER_HISTORY,
initFilterHistory,
APPLIED_FILTER,
storeAppliedFilter,
STORE_CURRENT_APPLIED_FILTER,
storeCurrentFilter,
RESTORE_CURRENT_SAVED_FILTER,
restoreCurrentSavedFilter,
applyFilter,
APPLY_FILTER
} = require('../filterHistory');


describe('Test correctness of the filterHistory actions', () => {

it('openQueryBuilder', () => {
var retval = openQueryBuilder();
expect(retval).toExist();
expect(retval.type).toBe(OPEN_QUERY_BUILDER);
});

it('initFilterHistory', () => {
var retval = initFilterHistory();
expect(retval).toExist();
expect(retval.type).toBe(INIT_FILTER_HISTORY);
});

it('storeAppliedFilter', () => {
const filter = {};
var retval = storeAppliedFilter(filter);
expect(retval).toExist();
expect(retval.type).toBe(APPLIED_FILTER);
expect(retval.filter).toBe(filter);
});

it('storeCurrentFilter', () => {
var retval = storeCurrentFilter();
expect(retval).toExist();
expect(retval.type).toBe(STORE_CURRENT_APPLIED_FILTER);
});

it('restoreCurrentSavedFilter', () => {
var retval = restoreCurrentSavedFilter();
expect(retval).toExist();
expect(retval.type).toBe(RESTORE_CURRENT_SAVED_FILTER);
});

it('applyFilter', () => {
var retval = applyFilter();
expect(retval).toExist();
expect(retval.type).toBe(APPLY_FILTER);
});

});
11 changes: 9 additions & 2 deletions web/client/actions/__tests__/wfsquery-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ var {
QUERY_CREATE,
QUERY,
RESET_QUERY,
INIT_QUERY_PANEL, initQueryPanel,
INIT_QUERY_PANEL,
TOGGLE_LAYER_FILTER,
initQueryPanel,
layerSelectedForSearch,
featureTypeSelected,
featureTypeError,
Expand All @@ -30,7 +32,8 @@ var {
queryError,
createQuery,
query,
resetQuery
resetQuery,
toggleLayerFilter
} = require('../wfsquery');

describe('wfsquery actions', () => {
Expand Down Expand Up @@ -107,4 +110,8 @@ describe('wfsquery actions', () => {
let {type} = resetQuery();
expect(type).toBe(RESET_QUERY);
});
it('toggleLayerFilter', () => {
let {type} = toggleLayerFilter();
expect(type).toBe(TOGGLE_LAYER_FILTER);
});
});
62 changes: 62 additions & 0 deletions web/client/actions/filterHistory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright 2019, GeoSolutions Sas.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/

const INIT_FILTER_HISTORY = 'FILTER_HISTORY:INIT_FILTER_HISTORY';
const APPLIED_FILTER = 'FILTER_HISTORY:APPLIED_FILTER';
const STORE_CURRENT_APPLIED_FILTER = 'FILTER_HISTORY:STORE_CURRENT_APPLIED_FILTER';
const RESTORE_CURRENT_SAVED_FILTER = 'FILTER_HISTORY:RESTORE_CURRENT_SAVED_FILTER';
const APPLY_FILTER = 'FILTER_HISTORY:APPLY_FILTER';
const OPEN_QUERY_BUILDER = 'LAYER_FILTER:OPEN_QUERY_BUILDER';

function storeCurrentFilter() {
return {
type: STORE_CURRENT_APPLIED_FILTER
};
}
function restoreCurrentSavedFilter() {
return {
type: RESTORE_CURRENT_SAVED_FILTER
};
}
function openQueryBuilder() {
return {
type: OPEN_QUERY_BUILDER
};
}
function storeAppliedFilter(filter) {
return {
type: APPLIED_FILTER,
filter
};
}
function applyFilter() {
return {
type: APPLY_FILTER
};
}

function initFilterHistory(filter) {
return {
type: INIT_FILTER_HISTORY,
filter
};
}
module.exports = {
OPEN_QUERY_BUILDER,
openQueryBuilder,
INIT_FILTER_HISTORY,
initFilterHistory,
APPLIED_FILTER,
storeAppliedFilter,
STORE_CURRENT_APPLIED_FILTER,
storeCurrentFilter,
RESTORE_CURRENT_SAVED_FILTER,
restoreCurrentSavedFilter,
applyFilter,
APPLY_FILTER
};
9 changes: 8 additions & 1 deletion web/client/actions/wfsquery.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,19 @@ const RESET_QUERY = 'RESET_QUERY';
const QUERY = 'QUERY';
const INIT_QUERY_PANEL = 'INIT_QUERY_PANEL';
const TOGGLE_SYNC_WMS = 'QUERY:TOGGLE_SYNC_WMS';
const TOGGLE_LAYER_FILTER = 'QUERY:TOGGLE_LAYER_FILTER';

function toggleSyncWms() {
return {
type: TOGGLE_SYNC_WMS
};
}

function toggleLayerFilter() {
return {
type: TOGGLE_LAYER_FILTER
};
}
const axios = require('../libs/ajax');

function layerSelectedForSearch(id) {
Expand Down Expand Up @@ -164,5 +170,6 @@ module.exports = {
FEATURE_LOADED, featureLoaded,
INIT_QUERY_PANEL, initQueryPanel,
loadFeature,
TOGGLE_SYNC_WMS, toggleSyncWms
TOGGLE_SYNC_WMS, toggleSyncWms,
TOGGLE_LAYER_FILTER, toggleLayerFilter
};
3 changes: 3 additions & 0 deletions web/client/components/TOC/DefaultLayer.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const Title = require('./fragments/Title');
const WMSLegend = require('./fragments/WMSLegend');
const LayersTool = require('./fragments/LayersTool');
const OpacitySlider = require('./fragments/OpacitySlider');
const ToggleFilter = require('./fragments/ToggleFilter');
const withTooltip = require('../data/featuregrid/enhancers/withTooltip');
const localizedProps = require('../misc/enhancers/localizedProps');

Expand Down Expand Up @@ -149,6 +150,7 @@ class DefaultLayer extends React.Component {
<div className="toc-default-layer-head">
{grab}
{this.renderVisibility()}
<ToggleFilter node={this.props.node} propertiesChangeHandler={this.props.propertiesChangeHandler}/>
<Title
tooltipOptions={this.props.tooltipOptions}
tooltip={this.props.titleTooltip}
Expand All @@ -158,6 +160,7 @@ class DefaultLayer extends React.Component {
onClick={this.props.onSelect}
onContextMenu={this.props.onContextMenu}
/>

{this.props.node.loading ? <div className="toc-inline-loader"></div> : this.renderToolsLegend(isEmpty)}
{this.props.indicators ? this.renderIndicators() : null}
</div>
Expand Down
18 changes: 16 additions & 2 deletions web/client/components/TOC/Toolbar.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class Toolbar extends React.Component {
onZoom: () => {},
onNewWidget: () => {},
onBrowseData: () => {},
onQueryBuilder: () => {},
onUpdate: () => {},
onRemove: () => {},
onClear: () => {},
Expand Down Expand Up @@ -93,7 +94,9 @@ class Toolbar extends React.Component {
LAYERS: ''
},
layerMetadataTooltip: '',
layerMetadataPanelTitle: ''
layerMetadataPanelTitle: '',
layerFilter: ''

},
activateTool: {
activateToolsContainer: true,
Expand All @@ -105,7 +108,8 @@ class Toolbar extends React.Component {
activateAddLayer: true,
activateAddGroup: true,
includeDeleteButtonInSettings: false,
activateMetedataTool: true
activateMetedataTool: true,
activateLayerFilterTool: true
},
options: {
modalOptions: {},
Expand Down Expand Up @@ -233,6 +237,16 @@ class Toolbar extends React.Component {
<Glyphicon glyph="wrench"/>
</Button>
</OverlayTrigger>
: null}
{this.props.activateTool.activateLayerFilterTool && status === 'LAYER' && this.props.selectedLayers[0].search && !this.props.settings.expanded && !this.props.layerMetadata.expanded && !this.props.wfsdownload.expanded ?
<OverlayTrigger
key="queryPanel"
placement="top"
overlay={<Tooltip id="toc-tooltip-layerFilter">{this.props.text.layerFilterTooltip}</Tooltip>}>
<Button bsStyle="primary" className="square-button-md" onClick={this.props.onToolsActions.onQueryBuilder}>
<Glyphicon glyph="filter" />
</Button>
</OverlayTrigger>
: null}
{this.props.activateTool.activateQueryTool && status === 'LAYER' && this.props.selectedLayers[0].search && !this.props.settings.expanded && !this.props.layerMetadata.expanded && !this.props.wfsdownload.expanded ?
<OverlayTrigger
Expand Down
20 changes: 12 additions & 8 deletions web/client/components/TOC/__tests__/Toolbar-test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ const onToolsActions = {
onRetrieveLayerData: () => {},
onHideSettings: () => {},
onReload: () => {},
onQueryBuilder: () => {},
onAddLayer: () => {},
onAddGroup: () => {},
onGetMetadataRecord: () => {},
Expand Down Expand Up @@ -63,6 +64,7 @@ describe('TOC Toolbar', () => {
it('layer single selection', () => {
const spyZoom = expect.spyOn(onToolsActions, 'onZoom');
const spySettings = expect.spyOn(onToolsActions, 'onSettings');
const spyLayerFilter = expect.spyOn(onToolsActions, 'onQueryBuilder');
const spyBrowseData = expect.spyOn(onToolsActions, 'onBrowseData');
const spyDownload = expect.spyOn(onToolsActions, 'onDownload');
const selectedLayers = [{
Expand Down Expand Up @@ -90,7 +92,7 @@ describe('TOC Toolbar', () => {
const el = ReactDOM.findDOMNode(cmp);
expect(el).toExist();
const btn = el.getElementsByClassName("btn");
expect(btn.length).toBe(5);
expect(btn.length).toBe(6);
TestUtils.Simulate.click(btn[0]);
expect(spyZoom).toHaveBeenCalledWith({
maxx: 10,
Expand All @@ -101,23 +103,25 @@ describe('TOC Toolbar', () => {

TestUtils.Simulate.click(btn[1]);
expect(spySettings).toHaveBeenCalledWith('l001', 'layers', {opacity: 1 });

TestUtils.Simulate.click(btn[2]);
expect(spyBrowseData).toHaveBeenCalled();
expect(spyLayerFilter).toHaveBeenCalled();

TestUtils.Simulate.click(btn[3]);
expect(spyLayerFilter).toHaveBeenCalled();
expect(spyBrowseData).toHaveBeenCalledWith({
url: selectedLayers[0].search.url,
name: selectedLayers[0].name,
id: selectedLayers[0].id
});
TestUtils.Simulate.click(btn[4]);
TestUtils.Simulate.click(btn[5]);
expect(spyDownload).toHaveBeenCalled();
expect(spyDownload).toHaveBeenCalledWith({
url: selectedLayers[0].search.url,
name: selectedLayers[0].name,
id: selectedLayers[0].id
});

TestUtils.Simulate.click(btn[3]);
TestUtils.Simulate.click(btn[4]);
const removeModal = document.getElementsByClassName('modal-dialog').item(0);
expect(removeModal).toExist();
});
Expand Down Expand Up @@ -282,13 +286,13 @@ describe('TOC Toolbar', () => {
const el = ReactDOM.findDOMNode(cmp);
expect(el).toExist();
const btn = el.getElementsByClassName("btn");
expect(btn.length).toBe(6);
expect(btn.length).toBe(7);


TestUtils.Simulate.click(btn[5]);
TestUtils.Simulate.click(btn[6]);
expect(spyGetMetadataRecord).toHaveBeenCalled();

TestUtils.Simulate.click(btn[3]);
TestUtils.Simulate.click(btn[4]);
const removeModal = document.getElementsByClassName('modal-dialog').item(0);
expect(removeModal).toExist();
});
Expand Down
44 changes: 44 additions & 0 deletions web/client/components/TOC/fragments/ToggleFilter.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright 2019, GeoSolutions Sas.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/

const React = require('react');
const PropTypes = require('prop-types');
const {Glyphicon, Tooltip} = require('react-bootstrap');
const Message = require('../../I18N/Message');
const OverlayTrigger = require('../../misc/OverlayTrigger');

class ToggleFilter extends React.Component {
static propTypes = {
node: PropTypes.object,
propertiesChangeHandler: PropTypes.func
};

static inheritedPropTypes = ['node'];

static defaultProps = {
node: null,
propertiesChangeHandler: () => {}
};
render() {
const {layerFilter} = this.props.node || {};
const {disabled} = layerFilter || {};
return !!layerFilter && (
<OverlayTrigger
placement="bottom"
overlay={<Tooltip id="toc-filter-icon">{<Message msgId={!disabled ? 'toc.filterIconEnabled' : 'toc.filterIconDisabled'} />}</Tooltip>}>
<Glyphicon onClick={this.onClick} className={`toc-filter-icon ${!!disabled ? "disabled" : ""}`} glyph="filter" />
</OverlayTrigger>
);
}
onClick = () => {
const {layerFilter} = this.props.node || {};
this.props.propertiesChangeHandler(this.props.node.id, {layerFilter: {...layerFilter, disabled: !layerFilter.disabled}});
}
}

module.exports = ToggleFilter;
Loading

0 comments on commit 109d92c

Please sign in to comment.