feat(menu): refactor menu handling to use labels directly and remove unused functions
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
role="menuitem"
|
||||
[attr.data-testid]="'user-dropdown-' + menu.code"
|
||||
>
|
||||
{{ menuLabel(menu) }}
|
||||
{{ menu.label }}
|
||||
</a>
|
||||
}
|
||||
<button
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { Component, computed, input, output } from '@angular/core';
|
||||
import { RouterLink } from '@angular/router';
|
||||
import { AuthUser } from '../../../../services/auth/auth.interfaces';
|
||||
import { getAccountNavigationLabel } from '../../../../services/menu.utils';
|
||||
import { Menu } from '../../../../services/tenant.interface';
|
||||
|
||||
@Component({
|
||||
@@ -17,8 +16,4 @@ export class UserDropdownComponent {
|
||||
readonly logoutClick = output<void>();
|
||||
|
||||
protected readonly displayName = computed(() => this.user()?.nombre_apellido || 'Mi cuenta');
|
||||
|
||||
protected menuLabel(menu: Menu): string {
|
||||
return getAccountNavigationLabel(menu);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,13 +30,15 @@ const tenant: Tenant = {
|
||||
{
|
||||
id: 4,
|
||||
code: 'account',
|
||||
label: 'Mi cuenta',
|
||||
parent_menu_code: null,
|
||||
content_type: 'dynamic',
|
||||
route: '/mi-cuenta',
|
||||
submenues: [
|
||||
{
|
||||
id: 5,
|
||||
code: 'profile',
|
||||
code: 'account.profile',
|
||||
label: 'Datos personales',
|
||||
parent_menu_code: 'account',
|
||||
content_type: 'dynamic',
|
||||
route: '/mi-cuenta/datos-personales',
|
||||
@@ -44,7 +46,8 @@ const tenant: Tenant = {
|
||||
},
|
||||
{
|
||||
id: 6,
|
||||
code: 'purchases',
|
||||
code: 'account.purchases',
|
||||
label: 'Mis compras',
|
||||
parent_menu_code: 'account',
|
||||
content_type: 'dynamic',
|
||||
route: '/mi-cuenta/compras',
|
||||
@@ -52,7 +55,8 @@ const tenant: Tenant = {
|
||||
},
|
||||
{
|
||||
id: 7,
|
||||
code: 'tickets',
|
||||
code: 'account.tickets',
|
||||
label: 'Mis tickets',
|
||||
parent_menu_code: 'account',
|
||||
content_type: 'dynamic',
|
||||
route: '/mi-cuenta/tickets',
|
||||
@@ -63,6 +67,7 @@ const tenant: Tenant = {
|
||||
{
|
||||
id: 1,
|
||||
code: 'help',
|
||||
label: 'Ayuda',
|
||||
parent_menu_code: null,
|
||||
content_type: 'dynamic',
|
||||
route: '/ayuda',
|
||||
@@ -70,6 +75,7 @@ const tenant: Tenant = {
|
||||
{
|
||||
id: 2,
|
||||
code: 'help.contact',
|
||||
label: 'Contacto',
|
||||
parent_menu_code: 'help',
|
||||
content_type: 'static',
|
||||
route: '/ayuda/contacto',
|
||||
@@ -78,6 +84,7 @@ const tenant: Tenant = {
|
||||
{
|
||||
id: 3,
|
||||
code: 'help.faq',
|
||||
label: 'Preguntas frecuentes',
|
||||
parent_menu_code: 'help',
|
||||
content_type: 'static',
|
||||
route: '/ayuda/preguntas-frecuentes',
|
||||
@@ -251,9 +258,11 @@ describe('StoreLayoutComponent', () => {
|
||||
|
||||
expect(compiled.querySelector('app-user-dropdown')).not.toBeNull();
|
||||
expect(compiled.textContent).toContain('Ada Lovelace');
|
||||
expect(compiled.querySelector('[data-testid="user-dropdown-profile"]')).not.toBeNull();
|
||||
expect(compiled.querySelector('[data-testid="user-dropdown-purchases"]')).not.toBeNull();
|
||||
expect(compiled.querySelector('[data-testid="user-dropdown-tickets"]')).toBeNull();
|
||||
expect(compiled.querySelector('[data-testid="user-dropdown-account"]')).not.toBeNull();
|
||||
expect(
|
||||
compiled.querySelector('[data-testid="user-dropdown-account.purchases"]'),
|
||||
).not.toBeNull();
|
||||
expect(compiled.querySelector('[data-testid="user-dropdown-account.tickets"]')).toBeNull();
|
||||
expect(router.navigate).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import { CartComponent, CartItemMock } from '../../../shared/components/cart/car
|
||||
import { ButtonComponent } from '../../../shared/components/button/button.component';
|
||||
import { CartItem } from '../../services/cart/cart.interface';
|
||||
import { AuthService } from '../../services/auth/auth.service';
|
||||
import { findMenu, getAccountNavigationLabel, getMenuLabel } from '../../services/menu.utils';
|
||||
import { findMenu } from '../../services/menu.utils';
|
||||
|
||||
@Component({
|
||||
selector: 'app-store-layout',
|
||||
@@ -80,9 +80,19 @@ export class StoreLayoutComponent implements OnInit {
|
||||
protected readonly user = this.authService.user;
|
||||
protected readonly isAuthenticated = this.authService.isAuthenticated;
|
||||
protected readonly accountNavigationMenus = computed(() => {
|
||||
const accountSubmenues = findMenu(this.tenant()?.menues ?? [], 'account')?.submenues ?? [];
|
||||
const accountMenu = findMenu(this.tenant()?.menues ?? [], 'account');
|
||||
|
||||
return accountSubmenues.filter((menu) => ['profile', 'purchases'].includes(menu.code));
|
||||
if (!accountMenu) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const profile = accountMenu.submenues.find((menu) => menu.code === 'account.profile');
|
||||
const purchases = accountMenu.submenues.find((menu) => menu.code === 'account.purchases');
|
||||
|
||||
return [
|
||||
...(profile ? [{ ...accountMenu, route: profile.route }] : []),
|
||||
...(purchases ? [purchases] : []),
|
||||
];
|
||||
});
|
||||
|
||||
protected readonly cartQuantity = computed(() => {
|
||||
@@ -121,7 +131,7 @@ export class StoreLayoutComponent implements OnInit {
|
||||
heading: 'Cuenta',
|
||||
links: [
|
||||
...this.accountNavigationMenus().map((menu) => ({
|
||||
label: getAccountNavigationLabel(menu),
|
||||
label: menu.label,
|
||||
routerLink: menu.route,
|
||||
})),
|
||||
{ label: 'Cerrar sesion', action: 'logout' },
|
||||
@@ -130,7 +140,7 @@ export class StoreLayoutComponent implements OnInit {
|
||||
{
|
||||
heading: 'Ayuda',
|
||||
links: helpSubmenues.map((menu) => ({
|
||||
label: getMenuLabel(menu),
|
||||
label: menu.label,
|
||||
routerLink: menu.route,
|
||||
})),
|
||||
},
|
||||
|
||||
@@ -1,17 +1,5 @@
|
||||
import { Menu } from './tenant.interface';
|
||||
|
||||
const MENU_LABELS: Record<string, string> = {
|
||||
account: 'Mi cuenta',
|
||||
profile: 'Datos personales',
|
||||
purchases: 'Mis compras',
|
||||
tickets: 'Mis tickets',
|
||||
'help.faq': 'Preguntas frecuentes',
|
||||
'help.contact': 'Contacto',
|
||||
'help.payment-methods': 'Medios de pago',
|
||||
'help.shipping': 'Envíos',
|
||||
'help.terms-and-conditions': 'Términos y condiciones',
|
||||
};
|
||||
|
||||
export function findMenu(menues: readonly Menu[], menuCode: string): Menu | undefined {
|
||||
for (const menu of menues) {
|
||||
if (menu.code === menuCode) {
|
||||
@@ -27,19 +15,3 @@ export function findMenu(menues: readonly Menu[], menuCode: string): Menu | unde
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
export function getMenuLabel(menu: Menu): string {
|
||||
const configuredLabel = MENU_LABELS[menu.code];
|
||||
|
||||
if (configuredLabel) {
|
||||
return configuredLabel;
|
||||
}
|
||||
|
||||
const label = menu.code.split('.').at(-1)?.replaceAll('-', ' ') ?? menu.code;
|
||||
|
||||
return label.charAt(0).toUpperCase() + label.slice(1);
|
||||
}
|
||||
|
||||
export function getAccountNavigationLabel(menu: Menu): string {
|
||||
return menu.code === 'profile' ? 'Mi cuenta' : getMenuLabel(menu);
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ export interface EventConfig {
|
||||
export interface Menu {
|
||||
id: number;
|
||||
code: string;
|
||||
label: string;
|
||||
parent_menu_code: string | null;
|
||||
content_type: 'static' | 'dynamic';
|
||||
route: string;
|
||||
@@ -63,4 +64,3 @@ export interface Tenant {
|
||||
}
|
||||
|
||||
export type TenantBootstrapResponse = ApiResponse<Tenant>;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user