UNPKG

@ark-ui/vue

Version:

A collection of unstyled, accessible UI components for Vue, utilizing state machines for seamless interaction.

102 lines (99 loc) 3.48 kB
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 init = () => { const { initialItems } = resolvedProps.value[0]; return initialItems; }; const items = ref(init()); const filterText = ref(""); const setItems = (newItems) => { items.value = newItems; filterText.value = ""; }; const create = (itemsToCreate) => { const [, collectionOptions] = resolvedProps.value; return createListCollection({ ...collectionOptions, items: itemsToCreate }); }; const collection = computed(() => { const [localProps, collectionOptions] = resolvedProps.value; let activeItems = items.value; const filter = localProps.filter; if (filterText.value && filter) { activeItems = create(items.value).filter( (itemString, _index, item) => filter(itemString, filterText.value, item) ).items; } const limitedItems = localProps.limit == null ? activeItems : activeItems.slice(0, localProps.limit); return createListCollection({ ...collectionOptions, items: limitedItems }); }); return { collection, filter: (inputValue = "") => { filterText.value = inputValue; }, set: (newItems) => { setItems(newItems); }, reset: () => { const [localProps] = resolvedProps.value; setItems(localProps.initialItems); }, clear: () => { setItems([]); }, insert: (index, ...itemsToInsert) => { const newItems = create(items.value).insert(index, ...itemsToInsert).items; setItems(newItems); }, insertBefore: (value, ...itemsToInsert) => { const newItems = create(items.value).insertBefore(value, ...itemsToInsert).items; setItems(newItems); }, insertAfter: (value, ...itemsToInsert) => { const newItems = create(items.value).insertAfter(value, ...itemsToInsert).items; setItems(newItems); }, remove: (...itemOrValues) => { const newItems = create(items.value).remove(...itemOrValues).items; setItems(newItems); }, move: (value, to) => { const newItems = create(items.value).move(value, to).items; setItems(newItems); }, moveBefore: (value, ...values) => { const newItems = create(items.value).moveBefore(value, ...values).items; setItems(newItems); }, moveAfter: (value, ...values) => { const newItems = create(items.value).moveAfter(value, ...values).items; setItems(newItems); }, reorder: (from, to) => { const newItems = create(items.value).reorder(from, to).items; setItems(newItems); }, append: (...itemsToAppend) => { const newItems = create(items.value).append(...itemsToAppend).items; setItems(newItems); }, upsert: (value, item, mode = "append") => { const newItems = create(items.value).upsert(value, item, mode).items; setItems(newItems); }, prepend: (...itemsToPrepend) => { const newItems = create(items.value).prepend(...itemsToPrepend).items; setItems(newItems); }, update: (value, item) => { const newItems = create(items.value).update(value, item).items; setItems(newItems); } }; } export { useListCollection };