@progress/kendo-react-listbox
Version:
React ListBox enables you to display a list of items and manage the data between multiple lists. KendoReact ListBox package
161 lines (160 loc) • 5.1 kB
JavaScript
/**
* @license
*-------------------------------------------------------------------------------------------
* Copyright © 2025 Progress Software Corporation. All rights reserved.
* Licensed under commercial license. See LICENSE.md in the package root for more information
*-------------------------------------------------------------------------------------------
*/
import * as n from "react";
import d from "prop-types";
import { Navigation as K, classNames as q, dispatchEvent as O } from "@progress/kendo-react-common";
import { Button as M } from "@progress/kendo-react-buttons";
import { useLocalization as _ } from "@progress/kendo-react-intl";
import { caretAltUpIcon as $, caretAltDownIcon as j, caretAltRightIcon as T, caretAltLeftIcon as A, caretDoubleAltRightIcon as y, caretDoubleAltLeftIcon as D, xIcon as G } from "@progress/kendo-svg-icons";
import { messages as J } from "./messages/index.mjs";
const N = [
{ name: "moveUp", iconName: "caret-alt-up", svgIcon: $ },
{ name: "moveDown", iconName: "caret-alt-down", svgIcon: j },
{ name: "transferTo", iconName: "caret-alt-right", svgIcon: T },
{ name: "transferFrom", iconName: "caret-alt-left", svgIcon: A },
{ name: "transferAllTo", iconName: "caret-double-alt-right", svgIcon: y },
{ name: "transferAllFrom", iconName: "caret-double-alt-left", svgIcon: D },
{ name: "remove", iconName: "x", svgIcon: G }
], F = n.forwardRef((g, L) => {
const {
tools: b,
dir: R,
onToolClick: v,
size: C = u.size,
data: l = u.data,
dataConnected: a = u.dataConnected,
selectedField: E = u.selectedField
} = g, z = _(), h = n.useRef(null), p = n.useRef(null), I = n.useCallback(
() => ({
onToolClick: v,
props: g,
context: {},
state: {},
refs: {}
}),
[]
);
n.useImperativeHandle(p, I), n.useImperativeHandle(
L,
() => p.current
);
const k = (t, e, o) => {
o.preventDefault(), e.focusNext(t);
}, w = (t, e, o) => {
o.preventDefault(), e.focusPrevious(t);
}, m = n.useMemo(
() => new K({
root: h,
selectors: [".k-button:not([disabled])"],
tabIndex: 0,
keyboardEvents: {
keydown: {
ArrowDown: k,
ArrowRight: k,
ArrowUp: w,
ArrowLeft: w,
Enter: (t, e, o) => {
t.click(), e.focusElement(e.current, t);
}
}
}
}),
[]
), S = n.useCallback(m.triggerKeyboardEvent.bind(m), []);
n.useEffect(() => (m.initializeRovingTab(), () => m.removeFocusListener()), []);
const B = (t) => {
switch (t.name) {
case "caret-alt-right":
return A;
case "caret-alt-left":
return T;
case "caret-double-alt-right":
return D;
case "caret-double-alt-left":
return y;
}
return t;
}, P = (t) => {
switch (t) {
case "caret-alt-right":
return "caret-alt-left";
case "caret-alt-left":
return "caret-alt-right";
case "caret-double-alt-right":
return "caret-double-alt-left";
case "caret-double-alt-left":
return "caret-double-alt-right";
}
return t;
}, U = (t, e) => {
O(v, t, I(), { toolName: e });
}, H = (t) => {
let e = !0;
const o = E || "selected", r = l.length, f = a.length, s = l.findIndex((c) => c[o] === !0) >= 0, i = a.findIndex((c) => c[o] === !0) >= 0;
switch (t) {
case "moveUp":
s ? e = l.length > 0 ? l[0].selected : !0 : i ? e = a.length > 0 ? a[0].selected : !0 : e = !0;
break;
case "moveDown":
s ? e = l[r - 1] ? l[r - 1].selected : !0 : i ? e = a.length > 0 ? a[f - 1].selected : !0 : e = !0;
break;
case "transferTo":
e = !(a && s);
break;
case "transferFrom":
a ? e = !(a && i) : e = !0;
break;
case "transferAllTo":
e = !(a && l.length > 0);
break;
case "transferAllFrom":
e = !(a && a.length > 0);
break;
case "remove":
e = !(s || i);
break;
}
return e;
}, x = R === "rtl";
return /* @__PURE__ */ n.createElement("div", { className: q("k-listbox-actions"), ref: h, onKeyDown: S }, b && b.map((t, e) => {
const o = N.findIndex((c) => c.name === t), r = N[o], f = H(r.name), s = `listbox.${r.name}`, i = z.toLanguageString(s, J[s]);
return /* @__PURE__ */ n.createElement(
M,
{
size: C,
key: e,
disabled: f,
"data-command": r.name,
title: i,
"aria-label": i,
icon: x ? P(r.iconName) : r.iconName,
svgIcon: x ? B(r.svgIcon) : r.svgIcon,
onClick: (c) => {
c.preventDefault(), U(c, r.name);
}
}
);
}));
}), u = {
data: [],
dataConnected: [],
selectedField: "selected",
size: "medium"
};
F.propTypes = {
data: d.array.isRequired,
dataConnected: d.array.isRequired,
tools: d.array,
selectedField: d.string,
dir: d.string,
size: d.oneOf([null, "small", "medium", "large"])
};
F.displayName = "ListBoxToolbarInner";
export {
F as ListBoxToolbar
};