From 1001e305217294643288236d517e0887801f2144 Mon Sep 17 00:00:00 2001 From: Alba Lopez Date: Mon, 2 Feb 2026 10:51:38 +0100 Subject: [PATCH 01/11] added powers --- package-lock.json | 4 ++-- package.json | 2 +- src/app/interfaces/websocket-data.ts | 2 +- src/app/services/websocket.service.ts | 11 ++++++++--- src/assets/i18n/ca.json | 1 + src/assets/i18n/en.json | 1 + src/assets/i18n/es.json | 1 + 7 files changed, 15 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0c262dd4..15d4a0f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "eudistack-wallet-ui", - "version": "2.0.13", + "version": "2.0.14", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "eudistack-wallet-ui", - "version": "2.0.13", + "version": "2.0.14", "dependencies": { "@angular/common": "^18.2.2", "@angular/core": "^18.2.2", diff --git a/package.json b/package.json index 4a410e49..710d654d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eudistack-wallet-ui", - "version": "2.0.13", + "version": "2.0.14", "author": "Ionic Framework", "homepage": "https://ionicframework.com/", "scripts": { diff --git a/src/app/interfaces/websocket-data.ts b/src/app/interfaces/websocket-data.ts index f7b8e93d..840f5fae 100644 --- a/src/app/interfaces/websocket-data.ts +++ b/src/app/interfaces/websocket-data.ts @@ -8,7 +8,7 @@ interface NotificationData { credentialPreview?: { subjectName?: string; organization?: string; - issuer?: string; + powers?: string; expirationDate?: string; }; timeout?: number; diff --git a/src/app/services/websocket.service.ts b/src/app/services/websocket.service.ts index 71fa5f65..81b5bc22 100644 --- a/src/app/services/websocket.service.ts +++ b/src/app/services/websocket.service.ts @@ -203,6 +203,7 @@ export class WebsocketService { const preview = data.credentialPreview; const subjectLabel = this.translate.instant('confirmation.holder'); const organizationLabel = this.translate.instant('confirmation.organization'); + const powersLabel = this.translate.instant('confirmation.organization'); const expirationLabel = this.translate.instant('confirmation.expiration'); @@ -219,9 +220,13 @@ export class WebsocketService { ${organizationLabel}${this.escapeHtml(preview.organization)} -
- ${expirationLabel}${this.formatDateHuman(preview.expirationDate)} -
+
+ ${powersLabel}${this.escapeHtml(preview.powers)} +
+ +
+ ${expirationLabel}${this.formatDateHuman(preview.expirationDate)} +
`; } diff --git a/src/assets/i18n/ca.json b/src/assets/i18n/ca.json index 6450a2a1..d740b40e 100644 --- a/src/assets/i18n/ca.json +++ b/src/assets/i18n/ca.json @@ -233,6 +233,7 @@ "messageHtml": "{{description}}
Temps restant: {{counter}} segundos", "organization":"Organització: ", "holder":"Titular: ", + "powers":"Poders: ", "expiration":"Data de caducitat: " } } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index a5e25816..18895ce7 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -231,6 +231,7 @@ "messageHtml": "{{description}}
Time remaining: {{counter}} seconds", "organization":"Organization: ", "holder":"Holder: ", + "powers":"Powers: ", "expiration":"Expiration date: " } diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 1041d85e..5dd79af0 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -232,6 +232,7 @@ "messageHtml": "{{description}}
Tiempo restante: {{counter}} segundos", "organization":"Organización: ", "holder":"Titular: ", + "powers":"Poderes: ", "expiration":"Fecha de caducidad: " } } From c332a8d4709d0fe856cc97c46d412481183ca42d Mon Sep 17 00:00:00 2001 From: Alba Lopez Date: Mon, 2 Feb 2026 16:33:26 +0100 Subject: [PATCH 02/11] update --- src/app/interfaces/websocket-data.ts | 2 +- src/app/services/websocket.service.ts | 43 +++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/app/interfaces/websocket-data.ts b/src/app/interfaces/websocket-data.ts index 840f5fae..14b742ad 100644 --- a/src/app/interfaces/websocket-data.ts +++ b/src/app/interfaces/websocket-data.ts @@ -8,7 +8,7 @@ interface NotificationData { credentialPreview?: { subjectName?: string; organization?: string; - powers?: string; + power?: string; expirationDate?: string; }; timeout?: number; diff --git a/src/app/services/websocket.service.ts b/src/app/services/websocket.service.ts index 81b5bc22..69a49789 100644 --- a/src/app/services/websocket.service.ts +++ b/src/app/services/websocket.service.ts @@ -203,7 +203,7 @@ export class WebsocketService { const preview = data.credentialPreview; const subjectLabel = this.translate.instant('confirmation.holder'); const organizationLabel = this.translate.instant('confirmation.organization'); - const powersLabel = this.translate.instant('confirmation.organization'); + const powersLabel = this.translate.instant('confirmation.powers'); const expirationLabel = this.translate.instant('confirmation.expiration'); @@ -221,7 +221,7 @@ export class WebsocketService {
- ${powersLabel}${this.escapeHtml(preview.powers)} + ${powersLabel}${this.mapPowersToHumanReadable(preview.power)}
@@ -290,6 +290,45 @@ export class WebsocketService { interval = this.startCountdown(alert, descriptionWithPreview, counter); } + public mapPowersToHumanReadable(powers: Array): string { + if (!Array.isArray(powers) || powers.length === 0) return ''; + + const lines = powers + .map((p) => { + const fnKey = this.normalizeKey(p?.function); + const actionKeys = this.normalizeActionKeys(p?.action); + + const functionLabel = this.translate.instant(`powers.function.${fnKey}`) || p?.function || ''; + const actionLabels = actionKeys + .map((a) => this.translate.instant(`powers.action.${a}`) || a) + .join(', '); + + const line = this.translate.instant('powers.format.line', { + function: functionLabel, + actions: actionLabels, + }); + + return line?.trim(); + }) + .filter(Boolean); + + return lines.join('\n'); + } + + private normalizeKey(value: unknown): string { + return String(value ?? '') + .trim() + .toLowerCase() + .replace(/[^a-z0-9]/g, ''); + } + + private normalizeActionKeys(actions: unknown): string[] { + if (!Array.isArray(actions)) return []; + return actions + .map((a) => this.normalizeKey(a)) + .filter(Boolean); + } + private async showTempOkMessage(message: string): Promise { const alert = await this.alertController.create({ message: ` From 08e5a9f7ae578d7fd33313b6d8fe81767a9a18ee Mon Sep 17 00:00:00 2001 From: Alba Lopez Date: Mon, 2 Feb 2026 16:43:04 +0100 Subject: [PATCH 03/11] logs --- src/app/services/websocket.service.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/services/websocket.service.ts b/src/app/services/websocket.service.ts index 69a49789..d7b59f2c 100644 --- a/src/app/services/websocket.service.ts +++ b/src/app/services/websocket.service.ts @@ -206,6 +206,8 @@ export class WebsocketService { const powersLabel = this.translate.instant('confirmation.powers'); const expirationLabel = this.translate.instant('confirmation.expiration'); + console.log('Credential Preview:', preview); + let previewHtml = ''; @@ -291,6 +293,7 @@ export class WebsocketService { } public mapPowersToHumanReadable(powers: Array): string { + console.log('Mapping powers:', powers); if (!Array.isArray(powers) || powers.length === 0) return ''; const lines = powers @@ -307,6 +310,7 @@ export class WebsocketService { function: functionLabel, actions: actionLabels, }); + console.log('Mapped line:', line); return line?.trim(); }) From 0bcad20d0bd66f35b1f5fa3877db6111b6fbc2a8 Mon Sep 17 00:00:00 2001 From: Alba Lopez Date: Mon, 2 Feb 2026 17:09:21 +0100 Subject: [PATCH 04/11] map fix --- src/app/services/websocket.service.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/services/websocket.service.ts b/src/app/services/websocket.service.ts index d7b59f2c..4c2494d5 100644 --- a/src/app/services/websocket.service.ts +++ b/src/app/services/websocket.service.ts @@ -301,24 +301,24 @@ export class WebsocketService { const fnKey = this.normalizeKey(p?.function); const actionKeys = this.normalizeActionKeys(p?.action); - const functionLabel = this.translate.instant(`powers.function.${fnKey}`) || p?.function || ''; + const functionLabel = + this.translate.instant(`vc-fields.power.${fnKey}`) || p?.function || ''; + const actionLabels = actionKeys - .map((a) => this.translate.instant(`powers.action.${a}`) || a) + .map((a) => this.translate.instant(`vc-fields.power.${a}`) || a) .join(', '); - const line = this.translate.instant('powers.format.line', { - function: functionLabel, - actions: actionLabels, - }); + const line = `${functionLabel}: ${actionLabels}`; console.log('Mapped line:', line); - return line?.trim(); + return line.trim(); }) .filter(Boolean); - return lines.join('\n'); + return lines.join('
'); } + private normalizeKey(value: unknown): string { return String(value ?? '') .trim() From cd34527e3b9cb2d1a1d9d39f61a4619b58715df2 Mon Sep 17 00:00:00 2001 From: Alba Lopez Date: Tue, 3 Feb 2026 08:07:19 +0100 Subject: [PATCH 05/11] new tests --- src/app/services/websocket.service.spec.ts | 91 ++++++++++++++++++++++ src/app/services/websocket.service.ts | 5 -- 2 files changed, 91 insertions(+), 5 deletions(-) diff --git a/src/app/services/websocket.service.spec.ts b/src/app/services/websocket.service.spec.ts index 610695f9..17cee964 100644 --- a/src/app/services/websocket.service.spec.ts +++ b/src/app/services/websocket.service.spec.ts @@ -670,4 +670,95 @@ describe('WebsocketService', () => { clearIntervalSpy.mockRestore(); })); + it('should map powers to human readable format with single power', () => { + const powers = [ + { function: 'Administrar', action: ['create', 'update'] } + ]; + + const result = service.mapPowersToHumanReadable(powers); + + expect(translateMock.instant).toHaveBeenCalledWith('vc-fields.power.administrar'); + expect(translateMock.instant).toHaveBeenCalledWith('vc-fields.power.create'); + expect(translateMock.instant).toHaveBeenCalledWith('vc-fields.power.update'); + expect(result).toContain(':'); + }); + + it('should map powers to human readable format with multiple powers', () => { + const powers = [ + { function: 'Administrar', action: ['crear'] }, + { function: 'Gestionar', action: ['borrar', 'modificar'] } + ]; + + const result = service.mapPowersToHumanReadable(powers); + + expect(result).toContain('
'); + expect(translateMock.instant).toHaveBeenCalledWith('vc-fields.power.administrar'); + expect(translateMock.instant).toHaveBeenCalledWith('vc-fields.power.gestionar'); + }); + + it('should return empty string for empty powers array', () => { + expect(service.mapPowersToHumanReadable([])).toBe(''); + }); + + it('should return empty string for non-array powers', () => { + expect(service.mapPowersToHumanReadable(null as any)).toBe(''); + expect(service.mapPowersToHumanReadable(undefined as any)).toBe(''); + expect(service.mapPowersToHumanReadable('not-array' as any)).toBe(''); + }); + + it('should normalize key by removing special characters and converting to lowercase', () => { + expect(service['normalizeKey']('Administrar')).toBe('administrar'); + expect(service['normalizeKey']('Test Key-123')).toBe('testkey123'); + expect(service['normalizeKey']('Special@#$Chars')).toBe('specialchars'); + expect(service['normalizeKey'](' spaces ')).toBe('spaces'); + }); + + it('should normalize key with null or undefined', () => { + expect(service['normalizeKey'](null)).toBe(''); + expect(service['normalizeKey'](undefined)).toBe(''); + }); + + it('should normalize key with numbers', () => { + expect(service['normalizeKey'](123)).toBe('123'); + expect(service['normalizeKey'](0)).toBe('0'); + }); + + it('should normalize action keys from array', () => { + const actions = ['Crear', 'Editar', 'Borrar']; + const result = service['normalizeActionKeys'](actions); + + expect(result).toEqual(['crear', 'editar', 'borrar']); + }); + + it('should normalize action keys with special characters', () => { + const actions = ['Test-Action', 'Special@Char', '123Number']; + const result = service['normalizeActionKeys'](actions); + + expect(result).toEqual(['testaction', 'specialchar', '123number']); + }); + + it('should return empty array for non-array action keys', () => { + expect(service['normalizeActionKeys'](null)).toEqual([]); + expect(service['normalizeActionKeys'](undefined)).toEqual([]); + expect(service['normalizeActionKeys']('not-array')).toEqual([]); + }); + + it('should filter out empty strings from normalized action keys', () => { + const actions = ['valid', '', ' ', 'another']; + const result = service['normalizeActionKeys'](actions); + + expect(result).toEqual(['valid', 'another']); + }); + + it('should handle powers with missing function or action', () => { + const powers = [ + { function: null, action: ['crear'] }, + { function: 'Administrar', action: null } + ]; + + const result = service.mapPowersToHumanReadable(powers); + + expect(result).toBeTruthy(); + }); + }); diff --git a/src/app/services/websocket.service.ts b/src/app/services/websocket.service.ts index 4c2494d5..a9d5ca65 100644 --- a/src/app/services/websocket.service.ts +++ b/src/app/services/websocket.service.ts @@ -206,8 +206,6 @@ export class WebsocketService { const powersLabel = this.translate.instant('confirmation.powers'); const expirationLabel = this.translate.instant('confirmation.expiration'); - console.log('Credential Preview:', preview); - let previewHtml = ''; @@ -285,7 +283,6 @@ export class WebsocketService { this.toastServiceHandler .showErrorAlert("The QR session expired") .subscribe(); - window.location.reload(); } }); @@ -293,7 +290,6 @@ export class WebsocketService { } public mapPowersToHumanReadable(powers: Array): string { - console.log('Mapping powers:', powers); if (!Array.isArray(powers) || powers.length === 0) return ''; const lines = powers @@ -309,7 +305,6 @@ export class WebsocketService { .join(', '); const line = `${functionLabel}: ${actionLabels}`; - console.log('Mapped line:', line); return line.trim(); }) From 9152a5ed157763cabae794770726d38efd324726 Mon Sep 17 00:00:00 2001 From: Alba Lopez Date: Tue, 3 Feb 2026 11:58:00 +0100 Subject: [PATCH 06/11] fixes --- src/app/interfaces/websocket-data.ts | 2 +- src/app/services/websocket.service.ts | 34 +++++++++++++++++++++------ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/app/interfaces/websocket-data.ts b/src/app/interfaces/websocket-data.ts index 14b742ad..2dc52661 100644 --- a/src/app/interfaces/websocket-data.ts +++ b/src/app/interfaces/websocket-data.ts @@ -8,7 +8,7 @@ interface NotificationData { credentialPreview?: { subjectName?: string; organization?: string; - power?: string; + power?: Array; expirationDate?: string; }; timeout?: number; diff --git a/src/app/services/websocket.service.ts b/src/app/services/websocket.service.ts index a9d5ca65..1e275afe 100644 --- a/src/app/services/websocket.service.ts +++ b/src/app/services/websocket.service.ts @@ -292,27 +292,47 @@ export class WebsocketService { public mapPowersToHumanReadable(powers: Array): string { if (!Array.isArray(powers) || powers.length === 0) return ''; + const unknown = this.translate.instant('common.unknown') || 'Desconocido'; + const lines = powers .map((p) => { const fnKey = this.normalizeKey(p?.function); const actionKeys = this.normalizeActionKeys(p?.action); - const functionLabel = - this.translate.instant(`vc-fields.power.${fnKey}`) || p?.function || ''; + const functionLabelRaw = + this.getSafeTranslation(`vc-fields.power.${fnKey}`, p?.function, unknown); + + const actionLabelsRaw = actionKeys + .map((a) => this.getSafeTranslation(`vc-fields.power.${a}`, a, unknown)) + .filter((x) => x && x !== unknown); - const actionLabels = actionKeys - .map((a) => this.translate.instant(`vc-fields.power.${a}`) || a) - .join(', '); + const functionLabel = this.escapeHtml(functionLabelRaw); + const actionLabels = this.escapeHtml(actionLabelsRaw.join(', ')); - const line = `${functionLabel}: ${actionLabels}`; + if (!functionLabel || !actionLabels) return ''; - return line.trim(); + return `${functionLabel}: ${actionLabels}`; }) .filter(Boolean); return lines.join('
'); } + private getSafeTranslation(key: string, fallbackText: unknown, unknown: string): string { + const translated = this.translate.instant(key); + + const hasRealTranslation = translated && translated !== key; + + if (hasRealTranslation) return String(translated); + + const fb = String(fallbackText ?? '').trim(); + const looksLikeKey = fb.includes('.') || fb.includes('_') || fb.includes('-'); + if (!fb || looksLikeKey) return unknown; + + return fb; + } + + private normalizeKey(value: unknown): string { return String(value ?? '') From 97a4cce9907bbecd5979e58e11b723945e06e4b7 Mon Sep 17 00:00:00 2001 From: Alba Lopez Date: Tue, 3 Feb 2026 13:06:53 +0100 Subject: [PATCH 07/11] updates --- src/app/interfaces/websocket-data.ts | 22 +++++++++++++++------- src/app/services/websocket.service.spec.ts | 12 +----------- src/app/services/websocket.service.ts | 6 +++--- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/app/interfaces/websocket-data.ts b/src/app/interfaces/websocket-data.ts index 2dc52661..4c203778 100644 --- a/src/app/interfaces/websocket-data.ts +++ b/src/app/interfaces/websocket-data.ts @@ -3,14 +3,22 @@ interface PinRequestData { timeout?: number; } -interface NotificationData { +export interface Power { + function: string; + action: string[]; +} + +export interface CredentialPreview { + power: Power[]; + subjectName: string; + organization: string; + expirationDate: string; +} + + +export interface NotificationData { decision: boolean; - credentialPreview?: { - subjectName?: string; - organization?: string; - power?: Array; - expirationDate?: string; - }; + credentialPreview?: CredentialPreview; timeout?: number; expiresAt?: number; } diff --git a/src/app/services/websocket.service.spec.ts b/src/app/services/websocket.service.spec.ts index 17cee964..f31c78eb 100644 --- a/src/app/services/websocket.service.spec.ts +++ b/src/app/services/websocket.service.spec.ts @@ -7,6 +7,7 @@ import { environment } from 'src/environments/environment'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { WEBSOCKET_PIN_PATH } from '../constants/api.constants'; import { LoaderService } from './loader.service'; +import { Power } from '../interfaces/verifiable-credential'; //todo mock broadcast channel @@ -750,15 +751,4 @@ describe('WebsocketService', () => { expect(result).toEqual(['valid', 'another']); }); - it('should handle powers with missing function or action', () => { - const powers = [ - { function: null, action: ['crear'] }, - { function: 'Administrar', action: null } - ]; - - const result = service.mapPowersToHumanReadable(powers); - - expect(result).toBeTruthy(); - }); - }); diff --git a/src/app/services/websocket.service.ts b/src/app/services/websocket.service.ts index 1e275afe..63536a66 100644 --- a/src/app/services/websocket.service.ts +++ b/src/app/services/websocket.service.ts @@ -6,7 +6,7 @@ import { TranslateService } from '@ngx-translate/core'; import { WEBSOCKET_NOTIFICATION_PATH, WEBSOCKET_PIN_PATH } from '../constants/api.constants'; import { LoaderService } from './loader.service'; import { ToastServiceHandler } from './toast.service'; -import { isPinRequest, isNotificationRequest } from '../interfaces/websocket-data'; +import { isPinRequest, isNotificationRequest, Power, CredentialPreview } from '../interfaces/websocket-data'; @Injectable({ providedIn: 'root', @@ -200,7 +200,7 @@ export class WebsocketService { const counter = data.timeout || 80; - const preview = data.credentialPreview; + const preview = data.credentialPreview as CredentialPreview; const subjectLabel = this.translate.instant('confirmation.holder'); const organizationLabel = this.translate.instant('confirmation.organization'); const powersLabel = this.translate.instant('confirmation.powers'); @@ -289,7 +289,7 @@ export class WebsocketService { interval = this.startCountdown(alert, descriptionWithPreview, counter); } - public mapPowersToHumanReadable(powers: Array): string { + public mapPowersToHumanReadable(powers: Power[]): string { if (!Array.isArray(powers) || powers.length === 0) return ''; const unknown = this.translate.instant('common.unknown') || 'Desconocido'; From 5d9c907a8408e0b7b0331a84128871234f04fc09 Mon Sep 17 00:00:00 2001 From: Alba Lopez Date: Tue, 3 Feb 2026 13:28:04 +0100 Subject: [PATCH 08/11] new implem --- src/app/services/websocket.service.spec.ts | 12 ++++++------ src/app/services/websocket.service.ts | 4 +--- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/app/services/websocket.service.spec.ts b/src/app/services/websocket.service.spec.ts index f31c78eb..8fe9281f 100644 --- a/src/app/services/websocket.service.spec.ts +++ b/src/app/services/websocket.service.spec.ts @@ -676,7 +676,7 @@ describe('WebsocketService', () => { { function: 'Administrar', action: ['create', 'update'] } ]; - const result = service.mapPowersToHumanReadable(powers); + const result = service['mapPowersToHumanReadable'](powers); expect(translateMock.instant).toHaveBeenCalledWith('vc-fields.power.administrar'); expect(translateMock.instant).toHaveBeenCalledWith('vc-fields.power.create'); @@ -690,7 +690,7 @@ describe('WebsocketService', () => { { function: 'Gestionar', action: ['borrar', 'modificar'] } ]; - const result = service.mapPowersToHumanReadable(powers); + const result = service['mapPowersToHumanReadable'](powers); expect(result).toContain('
'); expect(translateMock.instant).toHaveBeenCalledWith('vc-fields.power.administrar'); @@ -698,13 +698,13 @@ describe('WebsocketService', () => { }); it('should return empty string for empty powers array', () => { - expect(service.mapPowersToHumanReadable([])).toBe(''); + expect(service['mapPowersToHumanReadable']([])).toBe(''); }); it('should return empty string for non-array powers', () => { - expect(service.mapPowersToHumanReadable(null as any)).toBe(''); - expect(service.mapPowersToHumanReadable(undefined as any)).toBe(''); - expect(service.mapPowersToHumanReadable('not-array' as any)).toBe(''); + expect(service['mapPowersToHumanReadable'](null as any)).toBe(''); + expect(service['mapPowersToHumanReadable'](undefined as any)).toBe(''); + expect(service['mapPowersToHumanReadable']('not-array' as any)).toBe(''); }); it('should normalize key by removing special characters and converting to lowercase', () => { diff --git a/src/app/services/websocket.service.ts b/src/app/services/websocket.service.ts index 63536a66..e33d7b76 100644 --- a/src/app/services/websocket.service.ts +++ b/src/app/services/websocket.service.ts @@ -289,7 +289,7 @@ export class WebsocketService { interval = this.startCountdown(alert, descriptionWithPreview, counter); } - public mapPowersToHumanReadable(powers: Power[]): string { + private mapPowersToHumanReadable(powers: Power[]): string { if (!Array.isArray(powers) || powers.length === 0) return ''; const unknown = this.translate.instant('common.unknown') || 'Desconocido'; @@ -332,8 +332,6 @@ export class WebsocketService { return fb; } - - private normalizeKey(value: unknown): string { return String(value ?? '') .trim() From 1831c1357cb074a23a3b5f783dc8c202aab98e63 Mon Sep 17 00:00:00 2001 From: Alba Lopez Date: Tue, 3 Feb 2026 15:52:15 +0100 Subject: [PATCH 09/11] logs --- src/app/services/websocket.service.ts | 14 +++++++++++--- src/assets/i18n/ca.json | 3 ++- src/assets/i18n/en.json | 3 ++- src/assets/i18n/es.json | 3 ++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/app/services/websocket.service.ts b/src/app/services/websocket.service.ts index e33d7b76..246e7218 100644 --- a/src/app/services/websocket.service.ts +++ b/src/app/services/websocket.service.ts @@ -201,9 +201,11 @@ export class WebsocketService { const counter = data.timeout || 80; const preview = data.credentialPreview as CredentialPreview; + console.log('Credential Preview:', preview); const subjectLabel = this.translate.instant('confirmation.holder'); const organizationLabel = this.translate.instant('confirmation.organization'); const powersLabel = this.translate.instant('confirmation.powers'); + console.log('Powers Label:', powersLabel); const expirationLabel = this.translate.instant('confirmation.expiration'); @@ -290,9 +292,11 @@ export class WebsocketService { } private mapPowersToHumanReadable(powers: Power[]): string { - if (!Array.isArray(powers) || powers.length === 0) return ''; + if (powers.length === 0) return ''; - const unknown = this.translate.instant('common.unknown') || 'Desconocido'; + console.log('Mapping powers to human readable:', powers); + + const unknown = this.translate.instant('confirmation.unknown'); const lines = powers .map((p) => { @@ -301,13 +305,17 @@ export class WebsocketService { const functionLabelRaw = this.getSafeTranslation(`vc-fields.power.${fnKey}`, p?.function, unknown); - + console.log('Function Label Raw:', functionLabelRaw); const actionLabelsRaw = actionKeys .map((a) => this.getSafeTranslation(`vc-fields.power.${a}`, a, unknown)) .filter((x) => x && x !== unknown); + console.log('Action Labels Raw:', actionLabelsRaw); + const functionLabel = this.escapeHtml(functionLabelRaw); const actionLabels = this.escapeHtml(actionLabelsRaw.join(', ')); + console.log('Function Label:', functionLabel); + console.log('Action Labels:', actionLabels); if (!functionLabel || !actionLabels) return ''; diff --git a/src/assets/i18n/ca.json b/src/assets/i18n/ca.json index d740b40e..e1be1f3b 100644 --- a/src/assets/i18n/ca.json +++ b/src/assets/i18n/ca.json @@ -234,6 +234,7 @@ "organization":"Organització: ", "holder":"Titular: ", "powers":"Poders: ", - "expiration":"Data de caducitat: " + "expiration":"Data de caducitat: ", + "unknown": "Desconegut" } } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 18895ce7..856958f8 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -232,7 +232,8 @@ "organization":"Organization: ", "holder":"Holder: ", "powers":"Powers: ", - "expiration":"Expiration date: " + "expiration":"Expiration date: ", + "unknown": "Unknown" } } diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 5dd79af0..01d39bd3 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -233,6 +233,7 @@ "organization":"Organización: ", "holder":"Titular: ", "powers":"Poderes: ", - "expiration":"Fecha de caducidad: " + "expiration":"Fecha de caducidad: ", + "unknown": "Desconocido" } } From 077e81ac235ea7bbe7019d322c9278d117a621e1 Mon Sep 17 00:00:00 2001 From: Alba Lopez Date: Tue, 3 Feb 2026 16:20:48 +0100 Subject: [PATCH 10/11] deleted logs --- src/app/services/websocket.service.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/app/services/websocket.service.ts b/src/app/services/websocket.service.ts index 246e7218..f015bbda 100644 --- a/src/app/services/websocket.service.ts +++ b/src/app/services/websocket.service.ts @@ -201,11 +201,9 @@ export class WebsocketService { const counter = data.timeout || 80; const preview = data.credentialPreview as CredentialPreview; - console.log('Credential Preview:', preview); const subjectLabel = this.translate.instant('confirmation.holder'); const organizationLabel = this.translate.instant('confirmation.organization'); const powersLabel = this.translate.instant('confirmation.powers'); - console.log('Powers Label:', powersLabel); const expirationLabel = this.translate.instant('confirmation.expiration'); @@ -294,8 +292,6 @@ export class WebsocketService { private mapPowersToHumanReadable(powers: Power[]): string { if (powers.length === 0) return ''; - console.log('Mapping powers to human readable:', powers); - const unknown = this.translate.instant('confirmation.unknown'); const lines = powers @@ -305,17 +301,13 @@ export class WebsocketService { const functionLabelRaw = this.getSafeTranslation(`vc-fields.power.${fnKey}`, p?.function, unknown); - console.log('Function Label Raw:', functionLabelRaw); + const actionLabelsRaw = actionKeys .map((a) => this.getSafeTranslation(`vc-fields.power.${a}`, a, unknown)) .filter((x) => x && x !== unknown); - console.log('Action Labels Raw:', actionLabelsRaw); - const functionLabel = this.escapeHtml(functionLabelRaw); const actionLabels = this.escapeHtml(actionLabelsRaw.join(', ')); - console.log('Function Label:', functionLabel); - console.log('Action Labels:', actionLabels); if (!functionLabel || !actionLabels) return ''; From 6b53607f21d89c297c976a6d4c119422bd716f46 Mon Sep 17 00:00:00 2001 From: Alba Lopez Date: Tue, 3 Feb 2026 16:23:21 +0100 Subject: [PATCH 11/11] fix tests --- src/app/services/websocket.service.spec.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/app/services/websocket.service.spec.ts b/src/app/services/websocket.service.spec.ts index 8fe9281f..72ab1f6b 100644 --- a/src/app/services/websocket.service.spec.ts +++ b/src/app/services/websocket.service.spec.ts @@ -416,8 +416,8 @@ describe('WebsocketService', () => { timeout: 60, credentialPreview: { subjectName: 'John Doe', + power: [{ function: 'Administrar', action: ['create', 'update'] }], organization: 'Test Org', - issuer: 'Test Issuer', expirationDate: '2025-12-31', }, }), @@ -701,12 +701,6 @@ describe('WebsocketService', () => { expect(service['mapPowersToHumanReadable']([])).toBe(''); }); - it('should return empty string for non-array powers', () => { - expect(service['mapPowersToHumanReadable'](null as any)).toBe(''); - expect(service['mapPowersToHumanReadable'](undefined as any)).toBe(''); - expect(service['mapPowersToHumanReadable']('not-array' as any)).toBe(''); - }); - it('should normalize key by removing special characters and converting to lowercase', () => { expect(service['normalizeKey']('Administrar')).toBe('administrar'); expect(service['normalizeKey']('Test Key-123')).toBe('testkey123');