Release v2.5.6

This commit is contained in:
2026-08-05 19:38:16 +01:00
parent a8ef35b287
commit 9f831f04bc
161 changed files with 8487 additions and 1295 deletions
@@ -9,6 +9,12 @@ const TASKS_PER_PAGE = 25;
const QUEUE_PAGE_URL = '/settings/tasks-background';
const SCHEDULED_PAGE_URL = '/settings/tasks-scheduled';
const DATE_FILTER_FIELDS = {
createdAt: 'queued',
startedAt: 'started',
finishedAt: 'finished'
};
function formatIntervalLabel(intervalMs) {
const value = Math.max(1, Number(intervalMs) || 0);
if (value % 60000 === 0) {
@@ -36,6 +42,54 @@ function normalizeSourceFilter(sourceType, sourceId) {
};
}
function normalizeDateInput(value) {
const normalizedValue = String(value || '').trim();
return /^\d{4}-\d{2}-\d{2}$/.test(normalizedValue) ? normalizedValue : '';
}
function normalizeDateField(value) {
const normalizedField = String(value || '').trim();
return DATE_FILTER_FIELDS[normalizedField] ? normalizedField : 'createdAt';
}
function getIsoDateString(value) {
const date = new Date(value);
if (Number.isNaN(date.getTime())) {
return '';
}
return date.toISOString().slice(0, 10);
}
function getTaskDateValue(task, dateField) {
if (!task || !dateField) {
return '';
}
return task[dateField] || '';
}
function taskMatchesDateFilter(task, dateFilter) {
if (!dateFilter || (!dateFilter.from && !dateFilter.to)) {
return true;
}
const taskDate = getIsoDateString(getTaskDateValue(task, dateFilter.field));
if (!taskDate) {
return false;
}
if (dateFilter.from && taskDate < dateFilter.from) {
return false;
}
if (dateFilter.to && taskDate > dateFilter.to) {
return false;
}
return true;
}
function taskMatchesFilters(task, sourceFilter) {
if (!sourceFilter || !sourceFilter.sourceType || !sourceFilter.sourceId) {
return true;
@@ -107,12 +161,14 @@ function buildQueuePageViewModel(data, message, currentUser) {
queryState.sourceType = sourceFilter.sourceType;
queryState.sourceId = sourceFilter.sourceId;
const filteredTasks = tasks.filter(function (task) {
return taskMatchesFilters(task, sourceFilter) && taskMatchesSearch(queryState.search, [
return taskMatchesFilters(task, sourceFilter) && taskMatchesDateFilter(task, { field: 'createdAt', from: '', to: '' }) && taskMatchesSearch(queryState.search, [
'title',
'key',
'category',
'status',
'errorMessage',
'createdAt',
'startedAt',
'finishedAt',
function (item) { return item && item.metadata && item.metadata.sourceName; },
function (item) { return item && item.metadata && item.metadata.sourceType; },
function (item) { return item && item.metadata && item.metadata.sourceId; }
@@ -199,6 +255,11 @@ function buildQueuePageViewModel(data, message, currentUser) {
summary: summary,
statusCards: statusCards,
activeSourceLabel: queryState.sourceType && queryState.sourceId ? `${queryState.sourceType} #${queryState.sourceId}` : '',
search: queryState.search,
sort: sort,
direction: direction,
sourceType: queryState.sourceType,
sourceId: queryState.sourceId,
clearFiltersUrl: QUEUE_PAGE_URL,
hasActiveFilters: hasActiveFilters,
pagination: pagination,