From 5311df68e5e6c7fc85df24e031fdeaf240f019d4 Mon Sep 17 00:00:00 2001 From: "Patrik J. Braun" Date: Sun, 15 Dec 2019 15:53:03 +0100 Subject: [PATCH] improving settings --- src/backend/middlewares/admin/SettingsMWs.ts | 37 ++++++ .../model/diagnostics/ConfigDiagnostics.ts | 11 +- src/backend/routes/admin/SettingsRouter.ts | 6 + .../metafiles/metafile.settings.service.ts | 4 + .../photo/photo.settings.component.html | 5 +- .../settings/photo/photo.settings.service.ts | 12 +- .../tasks/tasks.settings.component.ts | 3 - .../settings/tasks/tasks.settings.service.ts | 5 + .../thumbnail.settings.component.html | 120 +++++++++++------- .../thumbnail/thumbnail.settings.component.ts | 48 ++++++- .../thumbnail/thumbnail.settings.service.ts | 4 + 11 files changed, 199 insertions(+), 56 deletions(-) diff --git a/src/backend/middlewares/admin/SettingsMWs.ts b/src/backend/middlewares/admin/SettingsMWs.ts index 7f6cad6..2b91f0c 100644 --- a/src/backend/middlewares/admin/SettingsMWs.ts +++ b/src/backend/middlewares/admin/SettingsMWs.ts @@ -301,6 +301,43 @@ export class SettingsMWs { } } + public static async updatePhotoSettings(req: Request, res: Response, next: NextFunction) { + if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) { + return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed')); + } + + try { + const settings: { + photoProcessingLibrary: ServerConfig.PhotoProcessingLib, + server: ServerConfig.PhotoConfig, + client: ClientConfig.PhotoConfig + } = req.body.settings; + + await ConfigDiagnostics.testThumbnailLib(settings.photoProcessingLibrary); + await ConfigDiagnostics.testServerPhotoConfig(settings.server); + await ConfigDiagnostics.testClientPhotoConfig(settings.client); + Config.Server.Media.photoProcessingLibrary = settings.photoProcessingLibrary; + Config.Server.Media.Photo = settings.server; + Config.Client.Media.Photo = settings.client; + // only updating explicitly set config (not saving config set by the diagnostics) + const original = Config.original(); + original.Server.Media.photoProcessingLibrary = settings.photoProcessingLibrary; + original.Server.Media.Photo = settings.server; + original.Client.Media.Photo = settings.client; + original.save(); + ProjectPath.reset(); + await ConfigDiagnostics.runDiagnostics(); + Logger.info(LOG_TAG, 'new config:'); + Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); + return next(); + } catch (err) { + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); + } + } + public static async updateBasicSettings(req: Request, res: Response, next: NextFunction) { if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) { return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed')); diff --git a/src/backend/model/diagnostics/ConfigDiagnostics.ts b/src/backend/model/diagnostics/ConfigDiagnostics.ts index dcdbf8b..b91699a 100644 --- a/src/backend/model/diagnostics/ConfigDiagnostics.ts +++ b/src/backend/model/diagnostics/ConfigDiagnostics.ts @@ -120,6 +120,15 @@ export class ConfigDiagnostics { } + + static async testServerPhotoConfig(server: ServerConfig.PhotoConfig) { + + } + + static async testClientPhotoConfig(client: ClientConfig.PhotoConfig) { + + } + public static async testServerThumbnailConfig(server: ServerConfig.ThumbnailConfig) { if (server.personFaceMargin < 0 || server.personFaceMargin > 1) { throw new Error('personFaceMargin should be between 0 and 1'); @@ -142,7 +151,7 @@ export class ConfigDiagnostics { } - static async testTasksConfig(faces: ServerConfig.TaskConfig, config: IPrivateConfig) { + static async testTasksConfig(task: ServerConfig.TaskConfig, config: IPrivateConfig) { } diff --git a/src/backend/routes/admin/SettingsRouter.ts b/src/backend/routes/admin/SettingsRouter.ts index 1618ab0..959c496 100644 --- a/src/backend/routes/admin/SettingsRouter.ts +++ b/src/backend/routes/admin/SettingsRouter.ts @@ -37,6 +37,12 @@ export class SettingsRouter { SettingsMWs.updateVideoSettings, RenderingMWs.renderOK ); + app.put('/api/settings/photo', + AuthenticationMWs.authenticate, + AuthenticationMWs.authorise(UserRoles.Admin), + SettingsMWs.updatePhotoSettings, + RenderingMWs.renderOK + ); app.put('/api/settings/metafile', AuthenticationMWs.authenticate, AuthenticationMWs.authorise(UserRoles.Admin), diff --git a/src/frontend/app/ui/settings/metafiles/metafile.settings.service.ts b/src/frontend/app/ui/settings/metafiles/metafile.settings.service.ts index cbfdca7..a10fb0d 100644 --- a/src/frontend/app/ui/settings/metafiles/metafile.settings.service.ts +++ b/src/frontend/app/ui/settings/metafiles/metafile.settings.service.ts @@ -17,6 +17,10 @@ export class MetaFileSettingsService extends AbstractSettingsService { return this._networkService.putJson('/settings/metafile', {settings: settings}); } diff --git a/src/frontend/app/ui/settings/photo/photo.settings.component.html b/src/frontend/app/ui/settings/photo/photo.settings.component.html index 002a8e0..c705dbc 100644 --- a/src/frontend/app/ui/settings/photo/photo.settings.component.html +++ b/src/frontend/app/ui/settings/photo/photo.settings.component.html @@ -24,8 +24,7 @@ Make sure that gm node module and - GraphicsMagick + GraphicsMagick are installed (npm install sharp). @@ -56,7 +55,7 @@ -
+
{ +export class PhotoSettingsService extends AbstractSettingsService<{ + photoProcessingLibrary: ServerConfig.PhotoProcessingLib, + server: ServerConfig.PhotoConfig, + client: ClientConfig.PhotoConfig +}> { constructor(private _networkService: NetworkService, _settingsService: SettingsService) { super(_settingsService); } - public updateSettings(settings: { server: ServerConfig.PhotoConfig, client: ClientConfig.PhotoConfig }): Promise { + public updateSettings(settings: { + photoProcessingLibrary: ServerConfig.PhotoProcessingLib, + server: ServerConfig.PhotoConfig, + client: ClientConfig.PhotoConfig + }): Promise { return this._networkService.putJson('/settings/photo', {settings: settings}); } diff --git a/src/frontend/app/ui/settings/tasks/tasks.settings.component.ts b/src/frontend/app/ui/settings/tasks/tasks.settings.component.ts index c3b51b9..d41cf7a 100644 --- a/src/frontend/app/ui/settings/tasks/tasks.settings.component.ts +++ b/src/frontend/app/ui/settings/tasks/tasks.settings.component.ts @@ -64,9 +64,6 @@ export class TasksSettingsComponent extends SettingsComponent t.Name === taskName); diff --git a/src/frontend/app/ui/settings/tasks/tasks.settings.service.ts b/src/frontend/app/ui/settings/tasks/tasks.settings.service.ts index 4c66bb7..58a9828 100644 --- a/src/frontend/app/ui/settings/tasks/tasks.settings.service.ts +++ b/src/frontend/app/ui/settings/tasks/tasks.settings.service.ts @@ -22,6 +22,11 @@ export class TasksSettingsService extends AbstractSettingsService
- {{Name}}* + {{Name}} + *
-
- -
- - - High quality may be slow. Especially with Jimp. +
+ +
+ + + High quality may be slow. Especially with Jimp. -
+
-
- -
- - Icon size (used on maps) +
+ +
+ + Icon size (used on maps) -
+
-
- -
- - - Size of the thumbnails.
- The best matching size will be generated. (More sizes give better quality, but use more storage and CPU to render.)
- ';' separated integers. If size is 160, that shorter side of the thumbnail will have 160 pixels. -
+
+ +
+ + + Size of the thumbnails. +
+ The best matching size will be generated. (More sizes give better quality, but use more + storage and CPU to render.) + +
+ ';' separated integers. If size is 160, that shorter side of the thumbnail will have 160 + pixels. + +
-
+
+ + + + + + + +
+
+ +
+
+
- - diff --git a/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.component.ts b/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.component.ts index 268f322..871ebdc 100644 --- a/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.component.ts +++ b/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.component.ts @@ -5,9 +5,12 @@ import {NavigationService} from '../../../model/navigation.service'; import {NotificationService} from '../../../model/notification.service'; import {ClientConfig} from '../../../../../common/config/public/ConfigClass'; import {ThumbnailSettingsService} from './thumbnail.settings.service'; -import {Utils} from '../../../../../common/Utils'; import {I18n} from '@ngx-translate/i18n-polyfill'; import {ServerConfig} from '../../../../../common/config/private/IPrivateConfig'; +import {DefaultsTasks} from '../../../../../common/entities/task/TaskDTO'; +import {ErrorDTO} from '../../../../../common/entities/Error'; +import {ScheduledTasksService} from '../scheduled-tasks.service'; +import {TaskState} from '../../../../../common/entities/settings/TaskProgressDTO'; @Component({ selector: 'app-settings-thumbnail', @@ -19,12 +22,13 @@ import {ServerConfig} from '../../../../../common/config/private/IPrivateConfig' export class ThumbnailSettingsComponent extends SettingsComponent<{ server: ServerConfig.ThumbnailConfig, client: ClientConfig.ThumbnailConfig }> implements OnInit { - ThumbnailProcessingLib: any; + TaskState = TaskState; constructor(_authService: AuthenticationService, _navigation: NavigationService, _settingsService: ThumbnailSettingsService, notification: NotificationService, + public tasksService: ScheduledTasksService, i18n: I18n) { super(i18n('Thumbnail'), _authService, _navigation, _settingsService, notification, i18n, s => ({ client: s.Client.Media.Thumbnail, @@ -44,11 +48,51 @@ export class ThumbnailSettingsComponent .filter(i => !isNaN(i) && i > 0); } + get Progress() { + return this.tasksService.progress.value[DefaultsTasks[DefaultsTasks['Thumbnail Generation']]]; + } + ngOnInit() { super.ngOnInit(); } + async startTask() { + this.inProgress = true; + this.error = ''; + try { + await this.tasksService.start(DefaultsTasks[DefaultsTasks['Thumbnail Generation']], {sizes: this.original.client.thumbnailSizes[0]}); + this.notification.info(this.i18n('Thumbnail generation started')); + this.inProgress = false; + return true; + } catch (err) { + console.log(err); + if (err.message) { + this.error = (err).message; + } + } + this.inProgress = false; + return false; + } + + async cancelTask() { + this.inProgress = true; + this.error = ''; + try { + await this.tasksService.stop(DefaultsTasks[DefaultsTasks['Thumbnail Generation']]); + this.notification.info(this.i18n('Thumbnail generation interrupted')); + this.inProgress = false; + return true; + } catch (err) { + console.log(err); + if (err.message) { + this.error = (err).message; + } + } + + this.inProgress = false; + return false; + } } diff --git a/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.service.ts b/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.service.ts index cee0d62..83984e6 100644 --- a/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.service.ts +++ b/src/frontend/app/ui/settings/thumbnail/thumbnail.settings.service.ts @@ -14,6 +14,10 @@ export class ThumbnailSettingsService } + showInSimplifiedMode(): boolean { + return false; + } + public updateSettings(settings: { server: ServerConfig.ThumbnailConfig, client: ClientConfig.ThumbnailConfig }): Promise { return this._networkService.putJson('/settings/thumbnail', {settings: settings}); }