multi value filtering added and font color fix for duplicates

This commit is contained in:
2026-08-11 23:28:35 +02:00
parent 5594431749
commit e0175ab48a
340 changed files with 739 additions and 160 deletions
Regular → Executable
View File
Regular → Executable
+52 -5
View File
@@ -5,7 +5,7 @@
.table-scroll{overflow:auto}.table-hint{color:#667;font-size:13px}.multiline{white-space:pre-line;min-width:140px}#asset-table th[draggable=true]{cursor:grab;user-select:none}#asset-table th.dragging{opacity:.45}#asset-table{min-width:900px}
@media(max-width:700px){main{padding:0 10px}}
.button-secondary{background:#546675}.column-filter-row th{padding:6px;background:#f5f7f9}.column-filter-row input{margin:0;min-width:110px;padding:6px;font-size:13px}.sortable-column{cursor:pointer;user-select:none;padding-right:24px;position:relative}.sortable-column.sort-asc::after{content:"▲";position:absolute;right:7px;font-size:10px}.sortable-column.sort-desc::after{content:"▼";position:absolute;right:7px;font-size:10px}tr[hidden]{display:none}.history-old,.history-new{white-space:pre-wrap}
.button-secondary{background:#546675}.column-filter-row th{padding:6px;background:#f5f7f9}.column-filter-row input,.column-filter-row textarea{margin:0;min-width:110px;padding:6px;font-size:13px}.sortable-column{cursor:pointer;user-select:none;padding-right:24px;position:relative}.sortable-column.sort-asc::after{content:"▲";position:absolute;right:7px;font-size:10px}.sortable-column.sort-desc::after{content:"▼";position:absolute;right:7px;font-size:10px}tr[hidden]{display:none}.history-old,.history-new{white-space:pre-wrap}
/* Tabellen: fixierte Kopfzeilen und kompakte Aktionsschaltflächen */
.sticky-table{max-height:calc(100vh - 170px);overflow:auto;border:1px solid #d8dde2;background:#fff}
@@ -511,9 +511,17 @@ body.single-scroll-list .sticky-table + .muted{
#asset-table tbody tr.duplicate-hidden{display:none!important}
#asset-table tbody tr.duplicate-match td{
background:#fff8d8;
color:#1f2937;
}
#asset-table tbody tr.duplicate-match:hover td{
background:#fff1ad;
color:#1f2937;
}
html[data-theme="dark"] #asset-table tbody tr.duplicate-match td,
html[data-theme="dark"] #asset-table tbody tr.duplicate-match td a,
html[data-theme="dark"] #asset-table tbody tr.duplicate-match td .muted,
html[data-theme="dark"] #asset-table tbody tr.duplicate-match td small{
color:#1f2937!important;
}
@@ -1094,12 +1102,22 @@ body.asset-list-scroll-page .asset-list-page #asset-table-scroll{
display:table-cell !important;
}
.column-filter-row input[type="search"]{
.column-filter-row input[type="search"],
.column-filter-row textarea{
display:block;
width:100%;
min-width:90px;
box-sizing:border-box;
}
.column-filter-row textarea{
height:32px;
min-height:32px;
max-height:96px;
resize:vertical;
line-height:18px;
overflow:auto;
white-space:pre;
}
/* Management pages use browser scrolling; avoid clipped sticky rows. */
.management-table-scroll thead tr:first-child th,
@@ -1123,7 +1141,8 @@ body.asset-list-scroll-page .asset-list-page #asset-table-scroll{
/* v0.4.0.8: clearly visible active table filters */
.column-filter-row input[type="search"]{
.column-filter-row input[type="search"],
.column-filter-row textarea{
transition:
background-color .15s ease,
border-color .15s ease,
@@ -1134,7 +1153,8 @@ body.asset-list-scroll-page .asset-list-page #asset-table-scroll{
background:#fff2c7;
}
.column-filter-row input[type="search"].filter-input-active{
.column-filter-row input[type="search"].filter-input-active,
.column-filter-row textarea.filter-input-active{
background:#fff7d8;
border-color:#cf9b16;
box-shadow:
@@ -1143,7 +1163,8 @@ body.asset-list-scroll-page .asset-list-page #asset-table-scroll{
font-weight:600;
}
.column-filter-row input[type="search"].filter-input-active:focus{
.column-filter-row input[type="search"].filter-input-active:focus,
.column-filter-row textarea.filter-input-active:focus{
background:#fff9e5;
border-color:#a87500;
box-shadow:
@@ -3075,3 +3096,29 @@ table th.table-resizable-column-header > .table-column-resizer:focus-visible::af
.image-upload-label{display:flex;flex-direction:column;align-items:flex-start;gap:5px;margin-top:8px}
html[data-theme="dark"] .standard-image-library{border-color:#46515d}
html[data-theme="dark"] .standard-image-choice{border-color:#46515d}
/* v0.5.5.67: line-based multi-value table filters and second-asset selector */
.software-compare-select-dialog{
width:min(560px,92vw);
}
.software-compare-select-dialog form{
padding:0;
border:0;
}
.software-compare-select-dialog label{
display:grid;
gap:6px;
}
.software-compare-select-dialog input,
.software-compare-select-dialog select{
width:100%;
}
.software-compare-selection-status{
min-height:1.25em;
margin:0;
}
html[data-theme="dark"] .column-filter-row textarea.filter-input-active{
background:#493d14;
color:#fff2b3;
border-color:#d4a735;
}
View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

View File

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Regular → Executable
View File
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
+7 -1
View File
@@ -24,7 +24,7 @@
}
function filterControls(table) {
return [...table.querySelectorAll('thead input, thead select')].filter(control => {
return [...table.querySelectorAll('thead input, thead select, thead textarea')].filter(control => {
const type = (control.type || '').toLowerCase();
return !['checkbox', 'radio', 'button', 'submit'].includes(type);
});
@@ -44,6 +44,12 @@
try { state = JSON.parse(api.get(key) || 'null'); } catch (_) {}
if (state?.field && (state.direction === 'asc' || state.direction === 'desc')) {
table.assetApplySort(state.field, state.direction, {silent: true});
} else if (table.dataset.defaultSortField) {
table.assetApplySort(
table.dataset.defaultSortField,
table.dataset.defaultSortDirection === 'desc' ? 'desc' : 'asc',
{silent: true}
);
} else {
table.assetUpdateRowNumbers?.();
}
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
View File
View File
View File
Regular → Executable
+17 -19
View File
@@ -714,9 +714,12 @@
const active = filterDefinitions
.map(definition => ({
definition,
term: definition.input?.value.trim() || ''
terms: String(definition.input?.value || '')
.split(/\r?\n/)
.map(term => term.trim())
.filter(Boolean)
}))
.filter(item => item.term);
.filter(item => item.terms.length);
if (usesServerFilters) {
const serverTotal = Number.parseInt(table.dataset.serverFilterTotal || '', 10);
@@ -737,13 +740,16 @@
let visibleRows = 0;
[...tbody.rows].forEach(row => {
const hidden = active.some(({ definition, term }) => {
const hidden = active.some(({ definition, terms }) => {
const cell = cellForDefinition(row, definition);
const value = textValue(cell);
if (definition.numericFilter) {
return !numericFilterMatches(value, term);
}
return !searchTextMatches(value, term);
const matchesAnyTerm = terms.some(term => {
if (definition.numericFilter) {
return numericFilterMatches(value, term);
}
return searchTextMatches(value, term);
});
return !matchesAnyTerm;
});
row.hidden = hidden;
@@ -824,11 +830,13 @@
}
if (!header.dataset.noFilter && (!usesServerFilters || serverName)) {
const input = document.createElement('input');
input.type = 'search';
const input = document.createElement('textarea');
input.rows = 1;
input.placeholder = header.dataset.filterPlaceholder || 'Filtern …';
input.setAttribute('aria-label', `Filter ${textValue(header)}`);
input.title = document.body.dataset.multiValueFilterHint || '';
input.autocomplete = 'off';
input.spellcheck = false;
if (usesServerFilters) {
input.name = `job_filter_${serverName}`;
input.value = header.dataset.serverFilterValue || '';
@@ -836,18 +844,8 @@
applyFilters();
submitServerFilters(false);
});
input.addEventListener('search', () => {
applyFilters();
submitServerFilters(false);
});
input.addEventListener('keydown', event => {
if (event.key !== 'Enter') return;
event.preventDefault();
submitServerFilters(true);
});
} else {
input.addEventListener('input', applyFilters);
input.addEventListener('search', applyFilters);
}
filterCell.appendChild(input);
Regular → Executable
View File
Regular → Executable
View File