@mantine/dates
Version:
Calendars, date and time pickers based on Mantine components
157 lines (155 loc) • 3.93 kB
JavaScript
'use client';
function getNextIndex({ direction, levelIndex, rowIndex, cellIndex, size }) {
switch (direction) {
case "up":
if (levelIndex === 0 && rowIndex === 0) {
return null;
}
if (rowIndex === 0) {
return {
levelIndex: levelIndex - 1,
rowIndex: cellIndex <= size[levelIndex - 1][size[levelIndex - 1].length - 1] - 1 ? size[levelIndex - 1].length - 1 : size[levelIndex - 1].length - 2,
cellIndex
};
}
return {
levelIndex,
rowIndex: rowIndex - 1,
cellIndex
};
case "down":
if (rowIndex === size[levelIndex].length - 1) {
return {
levelIndex: levelIndex + 1,
rowIndex: 0,
cellIndex
};
}
if (rowIndex === size[levelIndex].length - 2 && cellIndex >= size[levelIndex][size[levelIndex].length - 1]) {
return {
levelIndex: levelIndex + 1,
rowIndex: 0,
cellIndex
};
}
return {
levelIndex,
rowIndex: rowIndex + 1,
cellIndex
};
case "left":
if (levelIndex === 0 && rowIndex === 0 && cellIndex === 0) {
return null;
}
if (rowIndex === 0 && cellIndex === 0) {
return {
levelIndex: levelIndex - 1,
rowIndex: size[levelIndex - 1].length - 1,
cellIndex: size[levelIndex - 1][size[levelIndex - 1].length - 1] - 1
};
}
if (cellIndex === 0) {
return {
levelIndex,
rowIndex: rowIndex - 1,
cellIndex: size[levelIndex][rowIndex - 1] - 1
};
}
return {
levelIndex,
rowIndex,
cellIndex: cellIndex - 1
};
case "right":
if (rowIndex === size[levelIndex].length - 1 && cellIndex === size[levelIndex][rowIndex] - 1) {
return {
levelIndex: levelIndex + 1,
rowIndex: 0,
cellIndex: 0
};
}
if (cellIndex === size[levelIndex][rowIndex] - 1) {
return {
levelIndex,
rowIndex: rowIndex + 1,
cellIndex: 0
};
}
return {
levelIndex,
rowIndex,
cellIndex: cellIndex + 1
};
default:
return { levelIndex, rowIndex, cellIndex };
}
}
function focusOnNextFocusableControl({
controlsRef,
direction,
levelIndex,
rowIndex,
cellIndex,
size
}) {
const nextIndex = getNextIndex({ direction, size, rowIndex, cellIndex, levelIndex });
if (!nextIndex) {
return;
}
const controlToFocus = controlsRef.current?.[nextIndex.levelIndex]?.[nextIndex.rowIndex]?.[nextIndex.cellIndex];
if (!controlToFocus) {
return;
}
if (controlToFocus.disabled || controlToFocus.getAttribute("data-hidden") || controlToFocus.getAttribute("data-outside")) {
focusOnNextFocusableControl({
controlsRef,
direction,
levelIndex: nextIndex.levelIndex,
cellIndex: nextIndex.cellIndex,
rowIndex: nextIndex.rowIndex,
size
});
} else {
controlToFocus.focus();
}
}
function getDirection(key) {
switch (key) {
case "ArrowDown":
return "down";
case "ArrowUp":
return "up";
case "ArrowRight":
return "right";
case "ArrowLeft":
return "left";
default:
return null;
}
}
function getControlsSize(controlsRef) {
return controlsRef.current?.map((column) => column.map((row) => row.length));
}
function handleControlKeyDown({
controlsRef,
levelIndex,
rowIndex,
cellIndex,
event
}) {
const direction = getDirection(event.key);
if (direction) {
event.preventDefault();
const size = getControlsSize(controlsRef);
focusOnNextFocusableControl({
controlsRef,
direction,
levelIndex,
rowIndex,
cellIndex,
size
});
}
}
export { handleControlKeyDown };
//# sourceMappingURL=handle-control-key-down.mjs.map