diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 0b44d252ab..fa77fe72e3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -46,8 +46,8 @@ "react-app-polyfill": "^2.0.0", "react-chartjs-2": "5.3.0", "react-cookies": "^0.1.0", - "react-dnd": "^2.6.0", - "react-dnd-html5-backend": "^2.6.0", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", "react-dom": "18.3.1", "react-i18next": "^10.12.2", "react-mentions": "4.4.10", @@ -3106,19 +3106,6 @@ } } }, - "node_modules/@emotion/react/node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/@emotion/react/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/@emotion/serialize": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", @@ -5391,6 +5378,21 @@ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" }, + "node_modules/@react-dnd/asap": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", + "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==" + }, + "node_modules/@react-dnd/invariant": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", + "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==" + }, + "node_modules/@react-dnd/shallowequal": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", + "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==" + }, "node_modules/@replit/codemirror-lang-csharp": { "version": "6.2.0", "resolved": "https://registry.npmmirror.com/@replit/codemirror-lang-csharp/-/codemirror-lang-csharp-6.2.0.tgz", @@ -11612,12 +11614,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/disposables": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/disposables/-/disposables-1.0.2.tgz", - "integrity": "sha512-q1XTvs/XGdfubRSemB2+QRhJjIX4PerKkSom+i8Nkw3hCv6xISNrgaN442n2BunyBI4x77Om4ZAzSlqmhM9pwA==", - "license": "Apache-2.0" - }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", @@ -11626,15 +11622,13 @@ "license": "MIT" }, "node_modules/dnd-core": { - "version": "2.6.0", - "resolved": "https://registry.npmmirror.com/dnd-core/-/dnd-core-2.6.0.tgz", - "integrity": "sha512-5BfQHIp0XVd4ioF0q4GyUeHQQNCbqP+0SnUiP9TssoQ50wrP1NgSzDqZkjD5pFngsVz9txGin6rvTQD7w0qC3w==", - "license": "BSD-3-Clause", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", + "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", "dependencies": { - "asap": "^2.0.6", - "invariant": "^2.0.0", - "lodash": "^4.2.0", - "redux": "^3.7.1" + "@react-dnd/asap": "^5.0.1", + "@react-dnd/invariant": "^4.0.1", + "redux": "^4.2.0" } }, "node_modules/dns-packet": { @@ -13510,7 +13504,6 @@ "version": "3.1.3", "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -15283,10 +15276,17 @@ } }, "node_modules/hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmmirror.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", - "license": "BSD-3-Clause" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/hoopy": { "version": "0.1.4", @@ -24069,29 +24069,40 @@ } }, "node_modules/react-dnd": { - "version": "2.6.0", - "resolved": "https://registry.npmmirror.com/react-dnd/-/react-dnd-2.6.0.tgz", - "integrity": "sha512-2KHNpeg2SyaxXYq+xO1TM+tOtN9hViI41otJuiYiu6DRYGw+WMvDFDMP4aw7zIKRRm1xd0gizXuKWhb8iJYHBw==", - "license": "BSD-3-Clause", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", + "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", "dependencies": { - "disposables": "^1.0.1", - "dnd-core": "^2.6.0", - "hoist-non-react-statics": "^2.1.0", - "invariant": "^2.1.0", - "lodash": "^4.2.0", - "prop-types": "^15.5.10" + "@react-dnd/invariant": "^4.0.1", + "@react-dnd/shallowequal": "^4.0.1", + "dnd-core": "^16.0.1", + "fast-deep-equal": "^3.1.3", + "hoist-non-react-statics": "^3.3.2" }, "peerDependencies": { - "react": "*" + "@types/hoist-non-react-statics": ">= 3.3.1", + "@types/node": ">= 12", + "@types/react": ">= 16", + "react": ">= 16.14" + }, + "peerDependenciesMeta": { + "@types/hoist-non-react-statics": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@types/react": { + "optional": true + } } }, "node_modules/react-dnd-html5-backend": { - "version": "2.6.0", - "resolved": "https://registry.npmmirror.com/react-dnd-html5-backend/-/react-dnd-html5-backend-2.6.0.tgz", - "integrity": "sha512-8gOfBfqFikWmXvAGSZz1mgoctwkcsKdUC9POt/WGnMoZwGB4ivB0Ex5D6pwHTNjvAs0ixqqWdJKy57CzjDg5Sg==", - "license": "BSD-3-Clause", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", + "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", "dependencies": { - "lodash": "^4.2.0" + "dnd-core": "^16.0.1" } }, "node_modules/react-dom": { @@ -24436,15 +24447,11 @@ } }, "node_modules/redux": { - "version": "3.7.2", - "resolved": "https://registry.npmmirror.com/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "license": "MIT", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "dependencies": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" + "@babel/runtime": "^7.9.2" } }, "node_modules/reflect.getprototypeof": { @@ -28510,15 +28517,6 @@ "node": ">=4" } }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz", diff --git a/frontend/package.json b/frontend/package.json index 72a8acb62e..6d339588ff 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -41,8 +41,8 @@ "react-app-polyfill": "^2.0.0", "react-chartjs-2": "5.3.0", "react-cookies": "^0.1.0", - "react-dnd": "^2.6.0", - "react-dnd-html5-backend": "^2.6.0", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", "react-dom": "18.3.1", "react-i18next": "^10.12.2", "react-mentions": "4.4.10", diff --git a/frontend/src/app.js b/frontend/src/app.js index eeccc71ba5..524cfa99e3 100644 --- a/frontend/src/app.js +++ b/frontend/src/app.js @@ -3,6 +3,8 @@ import { createRoot } from 'react-dom/client'; import { Router, navigate, LocationProvider, globalHistory } from '@gatsbyjs/reach-router'; import MediaQuery from 'react-responsive'; import { Modal } from 'reactstrap'; +import { DndProvider } from 'react-dnd'; +import { HTML5Backend } from 'react-dnd-html5-backend'; import { siteRoot, siteTitle, mediaUrl, faviconPath } from './utils/constants'; import { Utils, isMobile } from './utils/utils'; import SystemNotification from './components/system-notification'; @@ -315,44 +317,46 @@ class App extends Component { /> }
- - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/frontend/src/metadata/components/popover/groupbys-popover/groupbys/groupby-item.js b/frontend/src/metadata/components/popover/groupbys-popover/groupbys/groupby-item.js index d2a91a1f8a..3dc0ca8a94 100644 --- a/frontend/src/metadata/components/popover/groupbys-popover/groupbys/groupby-item.js +++ b/frontend/src/metadata/components/popover/groupbys-popover/groupbys/groupby-item.js @@ -1,7 +1,7 @@ -import React, { Fragment, useCallback, useMemo } from 'react'; +import React, { Fragment, useCallback, useMemo, useRef } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; -import { DragSource, DropTarget } from 'react-dnd'; +import { useDrag, useDrop } from 'react-dnd'; import CustomizeSelect from '../../../../../components/customize-select'; import Icon from '../../../../../components/icon'; import { gettext } from '../../../../../utils/constants'; @@ -9,49 +9,6 @@ import { getColumnByKey } from '../../../../utils/column'; import { COLUMNS_ICON_CONFIG, SORT_TYPE, SORT_COLUMN_OPTIONS } from '../../../../constants'; import { getGroupbyGranularityByColumn, isShowGroupCountType, getSelectedCountType, getDefaultCountType } from '../../../../utils/group'; -const dragSource = { - beginDrag: props => { - return { idx: props.index, data: props.groupby, mode: 'sfMetadataGroupbyItem' }; - }, - endDrag(props, monitor) { - const groupSource = monitor.getItem(); - const didDrop = monitor.didDrop(); - let groupTarget = {}; - if (!didDrop) { - return { groupSource, groupTarget }; - } - }, - isDragging(props) { - const { index, dragged } = props; - const { idx } = dragged; - return idx > index; - } -}; - -const dropTarget = { - drop(props, monitor) { - const groupSource = monitor.getItem(); - const { index: targetIdx } = props; - if (targetIdx !== groupSource.idx) { - let groupTarget = { idx: targetIdx, data: props.groupby }; - props.onMove(groupSource, groupTarget); - } - } -}; - -const dragCollect = (connect, monitor) => ({ - connectDragSource: connect.dragSource(), - connectDragPreview: connect.dragPreview(), - isDragging: monitor.isDragging(), -}); - -const dropCollect = (connect, monitor) => ({ - connectDropTarget: connect.dropTarget(), - isOver: monitor.isOver(), - canDrop: monitor.canDrop(), - dragged: monitor.getItem(), -}); - /* groupby: { column_key: 'xxx', @@ -59,10 +16,39 @@ const dropCollect = (connect, monitor) => ({ sort_type: 'xxx', } */ -const GroupbyItem = ({ - isOver, isDragging, canDrop, connectDragSource, connectDragPreview, connectDropTarget, - showDragBtn, index, readOnly, groupby, columns, onDelete, onUpdate -}) => { +const GroupbyItem = ({ showDragBtn, index, readOnly, groupby, columns, onDelete, onUpdate, onMove }) => { + const ref = useRef(null); + + // drag and drop + const [{ isDragging }, drag] = useDrag({ + type: 'sfMetadataGroupbyItem', + item: () => ({ + idx: index, + data: groupby, + }), + collect: (monitor) => ({ + isDragging: monitor.isDragging(), + }), + }); + + const [{ isOver, canDrop }, drop] = useDrop({ + accept: 'sfMetadataGroupbyItem', + hover: (item) => { + if (item.idx !== index) { + onMove( + { idx: item.idx, data: item.data }, + { idx: index, data: groupby } + ); + item.idx = index; + } + }, + collect: (monitor) => ({ + isOver: monitor.isOver(), + canDrop: monitor.canDrop(), + }) + }); + const dragDropRef = drag(drop(ref)); + const column = useMemo(() => { return getColumnByKey(columns, groupby.column_key); }, [groupby, columns]); @@ -165,59 +151,58 @@ const GroupbyItem = ({ onUpdate(newGroupby, index); }, [groupby, index, onUpdate]); - return connectDropTarget( - connectDragPreview( -
- {!readOnly && ( -
- -
- )} -
-
+ return ( +
+ {!readOnly && ( +
+ +
+ )} +
+
+ +
+ {isShowGroupCountType(column) && ( +
- {isShowGroupCountType(column) && ( -
- -
- )} -
- {(!column.key || SORT_COLUMN_OPTIONS.includes(column.type)) && ( - - )} -
-
- {!readOnly && showDragBtn && connectDragSource( -
- -
)} +
+ {(!column.key || SORT_COLUMN_OPTIONS.includes(column.type)) && ( + + )} +
- ) + {!readOnly && showDragBtn && ( +
+ +
+ )} +
); }; @@ -229,16 +214,7 @@ GroupbyItem.propTypes = { columns: PropTypes.array, onDelete: PropTypes.func, onUpdate: PropTypes.func, - - // drag - isDragging: PropTypes.bool, - isOver: PropTypes.bool, - canDrop: PropTypes.bool, - connectDropTarget: PropTypes.func, - connectDragSource: PropTypes.func, - connectDragPreview: PropTypes.func, + onMove: PropTypes.func, }; -export default DropTarget('sfMetadataGroupbyItem', dropTarget, dropCollect)( - DragSource('sfMetadataGroupbyItem', dragSource, dragCollect)(GroupbyItem) -); +export default GroupbyItem; diff --git a/frontend/src/metadata/components/popover/groupbys-popover/groupbys/index.js b/frontend/src/metadata/components/popover/groupbys-popover/groupbys/index.js index 8cd808133a..c2e0c06cb2 100644 --- a/frontend/src/metadata/components/popover/groupbys-popover/groupbys/index.js +++ b/frontend/src/metadata/components/popover/groupbys-popover/groupbys/index.js @@ -1,8 +1,7 @@ import React, { useMemo } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; -import { DropTarget } from 'react-dnd'; -import html5DragDropContext from '../../../../../pages/wiki2/wiki-nav/html5DragDropContext'; +import { useDrop } from 'react-dnd'; import GroupbyItem from './groupby-item'; import { gettext } from '../../../../../utils/constants'; @@ -17,8 +16,20 @@ const Groupbys = ({ readOnly, groupbys, columns, onDelete, onUpdate, onMove }) = return groupbys.length > 1; }, [readOnly, groupbys]); + const [, drop] = useDrop({ + accept: 'sfMetadataGroupbyItem', + drop: (item, monitor) => { + if (!monitor.didDrop()) { + onMove(item, { idx: groupbys.length }); + } + }, + collect: monitor => ({ + isOver: monitor.isOver(), + }), + }); + return ( -
+
{isEmpty &&
{gettext('No groupings applied to this view.')}
} {!isEmpty && groupbys.map((groupby, index) => { return ( @@ -47,8 +58,4 @@ Groupbys.propTypes = { onMove: PropTypes.func, }; -const DndGroupbysContainer = DropTarget('sfMetadataGroupbyItem', {}, connect => ({ - connectDropTarget: connect.dropTarget() -}))(Groupbys); - -export default html5DragDropContext(DndGroupbysContainer); +export default Groupbys; diff --git a/frontend/src/metadata/components/popover/options-popover/option/index.js b/frontend/src/metadata/components/popover/options-popover/option/index.js index 6f0d36ec61..4a181d0a1d 100644 --- a/frontend/src/metadata/components/popover/options-popover/option/index.js +++ b/frontend/src/metadata/components/popover/options-popover/option/index.js @@ -1,6 +1,6 @@ import React, { useCallback } from 'react'; import PropTypes from 'prop-types'; -import { DragSource, DropTarget } from 'react-dnd'; +import { useDrag, useDrop } from 'react-dnd'; import classnames from 'classnames'; import Icon from '../../../../../components/icon'; import IconBtn from '../../../../../components/icon-btn'; @@ -9,56 +9,73 @@ import Name from './name'; import './index.css'; -const dragSource = { - beginDrag: props => { - return { idx: props.index, data: props.option, mode: 'sfMetadataSingleSelectOption' }; - }, - endDrag(props, monitor) { - const optionSource = monitor.getItem(); - const didDrop = monitor.didDrop(); - let optionTarget = {}; - if (!didDrop) { - return { optionSource, optionTarget }; - } - }, - isDragging(props, monitor) { - const { index, dragged } = props; - const { idx } = dragged; - return idx > index; - } -}; +// const dragSource = { +// beginDrag: props => { +// return { idx: props.index, data: props.option, mode: 'sfMetadataSingleSelectOption' }; +// }, +// endDrag(props, monitor) { +// const optionSource = monitor.getItem(); +// const didDrop = monitor.didDrop(); +// let optionTarget = {}; +// if (!didDrop) { +// return { optionSource, optionTarget }; +// } +// }, +// isDragging(props, monitor) { +// const { index, dragged } = props; +// const { idx } = dragged; +// return idx > index; +// } +// }; -const dragCollect = (connect, monitor) => ({ - connectDragSource: connect.dragSource(), - connectDragPreview: connect.dragPreview(), - isDragging: monitor.isDragging() -}); +// const dragCollect = (connect, monitor) => ({ +// connectDragSource: connect.dragSource(), +// connectDragPreview: connect.dragPreview(), +// isDragging: monitor.isDragging() +// }); -const dropTarget = { - drop(props, monitor) { - const optionSource = monitor.getItem(); - const { index: targetIdx } = props; - if (targetIdx !== optionSource.idx) { - const optionTarget = { idx: targetIdx, data: props.option }; - props.onMove(optionSource, optionTarget); - } - } -}; +// const dropTarget = { +// drop(props, monitor) { +// const optionSource = monitor.getItem(); +// const { index: targetIdx } = props; +// if (targetIdx !== optionSource.idx) { +// const optionTarget = { idx: targetIdx, data: props.option }; +// props.onMove(optionSource, optionTarget); +// } +// } +// }; -const dropCollect = (connect, monitor) => ({ - connectDropTarget: connect.dropTarget(), - isOver: monitor.isOver(), - canDrop: monitor.canDrop(), - dragged: monitor.getItem() -}); +// const dropCollect = (connect, monitor) => ({ +// connectDropTarget: connect.dropTarget(), +// isOver: monitor.isOver(), +// canDrop: monitor.canDrop(), +// dragged: monitor.getItem() +// }); const Option = ({ - isOver, isDragging, canDrop, connectDragSource, connectDragPreview, connectDropTarget, isViewing, isDeleting, isEditing, isPredefined, option, onDelete: propsDelete, onUpdate, onMouseLeave, onMouseEnter: propsMouseEnter, onToggleFreeze, onOpenNameEditor, onCloseNameEditor, }) => { + const [{ isDragging }, drag] = useDrag({ + type: 'sfMetadataSingleSelectOption', + item: () => ({ + idx: option.id, + data: option, + }), + collect: (monitor) => ({ + isDragging: monitor.isDragging(), + }), + }); + + const [{ isOver, canDrop }, drop] = useDrop({ + accept: 'sfMetadataSingleSelectOption', + collect: (monitor) => ({ + isOver: monitor.isOver(), + canDrop: monitor.canDrop(), + }) + }); const onDelete = useCallback((event) => { event.nativeEvent.stopImmediatePropagation(); @@ -69,44 +86,41 @@ const Option = ({ propsMouseEnter(option.id); }, [option, propsMouseEnter]); - return connectDropTarget( - connectDragPreview( -
onMouseEnter()} - onMouseLeave={onMouseLeave} - > - {connectDragSource( -
- -
- )} -
- - -
-
- {(isViewing || isDeleting) && ( - - )} -
+ return ( +
drag(drop(node))} + className={classnames('sf-metadata-edit-option-container', { + 'sf-metadata-edit-option-can-drop': isOver && canDrop && !isDragging, + 'sf-metadata-edit-deleting-option': isDeleting, + 'sf-metadata-edit-option-can-drop-top': isOver && canDrop && isDragging, + 'sf-metadata-edit-option-viewing': isViewing, + 'sf-metadata-edit-option-editing': isEditing, + 'sf-metadata-edit-option-disabled': isPredefined, + })} + onMouseEnter={() => onMouseEnter()} + onMouseLeave={onMouseLeave} + > +
+
- ) +
+ + +
+
+ {(isViewing || isDeleting) && ( + + )} +
+
); }; @@ -127,15 +141,13 @@ Option.propTypes = { onOpenNameEditor: PropTypes.func.isRequired, onCloseNameEditor: PropTypes.func.isRequired, - // drag - isOver: PropTypes.bool, - canDrop: PropTypes.bool, - dragged: PropTypes.object, - connectDragSource: PropTypes.func.isRequired, - connectDropTarget: PropTypes.func.isRequired, - connectDragPreview: PropTypes.func.isRequired, + // // drag + // isOver: PropTypes.bool, + // canDrop: PropTypes.bool, + // dragged: PropTypes.object, + // connectDragSource: PropTypes.func.isRequired, + // connectDropTarget: PropTypes.func.isRequired, + // connectDragPreview: PropTypes.func.isRequired, }; -export default DropTarget('sfMetadataSingleSelectOption', dropTarget, dropCollect)( - DragSource('sfMetadataSingleSelectOption', dragSource, dragCollect)(Option) -); +export default Option; diff --git a/frontend/src/metadata/components/popover/options-popover/options-container.js b/frontend/src/metadata/components/popover/options-popover/options-container.js index 04b9db553d..44d2c2768a 100644 --- a/frontend/src/metadata/components/popover/options-popover/options-container.js +++ b/frontend/src/metadata/components/popover/options-popover/options-container.js @@ -1,7 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { DropTarget } from 'react-dnd'; -import html5DragDropContext from '../../../../pages/wiki2/wiki-nav/html5DragDropContext'; const OptionsContainer = ({ inputRef, options }) => { if (!Array.isArray(options) || options.length === 0) return null; @@ -17,8 +15,4 @@ OptionsContainer.propTypes = { options: PropTypes.array }; -const DndOptionsContainer = DropTarget('sfMetadataSingleSelectOption', {}, connect => ({ - connectDropTarget: connect.dropTarget() -}))(OptionsContainer); - -export default html5DragDropContext(DndOptionsContainer); +export default OptionsContainer; diff --git a/frontend/src/pages/wiki2/wiki-nav/html5DragDropContext.js b/frontend/src/pages/wiki2/wiki-nav/html5DragDropContext.js index a9708ef978..7cf93399de 100644 --- a/frontend/src/pages/wiki2/wiki-nav/html5DragDropContext.js +++ b/frontend/src/pages/wiki2/wiki-nav/html5DragDropContext.js @@ -1,4 +1,4 @@ -import { DragDropContext } from 'react-dnd'; -import HTML5Backend from 'react-dnd-html5-backend'; +// import { DragDropContext } from 'react-dnd'; +// import HTML5Backend from 'react-dnd-html5-backend'; -export default DragDropContext(HTML5Backend); +// export default DragDropContext(HTML5Backend); diff --git a/frontend/src/pages/wiki2/wiki-nav/pages/dragged-page-item.js b/frontend/src/pages/wiki2/wiki-nav/pages/dragged-page-item.js index 7410a37358..688dc5f70f 100644 --- a/frontend/src/pages/wiki2/wiki-nav/pages/dragged-page-item.js +++ b/frontend/src/pages/wiki2/wiki-nav/pages/dragged-page-item.js @@ -1,4 +1,4 @@ -import { DragSource, DropTarget } from 'react-dnd'; +import { useDrag, useDrop } from 'react-dnd'; import PageItem from './page-item'; import wikiAPI from '../../../../utils/wiki-api'; import { wikiId, gettext } from '../../../../utils/constants'; @@ -77,6 +77,4 @@ const dropCollect = (connect, monitor) => ({ draggedPage: monitor.getItem() }); -export default DropTarget('WikiNav', dropTarget, dropCollect)( - DragSource('WikiNav', dragSource, dragCollect)(PageItem) -); +export default PageItem; diff --git a/frontend/src/pages/wiki2/wiki-nav/wiki-nav.js b/frontend/src/pages/wiki2/wiki-nav/wiki-nav.js index f835a38a4c..c70164b3eb 100644 --- a/frontend/src/pages/wiki2/wiki-nav/wiki-nav.js +++ b/frontend/src/pages/wiki2/wiki-nav/wiki-nav.js @@ -2,8 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { UncontrolledTooltip } from 'reactstrap'; -import { DropTarget, DragLayer } from 'react-dnd'; -import html5DragDropContext from './html5DragDropContext'; +import { useDragLayer, useDrop } from 'react-dnd'; import DraggedPageItem from './pages/dragged-page-item'; import { gettext, wikiPermission } from '../../../utils/constants'; import { Utils } from '../../../utils/utils'; @@ -158,14 +157,14 @@ class WikiNav extends Component { }; render() { - const StructureBody = html5DragDropContext( - DropTarget('WikiNav', {}, connect => ({ - connectDropTarget: connect.dropTarget() - }))(DragLayer(this.collect)(this.renderStructureBody)) - ); + // const StructureBody = html5DragDropContext( + // DropTarget('WikiNav', {}, connect => ({ + // connectDropTarget: connect.dropTarget() + // }))(DragLayer(this.collect)(this.renderStructureBody)) + // ); return (
- + {this.renderStructureBody()}
); }