Skip to content

Commit

Permalink
geosolutions-it#9510: enhance rule manager grid by adding checkbox fi…
Browse files Browse the repository at this point in the history
…lter mode
  • Loading branch information
mahmoudadel54 committed Oct 4, 2023
1 parent caaa908 commit d31974f
Show file tree
Hide file tree
Showing 12 changed files with 89 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ const parentFiltersSel = createSelector(workspaceSelector, (workspace) => ({
}));
const selector = createSelector([filterSelector, parentFiltersSel], (filter, parentsFilter) => ({
selected: filter.layer,
parentsFilter
parentsFilter,
anyFieldVal: filter.layerAny
}));

export default compose(
Expand All @@ -37,7 +38,8 @@ export default compose(
loadingErrorMsg: {
title: "rulesmanager.errorTitle",
message: "rulesmanager.errorLoadingLayers"
}
},
anyFilterRuleMode: 'layerAny'
}),
withHandlers({
onValueSelected: ({column = {}, onFilterChange = () => {}}) => filterTerm => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ const selector = createSelector([filterSelector, parentFiltersSel, servicesConfi
disabled: !filter.service,
service: filter.service,
parentsFilter,
services
services,
anyFieldVal: filter.requestAny
}));


Expand Down Expand Up @@ -52,7 +53,8 @@ export default compose(
"GetMap",
"GetStyles"
]
}
},
anyFilterRuleMode: 'requestAny'
}),
withPropsOnChange(["service", "services"], ({services = {}, service}) => {
return {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ import { createSelector } from 'reselect';
import { error } from '../../../../../actions/notifications';
import { filterSelector } from '../../../../../selectors/rulesmanager';
const selector = createSelector(filterSelector, (filter) => ({
selected: filter.rolename
selected: filter.rolename,
anyFieldVal: filter.groupAny
}));

export default compose(
Expand All @@ -32,7 +33,8 @@ export default compose(
loadingErrorMsg: {
title: "rulesmanager.errorTitle",
message: "rulesmanager.errorLoadingRoles"
}
},
anyFilterRuleMode: 'groupAny'
}),
withHandlers({
onValueSelected: ({column = {}, onFilterChange = () => {}}) => filterTerm => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ import { filterSelector, servicesSelector } from '../../../../../selectors/rules

const selector = createSelector(filterSelector, servicesSelector, (filter, services) => ({
selected: filter.service,
services
services,
anyFieldVal: filter.serviceAny
}));

export default compose(
Expand All @@ -32,7 +33,8 @@ export default compose(
{value: "WMS", label: "WMS"},
{value: "WFS", label: "WFS"},
{value: "WCS", label: "WCS"}
]
],
anyFilterRuleMode: 'serviceAny'
}),
withPropsOnChange(["services"], ({services, data}) => ({data: services || data})),
withHandlers({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ import { createSelector } from 'reselect';
import { filterSelector } from '../../../../../selectors/rulesmanager';
import { error } from '../../../../../actions/notifications';
const selector = createSelector(filterSelector, (filter) => ({
selected: filter.username
selected: filter.username,
anyFieldVal: filter.anyUser
}));

export default compose(
Expand All @@ -32,7 +33,8 @@ export default compose(
loadingErrorMsg: {
title: "rulesmanager.errorTitle",
message: "rulesmanager.errorLoadingUsers"
}
},
anyFilterRuleMode: 'userAny'
}),
withHandlers({
onValueSelected: ({column = {}, onFilterChange = () => {}}) => filterTerm => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ import { createSelector } from 'reselect';
import { filterSelector } from '../../../../../selectors/rulesmanager';

const selector = createSelector(filterSelector, (filter) => ({
selected: filter.workspace
selected: filter.workspace,
anyFieldVal: filter.workspaceAny
}));


Expand All @@ -35,7 +36,8 @@ export default compose(
loadingErrorMsg: {
title: "rulesmanager.errorTitle",
message: "rulesmanager.errorLoadingWorkspaces"
}
},
anyFilterRuleMode: 'workspaceAny'
}),
withHandlers({
onValueSelected: ({column = {}, onFilterChange = () => {}}) => filterTerm => {
Expand Down
30 changes: 30 additions & 0 deletions web/client/components/misc/__tests__/PagedCombobox-test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -159,4 +159,34 @@ describe("This test for PagedCombobox component", () => {
done();
}, 50);
});
it('tests PagedCombobox anyFilter Mode', (done) => {
const actions = {
onSelect: () => {}
};
const spy = expect.spyOn(actions, "onSelect");
const data = [{
label: "label", value: "value"
}];
const comp = ReactDOM.render(<PagedCombobox onSelect={actions.onSelect} anyFieldVal={false} anyFilterRuleMode={"userAny"} data={data}/>, document.getElementById("container"));
expect(comp).toExist();
const domNode = ReactDOM.findDOMNode(comp);
expect(domNode).toExist();
const checkbox = domNode.getElementsByTagName("input");
expect(checkbox.length).toEqual(2);
expect(checkbox[0].checked).toEqual(true);
expect(checkbox[0].name).toEqual('userAny');

const tool = ReactDOM.findDOMNode(TestUtils.scryRenderedDOMComponentsWithClass(comp, "rw-i rw-i-caret-down")[0]);
tool.click();
// this tests if the option list is opened
const firstOption = ReactDOM.findDOMNode(TestUtils.scryRenderedDOMComponentsWithClass(comp, "rw-list-option")[0]);
expect(firstOption).toExist();
const valueOption = firstOption.getElementsByTagName("span")[0];
expect(valueOption).toExist();
TestUtils.Simulate.click(firstOption);
setTimeout(() => {
expect(spy.calls.length).toEqual(1);
done();
}, 50);
});
});
22 changes: 16 additions & 6 deletions web/client/components/misc/combobox/PagedCombobox.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,10 @@ class PagedCombobox extends React.Component {
stopPropagation: PropTypes.bool,
clearable: PropTypes.bool,
onReset: PropTypes.func,
attribute: PropTypes.string
attribute: PropTypes.string,
anyFilterRuleMode: PropTypes.bool,
onFilterChange: PropTypes.func,
anyFieldVal: PropTypes.bool
};

static contextTypes = {
Expand Down Expand Up @@ -94,7 +97,9 @@ class PagedCombobox extends React.Component {
placement: "top"
},
valueField: "value",
clearable: false
clearable: false,
anyFilterRuleMode: false,
onFilterChange: ()=>{}
};

componentDidUpdate(prevProps) {
Expand Down Expand Up @@ -182,16 +187,21 @@ class PagedCombobox extends React.Component {
return this.props.tooltip && this.props.tooltip.enabled ? this.renderWithTooltip(field) : field;
}
render() {
const {selectedValue: v, disabled, onReset, label: l, clearable} = this.props;
const {selectedValue: v, disabled, onReset, label: l, clearable, onFilterChange, anyFieldVal } = this.props;
let label = l ? (<label>{l}</label>) : (<span/>); // TODO change "the else case" value with null ?
return (
<div className="autocompleteField">
{label}
<div className={`autocompleteField ${this.props.anyFilterRuleMode ? 'd-flex' : ''}`}>
<div className="d-flex"> {label} { this.props.anyFilterRuleMode &&
<input onChange={(evt)=>{
onFilterChange({column: {key: evt.target.name}, filterTerm: !evt.target.checked});
}} type="checkbox" disabled={v ? false : true} checked={typeof anyFieldVal === 'boolean' && !anyFieldVal ? true : false} title={'filter-mode'} name={this.props.anyFilterRuleMode} />}
</div>
{clearable ? (
<div className={`rw-combo-clearable ${disabled && 'disabled' || ''}`}>
{this.renderField()}
<span className={`rw-combo-clear ${!v && 'hidden' || ''}`} onClick={onReset}>x</span>
</div>) : this.renderField()
</div>) :
this.renderField()
}
</div>);
}
Expand Down
2 changes: 1 addition & 1 deletion web/client/reducers/rulesmanager.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ function rulesmanager(state = defaultState, action) {
return assign({}, state, {loading: action.loading});
case SET_FILTER: {
const {key, value} = action;
if (value) {
if (value || key?.includes('Any')) {
return assign({}, state, {filters: {...state.filters, [key]: value}});
}
const {[key]: omit, ...newFilters} = state.filters;
Expand Down
6 changes: 6 additions & 0 deletions web/client/selectors/rulesmanager.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,17 @@ export const rulesSelector = (state) => {
assign(formattedRule, {'id': rule.id});
assign(formattedRule, {'priority': rule.priority});
assign(formattedRule, {'roleName': rule.roleName ? rule.roleName : '*'});
assign(formattedRule, {'groupAny': rule.groupAny ? rule.groupAny : '*'});
assign(formattedRule, {'userName': rule.userName ? rule.userName : '*'});
assign(formattedRule, {'userAny': rule.userAny ? rule.userAny : '*'});
assign(formattedRule, {'service': rule.service ? rule.service : '*'});
assign(formattedRule, {'serviceAny': rule.serviceAny ? rule.serviceAny : '*'});
assign(formattedRule, {'request': rule.request ? rule.request : '*'});
assign(formattedRule, {'requestAny': rule.requestAny ? rule.requestAny : '*'});
assign(formattedRule, {'workspace': rule.workspace ? rule.workspace : '*'});
assign(formattedRule, {'workspaceAny': rule.workspaceAny ? rule.workspaceAny : '*'});
assign(formattedRule, {'layer': rule.layer ? rule.layer : '*'});
assign(formattedRule, {'layerAny': rule.layerAny ? rule.layerAny : '*'});
assign(formattedRule, {'access': rule.access});
return formattedRule;
});
Expand Down
3 changes: 3 additions & 0 deletions web/client/themes/default/less/autocomplete.less
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,6 @@
.rw-combobox .rw-btn {
overflow: hidden;
}
.d-flex{
display: flex;
}
9 changes: 9 additions & 0 deletions web/client/themes/default/less/react-data-grid.less
Original file line number Diff line number Diff line change
Expand Up @@ -301,3 +301,12 @@
}
}
}
#page-rulesmanager{
.ms2-border-layout-body{
.rules-data-gird {
.react-grid-HeaderCell{
display: flex !important;
}
}
}
}

0 comments on commit d31974f

Please sign in to comment.