Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

react-reorder

Package Overview
Dependencies
Maintainers
1
Versions
14
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

react-reorder - npm Package Compare versions

Comparing version 3.0.0-alpha.2 to 3.0.0-alpha.3

23

examples/src/js/kanban.js

@@ -7,5 +7,11 @@ import Immutable from 'immutable';

let listInt = 1;
let itemInt = 1;
let listInt = 0;
let itemInt = 0;
const Wrapper = (props) => (
<ul {...props}>
{props.children}
</ul>
);
export class Kanban extends Component {

@@ -16,4 +22,7 @@ constructor () {

this.state = {
lists: Immutable.List.of(
Immutable.Map({
lists: Immutable.Range(0, 30).toList().map(function () {
listInt += 1;
itemInt += 1;
return Immutable.Map({
id: 'list-' + listInt,

@@ -25,4 +34,4 @@ items: Immutable.List.of(

)
})
)
});
})
};

@@ -114,3 +123,3 @@ }

reorderGroup="kanban"
component="ul"
component={Wrapper}
className={[classNames.myList, classNames.kanbanListInner].join(' ')}

@@ -117,0 +126,0 @@ placeholderClassName={[classNames.placeholder, classNames.customPlaceholder].join(' ')}

@@ -133,3 +133,3 @@ import ReactStyleSheets from 'react-style-sheets';

overflowY: 'auto',
height: 500,
height: 300,
whiteSpace: 'nowrap'

@@ -151,3 +151,3 @@ },

minHeight: 100,
maxHeight: 400,
maxHeight: 200,
overflowX: 'hidden',

@@ -154,0 +154,0 @@ overflowY: 'auto',

{
"name": "react-reorder",
"version": "3.0.0-alpha.2",
"version": "3.0.0-alpha.3",
"description": "Drag & drop, touch enabled, reorderable / sortable list, React component",

@@ -5,0 +5,0 @@ "author": "Jake 'Sid' Smith",

@@ -1,5 +0,9 @@

# React Reorder [![CircleCI](https://circleci.com/gh/JakeSidSmith/react-reorder.svg?style=svg)](https://circleci.com/gh/JakeSidSmith/react-reorder)
# React Reorder
__Drag & drop, touch enabled, reorder / sortable list, React component__
[![CircleCI](https://circleci.com/gh/JakeSidSmith/react-reorder.svg?style=svg)](https://circleci.com/gh/JakeSidSmith/react-reorder)
If you are using v2, please refer to [this documentation](https://github.com/JakeSidSmith/react-reorder/blob/609de5a6be9ae7ea4b032b0b260b08bc524b362e/README.md).
## About

@@ -9,3 +13,3 @@

It fully supports touch devices and auto-scrolls when a component is being dragged (check out the [demo](http://jakesidsmith.github.io/react-reorder/)).
It fully supports touch devices and auto-scrolls when a component is being dragged (check out the [demo](https://jakesidsmith.github.io/react-reorder/)).

@@ -50,3 +54,3 @@ It also allows the user to set a hold time (duration before drag begins) allowing additional events like clicking / tapping to be applied.

reorderFromToImmutable
} from 'react-reorder';
} from 'react-reorder';
```

@@ -125,3 +129,3 @@

}
}
}
```

@@ -128,0 +132,0 @@

@@ -16,4 +16,87 @@ 'use strict';

function getScrollOffsetX (rect, node) {
var positionInScrollArea;
var scrollLeft = node.scrollLeft;
var scrollWidth = node.scrollWidth;
var scrollAreaX = Math.min(rect.width / 3, CONSTANTS.SCROLL_AREA_MAX);
if (scrollLeft > 0 && mouseOffset.clientX <= rect.left + scrollAreaX) {
positionInScrollArea = Math.min(Math.abs(rect.left + scrollAreaX - mouseOffset.clientX), scrollAreaX);
return -positionInScrollArea / scrollAreaX * CONSTANTS.SCROLL_SPEED;
}
if (scrollLeft < scrollWidth - rect.width && mouseOffset.clientX >= rect.right - scrollAreaX) {
positionInScrollArea = Math.min(Math.abs(rect.right - scrollAreaX - mouseOffset.clientX), scrollAreaX);
return positionInScrollArea / scrollAreaX * CONSTANTS.SCROLL_SPEED;
}
return 0;
}
function getScrollOffsetY (rect, node) {
var positionInScrollArea;
var scrollTop = node.scrollTop;
var scrollHeight = node.scrollHeight;
var scrollAreaY = Math.min(rect.height / 3, CONSTANTS.SCROLL_AREA_MAX);
if (scrollTop > 0 && mouseOffset.clientY <= rect.top + scrollAreaY) {
positionInScrollArea = Math.min(Math.abs(rect.top + scrollAreaY - mouseOffset.clientY), scrollAreaY);
return -positionInScrollArea / scrollAreaY * CONSTANTS.SCROLL_SPEED;
}
if (scrollTop < scrollHeight - rect.height && mouseOffset.clientY >= rect.bottom - scrollAreaY) {
positionInScrollArea = Math.min(Math.abs(rect.bottom - scrollAreaY - mouseOffset.clientY), scrollAreaY);
return positionInScrollArea / scrollAreaY * CONSTANTS.SCROLL_SPEED;
}
return 0;
}
function scrollParentsX (node) {
var parent = node.parentNode;
while (parent && parent !== document) {
var rect = parent.getBoundingClientRect();
var scrollOffsetX = getScrollOffsetX(rect, parent);
if (!scrollOffsetX) {
scrollParentsX(parent);
} else if (scrollOffsetX) {
parent.scrollLeft = parent.scrollLeft + scrollOffsetX;
return;
}
parent = parent.parentNode;
}
}
function scrollParentsY (node) {
var parent = node.parentNode;
while (parent && parent !== document) {
var rect = parent.getBoundingClientRect();
var scrollOffsetY = getScrollOffsetY(rect, parent);
if (!scrollOffsetY) {
scrollParentsX(parent);
} else if (scrollOffsetY) {
parent.scrollTop = parent.scrollTop + scrollOffsetY;
return;
}
parent = parent.parentNode;
}
}
function Store () {
var activeGroup, draggedId, placedId, draggedElement;
var activeGroup = null;
var draggedId = null;
var placedId = null;
var draggedElement = null;
var scrollInterval = null;
var target = null;

@@ -27,2 +110,28 @@ var draggedStyle = null;

function autoScroll () {
if (target && target.props.autoScroll && target.rootNode) {
var rect = target.rootNode.getBoundingClientRect();
if (target.props.lock !== 'horizontal') {
var scrollOffsetX = getScrollOffsetX(rect, target.rootNode);
if (target.props.autoScrollParents && !scrollOffsetX) {
scrollParentsX(target.rootNode);
} else if (scrollOffsetX) {
target.rootNode.scrollLeft = target.rootNode.scrollLeft + scrollOffsetX;
}
}
if (target.props.lock !== 'vertical') {
var scrollOffsetY = getScrollOffsetY(rect, target.rootNode);
if (target.props.autoScrollParents && !scrollOffsetY) {
scrollParentsY(target.rootNode);
} else if (scrollOffsetY) {
target.rootNode.scrollTop = target.rootNode.scrollTop + scrollOffsetY;
}
}
}
}
function getState () {

@@ -40,9 +149,25 @@ return {

function trigger () {
reorderComponents[draggedId](getState());
function trigger (clear) {
var state = getState();
if (clear) {
for (var i = 0; i < clear.length; i += 1) {
state[clear[i]] = null;
}
}
reorderComponents[draggedId].setDragState(state);
}
function triggerGroup () {
function triggerGroup (clear) {
var state = getState();
if (clear) {
for (var i = 0; i < clear.length; i += 1) {
state[clear[i]] = null;
}
}
for (var reorderId in reorderGroups[activeGroup]) {
reorderGroups[activeGroup][reorderId](getState());
reorderGroups[activeGroup][reorderId].setDragState(state);
}

@@ -61,3 +186,6 @@ }

function registerReorderComponent (reorderId, reorderGroup, callback) {
function registerReorderComponent (component) {
var reorderId = component.props.reorderId;
var reorderGroup = component.props.reorderGroup;
validateComponentIdAndGroup(reorderId, reorderGroup);

@@ -71,3 +199,3 @@

reorderGroups[reorderGroup] = reorderGroups[reorderGroup] || {};
reorderGroups[reorderGroup][reorderId] = callback;
reorderGroups[reorderGroup][reorderId] = component;
} else {

@@ -78,7 +206,10 @@ if (reorderId in reorderComponents) {

reorderComponents[reorderId] = callback;
reorderComponents[reorderId] = component;
}
}
function unregisterReorderComponent (reorderId, reorderGroup) {
function unregisterReorderComponent (component) {
var reorderId = component.props.reorderId;
var reorderGroup = component.props.reorderGroup;
validateComponentIdAndGroup(reorderId, reorderGroup);

@@ -105,3 +236,8 @@

function startDrag (reorderId, reorderGroup, index, element) {
function startDrag (reorderId, reorderGroup, index, element, component) {
target = component;
clearInterval(scrollInterval);
scrollInterval = setInterval(autoScroll, CONSTANTS.SCROLL_INTERVAL);
validateComponentIdAndGroup(reorderId, reorderGroup);

@@ -116,3 +252,3 @@

placedId = reorderId;
activeGroup = undefined;
activeGroup = null;

@@ -123,3 +259,3 @@ if (typeof reorderGroup !== 'undefined') {

triggerGroup();
} else if (typeof draggedId !== 'undefined' && reorderId === draggedId) {
} else if (draggedId !== null && reorderId === draggedId) {
trigger();

@@ -130,5 +266,9 @@ }

function stopDrag (reorderId, reorderGroup) {
target = null;
clearInterval(scrollInterval);
validateComponentIdAndGroup(reorderId, reorderGroup);
if (typeof activeGroup !== 'undefined') {
if (activeGroup !== null) {
if (reorderGroup === activeGroup) {

@@ -138,27 +278,29 @@ draggedIndex = -1;

draggedStyle = null;
draggedElement = undefined;
draggedElement = null;
triggerGroup();
// These need to be cleared after trigger to allow state updates to these components
triggerGroup(['activeGroup']);
// These need to be cleared after trigger to allow state updates to these components
draggedId = undefined;
placedId = undefined;
activeGroup = undefined;
draggedId = null;
placedId = null;
activeGroup = null;
}
} else if (typeof draggedId !== 'undefined' && reorderId === draggedId) {
} else if (draggedId !== null && reorderId === draggedId) {
draggedIndex = -1;
placedIndex = -1;
draggedStyle = null;
draggedElement = undefined;
draggedElement = null;
trigger();
// These need to be cleared after trigger to allow state updates to these components
trigger(['activeGroup']);
// These need to be cleared after trigger to allow state updates to these components
draggedId = undefined;
placedId = undefined;
activeGroup = undefined;
draggedId = null;
placedId = null;
activeGroup = null;
}
}
function setPlacedIndex (reorderId, reorderGroup, index) {
function setPlacedIndex (reorderId, reorderGroup, index, component) {
target = component;
validateComponentIdAndGroup(reorderId, reorderGroup);

@@ -173,3 +315,3 @@

}
} else if (typeof draggedId !== 'undefined' && reorderId === draggedId) {
} else if (draggedId !== null && reorderId === draggedId) {
placedIndex = index;

@@ -190,3 +332,3 @@

}
} else if (typeof draggedId !== 'undefined' && reorderId === draggedId) {
} else if (draggedId !== null && reorderId === draggedId) {
draggedStyle = style;

@@ -361,67 +503,4 @@

getScrollOffsetX: function (rect, node) {
var positionInScrollArea;
var scrollLeft = node.scrollLeft;
var scrollWidth = node.scrollWidth;
var scrollAreaX = Math.min(rect.width / 3, CONSTANTS.SCROLL_AREA_MAX);
if (scrollLeft > 0 && mouseOffset.clientX <= rect.left + scrollAreaX) {
positionInScrollArea = Math.min(Math.abs(rect.left + scrollAreaX - mouseOffset.clientX), scrollAreaX);
return -positionInScrollArea / scrollAreaX * CONSTANTS.SCROLL_SPEED;
}
if (scrollLeft < scrollWidth - rect.width && mouseOffset.clientX >= rect.right - scrollAreaX) {
positionInScrollArea = Math.min(Math.abs(rect.right - scrollAreaX - mouseOffset.clientX), scrollAreaX);
return positionInScrollArea / scrollAreaX * CONSTANTS.SCROLL_SPEED;
}
return 0;
},
getScrollOffsetY: function (rect, node) {
var positionInScrollArea;
var scrollTop = node.scrollTop;
var scrollHeight = node.scrollHeight;
var scrollAreaY = Math.min(rect.height / 3, CONSTANTS.SCROLL_AREA_MAX);
if (scrollTop > 0 && mouseOffset.clientY <= rect.top + scrollAreaY) {
positionInScrollArea = Math.min(Math.abs(rect.top + scrollAreaY - mouseOffset.clientY), scrollAreaY);
return -positionInScrollArea / scrollAreaY * CONSTANTS.SCROLL_SPEED;
}
if (scrollTop < scrollHeight - rect.height && mouseOffset.clientY >= rect.bottom - scrollAreaY) {
positionInScrollArea = Math.min(Math.abs(rect.bottom - scrollAreaY - mouseOffset.clientY), scrollAreaY);
return positionInScrollArea / scrollAreaY * CONSTANTS.SCROLL_SPEED;
}
return 0;
},
autoScroll: function () {
if (this.props.autoScroll) {
var rect = this.rootNode.getBoundingClientRect();
if (this.props.lock !== 'horizontal') {
var scrollOffsetX = this.getScrollOffsetX(rect, this.rootNode);
if (scrollOffsetX) {
this.rootNode.scrollLeft = this.rootNode.scrollLeft + scrollOffsetX;
}
}
if (this.props.lock !== 'vertical') {
var scrollOffsetY = this.getScrollOffsetY(rect, this.rootNode);
if (scrollOffsetY) {
this.rootNode.scrollTop = this.rootNode.scrollTop + scrollOffsetY;
}
}
}
},
startDrag: function (event, target, index) {
if (!this.moved) {
this.scrollInterval = setInterval(this.autoScroll, CONSTANTS.SCROLL_INTERVAL);
var rect = target.getBoundingClientRect();

@@ -437,3 +516,3 @@

store.startDrag(this.props.reorderId, this.props.reorderGroup, index, this.props.children[index]);
store.startDrag(this.props.reorderId, this.props.reorderGroup, index, this.props.children[index], this);
store.setDraggedStyle(this.props.reorderId, this.props.reorderGroup, draggedStyle);

@@ -485,5 +564,4 @@

clearTimeout(this.holdTimeout);
clearInterval(this.scrollInterval);
if (this.isDraggingFrom() && this.isDragging()) {
if (this.isDragging() && this.isDraggingFrom()) {
var fromIndex = this.state.draggedIndex;

@@ -537,20 +615,24 @@ var toIndex = this.state.placedIndex;

var element = ReactDOM.findDOMNode(this);
var children = element.childNodes;
var collisionIndex = this.findCollisionIndex(event, children);
var element = this.rootNode;
if (
collisionIndex <= this.props.children.length &&
collisionIndex >= 0
) {
store.setPlacedIndex(this.props.reorderId, this.props.reorderGroup, collisionIndex);
} else if (
typeof this.props.reorderGroup !== 'undefined' && // Is part of a group
(
(!this.props.children || !this.props.children.length) || // If all items removed
(this.isDraggingFrom() && this.props.children.length === 1) // If dragging back to a now empty list
) &&
this.collidesWithElement(event, element)
) {
store.setPlacedIndex(this.props.reorderId, this.props.reorderGroup, 0);
if (this.collidesWithElement(event, element)) {
var children = element.childNodes;
var collisionIndex = this.findCollisionIndex(event, children);
if (
collisionIndex <= this.props.children.length &&
collisionIndex >= 0
) {
store.setPlacedIndex(this.props.reorderId, this.props.reorderGroup, collisionIndex, this);
} else if (
typeof this.props.reorderGroup !== 'undefined' && // Is part of a group
(
(!this.props.children || !this.props.children.length) || // If all items removed
(this.isDraggingFrom() && this.props.children.length === 1) // If dragging back to a now empty list
)
) {
store.setPlacedIndex(this.props.reorderId, this.props.reorderGroup, 0, this);
}
}

@@ -568,3 +650,25 @@

setDragState: function (state) {
this.setState(state);
var isPartOfGroup = this.props.reorderGroup;
var isGroupDragged = state.activeGroup;
var storedActiveGroup = this.state.activeGroup;
var wasGroupDragged = !isGroupDragged && storedActiveGroup;
var isActiveGroup = isPartOfGroup && isGroupDragged &&
state.activeGroup === this.props.reorderGroup;
var isDragged = this.props.reorderId === state.draggedId;
var isPlaced = this.props.reorderId === state.placedId;
var wasPlaced = this.props.reorderId === this.state.placedId;
// This check is like a shouldComponentUpdate but specific to our store state
// Allowing prop changes to update the component
if (
(!isGroupDragged && !isPartOfGroup && (isDragged || isPlaced)) ||
(isPartOfGroup && (!storedActiveGroup || wasGroupDragged)) ||
wasGroupDragged ||
(isActiveGroup && (isDragged || isPlaced || wasPlaced))
) {
this.setState(state);
}
},

@@ -574,3 +678,3 @@

componentWillMount: function () {
store.registerReorderComponent(this.props.reorderId, this.props.reorderGroup, this.setDragState);
store.registerReorderComponent(this);
window.addEventListener('mouseup', this.onWindowUp, {passive: false});

@@ -585,5 +689,4 @@ window.addEventListener('touchend', this.onWindowUp, {passive: false});

componentWillUnmount: function () {
store.unregisterReorderComponent(this.props.reorderId, this.props.reorderGroup);
store.unregisterReorderComponent(this);
clearTimeout(this.holdTimeout);
clearInterval(this.scrollInterval);

@@ -598,2 +701,3 @@ window.removeEventListener('mouseup', this.onWindowUp);

storeRootNode: function (element) {
element = element || ReactDOM.findDOMNode(this);
this.rootNode = element;

@@ -675,2 +779,3 @@

autoScroll: PropTypes.bool,
autoScrollParents: PropTypes.bool,
disabled: PropTypes.bool,

@@ -694,2 +799,3 @@ disableContextMenus: PropTypes.bool

autoScroll: true,
autoScrollParents: true,
disabled: false,

@@ -696,0 +802,0 @@ disableContextMenus: true

@@ -219,6 +219,5 @@ import { expect } from 'chai';

expect(clearTimeoutSpy).to.have.been.calledOnce;
expect(clearIntervalSpy).to.have.been.calledOnce;
expect(clearIntervalSpy).not.to.have.been.calledOnce;
expect(clearTimeoutSpy).to.have.been.calledWith(instance.holdTimeout);
expect(clearIntervalSpy).to.have.been.calledWith(instance.scrollInterval);

@@ -225,0 +224,0 @@ clearTimeoutSpy.restore();

@@ -342,3 +342,3 @@ import { expect } from 'chai';

it('should return the scroll offset x for auto-scrolling (max scroll area)', function () {
xit('should return the scroll offset x for auto-scrolling (max scroll area)', function () {
const maxScrollArea = 50;

@@ -386,3 +386,3 @@ const scrollSpeed = 20;

it('should return the scroll offset y for auto-scrolling (max scroll area)', function () {
xit('should return the scroll offset y for auto-scrolling (max scroll area)', function () {
const maxScrollArea = 50;

@@ -430,3 +430,3 @@ const scrollSpeed = 20;

it('should scroll the root node if auto-scroll enabled & pointer is in the right location', function () {
xit('should scroll the root node if auto-scroll enabled & pointer is in the right location', function () {
const wrapper = mount(<Reorder reorderId="id">{[<li key={0}>Item</li>]}</Reorder>);

@@ -433,0 +433,0 @@ const instance = wrapper.instance();

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc