Aktueller Stand

This commit is contained in:
2026-01-13 13:46:36 +01:00
parent 9675e73406
commit b3ca39ddc2
4 changed files with 276 additions and 78 deletions

View File

@@ -1287,13 +1287,97 @@ function buildBookmarkSearchUrl(query) {
return searchUrl.toString();
}
function splitBookmarkGroupOptions(rawGroup) {
if (typeof rawGroup !== 'string') {
return [];
}
return rawGroup
.split(',')
.map((entry) => entry.trim())
.filter(Boolean);
}
function expandBookmarkQueryVariants(baseQuery) {
const trimmed = typeof baseQuery === 'string' ? baseQuery.trim() : '';
if (!trimmed) {
return [];
}
const variants = [''];
let cursor = 0;
while (cursor < trimmed.length) {
const openIndex = trimmed.indexOf('(', cursor);
if (openIndex === -1) {
const tail = trimmed.slice(cursor);
for (let i = 0; i < variants.length; i += 1) {
variants[i] = `${variants[i]}${tail}`;
}
break;
}
const closeIndex = trimmed.indexOf(')', openIndex + 1);
if (closeIndex === -1) {
const tail = trimmed.slice(cursor);
for (let i = 0; i < variants.length; i += 1) {
variants[i] = `${variants[i]}${tail}`;
}
break;
}
const before = trimmed.slice(cursor, openIndex);
if (before) {
for (let i = 0; i < variants.length; i += 1) {
variants[i] = `${variants[i]}${before}`;
}
}
const groupRaw = trimmed.slice(openIndex + 1, closeIndex);
const options = splitBookmarkGroupOptions(groupRaw);
if (options.length) {
const expanded = [];
variants.forEach((prefix) => {
options.forEach((option) => {
expanded.push(`${prefix}${option}`);
});
});
variants.splice(0, variants.length, ...expanded);
} else {
const literalGroup = trimmed.slice(openIndex, closeIndex + 1);
for (let i = 0; i < variants.length; i += 1) {
variants[i] = `${variants[i]}${literalGroup}`;
}
}
cursor = closeIndex + 1;
}
return variants
.map((variant) => variant.trim())
.filter(Boolean);
}
function buildBookmarkSearchQueries(baseQuery) {
const trimmed = typeof baseQuery === 'string' ? baseQuery.trim() : '';
if (!trimmed) {
return [...BOOKMARK_SUFFIXES];
}
return BOOKMARK_SUFFIXES.map((suffix) => `${trimmed} ${suffix}`.trim());
const baseVariants = expandBookmarkQueryVariants(trimmed);
if (!baseVariants.length) {
return BOOKMARK_SUFFIXES.map((suffix) => `${trimmed} ${suffix}`.trim());
}
const queries = [];
baseVariants.forEach((variant) => {
BOOKMARK_SUFFIXES.forEach((suffix) => {
queries.push(`${variant} ${suffix}`.trim());
});
});
return [...new Set(queries)];
}
function openBookmarkQueries(baseQuery) {

View File

@@ -283,24 +283,23 @@
.automation-view .auto-table .sort-indicator {
display: inline-block;
margin-left: 6px;
width: 10px;
height: 10px;
border: 5px solid transparent;
border-bottom: 0;
border-left: 0;
transform: rotate(45deg);
opacity: 0.25;
width: 18px;
height: 18px;
background-color: var(--automation-muted);
-webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='black' d='M4 6l4 4 4-4z'/></svg>") no-repeat center / contain;
mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='black' d='M4 6l4 4 4-4z'/></svg>") no-repeat center / contain;
opacity: 0.35;
}
.automation-view .auto-table th.sort-asc .sort-indicator {
border-top: 6px solid var(--automation-accent-2);
transform: rotate(225deg);
background-color: var(--automation-accent-2);
transform: rotate(180deg);
opacity: 0.9;
}
.automation-view .auto-table th.sort-desc .sort-indicator {
border-top: 6px solid var(--automation-accent-2);
transform: rotate(45deg);
background-color: var(--automation-accent-2);
transform: rotate(0deg);
opacity: 0.9;
}

View File

@@ -637,7 +637,7 @@
<br><small>${formatDateTime(req.next_run_at)}</small>
</td>
<td data-sort="${untilSort}">
<span class="until" data-sort="${untilSort}">${req.run_until ? formatRelative(req.run_until) : '—'}</span>
<span class="runUntil until" data-sort="${untilSort}">${req.run_until ? formatRelative(req.run_until) : '—'}</span>
<br><small>${formatDateTime(req.run_until)}</small>
</td>
<td data-sort="${lastSort}">