Finish select policy dynamic

This commit is contained in:
cyril lopez 2017-11-30 15:01:19 +01:00
parent 8e94fad183
commit 0866a5e484
11 changed files with 171 additions and 98 deletions

View File

@ -54,6 +54,7 @@ class Controller extends React.Component {
{map(Object.keys(this.props.actions).sort(), (actionKey) => (
<InputCheckbox
inputSelected={this.state.inputSelected}
isOpen={this.props.isOpen}
key={actionKey}
label={actionKey}
name={`${this.props.inputNamePath}.controllers.${this.props.name}.${actionKey}.enabled`}
@ -80,6 +81,7 @@ Controller.defaultProps = {
Controller.propTypes = {
actions: PropTypes.object,
inputNamePath: PropTypes.string,
isOpen: PropTypes.bool.isRequired,
name: PropTypes.string,
};

View File

@ -18,6 +18,10 @@ class InputCheckbox extends React.Component { // eslint-disable-line react/prefe
if (nextProps.inputSelected !== this.props.inputSelected && nextProps.inputSelected !== this.props.name) {
this.setState({ showBackground: false });
}
if (!nextProps.isOpen) {
this.setState({ showBackground: false, showCog: false });
}
}
handleChange = () => {
@ -34,6 +38,7 @@ class InputCheckbox extends React.Component { // eslint-disable-line react/prefe
this.props.setNewInputSelected(this.props.name);
// Tell the policies component to show the associated routes
this.context.setShouldDisplayPolicieshint();
this.context.setInputPoliciesPath(this.props.name);
} else {
this.setState({ showBackground: false, showCog: false });
this.props.setNewInputSelected('');
@ -45,6 +50,7 @@ class InputCheckbox extends React.Component { // eslint-disable-line react/prefe
handleClick = () => {
this.setState({ showBackground: !this.state.showBackground });
this.props.setNewInputSelected(this.props.name);
this.context.setInputPoliciesPath(this.props.name);
}
render() {
@ -81,6 +87,7 @@ class InputCheckbox extends React.Component { // eslint-disable-line react/prefe
InputCheckbox.contextTypes = {
onChange: PropTypes.func.isRequired,
setInputPoliciesPath: PropTypes.func.isRequired,
setShouldDisplayPolicieshint: PropTypes.func.isRequired,
};
@ -91,6 +98,7 @@ InputCheckbox.defaultProps = {
InputCheckbox.propTypes = {
inputSelected: PropTypes.string.isRequired,
isOpen: PropTypes.bool.isRequired,
label: PropTypes.string,
name: PropTypes.string.isRequired,
setNewInputSelected: PropTypes.func.isRequired,

View File

@ -27,6 +27,10 @@ class Plugin extends React.Component { // eslint-disable-line react/prefer-state
handleClick = () => {
this.props.changePluginSelected(this.props.name);
this.setState({ collapse: !this.state.collapse });
if (this.state.collapse) {
this.context.resetShouldDisplayPoliciesHint();
}
}
render() {
@ -66,9 +70,11 @@ class Plugin extends React.Component { // eslint-disable-line react/prefer-state
{map(get(this.props.plugin, 'controllers'), (controllerActions, key) => (
<Controller
inputNamePath={`permissions.${this.props.name}`}
isOpen={this.state.collapse}
key={key}
name={key}
actions={controllerActions}
resetInputBackground={this.state.resetInputBackground}
/>
))}
</div>

View File

@ -8,13 +8,20 @@ import React from 'react';
import cn from 'classnames';
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
import { get } from 'lodash';
import Input from 'components/Input';
import styles from './styles.scss';
class Policies extends React.Component { // eslint-disable-line react/prefer-stateless-function
handleChange = (e) => this.context.onChange(e);
render() {
const baseTitle = 'users-permissions.Policies.header';
const title = this.props.shouldDisplayPoliciesHint ? 'hint' : 'title';
const value = get(this.props.values, this.props.inputSelectName);
return (
<div className={cn('col-md-5',styles.policies)}>
<div className="container-fluid">
@ -22,6 +29,18 @@ class Policies extends React.Component { // eslint-disable-line react/prefer-sta
<div className={cn('col-md-12', styles.header)}>
<FormattedMessage id={`${baseTitle}.${title}`} />
</div>
{!this.props.shouldDisplayPoliciesHint ? (
<Input
customBootstrapClass="col-md-12"
label="users-permissions.Policies.InputSelect.empty"
name={this.props.inputSelectName}
onChange={this.handleChange}
selectOptions={this.props.selectOptions}
type="select"
validations={{}}
value={value}
/>
) : ''}
</div>
</div>
</div>
@ -29,8 +48,15 @@ class Policies extends React.Component { // eslint-disable-line react/prefer-sta
}
}
Policies.contextTypes = {
onChange: PropTypes.func.isRequired,
};
Policies.propTypes = {
inputSelectName: PropTypes.string.isRequired,
selectOptions: PropTypes.array.isRequired,
shouldDisplayPoliciesHint: PropTypes.bool.isRequired,
values: PropTypes.object.isRequired,
};
export default Policies;

View File

@ -4,7 +4,7 @@
*
*/
import { fromJS, List, Map } from 'immutable';
import { get } from 'lodash';
import { get, replace } from 'lodash';
import {
ADD_USER,
GET_PERMISSIONS,
@ -24,6 +24,7 @@ import {
SET_ACTION_TYPE,
SET_ERRORS,
SET_FORM,
SET_INPUT_POLICIES_PATH,
SET_ROLE_ID,
SET_SHOULD_DISPLAY_POLICIES_HINT,
SUBMIT,
@ -61,9 +62,15 @@ export function getPolicies() {
}
export function getPoliciesSucceeded(policies) {
const formattedPolicies = policies.policies.reduce((acc, current) => {
acc.push({ value: current });
return acc;
},[]);
return {
type: GET_POLICIES_SUCCEEDED,
policies,
policies: [{ name: 'users-permissions.Policies.InputSelect.empty', value: '' }].concat(formattedPolicies),
};
}
@ -176,6 +183,15 @@ export function setForm() {
};
}
export function setInputPoliciesPath(path) {
const inputPath = replace(path, 'enabled', 'policy');
return {
type: SET_INPUT_POLICIES_PATH,
inputPath,
};
}
export function setRoleId(roleId) {
return {
type: SET_ROLE_ID,

View File

@ -22,6 +22,7 @@ export const SELECT_ALL_ACTIONS = 'UsersPermissions/EditPage/SELECT_ALL_ACTIONS'
export const SET_ACTION_TYPE = 'UsersPermissions/EditPage/SET_ACTION_TYPE';
export const SET_ERRORS = 'UsersPermissions/EditPage/SET_ERRORS';
export const SET_FORM = 'UsersPermissions/EditPage/SET_FORM';
export const SET_INPUT_POLICIES_PATH = 'UsersPermissions/EditPage/SET_INPUT_POLICIES_PATH';
export const SET_ROLE_ID = 'UsersPermissions/EditPage/SET_ROLE_ID';
export const SET_SHOULD_DISPLAY_POLICIES_HINT = 'UsersPermissions/EditPage/SET_SHOULD_DISPLAY_POLICIES_HINT';
export const SUBMIT = 'UsersPermissions/EditPage/SUBMIT';

View File

@ -39,6 +39,7 @@ import {
setActionType,
setErrors,
setForm,
setInputPoliciesPath,
setRoleId,
setShouldDisplayPolicieshint,
submit,
@ -58,6 +59,7 @@ export class EditPage extends React.Component { // eslint-disable-line react/pre
{
onChange: this.props.onChangeInput,
selectAllActions: this.props.selectAllActions,
setInputPoliciesPath: this.props.setInputPoliciesPath,
setShouldDisplayPolicieshint: this.props.setShouldDisplayPolicieshint,
resetShouldDisplayPoliciesHint: this.props.resetShouldDisplayPoliciesHint,
}
@ -88,6 +90,7 @@ export class EditPage extends React.Component { // eslint-disable-line react/pre
componentWillUnmount() {
// Empty formErrors
this.props.setErrors([]);
this.props.resetShouldDisplayPoliciesHint();
}
handleSubmit = () => {
@ -203,6 +206,9 @@ export class EditPage extends React.Component { // eslint-disable-line react/pre
/>
<Policies
shouldDisplayPoliciesHint={this.props.editPage.shouldDisplayPoliciesHint}
inputSelectName={this.props.editPage.inputPoliciesPath}
selectOptions={this.props.editPage.policies}
values={this.props.editPage.modifiedData}
/>
</div>
</form>
@ -218,6 +224,7 @@ export class EditPage extends React.Component { // eslint-disable-line react/pre
EditPage.childContextTypes = {
onChange: PropTypes.func.isRequired,
selectAllActions: PropTypes.func.isRequired,
setInputPoliciesPath: PropTypes.func.isRequired,
setShouldDisplayPolicieshint: PropTypes.func.isRequired,
resetShouldDisplayPoliciesHint: PropTypes.func.isRequired,
};
@ -240,6 +247,7 @@ EditPage.propTypes = {
setActionType: PropTypes.func.isRequired,
setErrors: PropTypes.func.isRequired,
setForm: PropTypes.func.isRequired,
setInputPoliciesPath: PropTypes.func.isRequired,
setRoleId: PropTypes.func.isRequired,
setShouldDisplayPolicieshint: PropTypes.func.isRequired,
submit: PropTypes.func.isRequired,
@ -265,6 +273,7 @@ function mapDispatchToProps(dispatch) {
setActionType,
setErrors,
setForm,
setInputPoliciesPath,
setRoleId,
setShouldDisplayPolicieshint,
submit,

View File

@ -21,6 +21,7 @@ import {
SET_ACTION_TYPE,
SET_ERRORS,
SET_FORM,
SET_INPUT_POLICIES_PATH,
SET_ROLE_ID,
SET_SHOULD_DISPLAY_POLICIES_HINT,
SUBMIT_ERROR,
@ -36,6 +37,7 @@ const initialState = fromJS({
didSubmit: false,
formErrors: List([]),
initialData: Map({}),
inputPoliciesPath: '',
modifiedData: Map({}),
policies: List([]),
roleId: '',
@ -52,9 +54,8 @@ function editPageReducer(state = initialState, action) {
return state
.updateIn(['initialData', 'permissions'], () => action.permissions)
.updateIn(['modifiedData', 'permissions'], () => action.permissions);
case GET_POLICIES_SUCCEEDED:
return state.set('policies', List(action.policies.policies));
return state.set('policies', List(action.policies));
case GET_ROLE_SUCCEEDED:
return state
.set('didGetUsers', !state.get('didGetUsers'))
@ -103,6 +104,8 @@ function editPageReducer(state = initialState, action) {
.set('didGetUsers', !state.get('didGetUsers'))
.set('initialData', action.form)
.set('modifiedData', action.form);
case SET_INPUT_POLICIES_PATH:
return state.set('inputPoliciesPath', action.inputPath);
case SET_ROLE_ID:
return state.set('roleId', action.roleId);
case SET_SHOULD_DISPLAY_POLICIES_HINT:

View File

@ -108,6 +108,7 @@
"Plugins.header.title": "Permissions",
"Plugins.header.description": "Only actions bound by a route are listed below.",
"Policies.InputSelect.empty": "None",
"Policies.header.hint": "Select the application's actions or the plugin's actions and put your mouse over to display the bounded route",
"Policies.header.title": "Advanced settings",
"PopUpForm.button.cancel": "Cancel",

View File

@ -110,6 +110,7 @@
"Plugins.header.title": "Permissions",
"Plugins.header.description": "Sont listés uniquement les actions associées à une route.",
"Policies.InputSelect.empty": "Aucune",
"Policies.header.hint": "Sélectionnez ...",
"Policies.header.tile": "Paramètres avancés",
"popUpForm.button.cancel": "Annuler",

View File

@ -254,23 +254,23 @@
}
},
"1": {
"description": "",
"name": "Guest",
"description": "",
"permissions": {
"content-manager": {
"controllers": {
"contentmanager": {
"models": {
"enabled": true,
"policy": ""
"policy": "isauthenticated"
},
"find": {
"enabled": false,
"policy": ""
},
"count": {
"enabled": false,
"policy": ""
"enabled": true,
"policy": "isauthenticated"
},
"findOne": {
"enabled": false,
@ -302,37 +302,37 @@
"enabled": false,
"policy": ""
},
"getModel": {
"enabled": false,
"policy": ""
},
"getConnections": {
"enabled": false,
"policy": ""
},
"createModel": {
"enabled": false,
"policy": ""
},
"updateModel": {
"enabled": false,
"policy": ""
},
"deleteModel": {
"enabled": false,
"policy": ""
},
"autoReload": {
"enabled": false,
"policy": ""
},
"checkTableExists": {
"enabled": false,
"policy": ""
},
"autoReload": {
"enabled": true,
"policy": ""
},
"createModel": {
"enabled": false,
"policy": ""
},
"getModel": {
"enabled": false,
"policy": ""
},
"deleteModel": {
"enabled": false,
"policy": ""
},
"identity": {
"enabled": false,
"policy": ""
},
"getConnections": {
"enabled": false,
"policy": ""
}
}
}
@ -340,50 +340,14 @@
"settings-manager": {
"controllers": {
"settingsmanager": {
"menu": {
"enabled": false,
"policy": ""
},
"environments": {
"enabled": false,
"policy": ""
},
"languages": {
"enabled": false,
"policy": ""
},
"databases": {
"enabled": false,
"policy": ""
},
"database": {
"enabled": false,
"policy": ""
},
"databaseModel": {
"enabled": false,
"policy": ""
},
"get": {
"enabled": false,
"policy": ""
},
"update": {
"enabled": false,
"policy": ""
},
"createLanguage": {
"enabled": false,
"policy": ""
},
"deleteLanguage": {
"enabled": false,
"policy": ""
},
"createDatabase": {
"enabled": false,
"policy": ""
},
"updateDatabase": {
"enabled": false,
"policy": ""
@ -396,9 +360,45 @@
"enabled": false,
"policy": ""
},
"update": {
"enabled": false,
"policy": ""
},
"databaseModel": {
"enabled": false,
"policy": ""
},
"createLanguage": {
"enabled": false,
"policy": ""
},
"get": {
"enabled": false,
"policy": ""
},
"createDatabase": {
"enabled": false,
"policy": ""
},
"databases": {
"enabled": false,
"policy": ""
},
"languages": {
"enabled": false,
"policy": ""
},
"database": {
"enabled": false,
"policy": ""
},
"identity": {
"enabled": false,
"policy": ""
},
"menu": {
"enabled": false,
"policy": ""
}
}
}
@ -454,6 +454,38 @@
}
},
"userspermissions": {
"searchUsers": {
"enabled": false,
"policy": ""
},
"deleteRole": {
"enabled": false,
"policy": ""
},
"getPolicies": {
"enabled": false,
"policy": ""
},
"getRoles": {
"enabled": false,
"policy": ""
},
"getRole": {
"enabled": false,
"policy": ""
},
"getPermissions": {
"enabled": false,
"policy": ""
},
"init": {
"enabled": true,
"policy": ""
},
"index": {
"enabled": false,
"policy": ""
},
"createRole": {
"enabled": false,
"policy": ""
@ -462,49 +494,17 @@
"enabled": false,
"policy": ""
},
"deleteRole": {
"enabled": false,
"policy": ""
},
"getPermissions": {
"enabled": false,
"policy": ""
},
"getPolicies": {
"enabled": false,
"policy": ""
},
"getRole": {
"enabled": false,
"policy": ""
},
"getRoles": {
"enabled": false,
"policy": ""
},
"index": {
"enabled": false,
"policy": ""
},
"init": {
"enabled": true,
"policy": ""
},
"searchUsers": {
"identity": {
"enabled": false,
"policy": ""
},
"updateRole": {
"enabled": false,
"policy": ""
},
"identity": {
"enabled": false,
"policy": ""
}
}
}
}
}
}
}
}