From 36369fb1f01a15b863ab445a2d076610d45daf5c Mon Sep 17 00:00:00 2001 From: Fritz Heiden Date: Tue, 8 Apr 2025 17:09:23 +0200 Subject: [PATCH] feat: implement list-manager --- www/src/components/list-manager.jsx | 129 ++++++++++++++++++++++++- www/src/modals/create-remote-modal.jsx | 29 ++++-- www/src/services/remotes-service.js | 30 +++++- 3 files changed, 177 insertions(+), 11 deletions(-) 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 ( +
+ {props.children} +
+ ); + } + + return ( +
+
+
{props.itemsTitle}
+
+ {selectableItems().map((item, index) => ( + setSelectedItemIndex(index)} + selected={index === selectedItemIndex()} + > + {props.itemToString(item)} + + ))} +
+
+
+ + +
+
+
{props.availableItemsTitle}
+
+ {selectableAvailableItems().map((item, index) => ( + setSelectedAvailableItemIndex(index)} + selected={index === selectedAvailableItemIndex()} + > + {props.itemToString(item)} + + ))} +
+
+
+ ); } export default ListManager; diff --git a/www/src/modals/create-remote-modal.jsx b/www/src/modals/create-remote-modal.jsx index 8f2b061..dfe6633 100644 --- a/www/src/modals/create-remote-modal.jsx +++ b/www/src/modals/create-remote-modal.jsx @@ -42,6 +42,16 @@ function CreateRemoteModal(props) { setError(""); } + function handleCommandSelect(item) { + setCommands([...commands(), item]); + } + + function handleCommandDeselect(item) { + setCommands( + commands().filter((command) => command.getId() !== item.getId()) + ); + } + return ( -