diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 6fa60d8..4ca0dcf 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -35,6 +35,10 @@ export class AppComponent { this.direction = this.storageService.getItem('direction') || directions.LTR; this.storageService.setItem('direction', this.direction); + // if (typeof document !== 'undefined') { + // document.documentElement.setAttribute('dir', this.direction); + // } + const userStr = this.storageService.getItem('user'); if (userStr) { try { diff --git a/src/app/authenticate/login/login.component.html b/src/app/authenticate/login/login.component.html index bb04f41..05571ae 100644 --- a/src/app/authenticate/login/login.component.html +++ b/src/app/authenticate/login/login.component.html @@ -29,7 +29,7 @@
- +
diff --git a/src/app/authenticate/login/login.component.ts b/src/app/authenticate/login/login.component.ts index ee2488b..ed9acb1 100644 --- a/src/app/authenticate/login/login.component.ts +++ b/src/app/authenticate/login/login.component.ts @@ -87,13 +87,13 @@ export class LoginComponent { this.storageService.setItem('direction', this.direction); } else { - this.direction = directions.RTL; + this.direction = directions.LTR; this.storageService.setItem('direction', this.direction); } if (typeof document !== 'undefined') { document.documentElement.setAttribute('dir', this.direction); document.documentElement.setAttribute('lang', - this.direction === directions.RTL ? 'ar' : 'en'); + this.direction === directions.LTR ? 'ar' : 'en'); } } @@ -124,6 +124,7 @@ export class LoginComponent { } } + onLangChange() { const selectedLang = this.currentLanguage.value; diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index 9c5fce9..0f37358 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -1 +1,3 @@ -

dashboard works!

+
+

dashboard works!

+
diff --git a/src/app/dashboard/dashboard.component.scss b/src/app/dashboard/dashboard.component.scss index e69de29..9d05b88 100644 --- a/src/app/dashboard/dashboard.component.scss +++ b/src/app/dashboard/dashboard.component.scss @@ -0,0 +1,14 @@ +.dashboard-bg { + position: relative; + min-height: 100vh; + z-index: 1; +} +.dashboard-bg::after { + content: ""; + position: absolute; + inset: 0; + background: url('/assets/images/logo.png') center / contain no-repeat; + background-size: 350px; + opacity: 0.5; /* less transparent */ + z-index: -1; +} \ No newline at end of file diff --git a/src/app/logging/logging.component.html b/src/app/logging/logging.component.html index 5efba20..dc29e18 100644 --- a/src/app/logging/logging.component.html +++ b/src/app/logging/logging.component.html @@ -4,9 +4,7 @@
- +
@@ -21,7 +19,7 @@
-
+
+
+ {{ 'fieldRequired' | translate }} +
@@ -51,6 +53,16 @@ />
+
+ {{ 'fieldRequired' | translate }} +
+
+ {{ 'toDateInvalidError' | translate }} +
@@ -72,43 +84,49 @@
-
- {{ "activityLogDetails" | translate }} +
+ {{ "activityLogDetails" | translate }} -
- +
+ -
- -
- - - - - +
+ +
- - - -
+ +
-
+
-
- {{ "noLoggingDetailsFound" | translate }} +
+ +

{{ "noLoggingDetailsFound" | translate }}

@@ -137,43 +155,59 @@ - -
- - + +
+ +
+ {{ "show" | translate }} +
+ + + {{ item.value }} {{ "entries" | translate }} + -
+ + {{ item.value }} {{ "entries" | translate }} + + +
+
+ + +
{{ "page" | translate }} {{ currentPage }} - {{ "of" | translate }} {{ totalPages() }} ({{ - filteredItems.length - }} - {{ "totalItems" | translate }}) + {{ "of" | translate }} {{ totalPages() }} + + ({{ filteredItems.length }} {{ "totalItems" | translate }}) +
+
-
@@ -183,4 +217,4 @@
-
+
\ No newline at end of file diff --git a/src/app/logging/logging.component.ts b/src/app/logging/logging.component.ts index 67e2948..69b9cf1 100644 --- a/src/app/logging/logging.component.ts +++ b/src/app/logging/logging.component.ts @@ -162,8 +162,22 @@ export class LoggingComponent implements OnInit { } exportDataInExcel(): void { + const sanitizedData = this.filteredItems.map(item => { + if (item.requestBody) { + try { + const body = JSON.parse(item.requestBody); + if (body.password) { + body.password = '******'; + } + return { ...item, requestBody: JSON.stringify(body) }; + } catch { + return item; + } + } + return item; + }); this.excelExportService.exportExcel( - this.filteredItems, + sanitizedData, LOGGING_DETAILS_FILE_NAME, ); } diff --git a/src/app/services/authenticate.service.ts b/src/app/services/authenticate.service.ts index d6ceaa3..9a082ca 100644 --- a/src/app/services/authenticate.service.ts +++ b/src/app/services/authenticate.service.ts @@ -24,11 +24,11 @@ export class AuthenticationService { constructor(private buttonManagementService: ButtonManagementService, private httpService: HttpURIService, private router: Router, private credentialService: CredentialService, private i18nService: I18NService, private storageService: StorageService) { } authenticate(uCreds: UserCredentials): Observable { - const userJson = this.storageService.getItem('user'); - if (this.storageService.getItem('user') != null) { - this.i18nService.error(ErrorMessages.ALREADY_LOGGED_IN, []); - return new Observable(); // empty - } + // const userJson = this.storageService.getItem('user'); + // if (this.storageService.getItem('user') != null) { + // this.i18nService.error(ErrorMessages.ALREADY_LOGGED_IN, []); + // return new Observable(); // empty + // } this.credentialService.setPorOrgacode(HiddenValues.POR_ORGACODE); this.credentialService.setUserId(uCreds.userId); @@ -81,7 +81,7 @@ export class AuthenticationService { isAdminUser(){ if (this.storageService && this.storageService.getItem('user') != null) { let cachedUser = JSON.parse(this.storageService.getItem('user') || '{}'); - return cachedUser.user.role === HiddenValues.ADMIN_USER || cachedUser.user.role === HiddenValues.SUPER_ADMIN; + return cachedUser.user.role === HiddenValues.SUPER_ADMIN; } return false; } diff --git a/src/app/shared/services/excel-export.service.ts b/src/app/shared/services/excel-export.service.ts index d0b0c7d..9691cb8 100644 --- a/src/app/shared/services/excel-export.service.ts +++ b/src/app/shared/services/excel-export.service.ts @@ -1,28 +1,66 @@ import { Injectable } from '@angular/core'; import { saveAs } from 'file-saver'; import * as XLSX from 'xlsx'; +import { TranslateService } from '@ngx-translate/core'; import { EXCEL_FILE_EXTENSION, EXCEL_FILE_TYPE } from '../../utils/app.constants'; +import { StorageService } from './storage.service'; +import { supportedLanguages } from '../../utils/enums'; @Injectable({ providedIn: 'root' }) export class ExcelExportService { - constructor() { } - private fileType = EXCEL_FILE_TYPE; - private fileExtension = EXCEL_FILE_EXTENSION; + private fileExtension = EXCEL_FILE_EXTENSION; + + constructor(private translate: TranslateService, private storageService: StorageService) { } public exportExcel(jsonData: any[], fileName: string): void { - const ws: XLSX.WorkSheet = XLSX.utils.json_to_sheet(jsonData); - const wb: XLSX.WorkBook = { Sheets: { 'data': ws }, SheetNames: ['data'] }; + const translatedData = this.translateHeaders(jsonData); + + const ws: XLSX.WorkSheet = XLSX.utils.json_to_sheet(translatedData); + const wb: XLSX.WorkBook = { Sheets: { data: ws }, SheetNames: ['data'] }; const excelBuffer: any = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }); + this.saveExcelFile(excelBuffer, fileName); } + private translateHeaders(data: any[]): any[] { + if (!data?.length) return data; + + return data.map(row => { + const newRow: any = {}; + + Object.keys(row).forEach(key => { + const candidates = [ + key, + key.toLowerCase(), + key.toUpperCase(), + key.replace(/([A-Z])/g, '_$1').toUpperCase() + ]; + + let translatedKey = key; + + for (const candidate of candidates) { + const value = this.translate.instant(candidate); + if (value !== candidate) { + translatedKey = value; + break; + } + } + + newRow[translatedKey] = row[key]; + }); + + return newRow; + }); + } + + private saveExcelFile(buffer: any, fileName: string): void { - const data: Blob = new Blob([buffer], {type: this.fileType}); - saveAs.saveAs(data, fileName + this.fileExtension); + const data: Blob = new Blob([buffer], { type: this.fileType }); + saveAs(data, fileName + this.fileExtension); } } diff --git a/src/app/transaction-logs/transaction-logs.component.html b/src/app/transaction-logs/transaction-logs.component.html index cc6f86a..b052641 100644 --- a/src/app/transaction-logs/transaction-logs.component.html +++ b/src/app/transaction-logs/transaction-logs.component.html @@ -3,9 +3,7 @@
- +
@@ -19,9 +17,7 @@
-
+
{{ "transactionLogs" | translate }}
@@ -32,169 +28,164 @@ [(ngModel)]="searchText" (ngModelChange)="onSearch($event)" placeholder="{{ 'search' | translate }}" + [disabled]="isLoading" />
+
- + [disabled]="isLoading || transactionLog.length === 0" + title="Export to Excel" + > + +
- - - - - - - - + + +
-
-

{{ "loadingTransactionLogs" | translate }}

+ +
+
+ Loading... +
+

{{ "loadingTransactionLogs" | translate }}

-
-

{{ "noTransactionLogsFound" | translate }}

+ + -
- {{ errorMessage }} + +
+ +
{{ "noTransactionLogsFound" | translate }}
-
- + +
+
- - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + +
{{ "logID" | translate }}{{ "organization" | translate }}{{ "transactionID" | translate }}{{ "drAccount" | translate }}{{ "crAccount" | translate }}{{ "drPcaGlacode" | translate }}{{ "crPcaglacode" | translate }}{{ "transactionCode" | translate }}{{ "transactionUri" | translate }}{{ "paymentMode" | translate }}{{ "date" | translate }}{{ "channel" | translate }}{{ "createdAt" | translate }}{{ "logID" | translate }}{{ "organization" | translate }}{{ "transactionID" | translate }}{{ "drAccount" | translate }}{{ "crAccount" | translate }}{{ "drPcaGlacode" | translate }}{{ "crPcaglacode" | translate }}{{ "transactionUri" | translate }}{{ "transactionCode" | translate }}{{ "paymentMode" | translate }}{{ "date" | translate }}{{ "channel" | translate }}{{ "createdAt" | translate }}
{{ log.logId }}{{ log.porOrgacode }}{{ log.transactionID }}{{ log.drMbmbkmsnumber || "-" }}{{ log.crMbmbkmsnumber || "-" }}{{ log.drPcaGlacode || "-" }}{{ log.crPcaglacode || "-" }}{{log.transactionUri || "N/A"}}{{log.transactionCode || "N/A"}}{{ log.ppmPymdcode }} - {{ log.sgtGntrdate | date: "MMM dd, yyyy" }} - {{ log.channelCode }} - {{ - log.createdAt | date: "MMM dd, yyyy HH:mm" - }} -
{{ log.logId || '-' }}{{ log.porOrgacode || '-' }}{{ log.transactionID || '-' }}{{ log.drMbmbkmsnumber || '-' }}{{ log.crMbmbkmsnumber || '-' }}{{ log.drPcaGlacode || '-' }}{{ log.crPcaglacode || '-' }}{{ log.transactionUri || 'N/A' }}{{ log.transactionCode || 'N/A' }}{{ log.ppmPymdcode || '-' }}{{ log.sgtGntrdate | date: 'MMM dd, yyyy' }}{{ log.channelCode || '-' }}{{ log.createdAt | date: 'MMM dd, yyyy HH:mm' }}
-
-
- - + +
+ +
+ {{ "show" | translate }} +
+ + + {{ item.value }} {{ "entries" | translate }} + + + + {{ item.value }} {{ "entries" | translate }} + + +
-
+ +
{{ "page" | translate }} {{ currentPage }} - {{ "of" | translate }} {{ totalPages() }} ({{ - totalCount - }} - {{ "totalItems" | translate }}) + {{ "of" | translate }} {{ totalPages() }} + + ({{ totalCount }} {{ "totalItems" | translate }}) +
+
@@ -211,11 +202,13 @@
- -
-

{{ "noTransactionLogsFound" | translate }}

+ + +
+ +

{{ "tableCollapsed" | translate }}

+
-
+ \ No newline at end of file diff --git a/src/app/transaction-logs/transaction-logs.component.scss b/src/app/transaction-logs/transaction-logs.component.scss index e69de29..e980abf 100644 --- a/src/app/transaction-logs/transaction-logs.component.scss +++ b/src/app/transaction-logs/transaction-logs.component.scss @@ -0,0 +1,125 @@ +:host { + display: block; +} + +.card-header { + background-color: #f8f9fa; + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} + +.search-box { + position: relative; + min-width: 200px; + + .form-control { + padding-left: 2.5rem; + padding-right: 1rem; + } + + .search-icon { + position: absolute; + left: 1rem; + top: 50%; + transform: translateY(-50%); + color: #6c757d; + pointer-events: none; + } +} + +.table { + th { + font-weight: 600; + background-color: #f8f9fa; + border-bottom: 2px solid #dee2e6; + white-space: nowrap; + } + + td { + vertical-align: middle; + } +} + +.btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; +} + +.badge { + font-size: 0.75em; +} + +.alert-info { + background-color: #e7f3ff; + border-color: #b3d7ff; + color: #004085; + + .btn-close { + padding: 0.5rem; + } +} + +.spinner-border { + width: 3rem; + height: 3rem; +} + +// Responsive adjustments +@media (max-width: 768px) { + .card-header .d-flex { + flex-direction: column; + align-items: stretch !important; + gap: 0.75rem !important; + } + + .search-box { + min-width: 100%; + } + + .table-responsive { + font-size: 0.875rem; + } + + .d-flex.justify-content-between { + flex-direction: column; + gap: 1rem; + + > div { + width: 100%; + justify-content: center !important; + } + } + + .btn-group { + width: 100%; + + .btn { + flex: 1; + } + } +} + +// Loading overlay +.text-center.py-5 { + min-height: 200px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +// Hover effects +.table-hover tbody tr:hover { + background-color: rgba(0, 123, 255, 0.05); +} + +// Date filter styles +.form-control-sm { + min-width: 120px; +} + +// Active state for filter buttons +.btn-outline-primary.active { + background-color: #0d6efd; + color: white; + border-color: #0d6efd; +} \ No newline at end of file diff --git a/src/app/transaction-logs/transaction-logs.component.ts b/src/app/transaction-logs/transaction-logs.component.ts index 6ebe73d..1befd51 100644 --- a/src/app/transaction-logs/transaction-logs.component.ts +++ b/src/app/transaction-logs/transaction-logs.component.ts @@ -7,20 +7,19 @@ import { pageSizeOptions } from '../utils/app.constants'; import { NgSelectModule } from '@ng-select/ng-select'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { TableFilterPipe } from '../shared/pipes/table-filter.pipe'; -import {TransactionLog} from "../models/user" +import { TransactionLog } from "../models/user"; import { URIKey } from '../utils/uri-enums'; import { HttpParams } from '@angular/common/http'; import { HttpURIService } from '../app.http.uri.service'; +import { formatDate } from '@angular/common'; @Component({ selector: 'app-transaction-logs', templateUrl: './transaction-logs.component.html', - imports: [CommonModule, TranslateModule, NgSelectModule, FormsModule, ReactiveFormsModule, TableFilterPipe ] + styleUrls: ['./transaction-logs.component.scss'], + imports: [CommonModule, TranslateModule, NgSelectModule, FormsModule, ReactiveFormsModule, TableFilterPipe] }) export class TransactionLogsComponent implements OnInit { -onPageSizeChange(arg0: number) { -throw new Error('Method not implemented.'); -} currentPage: number = 1; totalCount: number = 0; renewalDataExpanded: boolean = true; @@ -32,75 +31,215 @@ throw new Error('Method not implemented.'); errorMessage: string = ''; searchText: string = ''; allItems: TransactionLog[] = []; - transactionDataExpanded: boolean = true - + transactionDataExpanded: boolean = true; + + // Date range properties + fromDate: string = ''; + toDate: string = ''; + maxDate: string = ''; + showDateFilters: boolean = false; + constructor( private excelExportService: ExcelExportService, private httpService: HttpURIService, ) {} - ngOnInit(): void { + // Set max date to today + this.maxDate = formatDate(new Date(), 'yyyy-MM-dd', 'en-US'); + + // Optionally set default date range (last 30 days) + const today = new Date(); + const lastMonth = new Date(); + lastMonth.setDate(today.getDate() - 30); + + this.fromDate = formatDate(lastMonth, 'yyyy-MM-dd', 'en-US'); + this.toDate = formatDate(today, 'yyyy-MM-dd', 'en-US'); + this.loadTransactionLogs(); } - loadTransactionLogs(): void { - this.isLoading = true; - const params = new HttpParams(); - this.httpService - .requestGET(URIKey.TRANSACTION_LOGS, params) - .subscribe({ - next: (res) => { - const logs = Array.isArray(res) ? res : res?.data; - this.transactionLog = logs ?? []; - this.allItems = [...this.transactionLog]; - this.totalCount = this.transactionLog.length; - - this.updatePagedItems(); - this.isLoading = false; - }, - error: (err) => { - console.error('Error fetching logging details data:', err); - this.transactionLog = []; - this.isLoading = false; + + loadTransactionLogs(): void { + this.isLoading = true; + this.errorMessage = ''; + + // Build query parameters + let params = new HttpParams(); + + // Add pagination parameters + params = params.set('page', this.currentPage.toString()); + params = params.set('limit', this.itemsPerPage.toString()); + + // Add date filters if provided + if (this.fromDate) { + params = params.set('fromDate', this.fromDate); + } + + if (this.toDate) { + params = params.set('toDate', this.toDate); + } + + // Add search filter if provided + if (this.searchText && this.searchText.trim() !== '') { + params = params.set('search', this.searchText.trim()); + } + + this.httpService + .requestGET(URIKey.TRANSACTION_LOGS, params) + .subscribe({ + next: (res) => { + const logs = Array.isArray(res) ? res : res?.data; + this.transactionLog = logs ?? []; + this.allItems = [...this.transactionLog]; + + // Get total count from response + if (res?.total !== undefined) { + this.totalCount = res.total; + } else if (res?.pagination?.total !== undefined) { + this.totalCount = res.pagination.total; + } else if (res?.meta?.total !== undefined) { + this.totalCount = res.meta.total; + } else { + this.totalCount = this.transactionLog.length; + } + + this.updatePagedItems(); + this.isLoading = false; + }, + error: (err) => { + console.error('Error fetching transaction logs:', err); + this.errorMessage = err.message || 'Failed to load transaction logs. Please try again.'; + this.transactionLog = []; + this.allItems = []; + this.totalCount = 0; + this.pagedItems = []; + this.isLoading = false; + }, + complete: () => { + this.isLoading = false; + } + }); + } + + // Date filter change handler + onDateFilterChange(): void { + // Validate date range + if (this.fromDate && this.toDate) { + const from = new Date(this.fromDate); + const to = new Date(this.toDate); + + if (from > to) { + this.errorMessage = 'From date cannot be after To date'; + return; } - }); -} + } + + // Reset to first page and reload + this.currentPage = 1; + this.loadTransactionLogs(); + } + + // Clear date filters + clearDateFilters(): void { + this.fromDate = ''; + this.toDate = ''; + this.currentPage = 1; + this.loadTransactionLogs(); + } + + // Toggle date filter visibility + toggleDateFilters(): void { + this.showDateFilters = !this.showDateFilters; + } + + // Apply default date range (Last 7 days) + applyLast7Days(): void { + const today = new Date(); + const lastWeek = new Date(); + lastWeek.setDate(today.getDate() - 7); + + this.fromDate = formatDate(lastWeek, 'yyyy-MM-dd', 'en-US'); + this.toDate = formatDate(today, 'yyyy-MM-dd', 'en-US'); + this.onDateFilterChange(); + } + + // Apply default date range (Last 30 days) + applyLast30Days(): void { + const today = new Date(); + const lastMonth = new Date(); + lastMonth.setDate(today.getDate() - 30); + + this.fromDate = formatDate(lastMonth, 'yyyy-MM-dd', 'en-US'); + this.toDate = formatDate(today, 'yyyy-MM-dd', 'en-US'); + this.onDateFilterChange(); + } + + // Apply default date range (This month) + applyThisMonth(): void { + const today = new Date(); + const firstDay = new Date(today.getFullYear(), today.getMonth(), 1); + + this.fromDate = formatDate(firstDay, 'yyyy-MM-dd', 'en-US'); + this.toDate = formatDate(today, 'yyyy-MM-dd', 'en-US'); + this.onDateFilterChange(); + } toggleTableCard(): void { - this.transactionDataExpanded = !this.transactionDataExpanded; -} + this.transactionDataExpanded = !this.transactionDataExpanded; + } + itemsPerPageChanged(): void { this.currentPage = 1; - this.updatePagedItems(); + this.loadTransactionLogs(); } + onSearch(value: string): void { - this.searchText = value; -} + this.searchText = value; + this.currentPage = 1; + + // Debounce search to avoid too many API calls + clearTimeout((this as any).searchTimeout); + (this as any).searchTimeout = setTimeout(() => { + this.loadTransactionLogs(); + }, 300); + } - totalPages(): number { - return Math.ceil(this.allItems.length / this.itemsPerPage); + totalPages(): number { + return Math.ceil(this.totalCount / this.itemsPerPage); } previousPage(): void { if (this.currentPage > 1) { this.currentPage--; - this.updatePagedItems(); + this.loadTransactionLogs(); } } + updatePagedItems(): void { + // For client-side display with table filter pipe const startIndex = (this.currentPage - 1) * this.itemsPerPage; const endIndex = startIndex + this.itemsPerPage; + + // If using server-side pagination, use transactionLog directly + // If using client-side filtering with tableFilter pipe, this might not be needed this.pagedItems = this.allItems.slice(startIndex, endIndex); } nextPage(): void { if (this.currentPage < this.totalPages()) { this.currentPage++; - this.updatePagedItems(); + this.loadTransactionLogs(); } } - exportDataInExcel() { - this.excelExportService.exportExcel(this.transactionLog, TRANSACTION_LOGS_FILE_NAME) + exportDataInExcel(): void { + // Export filtered data + const dataToExport = this.allItems.length > 0 ? this.allItems : this.transactionLog; + this.excelExportService.exportExcel(dataToExport, TRANSACTION_LOGS_FILE_NAME); + } + + // Get filtered items for display (used in template) + get filteredItems(): TransactionLog[] { + return this.allItems; } } \ No newline at end of file diff --git a/src/app/user-management/change-password/change-password.component.ts b/src/app/user-management/change-password/change-password.component.ts index a8d3ce3..d885159 100644 --- a/src/app/user-management/change-password/change-password.component.ts +++ b/src/app/user-management/change-password/change-password.component.ts @@ -174,24 +174,8 @@ constructor( next: (response) => { if (!(response instanceof HttpErrorResponse)) { this.i18nService.success(SuccessMessages.CHANGE_PASSWORD_SUCCESS, []); - - const userStr = this.storageService.getItem('user'); - if (userStr) { - const user = JSON.parse(userStr); - user.requiresPasswordChange = false; - if (user.user) { - user.user.firstLogin = false; - } - - if (payload.newPassword) { - this.storageService.setItem(FormConstants.PASSWORD, payload.newPassword); - } - this.storageService.setItem('user', JSON.stringify(user)); - this.authService.updateCredentialsAfterPasswordChange(payload.newPassword); - - } - - this.router.navigate(['/home/dashboard']); + this.authService.logout(); + this.router.navigate(['login']); } }, error: (error) => { diff --git a/src/app/user-management/reset-password-modal/reset-password-modal.component.html b/src/app/user-management/reset-password-modal/reset-password-modal.component.html index 1492dec..954b0b7 100644 --- a/src/app/user-management/reset-password-modal/reset-password-modal.component.html +++ b/src/app/user-management/reset-password-modal/reset-password-modal.component.html @@ -1,4 +1,4 @@ -