From f4fbe455b54eb1b9fdfe8effccb74b63975ab6bf Mon Sep 17 00:00:00 2001 From: cyril lopez Date: Thu, 23 Nov 2017 12:15:06 +0100 Subject: [PATCH] Handle front end role post --- .../admin/src/containers/EditPage/actions.js | 46 ++++++++++++++++--- .../src/containers/EditPage/constants.js | 5 ++ .../admin/src/containers/EditPage/index.js | 40 +++++++++++++++- .../admin/src/containers/EditPage/reducer.js | 26 ++++++++++- .../admin/src/containers/EditPage/saga.js | 31 ++++++++++++- .../src/containers/EditPage/selectors.js | 14 +++++- .../admin/src/translations/en.json | 1 + .../admin/src/translations/fr.json | 1 + .../config/routes.json | 2 +- 9 files changed, 154 insertions(+), 12 deletions(-) diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/actions.js b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/actions.js index 3227590564..012521b459 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/actions.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/actions.js @@ -14,7 +14,12 @@ import { ON_CANCEL, ON_CHANGE_INPUT, ON_CLICK_DELETE, + SET_ACTION_TYPE, + SET_ERRORS, SET_FORM, + SUBMIT, + SUBMIT_ERROR, + SUBMIT_SUCCEEDED, } from './constants'; export function addUser(newUser) { @@ -82,17 +87,27 @@ export function onClickDelete(itemToDelete) { itemToDelete, }; } +export function setActionType(action) { + const actionType = action === 'create' ? 'POST' : 'PUT'; + + return { + type: SET_ACTION_TYPE, + actionType, + }; +} + +export function setErrors(formErrors) { + return { + type: SET_ERRORS, + formErrors, + }; +} export function setForm() { const form = Map({ name: '', description: '', - users: List([ - { name: 'Pierre Burgy' }, - { name: 'Jim Laurie' }, - { name: 'Aurelien Georget' }, - { name: 'Cyril Lopez' }, - ]), + users: List([]), permissions: Map({}), }); @@ -101,3 +116,22 @@ export function setForm() { form, }; } + +export function submit() { + return { + type: SUBMIT, + }; +} + +export function submitError(errors) { + return { + type: SUBMIT_ERROR, + errors, + }; +} + +export function submitSucceeded() { + return { + type: SUBMIT_SUCCEEDED, + }; +} diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/constants.js b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/constants.js index 2604760d99..6c411bfb24 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/constants.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/constants.js @@ -12,4 +12,9 @@ export const GET_ROLE_SUCCEEDED = 'UsersPermissions/EditPage/GET_ROLE_SUCCEEDED' export const ON_CANCEL = 'UsersPermissions/EditPage/ON_CANCEL'; export const ON_CHANGE_INPUT = 'UsersPermissions/EditPage/ON_CHANGE_INPUT'; export const ON_CLICK_DELETE = 'UsersPermissions/EditPage/ON_CLICK_DELETE'; +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 SUBMIT = 'UsersPermissions/EditPage/SUBMIT'; +export const SUBMIT_ERROR = 'UsersPermissions/EditPage/SUBMIT_ERROR'; +export const SUBMIT_SUCCEEDED = 'UsersPermissions/EditPage/SUBMIT_SUCCEEDED'; diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/index.js b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/index.js index 1e5ca5e998..748d055c85 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/index.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/index.js @@ -10,7 +10,7 @@ import { connect } from 'react-redux'; import { createStructuredSelector } from 'reselect'; import { bindActionCreators, compose } from 'redux'; import { FormattedMessage } from 'react-intl'; -import { get, isEqual, size } from 'lodash'; +import { findIndex, get, isEmpty, isEqual, size } from 'lodash'; import cn from 'classnames'; // Design @@ -31,7 +31,10 @@ import { onCancel, onChangeInput, onClickDelete, + setActionType, + setErrors, setForm, + submit, } from './actions'; // Selectors @@ -50,14 +53,39 @@ export class EditPage extends React.Component { // eslint-disable-line react/pre ); componentDidMount() { + this.props.setActionType(this.props.match.params.actionType); + if (this.props.match.params.actionType === 'create') { + // Set reducer modifiedData this.props.setForm(); + // Get the available permissions this.props.getPermissions(); } else { this.props.getRole(this.props.match.params.id); } } + componentWillReceiveProps(nextProps) { + // Redirect user to HomePage if submit ok + if (nextProps.editPage.didSubmit !== this.props.editPage.didSubmit) { + this.props.history.push('/plugins/users-permissions/roles'); + } + } + + componentWillUnmount() { + // Empty formErrors + this.props.setErrors([]); + } + + handleSubmit = () => { + // Check if the name field is filled + if (isEmpty(get(this.props.editPage, ['modifiedData', 'name']))) { + return this.props.setErrors([{ name: 'name', errors: [{ id: 'users-permissions.EditPage.form.roles.name.error' }] }]); + } + + this.props.submit(); + } + pluginHeaderActions = [ { label: 'users-permissions.EditPage.cancel', @@ -68,7 +96,7 @@ export class EditPage extends React.Component { // eslint-disable-line react/pre { kind: 'primary', label: 'users-permissions.EditPage.submit', - onClick: () => console.log('submit'), + onClick: this.handleSubmit, type: 'submit', }, ]; @@ -114,6 +142,8 @@ export class EditPage extends React.Component { // eslint-disable-line react/pre list.filter(o => o.name !== action.itemToDelete.name)); + case SET_ACTION_TYPE: + return state + .set('formErrors', List([])) + .set('actionType', action.actionType); + case SET_ERRORS: + return state + .set('formErrors', List(action.formErrors)) + .set('didCheckErrors', !state.get('didCheckErrors')); case SET_FORM: return state .set('didGetUsers', !state.get('didGetUsers')) .set('initialData', action.form) .set('modifiedData', action.form); + case SUBMIT_ERROR: + return state + .set('formErrors', List(action.errors)); + case SUBMIT_SUCCEEDED: + return state + .set('didSubmit', !state.get('didSubmit')); default: return state; } diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/saga.js b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/saga.js index c8330717b0..55811ad222 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/saga.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/saga.js @@ -4,7 +4,7 @@ import { cancel, fork, put, - // select, + select, take, takeLatest, } from 'redux-saga/effects'; @@ -13,13 +13,20 @@ import request from 'utils/request'; import { getPermissionsSucceeded, getRoleSucceeded, + submitSucceeded, } from './actions'; import { GET_PERMISSIONS, GET_ROLE, + SUBMIT, } from './constants'; +import { + makeSelectActionType, + makeSelectModifiedData, +} from './selectors'; + export function* permissionsGet() { try { const response = yield call(request, '/users-permissions/permissions', { method: 'GET' }); @@ -39,10 +46,32 @@ export function* roleGet(action) { } } +export function* submit() { + try { + const actionType = yield select(makeSelectActionType()); + const body = yield select(makeSelectModifiedData()); + const opts = { + method: actionType, + body, + }; + + // TODO : handle PUT url + const requestURL = actionType === 'POST' ? '/users-permissions/roles' : '/users-permissions/roles/id'; + yield call(request, requestURL, opts); + + yield put(submitSucceeded()); + + } catch(error) { + console.log(error.response.payload); + // TODO handle error message + } +} + export default function* defaultSaga() { const loadPermissionsWatcher = yield fork(takeLatest, GET_PERMISSIONS, permissionsGet); const loadRoleWatcher = yield fork(takeLatest, GET_ROLE, roleGet); + yield fork(takeLatest, SUBMIT, submit); yield take(LOCATION_CHANGE); yield cancel(loadPermissionsWatcher); diff --git a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/selectors.js b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/selectors.js index 8791fd66cd..e629002552 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/selectors.js +++ b/packages/strapi-plugin-users-permissions/admin/src/containers/EditPage/selectors.js @@ -16,10 +16,22 @@ const selectEditPageDomain = () => (state) => state.get('editPage'); const makeSelectEditPage = () => createSelector( selectEditPageDomain(), - (substate) => substate.toJS() + (substate) => substate.toJS(), +); + +const makeSelectActionType = () => createSelector( + selectEditPageDomain(), + (substate) => substate.get('actionType'), +); + +const makeSelectModifiedData = () => createSelector( + selectEditPageDomain(), + (substate) => substate.get('modifiedData').toJS(), ); export default makeSelectEditPage; export { + makeSelectActionType, + makeSelectModifiedData, selectEditPageDomain, }; diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/en.json b/packages/strapi-plugin-users-permissions/admin/src/translations/en.json index ca56c0aba4..6fc19a7cc4 100755 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/en.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/en.json @@ -60,6 +60,7 @@ "EditPage.form.roles.label.description": "Description", "EditPage.form.roles.label.name": "Name", "EditPage.form.roles.label.users": "Users associated with this role ({number})", + "EditPage.form.roles.name.error": "This value input is required.", "EditPage.header.title": "{name} ", "EditPage.header.title.create": "Create a new role", "EditPage.header.description": "{description} ", diff --git a/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json b/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json index b36bab7a95..2ece8a87b0 100755 --- a/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json +++ b/packages/strapi-plugin-users-permissions/admin/src/translations/fr.json @@ -60,6 +60,7 @@ "EditPage.form.roles.label.description": "Description", "EditPage.form.roles.label.name": "Nom", "EditPage.form.roles.label.users": "Utilisateurs associés avec ce rôle ({number})", + "EditPage.form.roles.name.error": "Ce champ est obligatoire.", "EditPage.header.title": "{name} ", "EditPage.header.title.create": "Créez un nouveau rôle", "EditPage.header.description": "{description} ", diff --git a/packages/strapi-plugin-users-permissions/config/routes.json b/packages/strapi-plugin-users-permissions/config/routes.json index 0f2638c7c7..b1d13e8a78 100644 --- a/packages/strapi-plugin-users-permissions/config/routes.json +++ b/packages/strapi-plugin-users-permissions/config/routes.json @@ -34,7 +34,7 @@ }, { "method": "POST", - "path": "/permissions", + "path": "/roles", "handler": "UsersPermissions.createRole", "config": { "policies": []