mirror of
https://github.com/nextui-org/nextui.git
synced 2025-12-08 19:26:11 +00:00
* chore(deps): bump RA versions * chore(deps): bump RA versions * chore(deps): bump RA versions * chore: changeset * chore(deps): remove unnecessary dependencies * fix(calendar): typing issue * refactor(system): remove unused SupportedCalendars * refactor(system): move I18nProviderProps to type * refactor: use `spectrumCalendarProps<DateValue>["createCalendar"]` * feat: add consistent-type-imports * fix: eslint * chore: add changeset * refactor: remove unused deps
103 lines
2.2 KiB
TypeScript
103 lines
2.2 KiB
TypeScript
import type {Key} from "react";
|
|
import type {TreeCollection} from "@react-stately/tree";
|
|
|
|
export class TreeKeyboardDelegate<T> {
|
|
collator: Intl.Collator;
|
|
collection: TreeCollection<T>;
|
|
disabledKeys: Set<Key>;
|
|
|
|
constructor(collection: TreeCollection<T>, disabledKeys: Set<Key>) {
|
|
this.collator = new Intl.Collator("en");
|
|
this.collection = collection;
|
|
this.disabledKeys = disabledKeys;
|
|
}
|
|
|
|
getKeyAbove(key: Key) {
|
|
let {collection, disabledKeys} = this;
|
|
let keyBefore = collection.getKeyBefore(key);
|
|
|
|
while (keyBefore !== null) {
|
|
let item = collection.getItem(keyBefore);
|
|
|
|
if (item?.type === "item" && !disabledKeys.has(item.key)) {
|
|
return keyBefore;
|
|
}
|
|
|
|
keyBefore = collection.getKeyBefore(keyBefore);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
getKeyBelow(key: Key) {
|
|
let {collection, disabledKeys} = this;
|
|
let keyBelow = collection.getKeyAfter(key);
|
|
|
|
while (keyBelow !== null) {
|
|
let item = collection.getItem(keyBelow);
|
|
|
|
if (item?.type === "item" && !disabledKeys.has(item.key)) {
|
|
return keyBelow;
|
|
}
|
|
|
|
keyBelow = collection.getKeyAfter(keyBelow);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
getFirstKey() {
|
|
let {collection, disabledKeys} = this;
|
|
let key = collection.getFirstKey();
|
|
|
|
while (key !== null) {
|
|
let item = collection.getItem(key);
|
|
|
|
if (item?.type === "item" && !disabledKeys.has(item.key)) {
|
|
return key;
|
|
}
|
|
|
|
key = collection.getKeyAfter(key);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
getLastKey() {
|
|
let {collection, disabledKeys} = this;
|
|
let key = collection.getLastKey();
|
|
|
|
while (key !== null) {
|
|
let item = collection.getItem(key);
|
|
|
|
if (item?.type === "item" && !disabledKeys.has(item.key)) {
|
|
return key;
|
|
}
|
|
|
|
key = collection.getKeyBefore(key);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
getKeyForSearch(search: string, fromKey = this.getFirstKey()) {
|
|
let {collator, collection} = this;
|
|
let key = fromKey;
|
|
|
|
while (key !== null) {
|
|
let item = collection.getItem(key);
|
|
|
|
if (
|
|
item?.textValue &&
|
|
collator.compare(search, item.textValue.slice(0, search.length)) === 0
|
|
) {
|
|
return key;
|
|
}
|
|
|
|
key = this.getKeyBelow(key);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|