From a2c50d6df91b43741852747ab40f14a86903fb1f Mon Sep 17 00:00:00 2001
From: milanmajchrak <90026355+milanmajchrak@users.noreply.github.com>
Date: Wed, 24 Sep 2025 11:06:54 +0200
Subject: [PATCH 1/4] VSB-TUO/Created feature for updating configuration files
(#1008)
* Working, added a new page, component to be possible update configuration files which are loaded from the BE.
* Small changes to make it prettier and mor intuitive
* Removed hardcoded icons
* Updated messages
---
src/app/admin/admin-routing-paths.ts | 5 +
src/app/admin/admin-routing.module.ts | 6 +
.../admin-update-config-routing.module.ts | 21 ++
.../admin-update-config.component.html | 166 ++++++++++++
.../admin-update-config.component.scss | 142 ++++++++++
.../admin-update-config.component.ts | 221 ++++++++++++++++
.../admin-update-config.module.ts | 23 ++
.../admin-update-config.service.ts | 102 +++++++
src/app/menu.resolver.ts | 14 +
src/assets/i18n/cs.json5 | 249 ++++++++++++++++++
src/assets/i18n/en.json5 | 129 +++++++++
11 files changed, 1078 insertions(+)
create mode 100644 src/app/admin/admin-update-config/admin-update-config-routing.module.ts
create mode 100644 src/app/admin/admin-update-config/admin-update-config.component.html
create mode 100644 src/app/admin/admin-update-config/admin-update-config.component.scss
create mode 100644 src/app/admin/admin-update-config/admin-update-config.component.ts
create mode 100644 src/app/admin/admin-update-config/admin-update-config.module.ts
create mode 100644 src/app/admin/admin-update-config/admin-update-config.service.ts
diff --git a/src/app/admin/admin-routing-paths.ts b/src/app/admin/admin-routing-paths.ts
index 3168ea93c92..4b780644e52 100644
--- a/src/app/admin/admin-routing-paths.ts
+++ b/src/app/admin/admin-routing-paths.ts
@@ -2,7 +2,12 @@ import { URLCombiner } from '../core/url-combiner/url-combiner';
import { getAdminModuleRoute } from '../app-routing-paths';
export const REGISTRIES_MODULE_PATH = 'registries';
+export const UPDATE_CONFIG_MODULE_PATH = 'update-config';
export function getRegistriesModuleRoute() {
return new URLCombiner(getAdminModuleRoute(), REGISTRIES_MODULE_PATH).toString();
}
+
+export function getUpdateConfigModuleRoute() {
+ return new URLCombiner(getAdminModuleRoute(), UPDATE_CONFIG_MODULE_PATH).toString();
+}
diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts
index df938fb6c9f..94522c89715 100644
--- a/src/app/admin/admin-routing.module.ts
+++ b/src/app/admin/admin-routing.module.ts
@@ -53,6 +53,12 @@ import { ThemedAdminWorkflowPageComponent } from './admin-workflow-page/themed-a
loadChildren: () => import('../system-wide-alert/system-wide-alert.module').then((m) => m.SystemWideAlertModule),
data: {title: 'admin.system-wide-alert.title', breadcrumbKey: 'admin.system-wide-alert'}
},
+ {
+ path: 'update-config',
+ resolve: { breadcrumb: I18nBreadcrumbResolver },
+ loadChildren: () => import('./admin-update-config/admin-update-config.module').then((m) => m.AdminUpdateConfigModule),
+ data: { title: 'admin.update-config.title', breadcrumbKey: 'admin.update-config' }
+ },
])
],
providers: [
diff --git a/src/app/admin/admin-update-config/admin-update-config-routing.module.ts b/src/app/admin/admin-update-config/admin-update-config-routing.module.ts
new file mode 100644
index 00000000000..c855a850ba1
--- /dev/null
+++ b/src/app/admin/admin-update-config/admin-update-config-routing.module.ts
@@ -0,0 +1,21 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+import { AdminUpdateConfigComponent } from './admin-update-config.component';
+import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver';
+import { SiteAdministratorGuard } from '../../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: AdminUpdateConfigComponent,
+ resolve: { breadcrumb: I18nBreadcrumbResolver },
+ canActivate: [SiteAdministratorGuard],
+ data: { title: 'admin.update-config.title', breadcrumbKey: 'admin.update-config' }
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule]
+})
+export class AdminUpdateConfigRoutingModule { }
diff --git a/src/app/admin/admin-update-config/admin-update-config.component.html b/src/app/admin/admin-update-config/admin-update-config.component.html
new file mode 100644
index 00000000000..c2a9e98e34f
--- /dev/null
+++ b/src/app/admin/admin-update-config/admin-update-config.component.html
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+ {{ 'admin.update-config.title' | translate }}
+
+
+
+
+
+
+
+ {{ 'admin.update-config.loading' | translate }}
+
+
{{ 'admin.update-config.loading-files' | translate }}
+
+
+
+
+
+
+
+ {{ 'admin.update-config.file-selection.title' | translate }}
+
+
+ {{ 'admin.update-config.description' | translate }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ 'admin.update-config.file-info.title' | translate }}
+
+
+ {{ 'admin.update-config.file-info.name' | translate }}: {{ selectedFile.fileName }}
+ {{ 'admin.update-config.file-info.size' | translate }}: {{ selectedFile.size | number }} {{ 'admin.update-config.file-info.bytes' | translate }}
+ {{ 'admin.update-config.file-info.modified' | translate }}: {{ selectedFile.lastModified | date:'short' }}
+ {{ 'admin.update-config.file-info.status' | translate }}:
+ {{ 'admin.update-config.file-info.ready' | translate }}
+
+
+
+
+
+
+
+
+
+
+ {{ 'admin.update-config.loading' | translate }}
+
+
{{ 'admin.update-config.loading-content' | translate }}
+
+
+
+
+
+
+
+
+ {{ 'admin.update-config.editor.title' | translate }}: {{ selectedFile.fileName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ 'admin.update-config.editor.notice.title' | translate }}
+ {{ 'admin.update-config.editor.notice.description' | translate:{ fileName: selectedFile?.fileName } }}
+
+
+
+
+
+
+ {{ 'admin.update-config.validation.unsaved-changes' | translate }}
+
+
+
+
+
+
+
+
+
+
+ {{ fileContent.length }} {{ 'admin.update-config.editor.characters' | translate }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/app/admin/admin-update-config/admin-update-config.component.scss b/src/app/admin/admin-update-config/admin-update-config.component.scss
new file mode 100644
index 00000000000..57fd5e4111c
--- /dev/null
+++ b/src/app/admin/admin-update-config/admin-update-config.component.scss
@@ -0,0 +1,142 @@
+.container-fluid {
+ padding: 1rem;
+}
+
+.card {
+ border: none;
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+ border-radius: 0.5rem;
+}
+
+.card-title {
+ color: #495057;
+ font-weight: 600;
+}
+
+.config-editor {
+ font-family: 'Courier New', Courier, monospace;
+ font-size: 0.875rem;
+ line-height: 1.5;
+ background-color: #f8f9fa;
+ border: 1px solid #dee2e6;
+ resize: vertical;
+ min-height: 300px;
+}
+
+.config-editor:focus {
+ background-color: #ffffff;
+ border-color: #80bdff;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+ outline: none;
+}
+
+.config-editor.is-invalid {
+ border-color: #dc3545;
+ background-color: #fff5f5;
+}
+
+.config-editor.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+}
+
+.form-control.is-invalid {
+ border-color: #dc3545;
+ background-image: none;
+}
+
+.form-control.is-invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+}
+
+.alert {
+ border: none;
+ border-radius: 0.375rem;
+}
+
+.alert-info {
+ background-color: #e7f3ff;
+ border-left: 4px solid #17a2b8;
+ color: #0c5460;
+}
+
+.alert-danger {
+ background-color: #f8d7da;
+ border-left: 4px solid #dc3545;
+ color: #721c24;
+}
+
+.alert-warning {
+ background-color: #fff3cd;
+ border-left: 4px solid #ffc107;
+ color: #856404;
+}
+
+.badge {
+ font-size: 0.75rem;
+ font-weight: 500;
+}
+
+.btn {
+ border-radius: 0.375rem;
+ font-weight: 500;
+}
+
+.btn:disabled {
+ opacity: 0.65;
+}
+
+.btn-sm {
+ padding: 0.375rem 0.75rem;
+ font-size: 0.875rem;
+}
+
+.form-select {
+ border-radius: 0.375rem;
+}
+
+.form-select:focus {
+ border-color: #80bdff;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+}
+
+/* Loading spinner animation */
+.fa-spin {
+ animation: fa-spin 2s infinite linear;
+}
+
+@keyframes fa-spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(359deg);
+ }
+}
+
+/* Responsive adjustments */
+@media (max-width: 768px) {
+ .container-fluid {
+ padding: 0.5rem;
+ }
+
+ .alert.d-flex {
+ flex-direction: column;
+ align-items: flex-start !important;
+ }
+
+ .alert.d-flex > div:last-child {
+ margin-top: 1rem;
+ width: 100%;
+ }
+
+ .btn-sm {
+ width: 100%;
+ margin-bottom: 0.5rem;
+ }
+
+ .btn-sm:last-child {
+ margin-bottom: 0;
+ }
+}
\ No newline at end of file
diff --git a/src/app/admin/admin-update-config/admin-update-config.component.ts b/src/app/admin/admin-update-config/admin-update-config.component.ts
new file mode 100644
index 00000000000..2a394894d73
--- /dev/null
+++ b/src/app/admin/admin-update-config/admin-update-config.component.ts
@@ -0,0 +1,221 @@
+import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
+import { AdminUpdateConfigService, ConfigFile } from './admin-update-config.service';
+import { Observable } from 'rxjs';
+import { NotificationsService } from '../../shared/notifications/notifications.service';
+import { TranslateService } from '@ngx-translate/core';
+
+@Component({
+ selector: 'ds-admin-update-config',
+ templateUrl: './admin-update-config.component.html',
+ styleUrls: ['./admin-update-config.component.scss']
+})
+export class AdminUpdateConfigComponent implements OnInit {
+
+ /**
+ * Available config files
+ */
+ configFiles: ConfigFile[] = [];
+
+ /**
+ * Currently selected file
+ */
+ selectedFile: ConfigFile | null = null;
+
+ /**
+ * Current file content
+ */
+ fileContent: string = '';
+
+ /**
+ * Original file content for reset functionality
+ */
+ originalContent: string = '';
+
+ /**
+ * Whether we're currently loading data
+ */
+ loading = false;
+
+ /**
+ * Whether we're currently saving
+ */
+ saving = false;
+
+
+
+ constructor(
+ private configService: AdminUpdateConfigService,
+ private notificationsService: NotificationsService,
+ private translateService: TranslateService,
+ private cdr: ChangeDetectorRef
+ ) { }
+
+ ngOnInit(): void {
+ this.loadConfigFiles();
+ }
+
+ /**
+ * Load available config files
+ */
+ loadConfigFiles(): void {
+ this.loading = true;
+ this.configService.getConfigFiles().subscribe({
+ next: (files) => {
+ this.configFiles = files;
+ this.loading = false;
+ this.cdr.detectChanges(); // Force change detection
+ },
+ error: (error) => {
+ this.loading = false;
+ this.notificationsService.error(
+ this.translateService.instant('admin.update-config.error.load-files.title'),
+ this.translateService.instant('admin.update-config.error.load-files.message')
+ );
+ this.cdr.detectChanges(); // Force change detection
+ }
+ });
+ }
+
+ /**
+ * Handle file selection from dropdown
+ */
+ onFileSelect(file: ConfigFile): void {
+ if (!file) {
+ this.selectedFile = null;
+ this.fileContent = '';
+ this.originalContent = '';
+ this.cdr.detectChanges(); // Force change detection when clearing selection
+ return;
+ }
+
+ this.selectedFile = file;
+ this.cdr.detectChanges(); // Force change detection when file is selected
+ this.loadFileContent(file.fileName);
+ }
+
+ /**
+ * Load content of selected config file (instant loading!)
+ */
+ loadFileContent(filename: string): void {
+ this.loading = true;
+ this.cdr.detectChanges(); // Force change detection to show loading spinner
+
+ // Instant subscription - no delays!
+ this.configService.getConfigFileContent(filename).subscribe({
+ next: (content) => {
+ this.fileContent = content;
+ this.originalContent = content;
+ this.loading = false;
+ this.cdr.detectChanges(); // Force change detection to hide loading spinner
+ },
+ error: (error) => {
+ this.loading = false;
+ this.notificationsService.error(
+ this.translateService.instant('admin.update-config.error.load-content.title'),
+ this.translateService.instant('admin.update-config.error.load-content.message', { fileName: filename })
+ );
+ this.cdr.detectChanges(); // Force change detection on error
+ }
+ });
+ }
+
+ /**
+ * Handle content changes in the editor
+ */
+ onContentChange(): void {
+ // Content changed
+ }
+
+ /**
+ * Save the current config file
+ */
+ saveFile(): void {
+ if (!this.selectedFile || this.saving) {
+ return;
+ }
+
+ this.saving = true;
+ this.cdr.detectChanges(); // Force change detection to show saving state
+
+ this.configService.saveConfigFile(this.selectedFile.fileName, this.fileContent).subscribe({
+ next: (result) => {
+ this.saving = false;
+ this.originalContent = this.fileContent;
+
+ this.notificationsService.success(
+ this.translateService.instant('admin.update-config.success.save.title'),
+ this.translateService.instant('admin.update-config.success.save.message', { fileName: this.selectedFile?.fileName })
+ );
+
+ this.loadConfigFiles();
+ this.cdr.detectChanges(); // Force change detection after save
+ },
+ error: (error) => {
+ this.saving = false;
+ this.notificationsService.error(
+ this.translateService.instant('admin.update-config.error.save.title'),
+ this.translateService.instant('admin.update-config.error.save.message', { fileName: this.selectedFile?.fileName })
+ );
+ this.cdr.detectChanges(); // Force change detection on error
+ }
+ });
+ }
+
+ /**
+ * Reset content to original version
+ */
+ resetContent(): void {
+ this.fileContent = this.originalContent;
+ }
+
+ /**
+ * Reset to original file
+ */
+ resetToOriginalFile(): void {
+ if (!this.selectedFile) {
+ return;
+ }
+
+ this.loading = true;
+ this.cdr.detectChanges(); // Force change detection to show loading state
+
+ this.configService.reloadOriginalContent(this.selectedFile.fileName).subscribe({
+ next: (originalContent) => {
+ this.fileContent = originalContent;
+ this.originalContent = originalContent;
+ this.loading = false;
+
+ this.notificationsService.success(
+ this.translateService.instant('admin.update-config.success.reload.title'),
+ this.translateService.instant('admin.update-config.success.reload.message', { fileName: this.selectedFile?.fileName })
+ );
+ this.cdr.detectChanges(); // Force change detection after reload
+ },
+ error: (error) => {
+ this.loading = false;
+ this.notificationsService.error(
+ this.translateService.instant('admin.update-config.error.reload.title'),
+ this.translateService.instant('admin.update-config.error.reload.message')
+ );
+ this.cdr.detectChanges(); // Force change detection on error
+ }
+ });
+ }
+
+ /**
+ * Check if content has unsaved changes
+ */
+ hasUnsavedChanges(): boolean {
+ return this.fileContent !== this.originalContent;
+ }
+
+ /**
+ * Get placeholder text for file selection
+ */
+ getFileSelectionText(): string {
+ if (this.configFiles.length === 0) {
+ return this.translateService.instant('admin.update-config.select.no-files');
+ }
+ return this.translateService.instant('admin.update-config.select.choose-file');
+ }
+}
\ No newline at end of file
diff --git a/src/app/admin/admin-update-config/admin-update-config.module.ts b/src/app/admin/admin-update-config/admin-update-config.module.ts
new file mode 100644
index 00000000000..e5da2ce189b
--- /dev/null
+++ b/src/app/admin/admin-update-config/admin-update-config.module.ts
@@ -0,0 +1,23 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { SharedModule } from '../../shared/shared.module';
+import { AdminUpdateConfigComponent } from './admin-update-config.component';
+import { AdminUpdateConfigService } from './admin-update-config.service';
+import { AdminUpdateConfigRoutingModule } from './admin-update-config-routing.module';
+
+@NgModule({
+ declarations: [
+ AdminUpdateConfigComponent
+ ],
+ imports: [
+ CommonModule,
+ FormsModule,
+ SharedModule,
+ AdminUpdateConfigRoutingModule
+ ],
+ providers: [
+ AdminUpdateConfigService
+ ]
+})
+export class AdminUpdateConfigModule { }
\ No newline at end of file
diff --git a/src/app/admin/admin-update-config/admin-update-config.service.ts b/src/app/admin/admin-update-config/admin-update-config.service.ts
new file mode 100644
index 00000000000..bf7c6f329e1
--- /dev/null
+++ b/src/app/admin/admin-update-config/admin-update-config.service.ts
@@ -0,0 +1,102 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpHeaders } from '@angular/common/http';
+import { Observable, of } from 'rxjs';
+import { map, catchError } from 'rxjs/operators';
+import { RESTURLCombiner } from '../../core/url-combiner/rest-url-combiner';
+
+export interface ConfigFile {
+ fileName: string;
+ size: number;
+ lastModified: string;
+ type: string;
+ _links: {
+ self: { href: string };
+ content: { href: string };
+ };
+}
+
+export interface SaveResponse {
+ success?: boolean;
+ message: string;
+ file?: string;
+ timestamp?: string;
+ backup?: string;
+}
+
+@Injectable()
+export class AdminUpdateConfigService {
+ private readonly apiBaseUrl: string;
+
+ constructor(private http: HttpClient) {
+ // Use DSpace's REST URL combiner to build proper backend URL
+ this.apiBaseUrl = new RESTURLCombiner('admin', 'configfiles').toString();
+ }
+
+ /**
+ * Get list of available configuration files from backend API
+ */
+ getConfigFiles(): Observable {
+ return this.http.get(this.apiBaseUrl).pipe(
+ map(files => {
+ // Transform API response to match our ConfigFile interface
+ return files.map(file => ({
+ fileName: file.fileName || file.name || file.id || file.identifier,
+ size: file.size || 0,
+ lastModified: file.lastModified || file.modified || new Date().toISOString(),
+ type: file.type || 'application/xml',
+ _links: file._links || {
+ self: { href: `${this.apiBaseUrl}/${file.fileName || file.name || file.id || file.identifier}` },
+ content: { href: `${this.apiBaseUrl}/${file.fileName || file.name || file.id || file.identifier}/content` }
+ }
+ }));
+ }),
+ catchError((error) => {
+ throw error;
+ })
+ );
+ }
+
+ /**
+ * Get content of a specific config file from backend API
+ */
+ getConfigFileContent(filename: string): Observable {
+ return this.http.get(`${this.apiBaseUrl}/${filename}/content`, {
+ responseType: 'text',
+ headers: new HttpHeaders({
+ 'Accept': 'text/plain'
+ })
+ }).pipe(
+
+ );
+ }
+
+ /**
+ * Save config file content to backend API
+ */
+ saveConfigFile(filename: string, content: string): Observable {
+ return this.http.put(`${this.apiBaseUrl}/${filename}/content`, content, {
+ headers: new HttpHeaders({
+ 'Content-Type': 'text/plain'
+ // Note: CSRF token should be handled automatically by Angular interceptors
+ })
+ });
+ }
+
+
+
+ /**
+ * Reload original file content from backend API
+ */
+ reloadOriginalContent(filename: string): Observable {
+ return this.getConfigFileContent(filename);
+ }
+
+ /**
+ * Get metadata for a specific config file
+ */
+ getConfigFile(filename: string): Observable {
+ return this.http.get(`${this.apiBaseUrl}/${filename}`);
+ }
+
+
+}
diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts
index 4a56dda0401..7a345edf2f8 100644
--- a/src/app/menu.resolver.ts
+++ b/src/app/menu.resolver.ts
@@ -669,6 +669,20 @@ export class MenuResolver implements Resolve {
icon: 'exclamation-circle',
index: 14
},
+
+ /* Update Config */
+ {
+ id: 'update_config',
+ active: false,
+ visible: authorized,
+ model: {
+ type: MenuItemType.LINK,
+ text: 'menu.section.update-config',
+ link: '/admin/update-config'
+ } as LinkMenuItemModel,
+ icon: 'cogs',
+ index: 15
+ },
];
menuList.forEach((menuSection) => this.menuService.addSection(MenuID.ADMIN, Object.assign(menuSection, {
diff --git a/src/assets/i18n/cs.json5 b/src/assets/i18n/cs.json5
index f928e07d09f..9f7359571da 100644
--- a/src/assets/i18n/cs.json5
+++ b/src/assets/i18n/cs.json5
@@ -8117,6 +8117,252 @@
// "admin.system-wide-alert.title": "System-wide Alerts",
"admin.system-wide-alert.title": "Systémová upozornění",
+ // "admin.update-config.title": "Update Configuration",
+ "admin.update-config.title": "Aktualizace konfigurace",
+
+ // "admin.update-config.description": "Edit DSpace configuration files through the web interface.",
+ "admin.update-config.description": "Editace konfiguračních souborů DSpace prostřednictvím webového rozhraní.",
+
+ // "admin.update-config.select.file": "Select Configuration File",
+ "admin.update-config.select.file": "Vyberte konfigurační soubor",
+
+ // "admin.update-config.select.file.placeholder": "Choose a file to edit...",
+ "admin.update-config.select.file.placeholder": "Vyberte soubor k editaci...",
+
+ // "admin.update-config.file.info": "File",
+ "admin.update-config.file.info": "Soubor",
+
+ // "admin.update-config.last.modified": "Last modified",
+ "admin.update-config.last.modified": "Naposledy změněno",
+
+ // "admin.update-config.content": "File Content",
+ "admin.update-config.content": "Obsah souboru",
+
+ // "admin.update-config.valid": "Valid",
+ "admin.update-config.valid": "Platný",
+
+ // "admin.update-config.invalid": "Invalid",
+ "admin.update-config.invalid": "Neplatný",
+
+ // "admin.update-config.validation.errors": "Configuration Validation Errors",
+ "admin.update-config.validation.errors": "Chyby validace konfigurace",
+
+ // "admin.update-config.save": "Save Configuration",
+ "admin.update-config.save": "Uložit konfiguraci",
+
+ // "admin.update-config.reset": "Reset",
+ "admin.update-config.reset": "Obnovit",
+
+ // "admin.update-config.help.title": "Important Notes",
+ "admin.update-config.help.title": "Důležité poznámky",
+
+ // "admin.update-config.help.backup": "Always backup configuration files before making changes.",
+ "admin.update-config.help.backup": "Vždy zálohujte konfigurační soubory před prováděním změn.",
+
+ // "admin.update-config.help.validate": "Ensure your configuration is valid before saving to prevent system errors.",
+ "admin.update-config.help.validate": "Ujistěte se, že je vaše konfigurace platná před uložením pro předejití systémovým chybám.",
+
+ // "admin.update-config.help.restart": "Changes may require application restart to take effect.",
+ "admin.update-config.help.restart": "Změny mohou vyžadovat restart aplikace pro aktivaci.",
+
+ // "admin.update-config.help.directory": "Only files in /config/config-be/ directory can be edited for security reasons.",
+ "admin.update-config.help.directory": "Pouze soubory v adresáři /config/config-be/ mohou být editovány z bezpečnostních důvodů.",
+
+ // "admin.update-config.success.save.title": "Configuration Saved",
+ "admin.update-config.success.save.title": "Konfigurace uložena",
+
+ // "admin.update-config.success.save.message": "{{message}}",
+ "admin.update-config.success.save.message": "{{message}}",
+
+ // "admin.update-config.error.save.title": "Save Failed",
+ "admin.update-config.error.save.title": "Uložení selhalo",
+
+ // "admin.update-config.error.save.message": "Unable to save configuration file. Please check the logs and try again.",
+ "admin.update-config.error.save.message": "Nepodařilo se uložit konfigurační soubor. Zkontrolujte logy a zkuste to znovu.",
+
+ // "admin.update-config.error.load.title": "Load Failed",
+ "admin.update-config.error.load.title": "Načtení selhalo",
+
+ // "admin.update-config.error.load.message": "Unable to load configuration file: {{fileName}}",
+ "admin.update-config.error.load.message": "Nepodařilo se načíst konfigurační soubor: {{fileName}}",
+
+ // Additional translation keys for enhanced UI
+ // "admin.update-config.refresh": "Refresh",
+ "admin.update-config.refresh": "Obnovit",
+
+ // "admin.update-config.refresh.tooltip": "Reload configuration files list",
+ "admin.update-config.refresh.tooltip": "Znovu načíst seznam konfiguračních souborů",
+
+ // "admin.update-config.loading": "Loading...",
+ "admin.update-config.loading": "Načítání...",
+
+ // "admin.update-config.loading-files": "Loading configuration files...",
+ "admin.update-config.loading-files": "Načítání konfiguračních souborů...",
+
+ // "admin.update-config.loading-content": "Loading file content...",
+ "admin.update-config.loading-content": "Načítání obsahu souboru...",
+
+ // "admin.update-config.file-selection.title": "File Selection",
+ "admin.update-config.file-selection.title": "Výběr souboru",
+
+ // "admin.update-config.file-selection.label": "Select Configuration File",
+ "admin.update-config.file-selection.label": "Vyberte konfigurační soubor",
+
+ // "admin.update-config.file-info.path": "Path",
+ "admin.update-config.file-info.path": "Cesta",
+
+ // "admin.update-config.file-info.modified": "Last Modified",
+ "admin.update-config.file-info.modified": "Naposledy změněno",
+
+ // "admin.update-config.select.choose-file": "Choose a configuration file to edit",
+ "admin.update-config.select.choose-file": "Vyberte konfigurační soubor k editaci",
+
+ // "admin.update-config.select.no-files": "No configuration files found",
+ "admin.update-config.select.no-files": "Nenalezeny žádné konfigurační soubory",
+
+ // "admin.update-config.editor.title": "Configuration Editor",
+ "admin.update-config.editor.title": "Editor konfigurace",
+
+ // "admin.update-config.editor.content": "File Content",
+ "admin.update-config.editor.content": "Obsah souboru",
+
+ // "admin.update-config.editor.placeholder": "Select a file to begin editing...",
+ "admin.update-config.editor.placeholder": "Vyberte soubor pro zahájení editace...",
+
+ // "admin.update-config.editor.characters": "characters",
+ "admin.update-config.editor.characters": "znaků",
+
+ // "admin.update-config.editor.save": "Save Changes",
+ "admin.update-config.editor.save": "Uložit změny",
+
+ // "admin.update-config.editor.save.tooltip": "Save changes to the configuration file",
+ "admin.update-config.editor.save.tooltip": "Uložit změny do konfiguračního souboru",
+
+ // "admin.update-config.editor.reset": "Reset",
+ "admin.update-config.editor.reset": "Obnovit",
+
+ // "admin.update-config.editor.reset.tooltip": "Reset content to original version",
+ "admin.update-config.editor.reset.tooltip": "Obnovit obsah na původní verzi",
+
+ // "admin.update-config.validation.valid": "Configuration is valid",
+ "admin.update-config.validation.valid": "Konfigurace je platná",
+
+ // "admin.update-config.validation.invalid": "Configuration contains errors - please fix before saving",
+ "admin.update-config.validation.invalid": "Konfigurace obsahuje chyby - prosím opravte před uložením",
+
+ // "admin.update-config.validation.unsaved-changes": "File has unsaved changes",
+ "admin.update-config.validation.unsaved-changes": "Soubor má neuložené změny",
+
+ // "admin.update-config.help.important.title": "Before You Start",
+ "admin.update-config.help.important.title": "Než začnete",
+
+ // "admin.update-config.help.important.backup": "Always backup configuration files before making changes",
+ "admin.update-config.help.important.backup": "Vždy zálohujte konfigurační soubory před prováděním změn",
+
+ // "admin.update-config.help.important.restart": "DSpace may require restart after configuration changes",
+ "admin.update-config.help.important.restart": "DSpace může vyžadovat restart po změnách konfigurace",
+
+ // "admin.update-config.help.important.validation": "Configuration validation prevents saving invalid files",
+ "admin.update-config.help.important.validation": "Validace konfigurace předchází uložení neplatných souborů",
+
+ // "admin.update-config.help.allowed-files.title": "Editable Files",
+ "admin.update-config.help.allowed-files.title": "Editovatelné soubory",
+
+ // "admin.update-config.help.allowed-files.description": "Only XML files in the config-be directory can be edited for security reasons:",
+ "admin.update-config.help.allowed-files.description": "Pouze XML soubory v adresáři config-be mohou být editovány z bezpečnostních důvodů:",
+
+ // "admin.update-config.error.load-files.title": "Load Error",
+ "admin.update-config.error.load-files.title": "Chyba načtení",
+
+ // "admin.update-config.error.load-files.message": "Failed to load configuration files list",
+ "admin.update-config.error.load-files.message": "Nepodařilo se načíst seznam konfiguračních souborů",
+
+ // Breadcrumb
+ "admin.update-config.breadcrumbs": "Aktualizace konfigurace",
+
+ // File Information
+ // "admin.update-config.file-info.title": "File Information",
+ "admin.update-config.file-info.title": "Informace o souboru",
+
+ // "admin.update-config.file-info.name": "File",
+ "admin.update-config.file-info.name": "Soubor",
+
+ // "admin.update-config.file-info.size": "Size",
+ "admin.update-config.file-info.size": "Velikost",
+
+ // "admin.update-config.file-info.bytes": "bytes",
+ "admin.update-config.file-info.bytes": "bajtů",
+
+ // "admin.update-config.file-info.modified": "Modified",
+ "admin.update-config.file-info.modified": "Změněno",
+
+ // "admin.update-config.file-info.status": "Status",
+ "admin.update-config.file-info.status": "Stav",
+
+ // "admin.update-config.file-info.ready": "Ready for editing",
+ "admin.update-config.file-info.ready": "Připraven k editaci",
+
+ // Action Buttons
+ // "admin.update-config.buttons.undo": "Undo Changes",
+ "admin.update-config.buttons.undo": "Vrátit změny",
+
+ // "admin.update-config.buttons.undo.tooltip": "Reset to last saved version",
+ "admin.update-config.buttons.undo.tooltip": "Obnovit na poslední uloženou verzi",
+
+ // "admin.update-config.buttons.reload": "Reload File",
+ "admin.update-config.buttons.reload": "Znovu načíst soubor",
+
+ // "admin.update-config.buttons.reload.tooltip": "Reload file from server",
+ "admin.update-config.buttons.reload.tooltip": "Znovu načíst soubor ze serveru",
+
+ // "admin.update-config.buttons.save": "Save to File",
+ "admin.update-config.buttons.save": "Uložit do souboru",
+
+ // "admin.update-config.buttons.save.tooltip": "Save changes to configuration file",
+ "admin.update-config.buttons.save.tooltip": "Uložit změny do konfiguračního souboru",
+
+ // "admin.update-config.buttons.saving": "Saving to File...",
+ "admin.update-config.buttons.saving": "Ukládání do souboru...",
+
+ // Editor Notice
+ // "admin.update-config.editor.notice.title": "File Editor",
+ "admin.update-config.editor.notice.title": "Editor souborů",
+
+ // "admin.update-config.editor.notice.description": "Editing configuration file {{fileName}}. Changes are saved immediately to the server.",
+ "admin.update-config.editor.notice.description": "Editace konfiguračního souboru {{fileName}}. Změny jsou ukládány okamžitě na server.",
+
+ // Success Messages
+ // "admin.update-config.success.save.title": "File Saved Successfully",
+ "admin.update-config.success.save.title": "Soubor úspěšně uložen",
+
+ // "admin.update-config.success.save.message": "{{fileName}} has been updated successfully",
+ "admin.update-config.success.save.message": "{{fileName}} byl úspěšně aktualizován",
+
+ // "admin.update-config.success.reload.title": "File Reloaded",
+ "admin.update-config.success.reload.title": "Soubor znovu načten",
+
+ // "admin.update-config.success.reload.message": "Reloaded {{fileName}} from server",
+ "admin.update-config.success.reload.message": "{{fileName}} byl znovu načten ze serveru",
+
+ // Error Messages
+ // "admin.update-config.error.load-content.title": "Load Failed",
+ "admin.update-config.error.load-content.title": "Načtení selhalo",
+
+ // "admin.update-config.error.load-content.message": "Could not load {{fileName}}",
+ "admin.update-config.error.load-content.message": "Nepodařilo se načíst {{fileName}}",
+
+ // "admin.update-config.error.save.title": "Save Failed",
+ "admin.update-config.error.save.title": "Uložení selhalo",
+
+ // "admin.update-config.error.save.message": "Could not save {{fileName}}",
+ "admin.update-config.error.save.message": "Nepodařilo se uložit {{fileName}}",
+
+ // "admin.update-config.error.reload.title": "Reload Failed",
+ "admin.update-config.error.reload.title": "Opětovné načtení selhalo",
+
+ // "admin.update-config.error.reload.message": "Could not reload original file",
+ "admin.update-config.error.reload.message": "Nepodařilo se znovu načíst původní soubor",
+
// "item-access-control-title": "This form allows you to perform changes to the access conditions of the item's metadata or its bitstreams.",
"item-access-control-title": "Tento formulář umožňuje provést změny typu přístupu k metadatovému záznamu nebo souborům.",
@@ -9458,6 +9704,9 @@
// "menu.section.licenses": "License Administration",
"menu.section.licenses": "Správa licencí",
+ // "menu.section.update-config": "Update Config",
+ "menu.section.update-config": "Uprava konfigurace",
+
// "autocomplete.suggestion.sponsor.funding-code": "Funding code",
"autocomplete.suggestion.sponsor.funding-code": "Kód financování",
diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5
index c6006102d8d..d74fd0054e1 100644
--- a/src/assets/i18n/en.json5
+++ b/src/assets/i18n/en.json5
@@ -3045,6 +3045,8 @@
"menu.section.icon.workflow": "Administer workflow menu section",
+ "menu.section.icon.update_config": "Update Configuration menu section",
+
"menu.section.icon.unpin": "Unpin sidebar",
"menu.section.import": "Import",
@@ -5375,6 +5377,8 @@
"menu.section.system-wide-alert": "System-wide Alert",
+ "menu.section.update-config": "Update Config",
+
"system-wide-alert.form.header": "System-wide Alert",
"system-wide-alert-form.retrieval.error": "Something went wrong retrieving the system-wide alert",
@@ -5407,6 +5411,131 @@
"system-wide-alert.form.create.error": "Something went wrong when creating the system-wide alert",
+ "admin.update-config.title": "Update Configuration",
+
+ "admin.update-config.description": "Edit DSpace configuration files through the web interface.",
+
+ "admin.update-config.select.file": "Select Configuration File",
+
+ "admin.update-config.select.file.placeholder": "Choose a file to edit...",
+
+ "admin.update-config.file.info": "File",
+
+ "admin.update-config.last.modified": "Last modified",
+
+ "admin.update-config.content": "File Content",
+
+ "admin.update-config.valid": "Valid",
+
+ "admin.update-config.invalid": "Invalid",
+
+ "admin.update-config.validation.errors": "Configuration Validation Errors",
+
+ "admin.update-config.save": "Save Configuration",
+
+ "admin.update-config.reset": "Reset",
+
+ "admin.update-config.help.title": "Important Notes",
+
+ "admin.update-config.help.backup": "Always backup configuration files before making changes.",
+
+ "admin.update-config.help.validate": "Ensure your configuration is valid before saving to prevent system errors.",
+
+ "admin.update-config.help.restart": "Changes may require application restart to take effect.",
+
+ "admin.update-config.help.directory": "Only files in /config/config-be/ directory can be edited for security reasons.",
+
+ "admin.update-config.success.save.title": "Configuration Saved",
+
+ "admin.update-config.success.save.message": "{{message}}",
+
+ "admin.update-config.error.save.title": "Save Failed",
+
+ "admin.update-config.error.save.message": "Unable to save configuration file. Please check the logs and try again.",
+
+ "admin.update-config.error.load.title": "Load Failed",
+
+ "admin.update-config.error.load.message": "Unable to load configuration file: {{fileName}}",
+
+ // Additional translation keys for enhanced UI
+ "admin.update-config.refresh": "Refresh",
+ "admin.update-config.refresh.tooltip": "Reload configuration files list",
+ "admin.update-config.loading": "Loading...",
+ "admin.update-config.loading-files": "Loading configuration files...",
+ "admin.update-config.loading-content": "Loading file content...",
+
+ "admin.update-config.file-selection.title": "File Selection",
+ "admin.update-config.file-selection.label": "Select Configuration File",
+
+ "admin.update-config.file-info.path": "Path",
+ "admin.update-config.file-info.modified": "Last Modified",
+
+ "admin.update-config.select.choose-file": "Choose a configuration file to edit",
+ "admin.update-config.select.no-files": "No configuration files found",
+
+ "admin.update-config.editor.title": "Configuration Editor",
+ "admin.update-config.editor.content": "File Content",
+ "admin.update-config.editor.placeholder": "Select a file to begin editing...",
+ "admin.update-config.editor.characters": "characters",
+ "admin.update-config.editor.save": "Save Changes",
+ "admin.update-config.editor.save.tooltip": "Save changes to the configuration file",
+ "admin.update-config.editor.reset": "Reset",
+ "admin.update-config.editor.reset.tooltip": "Reset content to original version",
+
+ "admin.update-config.validation.valid": "Configuration is valid",
+ "admin.update-config.validation.invalid": "Configuration contains errors - please fix before saving",
+ "admin.update-config.validation.unsaved-changes": "File has unsaved changes",
+
+ "admin.update-config.help.important.title": "Before You Start",
+ "admin.update-config.help.important.backup": "Always backup configuration files before making changes",
+ "admin.update-config.help.important.restart": "DSpace may require restart after configuration changes",
+ "admin.update-config.help.important.validation": "Configuration validation prevents saving invalid files",
+
+ "admin.update-config.help.allowed-files.title": "Editable Files",
+ "admin.update-config.help.allowed-files.description": "Only configuration files in the server configuration directory can be edited for security reasons:",
+
+ "admin.update-config.error.load-files.title": "Load Error",
+ "admin.update-config.error.load-files.message": "Failed to load configuration files list",
+
+ // Breadcrumb
+ "admin.update-config.breadcrumbs": "Update Configuration",
+
+ // File Information
+ "admin.update-config.file-info.title": "File Information",
+ "admin.update-config.file-info.name": "File",
+ "admin.update-config.file-info.size": "Size",
+ "admin.update-config.file-info.bytes": "bytes",
+ "admin.update-config.file-info.modified": "Modified",
+ "admin.update-config.file-info.status": "Status",
+ "admin.update-config.file-info.ready": "Ready for editing",
+
+ // Action Buttons
+ "admin.update-config.buttons.undo": "Undo Changes",
+ "admin.update-config.buttons.undo.tooltip": "Reset to last saved version",
+ "admin.update-config.buttons.reload": "Reload File",
+ "admin.update-config.buttons.reload.tooltip": "Reload file from server",
+ "admin.update-config.buttons.save": "Save to File",
+ "admin.update-config.buttons.save.tooltip": "Save changes to configuration file",
+ "admin.update-config.buttons.saving": "Saving to File...",
+
+ // Editor Notice
+ "admin.update-config.editor.notice.title": "File Editor",
+ "admin.update-config.editor.notice.description": "Editing configuration file {{fileName}}. Changes are saved immediately to the server.",
+
+ // Success Messages
+ "admin.update-config.success.save.title": "File Saved Successfully",
+ "admin.update-config.success.save.message": "{{fileName}} has been updated successfully",
+ "admin.update-config.success.reload.title": "File Reloaded",
+ "admin.update-config.success.reload.message": "Reloaded {{fileName}} from server",
+
+ // Error Messages
+ "admin.update-config.error.load-content.title": "Load Failed",
+ "admin.update-config.error.load-content.message": "Could not load {{fileName}}",
+ "admin.update-config.error.save.title": "Save Failed",
+ "admin.update-config.error.save.message": "Could not save {{fileName}}",
+ "admin.update-config.error.reload.title": "Reload Failed",
+ "admin.update-config.error.reload.message": "Could not reload original file",
+
"admin.system-wide-alert.breadcrumbs": "System-wide Alerts",
"admin.system-wide-alert.title": "System-wide Alerts",
From bcf1242d97eb0d6df6787bf41638e7c5af4a3e53 Mon Sep 17 00:00:00 2001
From: Juraj Roka <95219754+jr-rk@users.noreply.github.com>
Date: Wed, 5 Nov 2025 09:47:07 +0100
Subject: [PATCH 2/4] Added new translation key and removed unused pipe to
avoid error
---
.../admin-update-config.component.html | 2 +-
.../admin-update-config.service.ts | 4 +-
src/assets/i18n/cs.json5 | 5 +-
src/assets/i18n/en.json5 | 76 ++++++++++---------
4 files changed, 45 insertions(+), 42 deletions(-)
diff --git a/src/app/admin/admin-update-config/admin-update-config.component.html b/src/app/admin/admin-update-config/admin-update-config.component.html
index c2a9e98e34f..52458f5f36e 100644
--- a/src/app/admin/admin-update-config/admin-update-config.component.html
+++ b/src/app/admin/admin-update-config/admin-update-config.component.html
@@ -50,7 +50,7 @@
[disabled]="loading || configFiles.length === 0">
diff --git a/src/app/admin/admin-update-config/admin-update-config.service.ts b/src/app/admin/admin-update-config/admin-update-config.service.ts
index bf7c6f329e1..387fe4601e4 100644
--- a/src/app/admin/admin-update-config/admin-update-config.service.ts
+++ b/src/app/admin/admin-update-config/admin-update-config.service.ts
@@ -65,9 +65,7 @@ export class AdminUpdateConfigService {
headers: new HttpHeaders({
'Accept': 'text/plain'
})
- }).pipe(
-
- );
+ });
}
/**
diff --git a/src/assets/i18n/cs.json5 b/src/assets/i18n/cs.json5
index 9f7359571da..b74875f450e 100644
--- a/src/assets/i18n/cs.json5
+++ b/src/assets/i18n/cs.json5
@@ -8132,6 +8132,9 @@
// "admin.update-config.file.info": "File",
"admin.update-config.file.info": "Soubor",
+ // "admin.update-config.file.no-name": "[No Name]",
+ "admin.update-config.file.no-name": "[Bez názvu]",
+
// "admin.update-config.last.modified": "Last modified",
"admin.update-config.last.modified": "Naposledy změněno",
@@ -11791,4 +11794,4 @@
// "clarin-license-agreement-page.download-error": "An error occurred while downloading the file. Please try again later.",
"clarin-license-agreement-page.download-error": "Při stahování souboru došlo k chybě. Zkuste to prosím znovu později.",
-}
\ No newline at end of file
+}
diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5
index d74fd0054e1..790cb096b37 100644
--- a/src/assets/i18n/en.json5
+++ b/src/assets/i18n/en.json5
@@ -5412,67 +5412,69 @@
"system-wide-alert.form.create.error": "Something went wrong when creating the system-wide alert",
"admin.update-config.title": "Update Configuration",
-
+
"admin.update-config.description": "Edit DSpace configuration files through the web interface.",
-
+
"admin.update-config.select.file": "Select Configuration File",
-
+
"admin.update-config.select.file.placeholder": "Choose a file to edit...",
-
+
"admin.update-config.file.info": "File",
-
+
+ "admin.update-config.file.no-name": "[No Name]",
+
"admin.update-config.last.modified": "Last modified",
-
+
"admin.update-config.content": "File Content",
-
+
"admin.update-config.valid": "Valid",
-
+
"admin.update-config.invalid": "Invalid",
-
+
"admin.update-config.validation.errors": "Configuration Validation Errors",
-
+
"admin.update-config.save": "Save Configuration",
-
+
"admin.update-config.reset": "Reset",
-
+
"admin.update-config.help.title": "Important Notes",
-
+
"admin.update-config.help.backup": "Always backup configuration files before making changes.",
-
+
"admin.update-config.help.validate": "Ensure your configuration is valid before saving to prevent system errors.",
-
+
"admin.update-config.help.restart": "Changes may require application restart to take effect.",
-
+
"admin.update-config.help.directory": "Only files in /config/config-be/ directory can be edited for security reasons.",
-
+
"admin.update-config.success.save.title": "Configuration Saved",
-
+
"admin.update-config.success.save.message": "{{message}}",
-
+
"admin.update-config.error.save.title": "Save Failed",
-
+
"admin.update-config.error.save.message": "Unable to save configuration file. Please check the logs and try again.",
-
+
"admin.update-config.error.load.title": "Load Failed",
-
+
"admin.update-config.error.load.message": "Unable to load configuration file: {{fileName}}",
-
+
// Additional translation keys for enhanced UI
"admin.update-config.refresh": "Refresh",
"admin.update-config.refresh.tooltip": "Reload configuration files list",
"admin.update-config.loading": "Loading...",
"admin.update-config.loading-files": "Loading configuration files...",
"admin.update-config.loading-content": "Loading file content...",
-
+
"admin.update-config.file-selection.title": "File Selection",
"admin.update-config.file-selection.label": "Select Configuration File",
-
+
"admin.update-config.file-info.path": "Path",
"admin.update-config.file-info.modified": "Last Modified",
-
+
"admin.update-config.select.choose-file": "Choose a configuration file to edit",
"admin.update-config.select.no-files": "No configuration files found",
-
+
"admin.update-config.editor.title": "Configuration Editor",
"admin.update-config.editor.content": "File Content",
"admin.update-config.editor.placeholder": "Select a file to begin editing...",
@@ -5481,25 +5483,25 @@
"admin.update-config.editor.save.tooltip": "Save changes to the configuration file",
"admin.update-config.editor.reset": "Reset",
"admin.update-config.editor.reset.tooltip": "Reset content to original version",
-
+
"admin.update-config.validation.valid": "Configuration is valid",
"admin.update-config.validation.invalid": "Configuration contains errors - please fix before saving",
"admin.update-config.validation.unsaved-changes": "File has unsaved changes",
-
+
"admin.update-config.help.important.title": "Before You Start",
"admin.update-config.help.important.backup": "Always backup configuration files before making changes",
"admin.update-config.help.important.restart": "DSpace may require restart after configuration changes",
"admin.update-config.help.important.validation": "Configuration validation prevents saving invalid files",
-
+
"admin.update-config.help.allowed-files.title": "Editable Files",
"admin.update-config.help.allowed-files.description": "Only configuration files in the server configuration directory can be edited for security reasons:",
-
+
"admin.update-config.error.load-files.title": "Load Error",
"admin.update-config.error.load-files.message": "Failed to load configuration files list",
-
+
// Breadcrumb
"admin.update-config.breadcrumbs": "Update Configuration",
-
+
// File Information
"admin.update-config.file-info.title": "File Information",
"admin.update-config.file-info.name": "File",
@@ -5508,7 +5510,7 @@
"admin.update-config.file-info.modified": "Modified",
"admin.update-config.file-info.status": "Status",
"admin.update-config.file-info.ready": "Ready for editing",
-
+
// Action Buttons
"admin.update-config.buttons.undo": "Undo Changes",
"admin.update-config.buttons.undo.tooltip": "Reset to last saved version",
@@ -5517,17 +5519,17 @@
"admin.update-config.buttons.save": "Save to File",
"admin.update-config.buttons.save.tooltip": "Save changes to configuration file",
"admin.update-config.buttons.saving": "Saving to File...",
-
+
// Editor Notice
"admin.update-config.editor.notice.title": "File Editor",
"admin.update-config.editor.notice.description": "Editing configuration file {{fileName}}. Changes are saved immediately to the server.",
-
+
// Success Messages
"admin.update-config.success.save.title": "File Saved Successfully",
"admin.update-config.success.save.message": "{{fileName}} has been updated successfully",
"admin.update-config.success.reload.title": "File Reloaded",
"admin.update-config.success.reload.message": "Reloaded {{fileName}} from server",
-
+
// Error Messages
"admin.update-config.error.load-content.title": "Load Failed",
"admin.update-config.error.load-content.message": "Could not load {{fileName}}",
From 9aa5e7a6029c10e85bf2d60febe679395ff32302 Mon Sep 17 00:00:00 2001
From: Juraj Roka <95219754+jr-rk@users.noreply.github.com>
Date: Mon, 24 Nov 2025 09:45:33 +0100
Subject: [PATCH 3/4] Fixed punctuation
---
src/assets/i18n/cs.json5 | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/assets/i18n/cs.json5 b/src/assets/i18n/cs.json5
index 7e946e0c249..a583aac9f3e 100644
--- a/src/assets/i18n/cs.json5
+++ b/src/assets/i18n/cs.json5
@@ -9195,8 +9195,8 @@
"menu.section.licenses": "Správa licencí",
// "menu.section.update-config": "Update Config",
- "menu.section.update-config": "Uprava konfigurace",
-
+ "menu.section.update-config": "Úprava konfigurace",
+
// "menu.section.submissions": "Submissions",
"menu.section.submissions": "Příspěvky",
From d7ed673032e86779e915e6dd536099446fd20067 Mon Sep 17 00:00:00 2001
From: Juraj Roka <95219754+jr-rk@users.noreply.github.com>
Date: Mon, 12 Jan 2026 15:33:28 +0100
Subject: [PATCH 4/4] Fix: lint errors
---
.../admin-update-config.component.ts | 19 +++++++++----------
.../admin-update-config.module.ts | 2 +-
.../admin-update-config.service.ts | 2 +-
src/app/menu.resolver.ts | 2 +-
4 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/src/app/admin/admin-update-config/admin-update-config.component.ts b/src/app/admin/admin-update-config/admin-update-config.component.ts
index 2a394894d73..f49328fa977 100644
--- a/src/app/admin/admin-update-config/admin-update-config.component.ts
+++ b/src/app/admin/admin-update-config/admin-update-config.component.ts
@@ -1,6 +1,5 @@
import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
import { AdminUpdateConfigService, ConfigFile } from './admin-update-config.service';
-import { Observable } from 'rxjs';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { TranslateService } from '@ngx-translate/core';
@@ -24,12 +23,12 @@ export class AdminUpdateConfigComponent implements OnInit {
/**
* Current file content
*/
- fileContent: string = '';
+ fileContent = '';
/**
* Original file content for reset functionality
*/
- originalContent: string = '';
+ originalContent = '';
/**
* Whether we're currently loading data
@@ -141,12 +140,12 @@ export class AdminUpdateConfigComponent implements OnInit {
next: (result) => {
this.saving = false;
this.originalContent = this.fileContent;
-
+
this.notificationsService.success(
- this.translateService.instant('admin.update-config.success.save.title'),
+ this.translateService.instant('admin.update-config.success.save.title'),
this.translateService.instant('admin.update-config.success.save.message', { fileName: this.selectedFile?.fileName })
);
-
+
this.loadConfigFiles();
this.cdr.detectChanges(); // Force change detection after save
},
@@ -178,15 +177,15 @@ export class AdminUpdateConfigComponent implements OnInit {
this.loading = true;
this.cdr.detectChanges(); // Force change detection to show loading state
-
+
this.configService.reloadOriginalContent(this.selectedFile.fileName).subscribe({
next: (originalContent) => {
this.fileContent = originalContent;
this.originalContent = originalContent;
this.loading = false;
-
+
this.notificationsService.success(
- this.translateService.instant('admin.update-config.success.reload.title'),
+ this.translateService.instant('admin.update-config.success.reload.title'),
this.translateService.instant('admin.update-config.success.reload.message', { fileName: this.selectedFile?.fileName })
);
this.cdr.detectChanges(); // Force change detection after reload
@@ -218,4 +217,4 @@ export class AdminUpdateConfigComponent implements OnInit {
}
return this.translateService.instant('admin.update-config.select.choose-file');
}
-}
\ No newline at end of file
+}
diff --git a/src/app/admin/admin-update-config/admin-update-config.module.ts b/src/app/admin/admin-update-config/admin-update-config.module.ts
index e5da2ce189b..c36222656c7 100644
--- a/src/app/admin/admin-update-config/admin-update-config.module.ts
+++ b/src/app/admin/admin-update-config/admin-update-config.module.ts
@@ -20,4 +20,4 @@ import { AdminUpdateConfigRoutingModule } from './admin-update-config-routing.mo
AdminUpdateConfigService
]
})
-export class AdminUpdateConfigModule { }
\ No newline at end of file
+export class AdminUpdateConfigModule { }
diff --git a/src/app/admin/admin-update-config/admin-update-config.service.ts b/src/app/admin/admin-update-config/admin-update-config.service.ts
index 387fe4601e4..3e42ed96cd2 100644
--- a/src/app/admin/admin-update-config/admin-update-config.service.ts
+++ b/src/app/admin/admin-update-config/admin-update-config.service.ts
@@ -1,6 +1,6 @@
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
-import { Observable, of } from 'rxjs';
+import { Observable } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
import { RESTURLCombiner } from '../../core/url-combiner/rest-url-combiner';
diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts
index 7a345edf2f8..dba08b99538 100644
--- a/src/app/menu.resolver.ts
+++ b/src/app/menu.resolver.ts
@@ -669,7 +669,7 @@ export class MenuResolver implements Resolve {
icon: 'exclamation-circle',
index: 14
},
-
+
/* Update Config */
{
id: 'update_config',