update it

This commit is contained in:
Sukchan Lee 2017-06-30 22:42:24 +09:00
parent ac4eb2be15
commit 3fb03e2a97
6 changed files with 67 additions and 19 deletions

View File

@ -215,7 +215,7 @@ class Edit extends Component {
uiSchema uiSchema
}; };
if (action === 'change') { if (action === 'update') {
state = { state = {
...state, ...state,
uiSchema : { uiSchema : {
@ -277,11 +277,11 @@ class Edit extends Component {
return ( return (
<Form <Form
visible={visible} visible={visible}
title={(action === 'change') ? 'Edit Subscriber' : 'Create Subscriber'} title={(action === 'update') ? 'Edit Subscriber' : 'Create Subscriber'}
schema={this.state.schema} schema={this.state.schema}
uiSchema={this.state.uiSchema} uiSchema={this.state.uiSchema}
isLoading={isLoading} isLoading={isLoading}
formData={(action === 'change') ? this.props.formData : formData} formData={(action === 'update') ? this.props.formData : formData}
validate={validate} validate={validate}
onHide={onHide} onHide={onHide}
onSubmit={onSubmit} /> onSubmit={onSubmit} />

View File

@ -75,13 +75,13 @@ class Collection extends Component {
}) })
}, },
actions: { actions: {
add: () => { create: () => {
this.documentHandler.show('add'); this.documentHandler.show('create');
}, },
browser: (imsi) => { browser: (imsi) => {
}, },
change: (imsi) => { update: (imsi) => {
this.documentHandler.show('change', { imsi }); this.documentHandler.show('update', { imsi });
}, },
delete: (imsi) => { delete: (imsi) => {
const { dispatch } = this.props const { dispatch } = this.props
@ -120,7 +120,7 @@ class Collection extends Component {
<Subscriber.List <Subscriber.List
subscribers={data} subscribers={data}
onShow={documentHandler.actions.browser} onShow={documentHandler.actions.browser}
onEdit={documentHandler.actions.change} onEdit={documentHandler.actions.update}
onDelete={documentHandler.actions.delete} onDelete={documentHandler.actions.delete}
search={search} search={search}
/> />
@ -129,9 +129,9 @@ class Collection extends Component {
visible={!isLoading && !data.length} visible={!isLoading && !data.length}
title="ADD A SUBSCRIBER" title="ADD A SUBSCRIBER"
body="You have no subscribers... yet!" body="You have no subscribers... yet!"
onTitle={documentHandler.actions.add} onTitle={documentHandler.actions.create}
/> />
<FloatingButton onClick={documentHandler.actions.add}/> <FloatingButton onClick={documentHandler.actions.create}/>
<Document <Document
{ ...document } { ...document }
onHide={documentHandler.hide} /> onHide={documentHandler.hide} />

View File

@ -8,7 +8,15 @@ import {
createSubscriber, createSubscriber,
updateSubscriber updateSubscriber
} from 'modules/crud/subscriber'; } from 'modules/crud/subscriber';
import { select } from 'modules/crud/selectors';
import {
clearActionStatus
} from 'modules/crud/actions';
import {
select,
selectActionStatus
} from 'modules/crud/selectors';
import { Subscriber } from 'components'; import { Subscriber } from 'components';
@ -29,18 +37,23 @@ class Document extends Component {
} }
componentWillReceiveProps(nextProps) { componentWillReceiveProps(nextProps) {
const { subscriber } = nextProps const { subscriber, status } = nextProps
const { dispatch } = this.props const { dispatch, action, onHide } = this.props
if (subscriber.needsFetch) { if (subscriber.needsFetch) {
dispatch(subscriber.fetch) dispatch(subscriber.fetch)
} }
if (status.response) {
dispatch(clearActionStatus('subscribers', action));
onHide();
}
} }
validate = (formData, errors) => { validate = (formData, errors) => {
const { subscribers, action } = this.props; const { subscribers, action } = this.props;
const { imsi } = formData; const { imsi } = formData;
if (action === 'add' && subscribers && subscribers.data && if (action === 'create' && subscribers && subscribers.data &&
subscribers.data.filter(subscriber => subscriber.imsi === imsi).length > 0) { subscribers.data.filter(subscriber => subscriber.imsi === imsi).length > 0) {
errors.imsi.addError(`'${imsi}' is duplicated`); errors.imsi.addError(`'${imsi}' is duplicated`);
} }
@ -50,15 +63,13 @@ class Document extends Component {
handleSubmit = (formData) => { handleSubmit = (formData) => {
const { dispatch, action } = this.props; const { dispatch, action } = this.props;
if (action === 'add') { if (action === 'create') {
dispatch(createSubscriber({}, formData)); dispatch(createSubscriber({}, formData));
} else if (action === 'change') { } else if (action === 'update') {
dispatch(updateSubscriber(formData.imsi, {}, formData)); dispatch(updateSubscriber(formData.imsi, {}, formData));
} else { } else {
throw new Error(`Action type '${action}' is invalid.`); throw new Error(`Action type '${action}' is invalid.`);
} }
console.log(formData);
this.props.onHide();
} }
render() { render() {
@ -95,7 +106,8 @@ class Document extends Component {
Document = connect( Document = connect(
(state, props) => ({ (state, props) => ({
subscribers: select(fetchSubscribers(), state.crud), subscribers: select(fetchSubscribers(), state.crud),
subscriber: select(fetchSubscriber(props.imsi), state.crud) subscriber: select(fetchSubscriber(props.imsi), state.crud),
status: selectActionStatus('subscribers', state.crud, props.action)
}) })
)(Document); )(Document);

View File

@ -14,6 +14,7 @@ export const CRUD = {
DELETE: 'crud/DELETE', DELETE: 'crud/DELETE',
DELETE_SUCCESS: 'crud/DELETE_SUCCESS', DELETE_SUCCESS: 'crud/DELETE_SUCCESS',
DELETE_FAILURE: 'crud/DELETE_FAILURE', DELETE_FAILURE: 'crud/DELETE_FAILURE',
CLEAR_ACTION_STATUS: 'crud/CLEAR_ACTION_STATUS',
}; };
export const fetchCollection = (model, url, params = {}, options = {}) => { export const fetchCollection = (model, url, params = {}, options = {}) => {
@ -111,3 +112,10 @@ export const deleteDocument = (model, id, url, params = {}, options = {}) => {
} }
} }
} }
export const clearActionStatus = (model, action) => {
return {
type: CRUD.CLEAR_ACTION_STATUS,
payload: { model, action }
}
}

View File

@ -130,6 +130,8 @@ function actionStatusReducer(state = actionStatusInitialState, action) {
const idProperty = action.meta ? action.meta.idProperty : '_id'; const idProperty = action.meta ? action.meta.idProperty : '_id';
const id = action.meta ? action.meta.id : undefined; const id = action.meta ? action.meta.id : undefined;
switch(action.type) { switch(action.type) {
case CRUD.CLEAR_ACTION_STATUS:
return state.set(action.payload.action, fromJS({}))
case CRUD.CREATE: case CRUD.CREATE:
return state.set('create', fromJS({ return state.set('create', fromJS({
pending: true, pending: true,
@ -221,6 +223,9 @@ function crud(state = initialState, action) {
(s) => collectionsReducer(s, action)) (s) => collectionsReducer(s, action))
.updateIn([action.meta.model, 'actionStatus'], .updateIn([action.meta.model, 'actionStatus'],
(s) => actionStatusReducer(s, action)) (s) => actionStatusReducer(s, action))
case CRUD.CLEAR_ACTION_STATUS:
return state.updateIn([action.payload.model, 'actionStatus'],
(s) => actionStatusReducer(s, action))
default: default:
return state; return state;
} }

View File

@ -115,3 +115,26 @@ export function select(action, crud) {
selection.fetch = action; selection.fetch = action;
return selection; return selection;
} }
export function selectActionStatus(modelName, crud, action) {
const rawStatus = (crud.getIn([modelName, 'actionStatus', action]) || fromJS({})).toJS();
const { pending = false, id = null, isSuccess = null, payload = null } = rawStatus;
if (pending === true) {
return { id, pending }
}
if (isSuccess === true) {
return {
id,
pending,
response: payload
}
}
return {
id,
pending,
error: payload
}
}