UNPKG

wix-style-react

Version:
331 lines (272 loc) • 11.1 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray"; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } export var VerticalMovementDirection = { top: -1, bottom: 1 }; export var generateUniqueGroupId = function generateUniqueGroupId() { if (process.env.NODE_ENV === 'test') { return 'test_id'; } return Symbol('nestable-list-id'); }; export var getDepth = function getDepth(item, childrenProperty) { // returns depth of item and children var depth = 0; if (item[childrenProperty]) { item[childrenProperty].forEach(function (d) { var tmpDepth = getDepth(d, childrenProperty); if (tmpDepth > depth) { depth = tmpDepth; } }); } return depth + 1; }; export var getValuesByKey = function getValuesByKey(data, key, childrenProp) { var values = [data[key]]; if (data[childrenProp]) { data[childrenProp].forEach(function (item) { values.push.apply(values, _toConsumableArray(getValuesByKey(item, key, childrenProp))); }); } return values; }; // this method mutates an array export var removeFromTree = function removeFromTree(items, position) { var childrenProperty = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'children'; var lastIndex = position.length - 1; var itemsRemoveCandidate = items; position.forEach(function (pos, index) { if (index === lastIndex) { itemsRemoveCandidate.splice(pos, 1)[0]; // eslint-disable-line no-unused-expressions } else { itemsRemoveCandidate = itemsRemoveCandidate[pos][childrenProperty]; } }); return items; }; // this methods mutates an array export var addToTree = function addToTree(items, item, position) { var childrenProperty = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'children'; var lastIndex = position.length - 1; var itemsAddCandidate = items; position.forEach(function (pos, index) { if (index === lastIndex) { itemsAddCandidate.splice(pos, 0, item); // eslint-disable-line no-unused-expressions } else { if (itemsAddCandidate[pos] && !itemsAddCandidate[pos][childrenProperty]) { itemsAddCandidate[pos][childrenProperty] = []; } itemsAddCandidate = itemsAddCandidate[pos][childrenProperty]; } }); return items; }; export function swapItems(items, firstItem, secondItem) { var childProp = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'children'; return recursiveMap(items, function (item) { if (item.id === firstItem.id) { return secondItem; } if (item.id === secondItem.id) { return firstItem; } return item; }, childProp); } export function getSiblingsByNodePosition(items) { var position = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var childProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'children'; return position.reduce(function (siblings, pos, i) { if (siblings && siblings[pos]) { if (position.length - 1 === i) { return siblings; } return siblings[pos][childProp]; } return null; }, items); } export function getNodeAtPosition(items) { var position = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var childProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'children'; return position.reduce(function (siblings, pos, i) { if (siblings[pos]) { if (position.length - 1 === i) { return siblings[pos]; } return siblings[pos][childProp]; } return null; }, items); } export function getNodePosition(items, item) { var childProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'children'; var position = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; if (!items) { return; } for (var i = 0; i < items.length; i++) { var currentPosition = [].concat(_toConsumableArray(position), [i]); if (item.id === items[i].id) { return currentPosition; } var nodePosition = getNodePosition(items[i][childProp], item, childProp, currentPosition); if (nodePosition) { return nodePosition; } } } export function recursiveMap(items, predicateFn) { var childProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'children'; return items.map(function (currentItem) { var item = predicateFn(currentItem); if (item !== currentItem) { return item; } if (currentItem[childProp]) { return _objectSpread(_objectSpread({}, currentItem), {}, { children: recursiveMap(currentItem[childProp], predicateFn) }); } return currentItem; }); } export function isLastItem(siblings, item) { return siblings && siblings[siblings.length - 1] === item; } export function isFistItem(siblings, item) { return siblings && siblings[0] === item; } export function isRootItem(depth) { return depth === 1; } export function hoverAboveItself(prevPosition, nextPosition) { return prevPosition.every(function (position, index) { return nextPosition[index] === position; }); } export function isItemHasChildren(item, childrenProperty) { return Boolean(item[childrenProperty] && item[childrenProperty].length); } export function getDropParent(items, nextPosition, childrenProperty) { return nextPosition.slice(1, nextPosition.length - 1).reduce(function (item, childIndex) { if (!item) { return null; } return item[childrenProperty][childIndex]; }, items[nextPosition[0]]); } export function moveItem(items, item, currentPosition, newPosition) { var childrenProp = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'children'; var newItems = _toConsumableArray(items); removeFromTree(newItems, currentPosition, childrenProp); addToTree(newItems, item, newPosition, childrenProp); return newItems; } export function moveItemToTheChildOfPrevSibling(items, item) { var childrenProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'children'; var currentPosition = getNodePosition(items, item, childrenProp); // if there is not prev sibling we cannot move if (currentPosition[currentPosition.length - 1] === 0) { return items; } var newPosition = currentPosition.reduce(function (acc, pos, index, arr) { if (index === arr.length - 1) { acc.push(pos - 1); acc.push(0); } else { acc.push(pos); } return acc; }, []); return moveItem(items, item, currentPosition, newPosition); } function getVerticalMovedPosition(items, position, step) { var childProp = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'children'; var suitableNextParent = _toConsumableArray(position).reverse().reduce(function (acc, pos, index) { if (acc) { return acc; } var prefix = position.slice(0, position.length - 1 - index); var siblings = getSiblingsByNodePosition(items, position.slice(0, position.length - index), childProp); for (var i = pos + step; i >= 0 && i < siblings.length; i += step) { var candidate = [].concat(_toConsumableArray(prefix), [i]); var candidateSiblings = getSiblingsByNodePosition(items, candidate, childProp); if (!candidateSiblings) { return null; } var totalDepth = getDepth(getNodeAtPosition(items, candidate, childProp), childProp) + position.length - index; if (totalDepth >= position.length) { return candidate; } } return acc; }, null); if (!suitableNextParent) { return null; } if (position.length === suitableNextParent.length) { return suitableNextParent; } return position.reduce(function (acc, _, index) { var lastItem = index === position.length - 1; if (suitableNextParent[index] !== undefined) { acc.push(suitableNextParent[index]); } else { var siblings = getSiblingsByNodePosition(items, [].concat(_toConsumableArray(acc), [0]), childProp); if (!siblings) { acc.push(0); return acc; } var maxIndex = lastItem ? siblings.length : siblings.length - 1; var candidateIndex = step < 0 ? maxIndex : 0; while (candidateIndex >= 0 && candidateIndex <= maxIndex) { var candidate = [].concat(_toConsumableArray(acc), [candidateIndex]); if (lastItem) { return candidate; } var candidateDepth = getDepth(getNodeAtPosition(items, candidate, childProp), childProp) + index; if (candidateDepth < position.length - 1) { candidateIndex += step; continue; } return candidate; } } return acc; }, []); } function getParentPosition(position) { return position.slice(0, position.length - 1); } export function moveItemVertically(items, item) { var step = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : VerticalMovementDirection.bottom; var childProp = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'children'; var currentPosition = getNodePosition(items, item, childProp); var newPosition = getVerticalMovedPosition(items, currentPosition, step, childProp); if (newPosition) { return moveItem(items, item, currentPosition, newPosition, childProp); } return items; } export function moveItemOutsideOfTheParent(items, item) { var childProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'children'; var currentPosition = getNodePosition(items, item, childProp); // if currentPosition is root of the tree we cannot move item to the left if (currentPosition.length < 2) { return items; } var newPosition = getParentPosition(currentPosition); newPosition[newPosition.length - 1] = newPosition[newPosition.length - 1] + 1; return moveItem(items, item, currentPosition, newPosition); } export function setCollapse(items, itemId, isCollapsed) { return recursiveMap(items, function (item) { if (itemId === item.id) { return _objectSpread(_objectSpread({}, item), {}, { isCollapsed: isCollapsed }); } return item; }); }