From 99739575d45ea5a6e0f0047e17f15be90d3ecf1a Mon Sep 17 00:00:00 2001 From: Alex Inkin Date: Sun, 23 Mar 2025 21:03:41 +0400 Subject: [PATCH] chore: refactor system settings routes (#2853) * chore: refactor system settings routes * switch mock to null to see backup page --------- Co-authored-by: Matt Hill --- web/package-lock.json | 19 ++ web/package.json | 1 + web/projects/shared/styles/taiga.scss | 17 + .../portal/components/form.component.ts | 6 +- .../uptime.component.ts | 3 +- .../services/dashboard/service.component.ts | 2 +- .../services/routes/outlet.component.ts | 19 +- .../services/routes/service.component.ts | 5 + .../system/components/button.component.ts | 56 ---- .../system/components/menu.component.ts | 114 ------- .../system/components/sync.component.ts | 34 -- .../system/components/update.component.ts | 109 ------- .../system/routes/acme/info.component.ts | 6 +- .../system/routes/backups/backup.component.ts | 191 +++++++++++ .../system/routes/backups/backup.const.ts | 35 ++ .../system/routes/backups/backup.service.ts | 77 +++++ .../system/routes/backups/backup.types.ts | 27 ++ .../routes/backups/backups.component.ts | 111 +++++++ .../routes/backups/network.component.ts | 259 +++++++++++++++ .../routes/backups/physical.component.ts | 105 ++++++ .../routes/backups/progress.component.ts | 68 ++++ .../routes/backups/recover.component.ts | 154 +++++++++ .../routes/backups/restore.component.ts | 88 +++++ .../system/routes/backups/status.component.ts | 42 +++ .../system/routes/email/email.component.ts | 11 + .../system/routes/email/info.component.ts | 15 +- .../routes/general/general.component.ts | 285 ++++++++++++++++ .../system/routes/general/sync.component.ts | 29 ++ .../general}/update.component.ts | 8 +- .../system/routes/general/wipe.component.ts | 34 ++ ...i.component.ts => interfaces.component.ts} | 45 +-- .../routes/password/password.component.ts | 145 +++++++++ .../system/routes/wifi/info.component.ts | 6 +- .../portal/routes/system/system.component.ts | 101 +++++- .../portal/routes/system/system.const.ts | 60 ++++ .../portal/routes/system/system.routes.ts | 70 ++-- .../portal/routes/system/system.service.ts | 306 ------------------ .../portal/routes/system/system.types.ts | 32 -- .../ui/src/app/services/api/mock-patch.ts | 2 +- .../ui/src/app/utils/verify-password.ts | 31 ++ web/projects/ui/src/styles.scss | 22 +- 41 files changed, 1996 insertions(+), 754 deletions(-) rename web/projects/ui/src/app/routes/portal/{routes/services/dashboard => components}/uptime.component.ts (97%) delete mode 100644 web/projects/ui/src/app/routes/portal/routes/system/components/button.component.ts delete mode 100644 web/projects/ui/src/app/routes/portal/routes/system/components/menu.component.ts delete mode 100644 web/projects/ui/src/app/routes/portal/routes/system/components/sync.component.ts delete mode 100644 web/projects/ui/src/app/routes/portal/routes/system/components/update.component.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/backups/backup.component.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/backups/backup.const.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/backups/backup.service.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/backups/backup.types.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/backups/backups.component.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/backups/network.component.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/backups/physical.component.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/backups/progress.component.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/backups/recover.component.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/backups/restore.component.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/backups/status.component.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/general/general.component.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/general/sync.component.ts rename web/projects/ui/src/app/routes/portal/routes/system/{modals => routes/general}/update.component.ts (94%) create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/general/wipe.component.ts rename web/projects/ui/src/app/routes/portal/routes/system/routes/interfaces/{ui.component.ts => interfaces.component.ts} (61%) create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/routes/password/password.component.ts create mode 100644 web/projects/ui/src/app/routes/portal/routes/system/system.const.ts delete mode 100644 web/projects/ui/src/app/routes/portal/routes/system/system.service.ts delete mode 100644 web/projects/ui/src/app/routes/portal/routes/system/system.types.ts create mode 100644 web/projects/ui/src/app/utils/verify-password.ts diff --git a/web/package-lock.json b/web/package-lock.json index ffed0a59b..119a46e7f 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -46,6 +46,7 @@ "core-js": "^3.21.1", "cron": "^2.2.0", "cronstrue": "^2.21.0", + "deep-equality-data-structures": "1.5.1", "dompurify": "^2.3.6", "fast-json-patch": "^3.1.1", "fuse.js": "^6.4.6", @@ -6931,6 +6932,15 @@ "node": ">=0.10.0" } }, + "node_modules/deep-equality-data-structures": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/deep-equality-data-structures/-/deep-equality-data-structures-1.5.1.tgz", + "integrity": "sha512-P7zsL2/AbZIGHDxbo/LLEhCp11AttRp8GvzXOXudqMT/qiGCLo/pyI4lAZvjUZyQnlIbPna3fv8DMsuRvLt4ww==", + "license": "MIT", + "dependencies": { + "object-hash": "^3.0.0" + } + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -11314,6 +11324,15 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", diff --git a/web/package.json b/web/package.json index 699ade972..71792c535 100644 --- a/web/package.json +++ b/web/package.json @@ -69,6 +69,7 @@ "cron": "^2.2.0", "cronstrue": "^2.21.0", "dompurify": "^2.3.6", + "deep-equality-data-structures": "1.5.1", "fast-json-patch": "^3.1.1", "fuse.js": "^6.4.6", "jose": "^4.9.0", diff --git a/web/projects/shared/styles/taiga.scss b/web/projects/shared/styles/taiga.scss index 68b4b97ca..3edb110f8 100644 --- a/web/projects/shared/styles/taiga.scss +++ b/web/projects/shared/styles/taiga.scss @@ -162,3 +162,20 @@ tui-badge-notification { align-self: center !important; } } + +// TODO Remove after Taiga UI update +[tuiTitle] { + h1, + h2, + h3, + h4, + h5, + h6 { + font: inherit; + margin: 0; + } + + [tuiSubtitle] { + margin: 0; + } +} diff --git a/web/projects/ui/src/app/routes/portal/components/form.component.ts b/web/projects/ui/src/app/routes/portal/components/form.component.ts index a4850ffac..07c27b769 100644 --- a/web/projects/ui/src/app/routes/portal/components/form.component.ts +++ b/web/projects/ui/src/app/routes/portal/components/form.component.ts @@ -99,7 +99,7 @@ export interface FormContext { changeDetection: ChangeDetectionStrategy.OnPush, }) export class FormComponent> implements OnInit { - private readonly confirmService = inject(TuiConfirmService) + private readonly confirm = inject(TuiConfirmService, { optional: true }) private readonly formService = inject(FormService) private readonly invalidService = inject(InvalidService) private readonly context = inject>>( @@ -115,7 +115,7 @@ export class FormComponent> implements OnInit { form = new FormGroup({}) ngOnInit() { - this.confirmService.markAsPristine() + this.confirm?.markAsPristine() this.form = this.formService.createForm(this.spec, this.value) this.process(this.operations) } @@ -136,7 +136,7 @@ export class FormComponent> implements OnInit { } markAsDirty() { - this.confirmService.markAsDirty() + this.confirm?.markAsDirty() } close() { diff --git a/web/projects/ui/src/app/routes/portal/routes/services/dashboard/uptime.component.ts b/web/projects/ui/src/app/routes/portal/components/uptime.component.ts similarity index 97% rename from web/projects/ui/src/app/routes/portal/routes/services/dashboard/uptime.component.ts rename to web/projects/ui/src/app/routes/portal/components/uptime.component.ts index a0136717e..0280df7ad 100644 --- a/web/projects/ui/src/app/routes/portal/routes/services/dashboard/uptime.component.ts +++ b/web/projects/ui/src/app/routes/portal/components/uptime.component.ts @@ -19,10 +19,11 @@ export class UptimeComponent implements OnChanges, OnDestroy { appUptime = '' ngOnChanges() { + clearInterval(this.interval) + if (!this.appUptime) { this.el.textContent = '-' } else { - clearInterval(this.interval) this.el.textContent = uptime(new Date(this.appUptime)) this.interval = setInterval(() => { this.el.textContent = uptime(new Date(this.appUptime)) diff --git a/web/projects/ui/src/app/routes/portal/routes/services/dashboard/service.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/dashboard/service.component.ts index 45d514a8f..a2eee42fd 100644 --- a/web/projects/ui/src/app/routes/portal/routes/services/dashboard/service.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/dashboard/service.component.ts @@ -8,11 +8,11 @@ import { } from '@angular/core' import { RouterLink } from '@angular/router' import { tuiPure } from '@taiga-ui/cdk' +import { UptimeComponent } from 'src/app/routes/portal/components/uptime.component' import { ConnectionService } from 'src/app/services/connection.service' import { PkgDependencyErrors } from 'src/app/services/dep-error.service' import { PackageDataEntry } from 'src/app/services/patch-db/data-model' import { getManifest } from 'src/app/utils/get-package-data' -import { UptimeComponent } from './uptime.component' import { ControlsComponent } from './controls.component' import { StatusComponent } from './status.component' diff --git a/web/projects/ui/src/app/routes/portal/routes/services/routes/outlet.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/routes/outlet.component.ts index e84a5b50d..dc38446d6 100644 --- a/web/projects/ui/src/app/routes/portal/routes/services/routes/outlet.component.ts +++ b/web/projects/ui/src/app/routes/portal/routes/services/routes/outlet.component.ts @@ -33,7 +33,7 @@ const ICONS = { {{ manifest()?.title }} -