From 6e2703998d51405156cfb064ffbb177afdf43eeb Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Wed, 4 Jun 2025 14:45:31 +0200 Subject: [PATCH] Migrate jobTag management --- .../src/generic/helper/TagManagement.svelte | 81 +++++++++++-------- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/web/frontend/src/generic/helper/TagManagement.svelte b/web/frontend/src/generic/helper/TagManagement.svelte index eb2a8ee..037b54d 100644 --- a/web/frontend/src/generic/helper/TagManagement.svelte +++ b/web/frontend/src/generic/helper/TagManagement.svelte @@ -33,26 +33,42 @@ import { fuzzySearchTags } from "../utils.js"; import Tag from "./Tag.svelte"; - export let job; - export let jobTags = job.tags; - export let username; - export let authlevel; - export let roles; - export let renderModal = true; + /* Svelte 5 Props */ + let { + jobTags = $bindable(), + job, + username, + authlevel, + roles, + renderModal = true, + } = $props(); - let allTags = getContext("tags"), - initialized = getContext("initialized"); - let newTagType = "", - newTagName = "", - newTagScope = username; - let filterTerm = ""; - let pendingChange = false; - let isOpen = false; + /* Const Init */ const isAdmin = (roles && authlevel == roles.admin); const isSupport = (roles && authlevel == roles.support); - const client = getContextClient(); + /* State Init */ + let initialized = getContext("initialized") + let allTags = getContext("tags") + let newTagType = $state(""); + let newTagName = $state(""); + let newTagScope = $state(username); + let filterTerm = $state(""); + let pendingChange = $state(false); + let isOpen = $state(false); + + /* Derived Init */ + const allTagsFiltered = $derived(($initialized, jobTags, fuzzySearchTags(filterTerm, allTags))); // $init und JobTags only for triggering react + const usedTagsFiltered = $derived(matchJobTags(jobTags, allTagsFiltered, 'used', isAdmin, isSupport)); + const unusedTagsFiltered = $derived(matchJobTags(jobTags, allTagsFiltered, 'unused', isAdmin, isSupport)); + + /* Effects */ + $effect(() => { + updateNewTag(filterTerm) + }); + + /* Const Mutations */ const createTagMutation = ({ type, name, scope }) => { return mutationStore({ client: client, @@ -104,19 +120,16 @@ }); }; - $: allTagsFiltered = ($initialized, fuzzySearchTags(filterTerm, allTags)); - $: usedTagsFiltered = matchJobTags(jobTags, allTagsFiltered, 'used', isAdmin, isSupport); - $: unusedTagsFiltered = matchJobTags(jobTags, allTagsFiltered, 'unused', isAdmin, isSupport); - - $: { + /* Functions */ + function updateNewTag(term) { newTagType = ""; newTagName = ""; - let parts = filterTerm.split(":").map((s) => s.trim()); + let parts = term.split(":").map((s) => s.trim()); if (parts.length == 2 && parts.every((s) => s.length > 0)) { newTagType = parts[0]; newTagName = parts[1]; - } - } + }; + }; function matchJobTags(tags, availableTags, type, isAdmin, isSupport) { const jobTagIds = tags.map((t) => t.id) @@ -183,7 +196,7 @@ {#if renderModal} - (isOpen = !isOpen)}> + {isOpen = !isOpen; filterTerm = "";}}> Manage Tags @@ -232,7 +245,7 @@ @@ -282,7 +295,7 @@ @@ -314,7 +327,7 @@ outline style="width:100%;" color="success" - on:click={(e) => ( + onclick={(e) => ( e.preventDefault(), createTag(newTagType, newTagName, newTagScope) )} > @@ -345,11 +358,11 @@ {/if} - + - @@ -387,7 +400,7 @@ @@ -396,7 +409,7 @@ @@ -435,7 +448,7 @@ @@ -444,7 +457,7 @@ @@ -475,7 +488,7 @@ outline style="width:100%;" color="success" - on:click={(e) => ( + onclick={(e) => ( e.preventDefault(), createTag(newTagType, newTagName, newTagScope) )} >