diff --git a/www/src/components/list-manager.jsx b/www/src/components/list-manager.jsx index d4fa12f..c7386c6 100644 --- a/www/src/components/list-manager.jsx +++ b/www/src/components/list-manager.jsx @@ -1,11 +1,134 @@ -import { mergeProps } from "solid-js"; +import { createMemo, createSignal, mergeProps } from "solid-js"; function ListManager(props) { props = mergeProps( - { items: [], availableItems: [], itemToString: () => "" }, + { + items: [], + availableItems: [], + itemToString: () => "", + style: "", + onItemSelect: () => {}, + onItemDeselect: () => {}, + itemsTitle: "Selected items", + availableItemsTitle: "Available items", + }, props ); - return <>>; + + const [selectedAvailableItemIndex, setSelectedAvailableItemIndex] = + createSignal(-1); + const [selectedItemIndex, setSelectedItemIndex] = createSignal(-1); + + const selectableAvailableItems = createMemo(() => + props.availableItems + .filter((item) => !props.items.includes(item)) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + .concat(props.availableItems) + ); + const selectableItems = createMemo(() => props.items); + const canSelect = createMemo( + () => + selectedAvailableItemIndex() >= 0 && + selectedAvailableItemIndex() < selectableAvailableItems().length + ); + const canDeselect = createMemo( + () => + selectedItemIndex() >= 0 && selectedItemIndex() < selectableItems().length + ); + + function handleSelectItem() { + let itemIndex = selectedAvailableItemIndex(); + let item = selectableAvailableItems()[itemIndex]; + if (itemIndex === selectableAvailableItems().length - 1) { + setSelectedAvailableItemIndex(itemIndex - 1); + } + props.onItemSelect(item); + } + + function handleDeselectItem() { + let itemIndex = selectedItemIndex(); + let item = selectableItems()[itemIndex]; + if (itemIndex === selectableItems().length - 1) { + setSelectedItemIndex(itemIndex - 1); + } + props.onItemDeselect(item); + } + + function ListItem(props) { + props = mergeProps( + { children: "", selected: false, onClick: () => {} }, + props + ); + return ( +