@if (!disableResume) {
-
-
+
Cancel Task
diff --git a/src/app/tasks/show.component.spec.ts b/src/app/tasks/show.component.spec.ts
index 743e95172..2ce8128a1 100644
--- a/src/app/tasks/show.component.spec.ts
+++ b/src/app/tasks/show.component.spec.ts
@@ -7,6 +7,7 @@ import { FiltersService } from '@services/filters.service';
import { IconsService } from '@services/icons.service';
import { NotificationService } from '@services/notification.service';
import { ShareUrlService } from '@services/share-url.service';
+import { UserService } from '@services/user.service';
import { BehaviorSubject, Observable, of, throwError } from 'rxjs';
import { TasksGrpcService } from './services/tasks-grpc.service';
import { TasksInspectionService } from './services/tasks-inspection.service';
@@ -25,6 +26,12 @@ describe('AppShowComponent', () => {
generateSharableURL: jest.fn(),
};
+ const mockUserService = {
+ user: {
+ permissions: ['Tasks:GetTask', 'Tasks:CancelTasks', 'Results:GetResult']
+ }
+ };
+
const paramId = 'paramId-12345';
const mockActivatedRoute = {
params: new BehaviorSubject({
@@ -74,6 +81,7 @@ describe('AppShowComponent', () => {
{ provide: ShareUrlService, useValue: mockShareUrlService },
{ provide: ActivatedRoute, useValue: mockActivatedRoute },
{ provide: TasksGrpcService, useValue: mockTasksGrpcService },
+ { provide: UserService, useValue: mockUserService },
TasksInspectionService
]
}).inject(ShowComponent);
diff --git a/src/app/tasks/show.component.ts b/src/app/tasks/show.component.ts
index eebcd9fb7..c315832ae 100644
--- a/src/app/tasks/show.component.ts
+++ b/src/app/tasks/show.component.ts
@@ -19,6 +19,7 @@ import { StorageService } from '@services/storage.service';
import { TableStorageService } from '@services/table-storage.service';
import { TableURLService } from '@services/table-url.service';
import { TableService } from '@services/table.service';
+import { UserService } from '@services/user.service';
import { UtilsService } from '@services/utils.service';
import { TasksFiltersService } from './services/tasks-filters.service';
import { TasksGrpcService } from './services/tasks-grpc.service';
@@ -68,6 +69,7 @@ export class ShowComponent extends AppShowComponent im
private readonly tasksStatusesService = inject(StatusService) as TasksStatusesService;
private readonly filtersService = inject(FiltersService);
+ private readonly userService = inject(UserService);
private _status: StatusLabelColor | undefined;
@@ -83,6 +85,11 @@ export class ShowComponent extends AppShowComponent im
return this._status;
}
+ get hasCancelTaskPermission(): boolean {
+ const permissions = this.userService.user?.permissions ?? [];
+ return permissions.includes('Tasks:CancelTask');
+ }
+
set status(value: TaskStatus | undefined) {
this._status = value ? this.statuses[value] : undefined;
}
@@ -106,7 +113,7 @@ export class ShowComponent extends AppShowComponent im
if (data) {
data.parentTaskIds = data.parentTaskIds.filter(taskId => taskId !== data.sessionId);
this.createResultQueryParams();
- this.canCancel = !this.tasksStatusesService.taskNotEnded(data.status);
+ this.canCancel = !this.tasksStatusesService.taskNotEnded(data.status) && this.hasCancelTaskPermission;
}
}