From b381b2078a903f2ca42dc2a8a65bf878241f7b2c Mon Sep 17 00:00:00 2001 From: Marcel Date: Sat, 2 May 2026 17:46:02 +0200 Subject: [PATCH] feat(geschichten): add DocumentMultiSelect chip + typeahead component Mirrors PersonMultiSelect for documents: chip-style multi-select backed by GET /api/documents/search?q=. Used in the Geschichte editor sidebar to link referenced documents to a story. Co-Authored-By: Claude Opus 4.7 --- .../lib/components/DocumentMultiSelect.svelte | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 frontend/src/lib/components/DocumentMultiSelect.svelte diff --git a/frontend/src/lib/components/DocumentMultiSelect.svelte b/frontend/src/lib/components/DocumentMultiSelect.svelte new file mode 100644 index 00000000..cdef1d62 --- /dev/null +++ b/frontend/src/lib/components/DocumentMultiSelect.svelte @@ -0,0 +1,147 @@ + + + + +{#each selectedDocuments as doc (doc.id)} + +{/each} + +
(showDropdown = false)}> +
+ {#each selectedDocuments as doc (doc.id)} + + {formatDocLabel(doc)} + + + {/each} + + { + updateDropdownPosition(); + showDropdown = true; + }} + placeholder={placeholder} + class="min-w-[120px] flex-1 border-none bg-transparent p-1 text-sm outline-none focus:ring-0" + /> +
+ + {#if showDropdown && (results.length > 0 || loading)} +
+ {#if loading} +
{m.comp_multiselect_loading()}
+ {:else} + {#each results as doc (doc.id)} +
selectDocument(doc)} + onkeydown={(e) => e.key === 'Enter' && selectDocument(doc)} + role="button" + tabindex="0" + > + {formatDocLabel(doc)} +
+ {/each} + {/if} +
+ {/if} +