2024-06-21 19:49:13 +03:00

188 lines
6.6 KiB
JavaScript

import _extends from "@babel/runtime/helpers/esm/extends";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import * as React from 'react';
import { populateInstance, getNextNode, getFirstNode, getLastNode } from '../../useTreeView/useTreeView.utils';
import { findOrderInTremauxTree } from './useTreeViewSelection.utils';
export var useTreeViewSelection = function useTreeViewSelection(_ref) {
var instance = _ref.instance,
params = _ref.params,
models = _ref.models;
var lastSelectedNode = React.useRef(null);
var lastSelectionWasRange = React.useRef(false);
var currentRangeSelection = React.useRef([]);
var isNodeSelected = function isNodeSelected(nodeId) {
return Array.isArray(models.selected.value) ? models.selected.value.indexOf(nodeId) !== -1 : models.selected.value === nodeId;
};
var selectNode = function selectNode(event, nodeId) {
var multiple = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
if (params.disableSelection) {
return;
}
if (multiple) {
if (Array.isArray(models.selected.value)) {
var newSelected;
if (models.selected.value.indexOf(nodeId) !== -1) {
newSelected = models.selected.value.filter(function (id) {
return id !== nodeId;
});
} else {
newSelected = [nodeId].concat(models.selected.value);
}
if (params.onNodeSelect) {
params.onNodeSelect(event, newSelected);
}
models.selected.setValue(newSelected);
}
} else {
var _newSelected = params.multiSelect ? [nodeId] : nodeId;
if (params.onNodeSelect) {
params.onNodeSelect(event, _newSelected);
}
models.selected.setValue(_newSelected);
}
lastSelectedNode.current = nodeId;
lastSelectionWasRange.current = false;
currentRangeSelection.current = [];
};
var getNodesInRange = function getNodesInRange(nodeAId, nodeBId) {
var _findOrderInTremauxTr = findOrderInTremauxTree(instance, nodeAId, nodeBId),
_findOrderInTremauxTr2 = _slicedToArray(_findOrderInTremauxTr, 2),
first = _findOrderInTremauxTr2[0],
last = _findOrderInTremauxTr2[1];
var nodes = [first];
var current = first;
while (current !== last) {
current = getNextNode(instance, current);
nodes.push(current);
}
return nodes;
};
var handleRangeArrowSelect = function handleRangeArrowSelect(event, nodes) {
var base = models.selected.value.slice();
var start = nodes.start,
next = nodes.next,
current = nodes.current;
if (!next || !current) {
return;
}
if (currentRangeSelection.current.indexOf(current) === -1) {
currentRangeSelection.current = [];
}
if (lastSelectionWasRange.current) {
if (currentRangeSelection.current.indexOf(next) !== -1) {
base = base.filter(function (id) {
return id === start || id !== current;
});
currentRangeSelection.current = currentRangeSelection.current.filter(function (id) {
return id === start || id !== current;
});
} else {
base.push(next);
currentRangeSelection.current.push(next);
}
} else {
base.push(next);
currentRangeSelection.current.push(current, next);
}
if (params.onNodeSelect) {
params.onNodeSelect(event, base);
}
models.selected.setValue(base);
};
var handleRangeSelect = function handleRangeSelect(event, nodes) {
var base = models.selected.value.slice();
var start = nodes.start,
end = nodes.end;
// If last selection was a range selection ignore nodes that were selected.
if (lastSelectionWasRange.current) {
base = base.filter(function (id) {
return currentRangeSelection.current.indexOf(id) === -1;
});
}
var range = getNodesInRange(start, end);
range = range.filter(function (node) {
return !instance.isNodeDisabled(node);
});
currentRangeSelection.current = range;
var newSelected = base.concat(range);
newSelected = newSelected.filter(function (id, i) {
return newSelected.indexOf(id) === i;
});
if (params.onNodeSelect) {
params.onNodeSelect(event, newSelected);
}
models.selected.setValue(newSelected);
};
var selectRange = function selectRange(event, nodes) {
var stacked = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
if (params.disableSelection) {
return;
}
var _nodes$start = nodes.start,
start = _nodes$start === void 0 ? lastSelectedNode.current : _nodes$start,
end = nodes.end,
current = nodes.current;
if (stacked) {
handleRangeArrowSelect(event, {
start: start,
next: end,
current: current
});
} else if (start != null && end != null) {
handleRangeSelect(event, {
start: start,
end: end
});
}
lastSelectionWasRange.current = true;
};
var rangeSelectToFirst = function rangeSelectToFirst(event, nodeId) {
if (!lastSelectedNode.current) {
lastSelectedNode.current = nodeId;
}
var start = lastSelectionWasRange.current ? lastSelectedNode.current : nodeId;
instance.selectRange(event, {
start: start,
end: getFirstNode(instance)
});
};
var rangeSelectToLast = function rangeSelectToLast(event, nodeId) {
if (!lastSelectedNode.current) {
lastSelectedNode.current = nodeId;
}
var start = lastSelectionWasRange.current ? lastSelectedNode.current : nodeId;
instance.selectRange(event, {
start: start,
end: getLastNode(instance)
});
};
populateInstance(instance, {
isNodeSelected: isNodeSelected,
selectNode: selectNode,
selectRange: selectRange,
rangeSelectToLast: rangeSelectToLast,
rangeSelectToFirst: rangeSelectToFirst
});
return {
getRootProps: function getRootProps() {
return {
'aria-multiselectable': params.multiSelect
};
}
};
};
useTreeViewSelection.models = {
selected: {
controlledProp: 'selected',
defaultProp: 'defaultSelected'
}
};
var DEFAULT_SELECTED = [];
useTreeViewSelection.getDefaultizedParams = function (params) {
var _params$disableSelect, _params$multiSelect, _params$defaultSelect;
return _extends({}, params, {
disableSelection: (_params$disableSelect = params.disableSelection) != null ? _params$disableSelect : false,
multiSelect: (_params$multiSelect = params.multiSelect) != null ? _params$multiSelect : false,
defaultSelected: (_params$defaultSelect = params.defaultSelected) != null ? _params$defaultSelect : params.multiSelect ? DEFAULT_SELECTED : null
});
};