Format model data to match inputs requirements

This commit is contained in:
cyril lopez 2017-08-31 11:01:59 +02:00
parent 6bfc8475bf
commit 11d51c99e9
5 changed files with 31 additions and 25 deletions

View File

@ -44,7 +44,7 @@ class AttributeRow extends React.Component { // eslint-disable-line react/prefer
this.setState({ showWarning: false });
}
toggleModalWarning = (e) => {
toggleModalWarning = () => {
// e.preventDefault();
// e.stopPropagation()
this.setState({ showWarning: !this.state.showWarning });

View File

@ -6,7 +6,7 @@
import React from 'react';
import { FormattedMessage } from 'react-intl';
import { map, includes, split } from 'lodash';
import { map, includes, split, isEmpty } from 'lodash';
import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
import Input from 'components/Input';
import PopUpHeaderNavLink from 'components/PopUpHeaderNavLink';
@ -20,7 +20,7 @@ class PopUpForm extends React.Component { // eslint-disable-line react/prefer-st
const shouldOverrideRendering = this.props.overrideRenderInputCondition ? this.props.overrideRenderInputCondition(item) : false;
const value = this.props.values[item.target] && includes(item.target, '.') ? this.props.values[split(item.target, '.')[0]][split(item.target, '.')[1]] : this.props.values[item.target];
const value = !isEmpty(this.props.values) && includes(item.target, '.') ? this.props.values[split(item.target, '.')[0]][split(item.target, '.')[1]] : this.props.values[item.target];
if (shouldOverrideRendering) {
return this.props.overrideRenderInput(item, key);

View File

@ -131,7 +131,7 @@ export function setAttributeForm(hash) {
type: formType,
required: true,
// TODO remove with correct value
// minLength: true,
minLength: true,
// minLengthValue: 0,
}),
});

View File

@ -3,7 +3,7 @@
* ModelPage actions
*
*/
import { get } from 'lodash';
import { forEach, get, includes, map, set } from 'lodash';
import { storeData } from '../../utils/storeData';
import {
@ -62,7 +62,19 @@ export function modelFetch(modelName) {
};
}
export function modelFetchSucceeded(model) {
export function modelFetchSucceeded(data) {
const model = data;
const defaultKeys = ['required', 'unique', 'type'];
forEach(model.model.attributes, (attribute, index) => {
map(attribute.params, (value, key) => {
if (!includes(defaultKeys, key) && value) {
set(model.model.attributes[index].params, `${key}Value`, value);
set(model.model.attributes[index].params, key, true);
}
});
});
return {
type: MODEL_FETCH_SUCCEEDED,
model,

View File

@ -1,5 +1,5 @@
import { LOCATION_CHANGE } from 'react-router-redux';
import { get } from 'lodash';
import { forEach, get, includes, map, replace, set, unset } from 'lodash';
import { takeLatest } from 'redux-saga';
import { call, take, put, fork, cancel, select } from 'redux-saga/effects';
@ -13,24 +13,6 @@ import { MODEL_FETCH, SUBMIT } from './constants';
import { modelFetchSucceeded, postContentTypeSucceeded } from './actions';
import { makeSelectModel } from './selectors';
// Individual exports for testing
// export function* attributeDelete(action) {
// try {
// if (action.sendRequest) {
// const body = yield select(makeSelectModel());
// const requestUrl = `/content-type-builder/models/${action.modelName}`;
// const opts = {
// method: 'PUT',
// body,
// };
//
// yield call(request, requestUrl, opts);
// }
// } catch(error) {
// window.Strapi.notification.error('An error occured');
// }
// }
export function* fetchModel(action) {
try {
const requestUrl = `/content-type-builder/models/${action.modelName}`;
@ -49,6 +31,18 @@ export function* submitChanges() {
const modelName = get(storeData.getContentType(), 'name');
const body = yield select(makeSelectModel());
map(body.attributes, (attribute, index) => {
forEach(attribute.params, (value, key) => {
if (includes(key, 'Value')) {
set(body.attributes[index].params, replace(key, 'Value', ''), value);
unset(body.attributes[index].params, key);
}
if (!value) {
unset(body.attributes[index].params, key);
}
});
})
const method = modelName === body.name ? 'POST' : 'PUT';
const baseUrl = '/content-type-builder/models/';