@ark-ui/vue
Version:
A collection of unstyled, accessible UI components for Vue, utilizing state machines for seamless interaction.
80 lines (77 loc) • 2.72 kB
JavaScript
import { computed, toValue, ref } from 'vue';
import { createListCollection } from './list-collection.js';
function useListCollection(props) {
const resolvedProps = computed(() => {
const { initialItems = [], filter, limit, ...collectionOptions } = toValue(props);
return [{ initialItems, filter, limit }, collectionOptions];
});
const create = (items) => {
const [, collectionOptions] = resolvedProps.value;
return createListCollection({ ...collectionOptions, items });
};
const init = () => {
const [localProps] = resolvedProps.value;
return create(
localProps.limit != null ? localProps.initialItems.slice(0, localProps.limit) : localProps.initialItems
);
};
const collection = ref(init());
const setCollection = (newCollection) => {
const [localProps] = resolvedProps.value;
collection.value = localProps.limit == null ? newCollection : newCollection.copy(newCollection.items.slice(0, localProps.limit));
};
return {
collection,
filter: (inputValue) => {
const [localProps] = resolvedProps.value;
const filter = localProps.filter;
if (!filter) return;
const filtered = create(localProps.initialItems).filter((itemString) => filter(itemString, inputValue));
setCollection(filtered);
},
set: (items) => {
setCollection(create(items));
},
reset: () => {
const [localProps] = resolvedProps.value;
setCollection(create(localProps.initialItems));
},
clear: () => {
setCollection(create([]));
},
insert: (index, ...items) => {
setCollection(collection.value.insert(index, ...items));
},
insertBefore: (value, ...items) => {
setCollection(collection.value.insertBefore(value, ...items));
},
insertAfter: (value, ...items) => {
setCollection(collection.value.insertAfter(value, ...items));
},
remove: (...itemOrValues) => {
setCollection(collection.value.remove(...itemOrValues));
},
move: (value, to) => {
setCollection(collection.value.move(value, to));
},
moveBefore: (value, ...values) => {
setCollection(collection.value.moveBefore(value, ...values));
},
moveAfter: (value, ...values) => {
setCollection(collection.value.moveAfter(value, ...values));
},
reorder: (from, to) => {
setCollection(collection.value.reorder(from, to));
},
append: (...items) => {
setCollection(collection.value.append(...items));
},
prepend: (...items) => {
setCollection(collection.value.prepend(...items));
},
update: (value, item) => {
setCollection(collection.value.update(value, item));
}
};
}
export { useListCollection };