mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2026-01-31 08:11:45 +01:00
format nodeOverview state badges, review textFilter
- textFilter now remains on compare
This commit is contained in:
@@ -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}
|
||||||
|
|||||||
@@ -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.user.length != 0) {
|
||||||
if (filters.userMatch != "in") {
|
if (filters.userMatch != "in") {
|
||||||
opts.push(`user=${filters.user}`);
|
opts.push(`user=${filters.user}`);
|
||||||
} else {
|
} else {
|
||||||
for (let singleUser of filters.user) opts.push(`user=${singleUser}`);
|
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
|
||||||
|
|||||||
@@ -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 */
|
|
||||||
let term = $state("");
|
|
||||||
|
|
||||||
/* Derived */
|
/* Derived */
|
||||||
let project = $derived(presetProject ? presetProject : "");
|
const bufferProject = $derived.by(() => {
|
||||||
let mode = $derived(presetProject ? "jobName" : "project");
|
let bp = filterBuffer.find((fb) =>
|
||||||
|
Object.keys(fb).includes("project")
|
||||||
|
)
|
||||||
|
return bp?.project?.contains || null
|
||||||
|
});
|
||||||
|
|
||||||
|
const bufferUser = $derived.by(() => {
|
||||||
|
let bu = filterBuffer.find((fb) =>
|
||||||
|
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 : "";
|
|
||||||
jobName = "";
|
|
||||||
} 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({ user: term, project: (presetProject ? presetProject : null), jobName: null });
|
||||||
user,
|
|
||||||
project,
|
|
||||||
jobName
|
|
||||||
});
|
|
||||||
}, sleep);
|
}, sleep);
|
||||||
} else {
|
} else if (mode == "project") {
|
||||||
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 });
|
||||||
project,
|
}, sleep);
|
||||||
jobName
|
} else if (mode == "jobName") {
|
||||||
});
|
timeoutId = setTimeout(() => {
|
||||||
|
setFilter({ jobName: term, user: null, project: (presetProject ? presetProject : null) });
|
||||||
}, sleep);
|
}, 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}
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user