From 68aed9744294287b6da4543cfbbf6527052edff0 Mon Sep 17 00:00:00 2001 From: gluafamichl <> Date: Tue, 14 Oct 2025 16:17:12 +0200 Subject: [PATCH] Fix: move live chunks filter to backend request params --- .../tasks-chunks-table.component.ts | 8 ++-- .../_datasources/tasks-chunks.datasource.ts | 41 +++++++++++-------- src/app/core/_models/request-params.model.ts | 3 +- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/app/core/_components/tables/tasks-chunks-table/tasks-chunks-table.component.ts b/src/app/core/_components/tables/tasks-chunks-table/tasks-chunks-table.component.ts index 891b8ed1..ea978688 100644 --- a/src/app/core/_components/tables/tasks-chunks-table/tasks-chunks-table.component.ts +++ b/src/app/core/_components/tables/tasks-chunks-table/tasks-chunks-table.component.ts @@ -66,7 +66,7 @@ export class TasksChunksTableComponent extends BaseTableComponent implements OnI if (this.taskId != null) { this.dataSource.setTaskId(this.taskId); this.dataSource.setIsChunksLive(this.isChunksLive); - this.dataSource.loadAll(); + this.dataSource.loadAll().then(); } } @@ -143,12 +143,12 @@ export class TasksChunksTableComponent extends BaseTableComponent implements OnI filter(input: string) { const selectedColumn = this.selectedFilterColumn; if (input && input.length > 0) { - this.dataSource.loadAll({ value: input, field: selectedColumn, operator: FilterType.ICONTAINS }); - return; + this.dataSource.loadAll({ value: input, field: selectedColumn, operator: FilterType.ICONTAINS }).then(); } else { - this.dataSource.loadAll(); // Reload all data if input is empty + this.dataSource.loadAll().then(); } } + handleBackendSqlFilter(event: string) { if (event && event.trim().length > 0) { this.filter(event); diff --git a/src/app/core/_datasources/tasks-chunks.datasource.ts b/src/app/core/_datasources/tasks-chunks.datasource.ts index 496f6b37..d8d125d7 100644 --- a/src/app/core/_datasources/tasks-chunks.datasource.ts +++ b/src/app/core/_datasources/tasks-chunks.datasource.ts @@ -1,8 +1,9 @@ -import { catchError, finalize, of } from 'rxjs'; +import { catchError, finalize, firstValueFrom, of } from 'rxjs'; import { JChunk } from '@models/chunk.model'; import { Filter, FilterType } from '@models/request-params.model'; import { ResponseWrapper } from '@models/response.model'; +import { JTask } from '@models/task.model'; import { JsonAPISerializer } from '@services/api/serializer-service'; import { SERV } from '@services/main.config'; @@ -23,21 +24,36 @@ export class TasksChunksDataSource extends BaseDataSource { this._isChunksLive = number; } - loadAll(query?: Filter): void { - const chunktime = this.uiService.getUIsettings('chunktime').value; + async loadAll(query?: Filter): Promise { + let chunkTime = this.uiService.getUIsettings('chunktime').value; this.loading = true; - // Store the current filter if provided + if (query) { this._currentFilter = query; } - // Use stored filter if no new filter is provided const activeFilter = query || this._currentFilter; + let chunkParams = new RequestParamBuilder().addInitial(this).addInclude('task').addInclude('agent').addFilter({ field: 'taskId', operator: FilterType.EQUAL, value: this._taskId }); + + if (!this._isChunksLive) { + if (this._taskId) { + const response = await firstValueFrom(this.service.get(SERV.TASKS, this._taskId)); + const task = new JsonAPISerializer().deserialize({ + data: response.data, + included: response.included + }); + chunkTime = task.chunkTime; + } + chunkParams + .addFilter({ field: 'progress', value: 10000, operator: FilterType.LESSER }) + .addFilter({ field: 'solveTime', value: Date.now() / 1000 - chunkTime, operator: FilterType.GREATER }); + } + chunkParams = this.applyFilterWithPaginationReset(chunkParams, activeFilter, query); this.service @@ -53,22 +69,14 @@ export class TasksChunksDataSource extends BaseDataSource { included: responseBody.included }); - const chunksToShow: JChunk[] = []; - chunks.forEach((chunk: JChunk) => { + const chunksToShow: JChunk[] = chunks.map((chunk: JChunk) => { if (chunk.agent) { chunk.agentName = chunk.agent.agentName; } if (chunk.task) { chunk.taskName = chunk.task.taskName; } - if (this._isChunksLive) { - chunksToShow.push(chunk); - } else if ( - Date.now() / 1000 - Math.max(chunk.solveTime, chunk.dispatchTime) < chunktime && - chunk.progress < 10000 - ) { - chunksToShow.push(chunk); - } + return chunk; }); const length = response.meta.page.total_elements; @@ -84,8 +92,9 @@ export class TasksChunksDataSource extends BaseDataSource { reload(): void { this.clearSelection(); - this.loadAll(); + this.loadAll().then(); } + clearFilter(): void { this._currentFilter = null; this.setPaginationConfig(this.pageSize, undefined, undefined, undefined, 0); diff --git a/src/app/core/_models/request-params.model.ts b/src/app/core/_models/request-params.model.ts index 4d539297..6725b9b7 100644 --- a/src/app/core/_models/request-params.model.ts +++ b/src/app/core/_models/request-params.model.ts @@ -16,7 +16,8 @@ export enum FilterType { IN = 'in', NOTIN = 'nin', CONTAINS = 'contains', - ICONTAINS = 'icontains' + ICONTAINS = 'icontains', + LESSER = 'lt' } /**