diff --git a/src/backend/model/tasks/tasks/IndexingTask.ts b/src/backend/model/tasks/tasks/IndexingTask.ts index c31cadae..d821248a 100644 --- a/src/backend/model/tasks/tasks/IndexingTask.ts +++ b/src/backend/model/tasks/tasks/IndexingTask.ts @@ -1,4 +1,4 @@ -import {TaskProgressDTO} from '../../../../common/entities/settings/TaskProgressDTO'; +import {TaskProgressDTO, TaskState} from '../../../../common/entities/settings/TaskProgressDTO'; import {ObjectManagers} from '../../ObjectManagers'; import * as path from 'path'; import * as fs from 'fs'; @@ -45,7 +45,7 @@ export class IndexingTask extends Task<{ createThumbnails: boolean }> { this.progress.comment = directory; this.progress.left = this.directoriesToIndex.length; const scanned = await ObjectManagers.getInstance().IndexingManager.indexDirectory(directory); - if (this.running === false) { + if (this.state !== TaskState.running) { return null; } this.progress.progress++; diff --git a/src/backend/model/tasks/tasks/Task.ts b/src/backend/model/tasks/tasks/Task.ts index 8312af25..039b5663 100644 --- a/src/backend/model/tasks/tasks/Task.ts +++ b/src/backend/model/tasks/tasks/Task.ts @@ -1,4 +1,4 @@ -import {TaskProgressDTO} from '../../../../common/entities/settings/TaskProgressDTO'; +import {TaskProgressDTO, TaskState} from '../../../../common/entities/settings/TaskProgressDTO'; import {Logger} from '../../../Logger'; import {ITask} from './ITask'; import {ConfigTemplateEntry, TaskDTO} from '../../../../common/entities/task/TaskDTO'; @@ -8,7 +8,7 @@ declare const process: any; export abstract class Task implements ITask { protected progress: TaskProgressDTO = null; - protected running = false; + protected state = TaskState.idle; protected config: T; protected prResolve: () => void; @@ -25,24 +25,26 @@ export abstract class Task implements ITask { } public start(config: T): Promise { - if (this.running === false && this.Supported) { + if (this.state === TaskState.idle && this.Supported) { Logger.info('[Task]', 'Running task: ' + this.Name); this.config = config; this.progress = { progress: 0, left: 0, comment: '', + state: TaskState.running, time: { start: Date.now(), current: Date.now() } }; - this.running = true; - this.init().catch(console.error); - this.run(); - return new Promise((resolve) => { + const pr = new Promise((resolve) => { this.prResolve = resolve; }); + this.init().catch(console.error); + this.state = TaskState.running; + this.run(); + return pr; } else { Logger.info('[Task]', 'Task already running: ' + this.Name); return Promise.reject(); @@ -51,8 +53,8 @@ export abstract class Task implements ITask { public stop(): void { Logger.info('[Task]', 'Stopping task: ' + this.Name); - this.running = false; - this.onFinish(); + this.state = TaskState.stopping; + this.progress.state = TaskState.stopping; } public toJSON(): TaskDTO { @@ -75,13 +77,13 @@ export abstract class Task implements ITask { private run() { process.nextTick(async () => { try { - if (!this.running) { + if (this.state === TaskState.idle) { this.progress = null; return; } this.progress = await this.step(); if (this.progress == null) { // finished - this.running = false; + this.state = TaskState.idle; this.onFinish(); return; } diff --git a/src/backend/model/tasks/tasks/VideoConvertingTask.ts b/src/backend/model/tasks/tasks/VideoConvertingTask.ts index 245dae2f..f13f6ad6 100644 --- a/src/backend/model/tasks/tasks/VideoConvertingTask.ts +++ b/src/backend/model/tasks/tasks/VideoConvertingTask.ts @@ -1,4 +1,4 @@ -import {TaskProgressDTO} from '../../../../common/entities/settings/TaskProgressDTO'; +import {TaskProgressDTO, TaskState} from '../../../../common/entities/settings/TaskProgressDTO'; import {Config} from '../../../../common/config/private/Config'; import {ConfigTemplateEntry, DefaultsTasks} from '../../../../common/entities/task/TaskDTO'; import {Task} from './Task'; @@ -33,7 +33,7 @@ export class VideoConvertingTask extends Task { protected async step(): Promise { if ((this.directoryQueue.length === 0 && this.videoQueue.length === 0) - || this.running === false) { + || this.state !== TaskState.running) { if (global.gc) { global.gc(); } diff --git a/src/common/entities/settings/TaskProgressDTO.ts b/src/common/entities/settings/TaskProgressDTO.ts index 65dd883f..0f5991db 100644 --- a/src/common/entities/settings/TaskProgressDTO.ts +++ b/src/common/entities/settings/TaskProgressDTO.ts @@ -1,6 +1,12 @@ +export enum TaskState { + idle = 1, running = 2, stopping = 3 +} + + export interface TaskProgressDTO { progress: number; left: number; + state: TaskState; comment: string; time: { start: number, diff --git a/src/frontend/app/app.module.ts b/src/frontend/app/app.module.ts index 13e5f7b9..0c421483 100644 --- a/src/frontend/app/app.module.ts +++ b/src/frontend/app/app.module.ts @@ -86,6 +86,7 @@ import {ScheduledTasksService} from './ui/settings/scheduled-tasks.service'; import {TimepickerModule} from 'ngx-bootstrap/timepicker'; import {TimeStampDatePickerComponent} from './ui/utils/timestamp-datepicker/datepicker.component'; import {TimeStampTimePickerComponent} from './ui/utils/timestamp-timepicker/timepicker.component'; +import {TasksProgressComponent} from './ui/settings/tasks/progress/progress.tasks.settings.component'; @@ -195,6 +196,7 @@ export function translationsFactory(locale: string) { FacesSettingsComponent, OtherSettingsComponent, IndexingSettingsComponent, + TasksProgressComponent, TasksSettingsComponent, // Pipes StringifyRole, diff --git a/src/frontend/app/ui/settings/indexing/indexing.settings.component.html b/src/frontend/app/ui/settings/indexing/indexing.settings.component.html index 33307b3b..c185c01b 100644 --- a/src/frontend/app/ui/settings/indexing/indexing.settings.component.html +++ b/src/frontend/app/ui/settings/indexing/indexing.settings.component.html @@ -1,7 +1,8 @@
- Folder indexing* + Folder indexing + *
@@ -57,9 +58,13 @@ [(ngModel)]="excludeFolderList" name="excludeFolderList" required> - Folders to exclude from indexing
+ Folders to exclude from indexing +
';' separated strings. If an entry starts with '/' it is treated as an absolute path. If it doesn't start with '/' but contains a '/', the path is relative to the image directory. If it doesn't contain a '/', any folder with this name will be excluded. + i18n>';' separated strings. If an entry starts with '/' it is treated as an absolute path. If it doesn't + start with '/' but contains a '/', the path is relative to the image directory. If it doesn't contain a + '/', any folder with this name will be excluded. +
@@ -72,9 +77,12 @@ [(ngModel)]="excludeFileList" name="excludeFileList" required> - Files that mark a folder to be excluded from indexing
+ Files that mark a folder to be excluded from indexing +
';' separated strings. Any folder that contains a file with this name will be excluded from indexing. + i18n>';' separated strings. Any folder that contains a file with this name will be excluded from + indexing. +
@@ -101,21 +109,7 @@
- indexing: {{Progress.comment}}
- elapsed: {{tasksService.calcTimeElapsed(Progress) | duration}}
- left: {{tasksService.calcTimeLeft(Progress) | duration}} -
-
- {{Progress.progress}} - /{{Progress.progress + Progress.left}} -
-
+
@@ -135,7 +129,7 @@
diff --git a/src/frontend/app/ui/settings/tasks/progress/progress.tasks.settings.component.ts b/src/frontend/app/ui/settings/tasks/progress/progress.tasks.settings.component.ts new file mode 100644 index 00000000..ec451a68 --- /dev/null +++ b/src/frontend/app/ui/settings/tasks/progress/progress.tasks.settings.component.ts @@ -0,0 +1,44 @@ +import {Component, Input} from '@angular/core'; +import {TaskProgressDTO, TaskState} from '../../../../../../common/entities/settings/TaskProgressDTO'; + +@Component({ + selector: 'app-settings-tasks-progress', + templateUrl: './progress.tasks.settings.component.html', + styleUrls: ['./progress.tasks.settings.component.css'] +}) +export class TasksProgressComponent { + + @Input() progress: TaskProgressDTO; + TaskState = TaskState; + + constructor() { + + } + + + get TimeAll(): number { + if (!this.progress) { + return 0; + } + return (this.progress.time.current - this.progress.time.start) / + this.progress.progress * (this.progress.left + this.progress.progress); + } + + get TimeLeft(): number { + if (!this.progress) { + return 0; + } + return (this.progress.time.current - this.progress.time.start) / this.progress.progress * this.progress.left; + } + + get TimeElapsed() { + if (!this.progress) { + return 0; + } + return (this.progress.time.current - this.progress.time.start); + } + +} + + + diff --git a/src/frontend/app/ui/settings/tasks/tasks.settings.component.css b/src/frontend/app/ui/settings/tasks/tasks.settings.component.css index ec813352..681efadb 100644 --- a/src/frontend/app/ui/settings/tasks/tasks.settings.component.css +++ b/src/frontend/app/ui/settings/tasks/tasks.settings.component.css @@ -1,8 +1,4 @@ -.progress-details { - font-weight: bold; -} - .card { margin-bottom: 1rem; } diff --git a/src/frontend/app/ui/settings/tasks/tasks.settings.component.html b/src/frontend/app/ui/settings/tasks/tasks.settings.component.html index f1154c35..7692d46d 100644 --- a/src/frontend/app/ui/settings/tasks/tasks.settings.component.html +++ b/src/frontend/app/ui/settings/tasks/tasks.settings.component.html @@ -103,7 +103,7 @@ @@ -115,7 +115,8 @@
- +
- +
- +
- + + +
@@ -141,21 +141,7 @@

- status: {{Progress.comment}}
- elapsed: {{tasksService.calcTimeElapsed(Progress) | duration}}
- left: {{tasksService.calcTimeLeft(Progress) | duration}} -
-
- {{Progress.progress}} - /{{Progress.progress + Progress.left}} -
-
+
diff --git a/src/frontend/app/ui/settings/video/video.settings.component.ts b/src/frontend/app/ui/settings/video/video.settings.component.ts index 5b12ae4e..f2f2548a 100644 --- a/src/frontend/app/ui/settings/video/video.settings.component.ts +++ b/src/frontend/app/ui/settings/video/video.settings.component.ts @@ -10,6 +10,7 @@ import {ScheduledTasksService} from '../scheduled-tasks.service'; import {DefaultsTasks} from '../../../../../common/entities/task/TaskDTO'; import {ErrorDTO} from '../../../../../common/entities/Error'; import {ServerConfig} from '../../../../../common/config/private/IPrivateConfig'; +import { TaskState } from '../../../../../common/entities/settings/TaskProgressDTO'; @Component({ @@ -26,6 +27,8 @@ export class VideoSettingsComponent extends SettingsComponent<{ server: ServerCo formats: ServerConfig.formatType[] = ['mp4', 'webm']; fps = [24, 25, 30, 48, 50, 60]; + TaskState = TaskState; + constructor(_authService: AuthenticationService, _navigation: NavigationService, _settingsService: VideoSettingsService,