From a7f71973fe97558cbdb24f8c8228ce9fa4d98a47 Mon Sep 17 00:00:00 2001 From: stumpylog <797416+stumpylog@users.noreply.github.com> Date: Wed, 15 Apr 2026 13:59:02 -0700 Subject: [PATCH] feat(tasks): update Angular types and service for task redesign Replace PaperlessTaskName/PaperlessTaskType/PaperlessTaskStatus enums with new PaperlessTaskType, PaperlessTaskTriggerSource, PaperlessTaskStatus enums. Update PaperlessTask interface to new field names (task_type, trigger_source, input_data, result_message, related_document_ids). Update TasksService to filter by task_type instead of task_name. Update tasks component and system-status-dialog to use new field names. Co-Authored-By: Claude Sonnet 4.6 --- .../admin/tasks/tasks.component.html | 24 ++--- .../admin/tasks/tasks.component.spec.ts | 99 +++++++++++-------- .../components/admin/tasks/tasks.component.ts | 10 +- .../system-status-dialog.component.html | 16 +-- .../system-status-dialog.component.spec.ts | 20 ++-- .../system-status-dialog.component.ts | 10 +- src-ui/src/app/data/paperless-task.ts | 78 +++++++++------ src-ui/src/app/services/tasks.service.spec.ts | 56 +++++------ src-ui/src/app/services/tasks.service.ts | 44 ++++++--- 9 files changed, 197 insertions(+), 160 deletions(-) diff --git a/src-ui/src/app/components/admin/tasks/tasks.component.html b/src-ui/src/app/components/admin/tasks/tasks.component.html index 418dfa8fa..934e9007f 100644 --- a/src-ui/src/app/components/admin/tasks/tasks.component.html +++ b/src-ui/src/app/components/admin/tasks/tasks.component.html @@ -76,33 +76,27 @@ - {{ task.task_file_name }} + {{ task.input_data?.filename }} {{ task.date_created | customDate:'short' }} @if (activeTab !== 'started' && activeTab !== 'queued') { - @if (task.result?.length > 50) { + @if (task.result_message?.length > 50) {
- {{ task.result | slice:0:50 }}… + {{ task.result_message | slice:0:50 }}…
} - @if (task.result?.length <= 50) { - {{ task.result }} + @if (task.result_message?.length <= 50) { + {{ task.result_message }} } -
{{ task.result | slice:0:300 }}@if (task.result.length > 300) {
+                
{{ task.result_message | slice:0:300 }}@if (task.result_message.length > 300) {
                   …
                 }
- @if (task.result?.length > 300) { + @if (task.result_message?.length > 300) {
(click for full output) } - @if (task.duplicate_documents?.length > 0) { -
- - Duplicate(s) detected -
- } } @@ -116,7 +110,7 @@ Dismiss - @if (task.related_document) { + @if (task.related_document_ids?.[0]) { @@ -127,7 +121,7 @@ -
{{ task.result }}
+
{{ task.result_message }}
} diff --git a/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts b/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts index 1a085150e..4c85c939e 100644 --- a/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts +++ b/src-ui/src/app/components/admin/tasks/tasks.component.spec.ts @@ -20,8 +20,8 @@ import { throwError } from 'rxjs' import { routes } from 'src/app/app-routing.module' import { PaperlessTask, - PaperlessTaskName, PaperlessTaskStatus, + PaperlessTaskTriggerSource, PaperlessTaskType, } from 'src/app/data/paperless-task' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' @@ -39,81 +39,100 @@ const tasks: PaperlessTask[] = [ { id: 467, task_id: '11ca1a5b-9f81-442c-b2c8-7e4ae53657f1', - task_file_name: 'test.pdf', + input_data: { filename: 'test.pdf' }, date_created: new Date('2023-03-01T10:26:03.093116Z'), date_done: new Date('2023-03-01T10:26:07.223048Z'), - type: PaperlessTaskType.Auto, - task_name: PaperlessTaskName.ConsumeFile, - status: PaperlessTaskStatus.Failed, - result: 'test.pd: Not consuming test.pdf: It is a duplicate of test (#100)', + task_type: PaperlessTaskType.ConsumeFile, + task_type_display: 'Consume File', + trigger_source: PaperlessTaskTriggerSource.FolderConsume, + trigger_source_display: 'Folder Consume', + status: PaperlessTaskStatus.Failure, + status_display: 'Failure', + result_message: + 'test.pd: Not consuming test.pdf: It is a duplicate of test (#100)', acknowledged: false, - related_document: null, + related_document_ids: [], }, { id: 466, task_id: '10ca1a5b-3c08-442c-b2c8-7e4ae53657f1', - task_file_name: '191092.pdf', + input_data: { filename: '191092.pdf' }, date_created: new Date('2023-03-01T09:26:03.093116Z'), date_done: new Date('2023-03-01T09:26:07.223048Z'), - type: PaperlessTaskType.Auto, - task_name: PaperlessTaskName.ConsumeFile, - status: PaperlessTaskStatus.Failed, - result: + task_type: PaperlessTaskType.ConsumeFile, + task_type_display: 'Consume File', + trigger_source: PaperlessTaskTriggerSource.FolderConsume, + trigger_source_display: 'Folder Consume', + status: PaperlessTaskStatus.Failure, + status_display: 'Failure', + result_message: '191092.pd: Not consuming 191092.pdf: It is a duplicate of 191092 (#311)', acknowledged: false, - related_document: null, + related_document_ids: [], }, { id: 465, task_id: '3612d477-bb04-44e3-985b-ac580dd496d8', - task_file_name: 'Scan Jun 6, 2023 at 3.19 PM.pdf', + input_data: { filename: 'Scan Jun 6, 2023 at 3.19 PM.pdf' }, date_created: new Date('2023-06-06T15:22:05.722323-07:00'), date_done: new Date('2023-06-06T15:22:14.564305-07:00'), - type: PaperlessTaskType.Auto, - task_name: PaperlessTaskName.ConsumeFile, + task_type: PaperlessTaskType.ConsumeFile, + task_type_display: 'Consume File', + trigger_source: PaperlessTaskTriggerSource.FolderConsume, + trigger_source_display: 'Folder Consume', status: PaperlessTaskStatus.Pending, - result: null, + status_display: 'Pending', + result_message: null, acknowledged: false, - related_document: null, + related_document_ids: [], }, { id: 464, task_id: '2eac4716-2aa6-4dcd-9953-264e11656d7e', - task_file_name: 'paperless-mail-l4dkg8ir', + input_data: { filename: 'paperless-mail-l4dkg8ir' }, date_created: new Date('2023-06-04T11:24:32.898089-07:00'), date_done: new Date('2023-06-04T11:24:44.678605-07:00'), - type: PaperlessTaskType.Auto, - task_name: PaperlessTaskName.ConsumeFile, - status: PaperlessTaskStatus.Complete, - result: 'Success. New document id 422 created', + task_type: PaperlessTaskType.ConsumeFile, + task_type_display: 'Consume File', + trigger_source: PaperlessTaskTriggerSource.EmailConsume, + trigger_source_display: 'Email Consume', + status: PaperlessTaskStatus.Success, + status_display: 'Success', + result_message: 'Success. New document id 422 created', acknowledged: false, - related_document: 422, + related_document_ids: [422], }, { id: 463, task_id: '28125528-1575-4d6b-99e6-168906e8fa5c', - task_file_name: 'onlinePaymentSummary.pdf', + input_data: { filename: 'onlinePaymentSummary.pdf' }, date_created: new Date('2023-06-01T13:49:51.631305-07:00'), date_done: new Date('2023-06-01T13:49:54.190220-07:00'), - type: PaperlessTaskType.Auto, - task_name: PaperlessTaskName.ConsumeFile, - status: PaperlessTaskStatus.Complete, - result: 'Success. New document id 421 created', + task_type: PaperlessTaskType.ConsumeFile, + task_type_display: 'Consume File', + trigger_source: PaperlessTaskTriggerSource.FolderConsume, + trigger_source_display: 'Folder Consume', + status: PaperlessTaskStatus.Success, + status_display: 'Success', + result_message: 'Success. New document id 421 created', acknowledged: false, - related_document: 421, + related_document_ids: [421], }, { id: 462, task_id: 'a5b9ca47-0c8e-490f-a04c-6db5d5fc09e5', - task_file_name: 'paperless-mail-_rrpmqk6', + input_data: { filename: 'paperless-mail-_rrpmqk6' }, date_created: new Date('2023-06-07T02:54:35.694916Z'), date_done: null, - type: PaperlessTaskType.Auto, - task_name: PaperlessTaskName.ConsumeFile, + task_type: PaperlessTaskType.ConsumeFile, + task_type_display: 'Consume File', + trigger_source: PaperlessTaskTriggerSource.EmailConsume, + trigger_source_display: 'Email Consume', status: PaperlessTaskStatus.Started, - result: null, + status_display: 'Started', + result_message: null, acknowledged: false, - related_document: null, + related_document_ids: [], }, ] @@ -167,7 +186,7 @@ describe('TasksComponent', () => { fixture.detectChanges() httpTestingController .expectOne( - `${environment.apiBaseUrl}tasks/?task_name=consume_file&acknowledged=false` + `${environment.apiBaseUrl}tasks/?task_type=consume_file&acknowledged=false` ) .flush(tasks) }) @@ -176,7 +195,7 @@ describe('TasksComponent', () => { const tabButtons = fixture.debugElement.queryAll(By.directive(NgbNavItem)) let currentTasksLength = tasks.filter( - (t) => t.status === PaperlessTaskStatus.Failed + (t) => t.status === PaperlessTaskStatus.Failure ).length component.activeTab = TaskTab.Failed fixture.detectChanges() @@ -188,7 +207,7 @@ describe('TasksComponent', () => { ).toHaveLength(currentTasksLength + 1) currentTasksLength = tasks.filter( - (t) => t.status === PaperlessTaskStatus.Complete + (t) => t.status === PaperlessTaskStatus.Success ).length component.activeTab = TaskTab.Completed fixture.detectChanges() @@ -308,7 +327,7 @@ describe('TasksComponent', () => { expect(component.selectedTasks).toEqual( new Set( tasks - .filter((t) => t.status === PaperlessTaskStatus.Failed) + .filter((t) => t.status === PaperlessTaskStatus.Failure) .map((t) => t.id) ) ) @@ -322,7 +341,7 @@ describe('TasksComponent', () => { component.dismissAndGo(tasks[3]) expect(routerSpy).toHaveBeenCalledWith([ 'documents', - tasks[3].related_document, + tasks[3].related_document_ids?.[0], ]) }) diff --git a/src-ui/src/app/components/admin/tasks/tasks.component.ts b/src-ui/src/app/components/admin/tasks/tasks.component.ts index 6f144c58c..decba1eb8 100644 --- a/src-ui/src/app/components/admin/tasks/tasks.component.ts +++ b/src-ui/src/app/components/admin/tasks/tasks.component.ts @@ -175,7 +175,7 @@ export class TasksComponent dismissAndGo(task: PaperlessTask) { this.dismissTask(task) - this.router.navigate(['documents', task.related_document]) + this.router.navigate(['documents', task.related_document_ids?.[0]]) } expandTask(task: PaperlessTask) { @@ -207,11 +207,13 @@ export class TasksComponent if (this._filterText.length) { tasks = tasks.filter((t) => { if (this.filterTargetID == TaskFilterTargetID.Name) { - return t.task_file_name - .toLowerCase() + return (t.input_data?.filename as string) + ?.toLowerCase() .includes(this._filterText.toLowerCase()) } else if (this.filterTargetID == TaskFilterTargetID.Result) { - return t.result.toLowerCase().includes(this._filterText.toLowerCase()) + return t.result_message + ?.toLowerCase() + .includes(this._filterText.toLowerCase()) } }) } diff --git a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.html b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.html index 636e574f5..5ec800b2e 100644 --- a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.html +++ b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -169,10 +169,10 @@ } @if (currentUserIsSuperUser) { - @if (isRunning(PaperlessTaskName.IndexOptimize)) { + @if (isRunning(PaperlessTaskType.IndexOptimize)) {
} @else { - @@ -203,10 +203,10 @@ } @if (currentUserIsSuperUser) { - @if (isRunning(PaperlessTaskName.TrainClassifier)) { + @if (isRunning(PaperlessTaskType.TrainClassifier)) {
} @else { - @@ -237,10 +237,10 @@ } @if (currentUserIsSuperUser) { - @if (isRunning(PaperlessTaskName.SanityCheck)) { + @if (isRunning(PaperlessTaskType.SanityCheck)) {
} @else { - @@ -285,10 +285,10 @@ } @if (currentUserIsSuperUser) { - @if (isRunning(PaperlessTaskName.LLMIndexUpdate)) { + @if (isRunning(PaperlessTaskType.LlmIndex)) {
} @else { - diff --git a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts index 0fd331b10..58310be8f 100644 --- a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts +++ b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.spec.ts @@ -25,7 +25,7 @@ import { import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' import { Subject, of, throwError } from 'rxjs' -import { PaperlessTaskName } from 'src/app/data/paperless-task' +import { PaperlessTaskType } from 'src/app/data/paperless-task' import { InstallType, SystemStatus, @@ -138,9 +138,9 @@ describe('SystemStatusDialogComponent', () => { }) it('should check if task is running', () => { - component.runTask(PaperlessTaskName.IndexOptimize) - expect(component.isRunning(PaperlessTaskName.IndexOptimize)).toBeTruthy() - expect(component.isRunning(PaperlessTaskName.SanityCheck)).toBeFalsy() + component.runTask(PaperlessTaskType.IndexOptimize) + expect(component.isRunning(PaperlessTaskType.IndexOptimize)).toBeTruthy() + expect(component.isRunning(PaperlessTaskType.SanityCheck)).toBeFalsy() }) it('should support running tasks, refresh status and show toasts', () => { @@ -151,22 +151,22 @@ describe('SystemStatusDialogComponent', () => { // fail first runSpy.mockReturnValue(throwError(() => new Error('error'))) - component.runTask(PaperlessTaskName.IndexOptimize) - expect(runSpy).toHaveBeenCalledWith(PaperlessTaskName.IndexOptimize) + component.runTask(PaperlessTaskType.IndexOptimize) + expect(runSpy).toHaveBeenCalledWith(PaperlessTaskType.IndexOptimize) expect(toastErrorSpy).toHaveBeenCalledWith( - `Failed to start task ${PaperlessTaskName.IndexOptimize}, see the logs for more details`, + `Failed to start task ${PaperlessTaskType.IndexOptimize}, see the logs for more details`, expect.any(Error) ) // succeed runSpy.mockReturnValue(of({})) getStatusSpy.mockReturnValue(of(status)) - component.runTask(PaperlessTaskName.IndexOptimize) - expect(runSpy).toHaveBeenCalledWith(PaperlessTaskName.IndexOptimize) + component.runTask(PaperlessTaskType.IndexOptimize) + expect(runSpy).toHaveBeenCalledWith(PaperlessTaskType.IndexOptimize) expect(getStatusSpy).toHaveBeenCalled() expect(toastSpy).toHaveBeenCalledWith( - `Task ${PaperlessTaskName.IndexOptimize} started` + `Task ${PaperlessTaskType.IndexOptimize} started` ) }) diff --git a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts index d53bb74bf..88426186c 100644 --- a/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts +++ b/src-ui/src/app/components/common/system-status-dialog/system-status-dialog.component.ts @@ -8,7 +8,7 @@ import { } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' import { Subject, takeUntil } from 'rxjs' -import { PaperlessTaskName } from 'src/app/data/paperless-task' +import { PaperlessTaskType } from 'src/app/data/paperless-task' import { SystemStatus, SystemStatusItemStatus, @@ -49,14 +49,14 @@ export class SystemStatusDialogComponent implements OnInit, OnDestroy { private settingsService = inject(SettingsService) public SystemStatusItemStatus = SystemStatusItemStatus - public PaperlessTaskName = PaperlessTaskName + public PaperlessTaskType = PaperlessTaskType public status: SystemStatus public frontendVersion: string = environment.version public versionMismatch: boolean = false public copied: boolean = false - private runningTasks: Set = new Set() + private runningTasks: Set = new Set() private unsubscribeNotifier: Subject = new Subject() get currentUserIsSuperUser(): boolean { @@ -107,11 +107,11 @@ export class SystemStatusDialogComponent implements OnInit, OnDestroy { return now.getTime() - date.getTime() > hours * 60 * 60 * 1000 } - public isRunning(taskName: PaperlessTaskName): boolean { + public isRunning(taskName: PaperlessTaskType): boolean { return this.runningTasks.has(taskName) } - public runTask(taskName: PaperlessTaskName) { + public runTask(taskName: PaperlessTaskType) { this.runningTasks.add(taskName) this.toastService.showInfo(`Task ${taskName} started`) this.tasksService.run(taskName).subscribe({ diff --git a/src-ui/src/app/data/paperless-task.ts b/src-ui/src/app/data/paperless-task.ts index 19dd3921e..f44b5a6f4 100644 --- a/src-ui/src/app/data/paperless-task.ts +++ b/src-ui/src/app/data/paperless-task.ts @@ -1,49 +1,63 @@ -import { Document } from './document' import { ObjectWithId } from './object-with-id' export enum PaperlessTaskType { - Auto = 'auto_task', - ScheduledTask = 'scheduled_task', - ManualTask = 'manual_task', -} - -export enum PaperlessTaskName { ConsumeFile = 'consume_file', TrainClassifier = 'train_classifier', - SanityCheck = 'check_sanity', + SanityCheck = 'sanity_check', IndexOptimize = 'index_optimize', - LLMIndexUpdate = 'llmindex_update', + IndexRebuild = 'index_rebuild', + MailFetch = 'mail_fetch', + LlmIndex = 'llm_index', +} + +export enum PaperlessTaskTriggerSource { + Scheduled = 'scheduled', + WebUI = 'web_ui', + ApiUpload = 'api_upload', + FolderConsume = 'folder_consume', + EmailConsume = 'email_consume', + System = 'system', + Manual = 'manual', } export enum PaperlessTaskStatus { - Pending = 'PENDING', - Started = 'STARTED', - Complete = 'SUCCESS', - Failed = 'FAILURE', + Pending = 'pending', + Started = 'started', + Success = 'success', + Failure = 'failure', + Revoked = 'revoked', } export interface PaperlessTask extends ObjectWithId { - type: PaperlessTaskType - - status: PaperlessTaskStatus - - acknowledged: boolean - task_id: string - - task_file_name: string - - task_name: PaperlessTaskName - + task_type: PaperlessTaskType + task_type_display: string + trigger_source: PaperlessTaskTriggerSource + trigger_source_display: string + status: PaperlessTaskStatus + status_display: string date_created: Date - + date_started?: Date date_done?: Date - - result?: string - - related_document?: number - - duplicate_documents?: Document[] - + duration_seconds?: number + wait_time_seconds?: number + input_data: Record + result_data?: Record + result_message?: string + related_document_ids: number[] + acknowledged: boolean owner?: number } + +export interface PaperlessTaskSummary { + task_type: PaperlessTaskType + total_count: number + pending_count: number + success_count: number + failure_count: number + avg_duration_seconds: number | null + avg_wait_time_seconds: number | null + last_run: Date | null + last_success: Date | null + last_failure: Date | null +} diff --git a/src-ui/src/app/services/tasks.service.spec.ts b/src-ui/src/app/services/tasks.service.spec.ts index 640f84587..09bd29441 100644 --- a/src-ui/src/app/services/tasks.service.spec.ts +++ b/src-ui/src/app/services/tasks.service.spec.ts @@ -5,11 +5,7 @@ import { } from '@angular/common/http/testing' import { TestBed } from '@angular/core/testing' import { environment } from 'src/environments/environment' -import { - PaperlessTaskName, - PaperlessTaskStatus, - PaperlessTaskType, -} from '../data/paperless-task' +import { PaperlessTaskStatus, PaperlessTaskType } from '../data/paperless-task' import { TasksService } from './tasks.service' describe('TasksService', () => { @@ -37,7 +33,7 @@ describe('TasksService', () => { it('calls tasks api endpoint on reload', () => { tasksService.reload() const req = httpTestingController.expectOne( - `${environment.apiBaseUrl}tasks/?task_name=consume_file&acknowledged=false` + `${environment.apiBaseUrl}tasks/?task_type=consume_file&acknowledged=false` ) expect(req.request.method).toEqual('GET') }) @@ -46,7 +42,7 @@ describe('TasksService', () => { tasksService.loading = true tasksService.reload() httpTestingController.expectNone( - `${environment.apiBaseUrl}tasks/?task_name=consume_file&acknowledged=false` + `${environment.apiBaseUrl}tasks/?task_type=consume_file&acknowledged=false` ) }) @@ -63,7 +59,7 @@ describe('TasksService', () => { // reload is then called httpTestingController .expectOne( - `${environment.apiBaseUrl}tasks/?task_name=consume_file&acknowledged=false` + `${environment.apiBaseUrl}tasks/?task_type=consume_file&acknowledged=false` ) .flush([]) }) @@ -72,56 +68,56 @@ describe('TasksService', () => { expect(tasksService.total).toEqual(0) const mockTasks = [ { - type: PaperlessTaskType.Auto, - task_name: PaperlessTaskName.ConsumeFile, - status: PaperlessTaskStatus.Complete, + task_type: PaperlessTaskType.ConsumeFile, + status: PaperlessTaskStatus.Success, acknowledged: false, task_id: '1234', - task_file_name: 'file1.pdf', + input_data: { filename: 'file1.pdf' }, date_created: new Date(), + related_document_ids: [], }, { - type: PaperlessTaskType.Auto, - task_name: PaperlessTaskName.ConsumeFile, - status: PaperlessTaskStatus.Failed, + task_type: PaperlessTaskType.ConsumeFile, + status: PaperlessTaskStatus.Failure, acknowledged: false, task_id: '1235', - task_file_name: 'file2.pdf', + input_data: { filename: 'file2.pdf' }, date_created: new Date(), + related_document_ids: [], }, { - type: PaperlessTaskType.Auto, - task_name: PaperlessTaskName.ConsumeFile, + task_type: PaperlessTaskType.ConsumeFile, status: PaperlessTaskStatus.Pending, acknowledged: false, task_id: '1236', - task_file_name: 'file3.pdf', + input_data: { filename: 'file3.pdf' }, date_created: new Date(), + related_document_ids: [], }, { - type: PaperlessTaskType.Auto, - task_name: PaperlessTaskName.ConsumeFile, + task_type: PaperlessTaskType.ConsumeFile, status: PaperlessTaskStatus.Started, acknowledged: false, task_id: '1237', - task_file_name: 'file4.pdf', + input_data: { filename: 'file4.pdf' }, date_created: new Date(), + related_document_ids: [], }, { - type: PaperlessTaskType.Auto, - task_name: PaperlessTaskName.ConsumeFile, - status: PaperlessTaskStatus.Complete, + task_type: PaperlessTaskType.ConsumeFile, + status: PaperlessTaskStatus.Success, acknowledged: false, task_id: '1238', - task_file_name: 'file5.pdf', + input_data: { filename: 'file5.pdf' }, date_created: new Date(), + related_document_ids: [], }, ] tasksService.reload() const req = httpTestingController.expectOne( - `${environment.apiBaseUrl}tasks/?task_name=consume_file&acknowledged=false` + `${environment.apiBaseUrl}tasks/?task_type=consume_file&acknowledged=false` ) req.flush(mockTasks) @@ -134,9 +130,9 @@ describe('TasksService', () => { }) it('supports running tasks', () => { - tasksService.run(PaperlessTaskName.SanityCheck).subscribe((res) => { + tasksService.run(PaperlessTaskType.SanityCheck).subscribe((res) => { expect(res).toEqual({ - result: 'success', + task_id: 'abc-123', }) }) const req = httpTestingController.expectOne( @@ -144,7 +140,7 @@ describe('TasksService', () => { ) expect(req.request.method).toEqual('POST') req.flush({ - result: 'success', + task_id: 'abc-123', }) }) }) diff --git a/src-ui/src/app/services/tasks.service.ts b/src-ui/src/app/services/tasks.service.ts index 305258d7b..87a15edd9 100644 --- a/src-ui/src/app/services/tasks.service.ts +++ b/src-ui/src/app/services/tasks.service.ts @@ -4,8 +4,8 @@ import { Observable, Subject } from 'rxjs' import { first, takeUntil, tap } from 'rxjs/operators' import { PaperlessTask, - PaperlessTaskName, PaperlessTaskStatus, + PaperlessTaskType, } from 'src/app/data/paperless-task' import { environment } from 'src/environments/environment' @@ -18,7 +18,7 @@ export class TasksService { private baseUrl: string = environment.apiBaseUrl private endpoint: string = 'tasks' - public loading: boolean + public loading: boolean = false private fileTasks: PaperlessTask[] = [] @@ -33,21 +33,27 @@ export class TasksService { } public get queuedFileTasks(): PaperlessTask[] { - return this.fileTasks.filter((t) => t.status == PaperlessTaskStatus.Pending) + return this.fileTasks.filter( + (t) => t.status === PaperlessTaskStatus.Pending + ) } public get startedFileTasks(): PaperlessTask[] { - return this.fileTasks.filter((t) => t.status == PaperlessTaskStatus.Started) + return this.fileTasks.filter( + (t) => t.status === PaperlessTaskStatus.Started + ) } public get completedFileTasks(): PaperlessTask[] { return this.fileTasks.filter( - (t) => t.status == PaperlessTaskStatus.Complete + (t) => t.status === PaperlessTaskStatus.Success ) } public get failedFileTasks(): PaperlessTask[] { - return this.fileTasks.filter((t) => t.status == PaperlessTaskStatus.Failed) + return this.fileTasks.filter( + (t) => t.status === PaperlessTaskStatus.Failure + ) } public reload() { @@ -56,18 +62,16 @@ export class TasksService { this.http .get( - `${this.baseUrl}${this.endpoint}/?task_name=consume_file&acknowledged=false` + `${this.baseUrl}${this.endpoint}/?task_type=${PaperlessTaskType.ConsumeFile}&acknowledged=false` ) .pipe(takeUntil(this.unsubscribeNotifer), first()) .subscribe((r) => { - this.fileTasks = r.filter( - (t) => t.task_name == PaperlessTaskName.ConsumeFile - ) + this.fileTasks = r this.loading = false }) } - public dismissTasks(task_ids: Set) { + public dismissTasks(task_ids: Set): Observable { return this.http .post(`${this.baseUrl}tasks/acknowledge/`, { tasks: [...task_ids], @@ -81,16 +85,24 @@ export class TasksService { ) } + public dismissAllTasks(): Observable { + return this.http.post(`${this.baseUrl}tasks/acknowledge_all/`, {}).pipe( + first(), + takeUntil(this.unsubscribeNotifer), + tap(() => { + this.reload() + }) + ) + } + public cancelPending(): void { this.unsubscribeNotifer.next(true) } - public run(taskName: PaperlessTaskName): Observable { - return this.http.post( + public run(taskType: PaperlessTaskType): Observable<{ task_id: string }> { + return this.http.post<{ task_id: string }>( `${environment.apiBaseUrl}${this.endpoint}/run/`, - { - task_name: taskName, - } + { task_type: taskType } ) } }