Merge pull request 'added translations for headers in excel report files' (#60) from aconnect-UX/reporting-translation-updates into dev-pending-20-01-2026

Reviewed-on: https://ct.mfsys.com.pk/aConnect/aConnect-UX/pulls/60
dev-pending-20-01-2026
Naeem Ullah 6 days ago
commit 244ff1067a

@ -35,6 +35,10 @@ export class AppComponent {
this.direction = this.storageService.getItem('direction') || directions.LTR; this.direction = this.storageService.getItem('direction') || directions.LTR;
this.storageService.setItem('direction', this.direction); this.storageService.setItem('direction', this.direction);
// if (typeof document !== 'undefined') {
// document.documentElement.setAttribute('dir', this.direction);
// }
const userStr = this.storageService.getItem('user'); const userStr = this.storageService.getItem('user');
if (userStr) { if (userStr) {
try { try {

@ -1,28 +1,66 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { saveAs } from 'file-saver'; import { saveAs } from 'file-saver';
import * as XLSX from 'xlsx'; import * as XLSX from 'xlsx';
import { TranslateService } from '@ngx-translate/core';
import { EXCEL_FILE_EXTENSION, EXCEL_FILE_TYPE } from '../../utils/app.constants'; import { EXCEL_FILE_EXTENSION, EXCEL_FILE_TYPE } from '../../utils/app.constants';
import { StorageService } from './storage.service';
import { supportedLanguages } from '../../utils/enums';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class ExcelExportService { export class ExcelExportService {
constructor() { }
private fileType = EXCEL_FILE_TYPE; 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 { public exportExcel(jsonData: any[], fileName: string): void {
const ws: XLSX.WorkSheet = XLSX.utils.json_to_sheet(jsonData); const translatedData = this.translateHeaders(jsonData);
const wb: XLSX.WorkBook = { Sheets: { 'data': ws }, SheetNames: ['data'] };
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' }); const excelBuffer: any = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
this.saveExcelFile(excelBuffer, fileName); 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 { private saveExcelFile(buffer: any, fileName: string): void {
const data: Blob = new Blob([buffer], { type: this.fileType }); const data: Blob = new Blob([buffer], { type: this.fileType });
saveAs.saveAs(data, fileName + this.fileExtension); saveAs(data, fileName + this.fileExtension);
} }
} }

@ -13,7 +13,7 @@ import { PasswordHideShowComponent } from '../../shared/components/password-hide
@Component({ @Component({
selector: 'app-reset-password-modal', selector: 'app-reset-password-modal',
standalone: true, standalone: true,
imports: [TranslateModule, ReactiveFormsModule, CommonModule, PasswordHideShowComponent], imports: [TranslateModule, ReactiveFormsModule, CommonModule],
templateUrl: './reset-password-modal.component.html' templateUrl: './reset-password-modal.component.html'
}) })
export class ResetPasswordModalComponent implements OnInit, OnChanges { export class ResetPasswordModalComponent implements OnInit, OnChanges {

@ -269,5 +269,26 @@
"SAVED_SUCCESSFULLY": "تم الحفظ بنجاح", "SAVED_SUCCESSFULLY": "تم الحفظ بنجاح",
"activityLogs": "سجلات النشاط", "activityLogs": "سجلات النشاط",
"activityLogDetails": "تفاصيل سجل النشاط", "activityLogDetails": "تفاصيل سجل النشاط",
"resetPasswordButton": "إعادة تعيين كلمة المرور" "resetPasswordButton": "إعادة تعيين كلمة المرور",
"dateTime": "التاريخ والوقت",
"responseCode": "رمز الاستجابة",
"remoteIp": "IP البعيد",
"requestBody": "هيئة الطلب",
"requestUri": "طلب URI",
"method": "طريقة",
"id": "بطاقة تعريف",
"logId": "معرف السجل",
"porOrgacode": "رمز المنظمة",
"drMbmbkmsnumber": "رقم الحساب المدين",
"crMbmbkmsnumber": "رقم حساب الائتمان",
"ppmPymdcode": "رمز الدفع",
"sgtGntrdate": "تاريخ المعاملة",
"sgtGntrcreateat": "تاريخ الإنشاء",
"updatedAt": "تم التحديث في",
"crPcaglacode": "حساب CR GL",
"drPcaGlacode": "حساب DR GL",
"transactionUri": "معرّف المعاملة",
"transactionCode": "رمز المعاملة",
"channelCode": "رمز القناة"
} }

@ -276,5 +276,22 @@
"activityLogDetails": "Activity Log Details", "activityLogDetails": "Activity Log Details",
"transactionCode": "Transaction Code", "transactionCode": "Transaction Code",
"transactionUri": "Transaction URI", "transactionUri": "Transaction URI",
"resetPasswordButton": "Reset Password" "resetPasswordButton": "Reset Password",
"dateTime": "Date Time",
"responseCode": "Response Code",
"remoteIp": "Remote IP",
"requestBody": "Request Body",
"requestUri": "Request URI",
"method": "Method",
"id": "Id",
"logId": "Log ID",
"porOrgacode": "Organization Code",
"drMbmbkmsnumber": "Debit Account Number",
"crMbmbkmsnumber": "Credit Account Number",
"ppmPymdcode": "Payment Code",
"sgtGntrdate": "Transaction Date",
"sgtGntrcreateat": "Creation Date",
"updatedAt": "Updated At",
"channelCode": "Channel Code"
} }
Loading…
Cancel
Save