From e3bd2193b8915a0b2008bbb030f8493f3592d988 Mon Sep 17 00:00:00 2001 From: atif118-mfsys Date: Mon, 12 Jan 2026 11:24:59 +0500 Subject: [PATCH] integrated GET call in logger manager to get logging details --- src/app/logging/logging.component.html | 126 ++++++++++-------- src/app/logging/logging.component.ts | 122 ++++++++++++++--- src/app/services/button-management.service.ts | 2 +- src/app/shared/pipes/table-filter.pipe.ts | 25 ++++ .../user-permissions.component.ts | 2 +- src/app/utils/app.constants.ts | 21 ++- src/app/utils/app.interfaces.ts | 18 +++ src/app/utils/uri-enums.ts | 3 +- src/assets/data/app.uri.json | 5 + src/assets/i18n/Arabic.json | 4 +- src/assets/i18n/English.json | 4 +- 11 files changed, 245 insertions(+), 87 deletions(-) create mode 100644 src/app/shared/pipes/table-filter.pipe.ts create mode 100644 src/app/utils/app.interfaces.ts diff --git a/src/app/logging/logging.component.html b/src/app/logging/logging.component.html index 63568bd..b9dfb49 100644 --- a/src/app/logging/logging.component.html +++ b/src/app/logging/logging.component.html @@ -22,7 +22,7 @@ {{'loggerManager' | translate}}
-
+
@@ -34,14 +34,15 @@ class="password-wrapper position-relative w-100">
- +
- +
+ {{ 'fieldRequired' | translate }} +
@@ -54,9 +55,23 @@
- + +
+
+ {{ 'fieldRequired' | translate }} +
+ +
+ {{ 'toDateInvalidError' | translate }} +
+
@@ -65,10 +80,11 @@
- +
- @@ -100,14 +116,14 @@
{{'loggerManagerDetails' | translate}} -
+
- - + + @@ -116,7 +132,7 @@
-
+
@@ -125,43 +141,19 @@ - - - - - - - - - - - - + + + + + + +
{{'loggingRequestUri' | translate}} {{'loggingResponseCode' | translate}} {{'loggingRemoteIP' | translate}}{{'loggingTimeTaken' | translate}} {{'loggingDateTime' | translate}} {{'loggingMethod' | translate}}{{'action' | translate}}
-
- - - - - - - -
-
{{logs?.id}}{{logs?.requestUri}}{{logs?.responseCode}}{{logs?.remoteIp}}{{logs?.dateTime | date:'dd-MM-yyyy, hh:mm a'}}{{logs?.method}}
@@ -171,28 +163,39 @@
-
- {{ 'page' | translate }} {{ 'of' | translate }} ({{ - 'totalItems' | translate }}) +
+ {{'page' | translate}} {{currentPage}} {{'of' | + translate}} {{totalPages()}} ({{allItems.length}} + {{'totalItems' | translate}}) +
+
+ {{'no_record' | translate}} +
+
+ {{'page' | translate}} {{currentPage}} {{'of' | + translate}} {{totalPages()}} ({{allItems.length}} + {{'record' | translate}})
- -
-
@@ -206,4 +209,9 @@
- \ No newline at end of file + + +
+

{{'noLoggingDetailsFound' | translate}}

+
+
\ No newline at end of file diff --git a/src/app/logging/logging.component.ts b/src/app/logging/logging.component.ts index 9a0221a..dd6c8d8 100644 --- a/src/app/logging/logging.component.ts +++ b/src/app/logging/logging.component.ts @@ -1,28 +1,116 @@ -import { Component } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; import { NgSelectModule } from '@ng-select/ng-select'; import { TranslateModule } from '@ngx-translate/core'; -import { pageSizeOptions } from '../utils/app.constants'; -import { CommonModule } from '@angular/common'; +import { pageSizeOptions, toDateAfterFromDateValidator } from '../utils/app.constants'; +import { CommonModule, DatePipe } from '@angular/common'; +import { HttpParams } from '@angular/common/http'; +import { URIKey } from '../utils/uri-enums'; +import { HttpURIService } from '../app.http.uri.service'; +import { LogsManagementResponse } from '../utils/app.interfaces'; +import { TableFilterPipe } from '../shared/pipes/table-filter.pipe'; @Component({ selector: 'app-logging', - imports: [TranslateModule, FormsModule, NgSelectModule, CommonModule, ReactiveFormsModule], + imports: [ TranslateModule, FormsModule, NgSelectModule, CommonModule, ReactiveFormsModule, + TableFilterPipe + ], + providers: [ DatePipe ], templateUrl: './logging.component.html', styleUrl: './logging.component.scss' }) -export class LoggingComponent { +export class LoggingComponent implements OnInit { currentPage: number = 1; -pageSizeOptions = pageSizeOptions -renewalDataExpanded: boolean = true -itemsPerPage: number = 5; - searchText: any; -toggleCard(arg0: string) { -throw new Error('Method not implemented.'); -} -nextPage() { -throw new Error('Method not implemented.'); -} -logsForm: any; + pageSizeOptions = pageSizeOptions + logsDataExpanded: boolean = true + itemsPerPage: number = 5; + searchText: any = ''; + allItems: any[] = []; + pagedItems: any[] = []; + logsList: LogsManagementResponse[] = []; + logsSearchForm!: FormGroup; + isLoading: boolean = false; + + constructor( + private fb: FormBuilder, + private httpService: HttpURIService, + private datePipe: DatePipe + ) { } + + ngOnInit() { + this.initializeLogsSearchForm(); + } + + initializeLogsSearchForm() { + this.logsSearchForm = this.fb.group({ + fromDate: ['', Validators.required], + toDate: ['', Validators.required] + }, + { + validators: toDateAfterFromDateValidator + }) + } + + getlogsData(){ + if(this.logsSearchForm.invalid) + return; + + let formValues = this.logsSearchForm.value; + this.isLoading = true; + + let fromDateTransformed = this.datePipe.transform(formValues.fromDate, "dd-MM-yyyy"); + let toDateTransformed = this.datePipe.transform(formValues.toDate, "dd-MM-yyyy"); + + const params = new HttpParams() + .set('fromDate', fromDateTransformed!) + .set('toDate', toDateTransformed!); + + this.httpService.requestGET(URIKey.LOGGER_MANAGER_URI, params).subscribe({ + next: (response) => { + this.logsList = response; + this.allItems = [...this.logsList]; + this.updatePagedItems(); + this.isLoading = false; + }, + error: (err) => { + console.error('Error fetching BOD data:', err); + this.logsList = []; + this.isLoading = false; + } + }); + } + + updatePagedItems(): void { + const startIndex = (this.currentPage - 1) * this.itemsPerPage; + const endIndex = startIndex + this.itemsPerPage; + this.pagedItems = this.allItems.slice(startIndex, endIndex); + } + + totalPages(): number { + return Math.ceil(this.allItems.length / this.itemsPerPage); + } + + previousPage(): void { + if (this.currentPage > 1) { + this.currentPage--; + this.updatePagedItems(); + } + } + + nextPage(): void { + if (this.currentPage < this.totalPages()) { + this.currentPage++; + this.updatePagedItems(); + } + } + + itemsPerPageChanged(): void { + this.currentPage = 1; + this.updatePagedItems(); + } + + toggleTableCard(){ + this.logsDataExpanded = !this.logsDataExpanded; + } } diff --git a/src/app/services/button-management.service.ts b/src/app/services/button-management.service.ts index e3ef074..4655b0d 100644 --- a/src/app/services/button-management.service.ts +++ b/src/app/services/button-management.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@angular/core"; import { Observable } from "rxjs"; -import { PermissionNode } from "../utils/app.constants"; +import { PermissionNode } from "../utils/app.interfaces"; import { HttpURIService } from "../app.http.uri.service"; import { StorageService } from "../shared/services/storage.service"; diff --git a/src/app/shared/pipes/table-filter.pipe.ts b/src/app/shared/pipes/table-filter.pipe.ts new file mode 100644 index 0000000..07a6174 --- /dev/null +++ b/src/app/shared/pipes/table-filter.pipe.ts @@ -0,0 +1,25 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'tableFilter', + standalone: true +}) +export class TableFilterPipe implements PipeTransform { + transform(items: any[], searchText: string, filterProperties: string[]): any[] { + if (!items) return []; + if (!searchText.trim()) return items; + + searchText = searchText.toLowerCase().trim(); + + return items.filter(item => { + return filterProperties.some(prop => { + const value = this.getNestedProperty(item, prop)?.toString().toLowerCase(); + return value?.includes(searchText); + }); + }); + } + + private getNestedProperty(obj: any, path: string): any { + return path.split('.').reduce((o, p) => o?.[p], obj); + } +} \ No newline at end of file diff --git a/src/app/user-permissions/user-permissions.component.ts b/src/app/user-permissions/user-permissions.component.ts index 1575a77..0efc51a 100644 --- a/src/app/user-permissions/user-permissions.component.ts +++ b/src/app/user-permissions/user-permissions.component.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core'; import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { PermissionNode } from '../utils/app.constants'; +import { PermissionNode } from '../utils/app.interfaces'; import { Observable } from 'rxjs'; import { CredentialService } from '../services/credential.service'; import { I18NService } from '../services/i18n.service'; diff --git a/src/app/utils/app.constants.ts b/src/app/utils/app.constants.ts index 57635f7..5c27437 100644 --- a/src/app/utils/app.constants.ts +++ b/src/app/utils/app.constants.ts @@ -1,3 +1,5 @@ +import { AbstractControl, ValidationErrors, ValidatorFn } from "@angular/forms"; + export const CONSTANTS = { POR_ORGACODE: '0005', }; @@ -8,10 +10,17 @@ export const pageSizeOptions = [ { label: '20 items', value: 20 } ]; -export interface PermissionNode { - name: string; - checked: boolean; - expanded: boolean; - children?: PermissionNode[]; - buttons?: PermissionNode[]; +export const toDateAfterFromDateValidator: ValidatorFn = ( + group: AbstractControl +): ValidationErrors | null => { + const fromDate = group.get('fromDate')?.value; + const toDate = group.get('toDate')?.value; + + if (!fromDate || !toDate) { + return null; } + + return toDate >= fromDate + ? null + : { toDateInvalid: true }; +}; diff --git a/src/app/utils/app.interfaces.ts b/src/app/utils/app.interfaces.ts new file mode 100644 index 0000000..82d3eff --- /dev/null +++ b/src/app/utils/app.interfaces.ts @@ -0,0 +1,18 @@ +export interface PermissionNode { + name: string; + checked: boolean; + expanded: boolean; + children?: PermissionNode[]; + buttons?: PermissionNode[]; +} + +export interface LogsManagementResponse { + id: number, + method: string, + remoteIp: string, + requestBody: string, + requestUri: string, + responseCode: number, + userId: string, + dateTime: string +} \ No newline at end of file diff --git a/src/app/utils/uri-enums.ts b/src/app/utils/uri-enums.ts index d0143cd..a003871 100644 --- a/src/app/utils/uri-enums.ts +++ b/src/app/utils/uri-enums.ts @@ -12,5 +12,6 @@ export enum URIKey { RESET_PASSWORD_URI = "RESET_PASSWORD_URI", CHANGE_PASSWORD_URI = "CHANGE_PASSWORD_URI", THIRD_PARTY_REGISTER_URI = "THIRD_PARTY_REGISTER_URI", - TRANSACTION_LOGS = "TRANSACTION_LOGS" + TRANSACTION_LOGS = "TRANSACTION_LOGS", + LOGGER_MANAGER_URI = "LOGGER_MANAGER_URI" } \ No newline at end of file diff --git a/src/assets/data/app.uri.json b/src/assets/data/app.uri.json index 3b2861d..5f8781b 100644 --- a/src/assets/data/app.uri.json +++ b/src/assets/data/app.uri.json @@ -71,6 +71,11 @@ "Id": "ENTITY_TRANSACTION_LOGS", "URI": "/transaction/logs", "UUID": "TRANSACTION_LOGS" + }, + { + "Id": "ENTITY_LOGGER_MANAGER_URI", + "URI": "/logs/getByDate", + "UUID": "LOGGER_MANAGER_URI" } ] } diff --git a/src/assets/i18n/Arabic.json b/src/assets/i18n/Arabic.json index 2fd7716..96416b5 100644 --- a/src/assets/i18n/Arabic.json +++ b/src/assets/i18n/Arabic.json @@ -246,5 +246,7 @@ "permissionManagement": "إدارة الأذونات", "userCode": "مستخدم", "choose" : "يختار", - "allow": "يسمح" + "allow": "يسمح", + "toDateInvalidError": "يجب أن يكون تاريخ اليوم أكبر من أو يساوي تاريخ البداية", + "noLoggingDetailsFound": "لم يتم العثور على تفاصيل التسجيل" } \ No newline at end of file diff --git a/src/assets/i18n/English.json b/src/assets/i18n/English.json index dddf514..50e9718 100644 --- a/src/assets/i18n/English.json +++ b/src/assets/i18n/English.json @@ -245,5 +245,7 @@ "permissionManagement": "Permission Managment", "userCode": "User", "choose" : "Choose", - "allow": "Allow" + "allow": "Allow", + "toDateInvalidError": "To Date must be greater than or equal to From Date", + "noLoggingDetailsFound": "No Logging Details found" } \ No newline at end of file -- 2.32.0