Remove the possibility to edit a model from the HP....

This commit is contained in:
soupette 2019-03-14 17:36:13 +01:00
parent 1c3d765d05
commit d37d71a5d1
10 changed files with 87 additions and 41 deletions

View File

@ -15,7 +15,7 @@ import styles from './styles.scss';
class TableList extends React.Component { // eslint-disable-line react/prefer-stateless-function
render() {
const { push } = this.props;
const { canOpenModalAddContentType, deleteTemporaryModel, push } = this.props;
return (
<div className={styles.tableListContainer}>
@ -50,7 +50,9 @@ class TableList extends React.Component { // eslint-disable-line react/prefer-st
{map(this.props.rowItems, (rowItem, key) => (
<TableListRow
key={key}
onDelete={this.props.onHandleDelete}
canOpenModalAddContentType={canOpenModalAddContentType}
deleteTemporaryModel={deleteTemporaryModel}
onDelete={this.props.onDelete}
push={push}
rowItem={rowItem}
/>
@ -64,11 +66,17 @@ class TableList extends React.Component { // eslint-disable-line react/prefer-st
}
}
TableList.defaultProps = {
canOpenModalAddContentType: true,
};
TableList.propTypes = {
availableNumber: PropTypes.number.isRequired,
buttonLabel: PropTypes.string.isRequired,
canOpenModalAddContentType: PropTypes.bool,
deleteTemporaryModel: PropTypes.func.isRequired,
onButtonClick: PropTypes.func.isRequired,
onHandleDelete: PropTypes.func.isRequired,
onDelete: PropTypes.func.isRequired,
push: PropTypes.func.isRequired,
rowItems: PropTypes.array.isRequired,
title: PropTypes.string.isRequired,

View File

@ -11,6 +11,7 @@ import { FormattedMessage } from 'react-intl';
import IcoContainer from 'components/IcoContainer';
import ListRow from 'components/ListRow';
import PopUpWarning from 'components/PopUpWarning';
import styles from '../TableList/styles.scss';
/* eslint-disable jsx-a11y/no-static-element-interactions */
/* eslint-disable react/jsx-curly-brace-presence */
@ -24,23 +25,24 @@ class TableListRow extends React.Component {
};
}
handleEdit = () => {
const { push, rowItem: { name } } = this.props;
push({
search: `modalType=model&settingType=base&actionType=edit&model=${name}`,
});
};
handleDelete = e => {
e.preventDefault();
e.stopPropagation();
this.props.onDelete(this.props.rowItem.name);
const { deleteTemporaryModel, onDelete, rowItem: { name, isTemporary } } = this.props;
if (isTemporary) {
deleteTemporaryModel(name);
} else {
onDelete(name);
}
this.setState({ showWarning: false });
};
handleGoTo = () => {
const { push } = this.props;
push(
`/plugins/content-type-builder/models/${this.props.rowItem.name}${
this.props.rowItem.source ? `&source=${this.props.rowItem.source}` : ''
@ -77,7 +79,6 @@ class TableListRow extends React.Component {
const icons = this.props.rowItem.source
? []
: [
{ icoType: 'pencil', onClick: this.handleEdit },
{ icoType: 'trash', onClick: this.handleShowModalWarning, id: `delete${name}` },
];
@ -110,6 +111,7 @@ class TableListRow extends React.Component {
}
TableListRow.propTypes = {
deleteTemporaryModel: PropTypes.func.isRequired,
onDelete: PropTypes.func.isRequired,
push: PropTypes.func.isRequired,
rowItem: PropTypes.object.isRequired,

View File

@ -10,11 +10,13 @@ import {
CLEAR_TEMPORARY_ATTRIBUTE,
CREATE_TEMP_CONTENT_TYPE,
DELETE_MODEL,
DELETE_TEMPORARY_MODEL,
DELETE_MODEL_SUCCEEDED,
GET_DATA,
GET_DATA_SUCCEEDED,
ON_CHANGE_NEW_CONTENT_TYPE,
ON_CREATE_ATTRIBUTE,
ON_UPDATING_EXISTING_CONTENT_TYPE,
SUBMIT_TEMP_CONTENT_TYPE,
SUBMIT_TEMP_CONTENT_TYPE_SUCCEEDED,
} from './constants';
@ -51,6 +53,13 @@ export function deleteModel(modelName) {
};
}
export function deleteTemporaryModel({ modelName }) {
return {
type: DELETE_TEMPORARY_MODEL,
modelName,
};
}
export function deleteModelSucceeded(modelName) {
return {
type: DELETE_MODEL_SUCCEEDED,
@ -99,6 +108,16 @@ export function onCreateAttribute({ target }) {
};
}
export function onUpdatingExistingContentType({ target: { name, value } }) {
const formattedValue = name === 'name' ? camelCase(value.trim()).toLowerCase() : value.trim();
return {
type: ON_UPDATING_EXISTING_CONTENT_TYPE,
keys: name.split('.'),
value: formattedValue,
};
}
export function submitTempContentType() {
return {
type: SUBMIT_TEMP_CONTENT_TYPE,

View File

@ -9,10 +9,12 @@ export const CANCEL_NEW_CONTENT_TYPE = 'ContentTypeBuilder/App/CANCEL_NEW_CONTEN
export const CLEAR_TEMPORARY_ATTRIBUTE = 'ContentTypeBuilder/App/CLEAR_TEMPORARY_ATTRIBUTE';
export const CREATE_TEMP_CONTENT_TYPE = 'ContentTypeBuilder/App/CREATE_TEMP_CONTENT_TYPE';
export const DELETE_MODEL = 'ContentTypeBuilder/App/DELETE_MODEL';
export const DELETE_TEMPORARY_MODEL = 'ContentTypeBuilder/App/DELETE_TEMPORARY_MODEL';
export const DELETE_MODEL_SUCCEEDED = 'ContentTypeBuilder/App/DELETE_MODEL_SUCCEEDED';
export const GET_DATA = 'ContentTypeBuilder/App/GET_DATA';
export const GET_DATA_SUCCEEDED = 'ContentTypeBuilder/App/GET_DATA_SUCCEEDED';
export const ON_CHANGE_NEW_CONTENT_TYPE = 'ContentTypeBuilder/App/ON_CHANGE_NEW_CONTENT_TYPE';
export const ON_CREATE_ATTRIBUTE = 'ContentTypeBuilder/App/ON_CREATE_ATTRIBUTE';
export const ON_UPDATING_EXISTING_CONTENT_TYPE = 'ContentTypeBuilder/App/ON_UPDATING_EXISTING_CONTENT_TYPE';
export const SUBMIT_TEMP_CONTENT_TYPE = 'ContentTypeBuilder/App/SUBMIT_TEMP_CONTENT_TYPE';
export const SUBMIT_TEMP_CONTENT_TYPE_SUCCEEDED = 'ContentTypeBuilder/App/SUBMIT_TEMP_CONTENT_TYPE_SUCCEEDED';

View File

@ -22,8 +22,10 @@ import {
cancelNewContentType,
createTempContentType,
deleteModel,
deleteTemporaryModel,
getData,
onChangeNewContentType,
onUpdatingExistingContentType,
} from './actions';
import reducer from './reducer';
@ -109,7 +111,9 @@ export function mapDispatchToProps(dispatch) {
cancelNewContentType,
createTempContentType,
deleteModel,
deleteTemporaryModel,
getData,
onUpdatingExistingContentType,
onChangeNewContentType,
},
dispatch,

View File

@ -11,9 +11,11 @@ import {
CLEAR_TEMPORARY_ATTRIBUTE,
CREATE_TEMP_CONTENT_TYPE,
DELETE_MODEL_SUCCEEDED,
DELETE_TEMPORARY_MODEL,
GET_DATA_SUCCEEDED,
ON_CHANGE_NEW_CONTENT_TYPE,
ON_CREATE_ATTRIBUTE,
ON_UPDATING_EXISTING_CONTENT_TYPE,
SUBMIT_TEMP_CONTENT_TYPE_SUCCEEDED,
} from './constants';
@ -73,6 +75,10 @@ function appReducer(state = initialState, action) {
.removeIn(['models', state.get('models').findIndex(model => model.name === action.modelName)])
.removeIn(['initialData', action.modelName])
.removeIn(['modifiedData', action.modelName]);
case DELETE_TEMPORARY_MODEL:
return state
.removeIn(['models', state.get('models').findIndex(model => model.name === action.modelName)])
.update('newContentType', () => fromJS(initialState.get('newContentType')));
case GET_DATA_SUCCEEDED:
return state
.update('connections', () => List(action.connections))
@ -87,6 +93,9 @@ function appReducer(state = initialState, action) {
case ON_CREATE_ATTRIBUTE:
return state
.updateIn(['temporaryAttribute', ...action.keys], () => action.value);
case ON_UPDATING_EXISTING_CONTENT_TYPE:
return state
.updateIn(['modifiedData', ...action.keys], () => action.value);
case SUBMIT_TEMP_CONTENT_TYPE_SUCCEEDED:
return state
.updateIn([

View File

@ -156,7 +156,7 @@ class AttributeForm extends React.Component { // eslint-disable-line react/prefe
}
render() {
const { attributeType, modifiedData, isOpen } = this.props;
const { attributeType, isOpen } = this.props;
const { showForm } = this.state;
const currentForm = this.getCurrentForm();
@ -196,6 +196,7 @@ class AttributeForm extends React.Component { // eslint-disable-line react/prefe
AttributeForm.defaultProps = {
activeTab: 'base',
alreadyTakenAttributes: [],
attributeType: 'string',
isOpen: false,
modifiedData: {},
@ -206,6 +207,7 @@ AttributeForm.defaultProps = {
AttributeForm.propTypes = {
activeTab: PropTypes.string,
alreadyTakenAttributes: PropTypes.array,
attributeType: PropTypes.string,
isOpen: PropTypes.bool,
modifiedData: PropTypes.object, // TODO: Clearly define this object (It's working without it though)

View File

@ -6,7 +6,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { isEmpty } from 'lodash';
import { get, isEmpty } from 'lodash';
import PluginHeader from 'components/PluginHeader';
@ -31,17 +31,23 @@ class HomePage extends React.Component { // eslint-disable-line react/prefer-sta
}
getFormData = () => {
const { newContentType } = this.props;
const { modifiedData, newContentType } = this.props;
if (this.getActionType() === 'create') {
return newContentType;
}
return null;
return get(modifiedData, this.getModelToEditName(), {});
}
getModelToEditName = () => {
const { location: { search } } = this.props;
return getQueryParameters(search, 'model');
}
handleClick = () => {
const {canOpenModalAddContentType, history: { push } } = this.props;
const { canOpenModalAddContentType, history: { push } } = this.props;
if (canOpenModalAddContentType) {
push({
@ -52,14 +58,13 @@ class HomePage extends React.Component { // eslint-disable-line react/prefer-sta
}
}
handleDeleteModel = (modelName) => {
this.props.deleteModel(modelName);
}
render() {
const {
cancelNewContentType,
canOpenModalAddContentType,
createTempContentType,
deleteModel,
deleteTemporaryModel,
history: {
push,
},
@ -76,11 +81,13 @@ class HomePage extends React.Component { // eslint-disable-line react/prefer-sta
<EmptyContentTypeView handleButtonClick={this.handleClick} /> // eslint-disable-line react/jsx-handler-names
: (
<TableList
canOpenModalAddContentType={canOpenModalAddContentType}
availableNumber={availableNumber}
title={title}
buttonLabel={`${pluginId}.button.contentType.add`}
onButtonClick={this.handleClick}
onHandleDelete={this.handleDeleteModel}
onDelete={deleteModel}
deleteTemporaryModel={deleteTemporaryModel}
rowItems={this.props.models}
push={push}
/>
@ -107,6 +114,7 @@ class HomePage extends React.Component { // eslint-disable-line react/prefer-sta
cancelNewContentType={cancelNewContentType}
createTempContentType={createTempContentType}
currentData={modifiedData}
modelToEditName={this.getModelToEditName()}
modifiedData={this.getFormData()}
onChangeNewContentType={onChangeNewContentType}
isOpen={!isEmpty(search)}

View File

@ -98,12 +98,12 @@ describe('CTB <HomePage />', () => {
});
// This test needs to be updated when doing the edition
it('should return null otherwise', () => {
const wrapper = shallow(<HomePage {...props} />);
const { getFormData } = wrapper.instance();
// it('should return null otherwise', () => {
// const wrapper = shallow(<HomePage {...props} />);
// const { getFormData } = wrapper.instance();
expect(getFormData()).toBeNull();
});
// expect(getFormData()).toBeNull();
// });
});
describe('handleClick', () => {
@ -131,16 +131,5 @@ describe('CTB <HomePage />', () => {
wrapper.unmount();
});
});
describe('handleDeleteModel', () => {
it('should handle the action correctly', () => {
const wrapper = shallow(<HomePage {...props} />);
const { handleDeleteModel } = wrapper.instance();
handleDeleteModel('test');
expect(props.deleteModel).toHaveBeenCalledWith('test');
});
});
});
});

View File

@ -50,10 +50,11 @@ export class ModelForm extends React.Component { // eslint-disable-line react/pr
}
handleGoTo = to => {
const { actionType, push } = this.props;
const { actionType, modelToEditName, push } = this.props;
const model = actionType === 'edit' ? `&model=${modelToEditName}` : '';
push({
search: `modalType=model&settingType=${to}&actionType=${actionType}`,
search: `modalType=model&settingType=${to}&actionType=${actionType}${model}`,
});
}
@ -175,6 +176,7 @@ ModelForm.defaultProps = {
createTempContentType: () => {},
currentData: {},
isOpen: false,
modelToEditName: '',
modifiedData: {},
onSubmit: (e) => {
e.preventDefault();
@ -191,6 +193,7 @@ ModelForm.propTypes = {
createTempContentType: PropTypes.func,
currentData: PropTypes.object,
isOpen: PropTypes.bool,
modelToEditName: PropTypes.string,
modifiedData: PropTypes.object,
onChangeNewContentType: PropTypes.func.isRequired,
onSubmit: PropTypes.func,