<app-page-header title="File Tasks" i18n-title> <div class="btn-toolbar col col-md-auto"> <button class="btn btn-sm btn-outline-secondary me-2" (click)="clearSelection()" [hidden]="selectedTasks.size == 0"> <svg class="sidebaricon" fill="currentColor"> <use xlink:href="assets/bootstrap-icons.svg#x"/> </svg> <ng-container i18n>Clear selection</ng-container> </button> <button class="btn btn-sm btn-outline-primary me-4" (click)="dismissTasks()" [disabled]="tasksService.total == 0"> <svg class="sidebaricon" fill="currentColor"> <use xlink:href="assets/bootstrap-icons.svg#check2-all"/> </svg> <ng-container i18n>{{dismissButtonText}}</ng-container> </button> <button class="btn btn-sm btn-outline-primary" (click)="tasksService.reload()"> <svg class="sidebaricon" fill="currentColor"> <use xlink:href="assets/bootstrap-icons.svg#arrow-clockwise"/> </svg> <ng-container i18n>Refresh</ng-container> </button> </div> </app-page-header> <ng-container *ngIf="!tasksService.completedFileTasks && tasksService.loading"> <div class="spinner-border spinner-border-sm fw-normal ms-2 me-auto" role="status"></div> <div class="visually-hidden" i18n>Loading...</div> </ng-container> <ng-template let-tasks="tasks" #tasksTemplate> <table class="table table-striped align-middle border shadow-sm"> <thead> <tr> <th scope="col"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="all-tasks" [disabled]="currentTasks.length == 0" (click)="toggleAll($event); $event.stopPropagation();"> <label class="form-check-label" for="all-tasks"></label> </div> </th> <th scope="col" width="25%" i18n>Name</th> <th scope="col" width="20%" i18n>Created</th> <th scope="col" width="45%" i18n>Results</th> <th scope="col" width="10%" i18n>Actions</th> </tr> </thead> <tbody> <tr *ngFor="let task of tasks"> <th scope="row"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="task{{task.id}}" [checked]="selectedTasks.has(task.id)" (click)="toggleSelected(task, $event); $event.stopPropagation();"> <label class="form-check-label" for="task{{task.id}}"></label> </div> </th> <td>{{ task.name }}</td> <td>{{ task.created | customDate:'short' }}</td> <td> <button *ngIf="task.result.length > 50" class="btn btn-link p-1 mr-2" [ngbPopover]="resultPopover" popoverClass="shadow font-monospace small" triggers="mouseenter:mouseleave:click"> <svg fill="currentColor" class="me-1" width="1.2em" height="1.2em" style="vertical-align: text-top;" viewBox="0 0 16 16"> <use xlink:href="assets/bootstrap-icons.svg#info-circle" /> </svg> </button><span class="small d-none d-md-inline-block font-monospace">{{ task.result | slice:0:50 }}</span> <ng-template #resultPopover><div class="small">{{ task.result }}</div></ng-template> </td> <td> <button class="btn btn-sm btn-outline-secondary" (click)="dismissTask(task)"> <svg class="sidebaricon" fill="currentColor"> <use xlink:href="assets/bootstrap-icons.svg#check"/> </svg> <ng-container i18n>Dismiss</ng-container> </button> </td> </tr> </tbody> </table> </ng-template> <ul ngbNav #nav="ngbNav" [(activeId)]="activeTab" class="nav-tabs"> <li ngbNavItem="incomplete"> <a ngbNavLink i18n>Incomplete <span class="badge bg-secondary ms-1">{{tasksService.incompleteFileTasks.length}}</span></a> <ng-template ngbNavContent> <ng-container [ngTemplateOutlet]="tasksTemplate" [ngTemplateOutletContext]="{tasks:tasksService.incompleteFileTasks}"></ng-container> </ng-template> </li> <li ngbNavItem="completed"> <a ngbNavLink i18n>Completed <span class="badge bg-secondary ms-1">{{tasksService.completedFileTasks.length}}</span></a> <ng-template ngbNavContent> <ng-container [ngTemplateOutlet]="tasksTemplate" [ngTemplateOutletContext]="{tasks:tasksService.completedFileTasks}"></ng-container> </ng-template> </li> <li ngbNavItem="failed"> <a ngbNavLink i18n>Failed <span class="badge bg-secondary ms-1">{{tasksService.failedFileTasks.length}}</span></a> <ng-template ngbNavContent> <ng-container [ngTemplateOutlet]="tasksTemplate" [ngTemplateOutletContext]="{tasks:tasksService.failedFileTasks}"></ng-container> </ng-template> </li> </ul> <div [ngbNavOutlet]="nav"></div>