/** * Copyright since 2025 Mifos Initiative * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** Angular Imports */ import { Component, OnInit, inject } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { SettingsService } from 'app/settings/settings.service'; import { Dates } from 'app/core/utils/dates'; import { AlertService } from 'app/core/alert/alert.service'; /** Custom Services */ import { SystemService } from '../../../system.service'; import { CdkTextareaAutosize } from '@angular/cdk/text-field'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; /** * Edit Configuration Component */ @Component({ selector: 'mifosx-edit-configuration', templateUrl: './edit-configuration.component.html', styleUrls: ['./edit-configuration.component.scss'], imports: [ ...STANDALONE_SHARED_IMPORTS, CdkTextareaAutosize ] }) export class EditConfigurationComponent implements OnInit { private formBuilder = inject(UntypedFormBuilder); private systemService = inject(SystemService); private settingsService = inject(SettingsService); private route = inject(ActivatedRoute); private router = inject(Router); private dateUtils = inject(Dates); private alertService = inject(AlertService); /** Minimum transaction date allowed. */ minDate = new Date(2000, 0, 1); /** Maximum transaction date allowed. */ maxDate = new Date(); /** Global Configuration form. */ configurationForm: UntypedFormGroup; /** Configuration. */ configuration: any; /** * Retrieves the configuration data from `resolve`. * @param {FormBuilder} formBuilder Form Builder. * @param {SystemService} systemService System Service. * @param {SettingsService} settingsService Setting Service. * @param {ActivatedRoute} route Activated Route. * @param {Router} router Router for navigation. */ constructor() { this.route.data.subscribe((data: { configuration: any }) => { this.configuration = data.configuration; }); } /** * Creates and sets the configuration form. */ ngOnInit() { this.maxDate = this.settingsService.businessDate; this.createConfigurationForm(); } /** * Creates and sets the global configuration form. */ createConfigurationForm() { this.configurationForm = this.formBuilder.group({ name: [ { value: this.configuration.name, disabled: true }, Validators.required ], description: [{ value: this.configuration.description, disabled: true }], value: [this.configuration.value], stringValue: [this.configuration.stringValue], dateValue: [this.configuration.dateValue] }); } /** * Submits the global configuration form and updates global configuration, * if successful redirects to view all global configurations. */ submit() { if ( this.configurationForm.value.value != null || this.configurationForm.value.stringValue != null || this.configurationForm.value.dateValue != null ) { const payload: any = { ...this.configurationForm.value }; if (!this.configurationForm.value.stringValue) { delete payload.stringValue; } if (this.configurationForm.value.dateValue != null) { // Format the date according to the dateFormat setting const dateFormat = this.settingsService.dateFormat || 'dd MMMM yyyy'; const formattedDate = this.dateUtils.formatDate(this.configurationForm.value.dateValue, dateFormat); if (formattedDate) { payload.dateValue = formattedDate; payload.locale = this.settingsService.language.code; payload.dateFormat = dateFormat; } else { // Avoid sending invalid/null date to backend delete payload.dateValue; } } else { delete payload.dateValue; } this.systemService.updateConfiguration(this.configuration.id, payload).subscribe((response: any) => { if (response?.rollbackTransaction) { this.alertService.alert({ type: 'Success', message: 'Configuration update has been submitted for approval.' }); this.router.navigate(['../../'], { relativeTo: this.route }); return; } this.router.navigate(['../../'], { relativeTo: this.route }); }); } } }