format nodeOverview state badges, review textFilter

- textFilter now remains on compare
This commit is contained in:
Christoph Kluge
2026-01-30 12:51:49 +01:00
parent d397457ce6
commit 2ef1826b12
4 changed files with 64 additions and 66 deletions

View File

@@ -155,8 +155,9 @@
{#if !showCompare} {#if !showCompare}
<TextFilter <TextFilter
{presetProject} {presetProject}
bind:authlevel {authlevel}
bind:roles {roles}
{filterBuffer}
setFilter={(filter) => filterComponent.updateFilters(filter)} setFilter={(filter) => filterComponent.updateFilters(filter)}
/> />
{/if} {/if}

View File

@@ -241,12 +241,15 @@
if (filters.project) opts.push(`project=${filters.project}`); if (filters.project) opts.push(`project=${filters.project}`);
if (filters.project && filters.projectMatch != "contains") // "contains" is default-case if (filters.project && filters.projectMatch != "contains") // "contains" is default-case
opts.push(`projectMatch=${filters.projectMatch}`); opts.push(`projectMatch=${filters.projectMatch}`);
if (filters.user.length != 0) if (filters.user) {
if (filters.userMatch != "in") { if (filters.user.length != 0) {
opts.push(`user=${filters.user}`); if (filters.userMatch != "in") {
} else { opts.push(`user=${filters.user}`);
for (let singleUser of filters.user) opts.push(`user=${singleUser}`); } else {
for (let singleUser of filters.user) opts.push(`user=${singleUser}`);
}
} }
}
if (filters.userMatch != "contains") // "contains" is default-case if (filters.userMatch != "contains") // "contains" is default-case
opts.push(`userMatch=${filters.userMatch}`); opts.push(`userMatch=${filters.userMatch}`);
// Filter Modals // Filter Modals

View File

@@ -2,9 +2,10 @@
@component Search Field for Job-Lists with separate mode if project filter is active @component Search Field for Job-Lists with separate mode if project filter is active
Properties: Properties:
- `presetProject String?`: Currently active project filter [Default: ''] - `presetProject String?`: Currently active project filter preset [Default: '']
- `authlevel Number?`: The current users authentication level [Default: null] - `authlevel Number?`: The current users authentication level [Default: null]
- `roles [Number]?`: Enum containing available roles [Default: null] - `roles [Number]?`: Enum containing available roles [Default: null]
- `filterBuffer [Obj]?`: Currently active filters, if any.
- `setFilter Func`: The callback function to apply current filter selection - `setFilter Func`: The callback function to apply current filter selection
--> -->
@@ -18,78 +19,69 @@
presetProject = "", presetProject = "",
authlevel = null, authlevel = null,
roles = null, roles = null,
filterBuffer = [],
setFilter setFilter
} = $props(); } = $props();
/* Const Init*/ /* Const Init*/
const throttle = 500; const throttle = 300;
/* Var Init */ /* Var Init */
let user = "";
let jobName = "";
let timeoutId = null; let timeoutId = null;
/* State Init */ /* Derived */
let term = $state(""); const bufferProject = $derived.by(() => {
let bp = filterBuffer.find((fb) =>
Object.keys(fb).includes("project")
)
return bp?.project?.contains || null
});
/* Derived */ const bufferUser = $derived.by(() => {
let project = $derived(presetProject ? presetProject : ""); let bu = filterBuffer.find((fb) =>
let mode = $derived(presetProject ? "jobName" : "project"); Object.keys(fb).includes("user")
)
return bu?.user?.contains || null
});
const bufferJobName = $derived.by(() => {
let bjn = filterBuffer.find((fb) =>
Object.keys(fb).includes("jobName")
)
return bjn?.jobName?.contains || null
});
let mode = $derived.by(() => {
if (presetProject) return "jobName" // Search by jobName if presetProject set
else if (bufferUser) return "user"
else if (bufferJobName) return "jobName"
else return "project"
});
let term = $derived(bufferUser || bufferJobName || bufferProject || "");
/* Functions */ /* Functions */
function modeChanged() { function inputChanged(sleep = throttle) {
if (timeoutId != null) clearTimeout(timeoutId);
if (mode == "user") { if (mode == "user") {
project = presetProject ? presetProject : ""; timeoutId = setTimeout(() => {
jobName = ""; setFilter({ user: term, project: (presetProject ? presetProject : null), jobName: null });
}, sleep);
} else if (mode == "project") { } else if (mode == "project") {
user = "";
jobName = "";
} else {
project = presetProject ? presetProject : "";
user = "";
}
termChanged(0);
}
// Compatibility: Handle "user role" and "no role" identically
function termChanged(sleep = throttle) {
if (roles && authlevel >= roles.manager) {
if (mode == "user") user = term;
else if (mode == "project") project = term;
else jobName = term;
if (timeoutId != null) clearTimeout(timeoutId);
timeoutId = setTimeout(() => { timeoutId = setTimeout(() => {
setFilter({ setFilter({ project: term, user: null, jobName: null });
user, }, sleep);
project, } else if (mode == "jobName") {
jobName
});
}, sleep);
} else {
if (mode == "project") project = term;
else jobName = term;
if (timeoutId != null) clearTimeout(timeoutId);
timeoutId = setTimeout(() => { timeoutId = setTimeout(() => {
setFilter({ setFilter({ jobName: term, user: null, project: (presetProject ? presetProject : null) });
project, }, sleep);
jobName
});
}, sleep);
} }
} }
function resetProject () { function resetProject () {
mode = "project" presetProject = "";
term = "" term = "";
presetProject = "" inputChanged(0);
project = ""
jobName = ""
user = ""
termChanged(0);
} }
</script> </script>
@@ -100,12 +92,12 @@
class="form-select w-auto" class="form-select w-auto"
title="Search Mode" title="Search Mode"
bind:value={mode} bind:value={mode}
onchange={modeChanged} onchange={() => inputChanged()}
> >
{#if !presetProject} {#if !presetProject}
<option value={"project"}>Project</option> <option value={"project"}>Project</option>
{/if} {/if}
{#if roles && authlevel >= roles.manager} {#if roles && authlevel >= roles?.manager}
<option value={"user"}>User</option> <option value={"user"}>User</option>
{/if} {/if}
<option value={"jobName"}>Jobname</option> <option value={"jobName"}>Jobname</option>
@@ -113,8 +105,8 @@
<Input <Input
type="text" type="text"
bind:value={term} bind:value={term}
onchange={() => termChanged()} onchange={() => inputChanged()}
onkeyup={(event) => termChanged(event.key == "Enter" ? 0 : throttle)} onkeyup={(event) => inputChanged(event.key == "Enter" ? 0 : throttle)}
placeholder={presetProject ? `Find in ${scrambleNames ? scramble(presetProject) : presetProject} ...` : `Find ${mode} ...`} placeholder={presetProject ? `Find in ${scrambleNames ? scramble(presetProject) : presetProject} ...` : `Find ${mode} ...`}
/> />
{#if presetProject} {#if presetProject}

View File

@@ -156,7 +156,9 @@
> >
</h4> </h4>
<span style="margin-right: 0.5rem;"> <span style="margin-right: 0.5rem;">
<Badge color={stateColors[item?.state? item.state : 'notindb']}>{item?.state? item.state : 'notindb'}</Badge> <Badge color={stateColors[item?.state? item.state : 'notindb']}>
State: {item?.state? item.state.charAt(0).toUpperCase() + item.state.slice(1) : 'Not in DB'}
</Badge>
</span> </span>
</div> </div>
{#if item?.data} {#if item?.data}