From 6165ba01ad8fe125090e11a130eda7537f204b9f Mon Sep 17 00:00:00 2001 From: soupette Date: Fri, 3 Aug 2018 16:07:23 +0200 Subject: [PATCH] Fix duplicate key bug --- .../lib/src/utils/Manager.js | 5 ++- .../src/components/DraggableAttr/index.js | 4 ++ .../components/VariableDraggableAttr/index.js | 44 ++++++++++++++++--- .../admin/src/containers/App/helpers.js | 14 +++++- .../admin/src/containers/App/selectors.js | 8 ++++ .../admin/src/containers/SettingPage/index.js | 10 +++++ 6 files changed, 77 insertions(+), 8 deletions(-) diff --git a/packages/strapi-helper-plugin/lib/src/utils/Manager.js b/packages/strapi-helper-plugin/lib/src/utils/Manager.js index 23d7af61e2..65cae8d43c 100644 --- a/packages/strapi-helper-plugin/lib/src/utils/Manager.js +++ b/packages/strapi-helper-plugin/lib/src/utils/Manager.js @@ -52,8 +52,9 @@ class Manager { default: ret = ['__col-md-3__']; } - const random = Math.floor(Math.random() * 1000); - const random1 = Math.floor(Math.random() * 1000); + + const random = Math.random().toString(36).substring(7); + const random1 = Math.random().toString(36).substring(8); return ret.map((v, i) => { diff --git a/packages/strapi-plugin-content-manager/admin/src/components/DraggableAttr/index.js b/packages/strapi-plugin-content-manager/admin/src/components/DraggableAttr/index.js index 8460390860..e551350bd2 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/DraggableAttr/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/DraggableAttr/index.js @@ -104,6 +104,10 @@ class DraggableAttr extends React.Component { if (isDraggingSibling !== prevProps.isDraggingSibling && isDraggingSibling) { this.handleMouseLeave(); } + + if (prevProps.isDragging !== this.props.isDragging && this.props.isDragging) { + this.props.onClickEdit(this.props.index); + } } handleClickEdit = (e) => { diff --git a/packages/strapi-plugin-content-manager/admin/src/components/VariableDraggableAttr/index.js b/packages/strapi-plugin-content-manager/admin/src/components/VariableDraggableAttr/index.js index f00f77f180..7870aa8da0 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/VariableDraggableAttr/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/VariableDraggableAttr/index.js @@ -156,6 +156,10 @@ class VariableDraggableAttr extends React.Component { if (prevProps.isDragging !== this.props.isDragging) { this.handleDragEffect(); } + + if (prevProps.isDragging !== this.props.isDragging && this.props.isDragging) { + this.handleClickEdit(); + } } handleClickEdit = () => { @@ -179,20 +183,43 @@ class VariableDraggableAttr extends React.Component { renderContent = () => { let { classNames, isOver, style, dragStart } = this.state; - const { data, hoverIndex, index, isEditing, name } = this.props; + const { data, draggedItemName, grid, hoverIndex, index, initDragLine, isEditing, name } = this.props; const isFullSize = classNames.bootstrap === 'col-md-12'; - const showCarret = hoverIndex === index; + let itemLine = -1; + let itemLineEls = []; + grid.forEach((line, index) => { + if (line.indexOf(name) !== -1) { + itemLine = index; + itemLineEls = line; + } + }); + const itemPosition = get(grid, itemLine, []).indexOf(name); + const draggedItemLineIndex = get(grid, itemLine, []).indexOf(draggedItemName); + let showLeftCarret = hoverIndex === index && initDragLine !== itemLine; + let showRightCarret = hoverIndex === index && initDragLine === itemLine; + + if (hoverIndex === index && initDragLine === itemLine && (itemPosition === 0 || itemPosition === 1 && itemLineEls.length > 2)) { + if (itemLineEls.length < 3 || itemPosition === 0 || draggedItemLineIndex > itemPosition) { + showLeftCarret = true; + showRightCarret = false; + } + } + const carretStyle = (() => { - let style = { height: '30px' }; + let style = { height: '30px', marginRight: '3px' }; if (classNames.withLongerHeight) { - style = { height: '84px' }; + style = { height: '84px', marginRight: '3px' }; } if (isFullSize) { style = { width: '100%', height: '10px', marginBottom: '6px' }; } + if (showRightCarret) { + style = { height: '30px', marginLeft: '3px' }; + } + return style; })(); @@ -202,7 +229,7 @@ class VariableDraggableAttr extends React.Component { return (
- { showCarret && } + { showLeftCarret && }
@@ -220,6 +247,7 @@ class VariableDraggableAttr extends React.Component { )}
+ { showRightCarret && }
); } @@ -252,8 +280,11 @@ VariableDraggableAttr.defaultProps = { data: { type: 'text', }, + draggedItemName: null, + grid: [], hoverIndex: -1, index: 0, + initDragLine: -1, isDragging: false, isEditing: false, keys: '', @@ -268,8 +299,11 @@ VariableDraggableAttr.propTypes = { connectDragSource: PropTypes.func.isRequired, connectDropTarget: PropTypes.func.isRequired, data: PropTypes.object, + draggedItemName: PropTypes.string, + grid: PropTypes.array, hoverIndex: PropTypes.number, index: PropTypes.number, + initDragLine: PropTypes.number, isDragging: PropTypes.bool, isEditing: PropTypes.bool, keys: PropTypes.string, diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/App/helpers.js b/packages/strapi-plugin-content-manager/admin/src/containers/App/helpers.js index 087ef886f1..040f1a8aff 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/App/helpers.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/App/helpers.js @@ -57,8 +57,20 @@ const reorderList = (manager, list) => { return acc.concat(line); }, []) .filter(a => a !== undefined); + + const uniqueIdList = reordered.reduce((acc, current, index) => { + if (reordered.indexOf(current) === index) { + acc.push(current); + } else { + const bootstrapCol = parseInt(current.split('__')[1].split('-')[2], 10); + const random = Math.random().toString(36).substring(7); + acc.push(`__col-md-${bootstrapCol}__${random}`); + } - return List(flattenDeep(reordered)); + return acc; + }, []); + + return List(flattenDeep(uniqueIdList)); }; const getLines = (manager, list) => { const array = createArrayOfLastEls(manager, list); diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/App/selectors.js b/packages/strapi-plugin-content-manager/admin/src/containers/App/selectors.js index cc8f046107..a88074d4e5 100755 --- a/packages/strapi-plugin-content-manager/admin/src/containers/App/selectors.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/App/selectors.js @@ -29,6 +29,10 @@ const makeSelectAddedField = () => createSelector(selectGlobalDomain(), globalState => globalState.get('addedField') ); +const makeSelectDraggedItemName = () => + createSelector(selectGlobalDomain(), globalState => + globalState.get('draggedItemName') + ); const makeSelectHoverIndex = () => createSelector(selectGlobalDomain(), globalState => globalState.get('hoverIndex') @@ -39,6 +43,8 @@ const makeSelectModelEntries = () => ); const makeSelectGrid = () => createSelector(selectGlobalDomain(), substate => substate.get('grid').toJS()); +const makeSelectInitDragLine = () => + createSelector(selectGlobalDomain(), substate => substate.get('initDragLine')); const makeSelectLoading = () => createSelector(selectGlobalDomain(), substate => substate.get('loading')); const makeSelectSchema = () => @@ -54,8 +60,10 @@ export { selectGlobalDomain, selectLocationState, makeSelectAddedField, + makeSelectDraggedItemName, makeSelectHoverIndex, makeSelectGrid, + makeSelectInitDragLine, makeSelectLoading, makeSelectModelEntries, makeSelectModifiedSchema, diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/SettingPage/index.js b/packages/strapi-plugin-content-manager/admin/src/containers/SettingPage/index.js index 53fa0c0a30..266949c1da 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/SettingPage/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/SettingPage/index.js @@ -32,8 +32,10 @@ import { } from 'containers/App/actions'; import { makeSelectAddedField, + makeSelectDraggedItemName, makeSelectGrid, makeSelectHoverIndex, + makeSelectInitDragLine, makeSelectModifiedSchema, makeSelectShouldResetGrid, makeSelectSubmitSuccess, @@ -443,10 +445,13 @@ class SettingPage extends React.PureComponent { ( ); const mapStateToProps = createStructuredSelector({ addedField: makeSelectAddedField(), + draggedItemName: makeSelectDraggedItemName(), grid: makeSelectGrid(), hoverIndex: makeSelectHoverIndex(), + initDragLine: makeSelectInitDragLine(), schema: makeSelectModifiedSchema(), settingPage: makeSelectSettingPage(), shouldResetGrid: makeSelectShouldResetGrid(),