From 34dcab22145ac4853bd665c4a9a9799fe61ca7d2 Mon Sep 17 00:00:00 2001
From: Alexandru Munteanu <alexandru.munteanu@thinslices.com>
Date: Tue, 23 Jan 2018 13:49:13 +0200
Subject: [PATCH] Move SortableList into new components-faraday package

---
 packages/components-faraday/package.json      |  19 +++
 .../src/components/SortableList/README.md     |   0
 .../components/SortableList/SortableList.js   | 132 ++++++++++++++++++
 .../src/components/index.js                   |   1 +
 packages/components-faraday/src/index.js      |   5 +
 packages/components-faraday/webpack.config.js |   3 +
 6 files changed, 160 insertions(+)
 create mode 100644 packages/components-faraday/package.json
 create mode 100644 packages/components-faraday/src/components/SortableList/README.md
 create mode 100644 packages/components-faraday/src/components/SortableList/SortableList.js
 create mode 100644 packages/components-faraday/src/components/index.js
 create mode 100644 packages/components-faraday/src/index.js
 create mode 100644 packages/components-faraday/webpack.config.js

diff --git a/packages/components-faraday/package.json b/packages/components-faraday/package.json
new file mode 100644
index 000000000..3d216b81d
--- /dev/null
+++ b/packages/components-faraday/package.json
@@ -0,0 +1,19 @@
+{
+  "name": "pubsweet-components-faraday",
+  "version": "0.0.1",
+  "main": "src",
+  "license": "MIT",
+  "dependencies": {
+    "@pubsweet/ui": "^0.1.1",
+    "moment": "^2.20.1",
+    "prop-types": "^15.5.10",
+    "react": "^15.6.1",
+    "react-dnd": "^2.5.4",
+    "react-dnd-html5-backend": "^2.5.4",
+    "react-dom": "^15.6.1",
+    "react-router-dom": "^4.2.2",
+    "recompose": "^0.26.0",
+    "redux": "^3.6.0",
+    "redux-form": "^7.0.3"
+  }
+}
diff --git a/packages/components-faraday/src/components/SortableList/README.md b/packages/components-faraday/src/components/SortableList/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/components-faraday/src/components/SortableList/SortableList.js b/packages/components-faraday/src/components/SortableList/SortableList.js
new file mode 100644
index 000000000..0d5066903
--- /dev/null
+++ b/packages/components-faraday/src/components/SortableList/SortableList.js
@@ -0,0 +1,132 @@
+import React from 'react'
+import { compose } from 'recompose'
+import { findDOMNode } from 'react-dom'
+import HTML5Backend from 'react-dnd-html5-backend'
+import { DragSource, DropTarget, DragDropContext } from 'react-dnd'
+
+const itemSource = {
+  beginDrag(props) {
+    return { index: props.index }
+  },
+}
+
+const itemTarget = {
+  hover({ moveItem, index }, monitor, component) {
+    const dragIndex = monitor.getItem().index
+    const hoverIndex = index
+
+    // Don't replace items with themselves
+    if (dragIndex === hoverIndex) {
+      return
+    }
+
+    const hoverBoundingRect = findDOMNode(component).getBoundingClientRect() // eslint-disable-line
+    const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2
+    const clientOffset = monitor.getClientOffset()
+    const hoverClientY = clientOffset.y - hoverBoundingRect.top
+
+    if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) {
+      return
+    }
+
+    if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) {
+      return
+    }
+    if (typeof moveItem === 'function') {
+      moveItem(dragIndex, hoverIndex)
+    }
+    monitor.getItem().index = hoverIndex
+  },
+  drop({ dropItem }) {
+    if (dropItem && typeof dropItem === 'function') dropItem()
+  },
+}
+
+const Item = ({
+  connectDragPreview,
+  connectDragSource,
+  connectDropTarget,
+  listItem,
+  dragHandle,
+  isEditing,
+  ...rest
+}) =>
+  dragHandle
+    ? connectDragPreview(
+        connectDropTarget(
+          <div style={{ flex: 1 }}>
+            {React.createElement(listItem, {
+              ...rest,
+              dragHandle: connectDragSource(
+                <div style={{ display: 'flex' }}>
+                  {React.createElement(dragHandle)}
+                </div>,
+              ),
+            })}
+          </div>,
+        ),
+      )
+    : connectDropTarget(
+        connectDragSource(
+          <div style={{ flex: 1 }}>{React.createElement(listItem, rest)}</div>,
+        ),
+      )
+
+const DecoratedItem = compose(
+  DropTarget('item', itemTarget, (connect, monitor) => ({
+    connectDropTarget: connect.dropTarget(),
+    isOver: monitor.isOver(),
+  })),
+  DragSource('item', itemSource, (connect, monitor) => ({
+    connectDragSource: connect.dragSource(),
+    connectDragPreview: connect.dragPreview(),
+    isDragging: monitor.isDragging(),
+  })),
+)(Item)
+
+const SortableList = ({
+  items,
+  moveItem,
+  listItem,
+  dragHandle,
+  editItem,
+  ...rest
+}) => {
+  console.log('Sortablelist', rest)
+  return (
+    <div>
+      {items.map((item, i) => (
+        <DecoratedItem
+          dragHandle={dragHandle}
+          index={i}
+          isEditing={rest.editedAuthor !== -1}
+          key={item.name || Math.random()}
+          listItem={listItem}
+          moveItem={moveItem}
+          {...item}
+          {...rest}
+        />
+      ))}
+    </div>
+  )
+}
+
+// helper function for sortable lists
+SortableList.moveItem = (items, dragIndex, hoverIndex) => {
+  if (dragIndex <= hoverIndex) {
+    return [
+      ...items.slice(0, dragIndex),
+      items[hoverIndex],
+      items[dragIndex],
+      ...items.slice(hoverIndex + 1),
+    ]
+  }
+  return [
+    ...items.slice(0, hoverIndex),
+    items[dragIndex],
+    items[hoverIndex],
+    ...items.slice(dragIndex + 1),
+  ]
+}
+
+export default DragDropContext(HTML5Backend)(SortableList)
diff --git a/packages/components-faraday/src/components/index.js b/packages/components-faraday/src/components/index.js
new file mode 100644
index 000000000..24c30260c
--- /dev/null
+++ b/packages/components-faraday/src/components/index.js
@@ -0,0 +1 @@
+export { default as SortableList } from './SortableList/SortableList'
diff --git a/packages/components-faraday/src/index.js b/packages/components-faraday/src/index.js
new file mode 100644
index 000000000..8d52f148e
--- /dev/null
+++ b/packages/components-faraday/src/index.js
@@ -0,0 +1,5 @@
+module.exports = {
+  client: {
+    components: [() => require('./components')],
+  },
+}
diff --git a/packages/components-faraday/webpack.config.js b/packages/components-faraday/webpack.config.js
new file mode 100644
index 000000000..4aa149ad2
--- /dev/null
+++ b/packages/components-faraday/webpack.config.js
@@ -0,0 +1,3 @@
+const webpackConfig = require('xpub-styleguide/src/webpack-config')
+
+module.exports = webpackConfig(__dirname)
-- 
GitLab