Files
print-calculator/frontend/src/app/features/admin/pages/admin-dashboard.component.ts
Joe Küng 3f938db257
Some checks failed
Build, Test and Deploy / test-backend (push) Failing after 38s
Build, Test and Deploy / build-and-push (push) Has been skipped
Build, Test and Deploy / deploy (push) Has been skipped
feat(back-end and front-end): back-office
2026-02-27 12:44:06 +01:00

100 lines
2.9 KiB
TypeScript

import { CommonModule } from '@angular/common';
import { Component, inject, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { AdminAuthService } from '../services/admin-auth.service';
import { AdminOrder, AdminOrdersService } from '../services/admin-orders.service';
const SUPPORTED_LANGS = new Set(['it', 'en', 'de', 'fr']);
@Component({
selector: 'app-admin-dashboard',
standalone: true,
imports: [CommonModule],
templateUrl: './admin-dashboard.component.html',
styleUrl: './admin-dashboard.component.scss'
})
export class AdminDashboardComponent implements OnInit {
private readonly adminOrdersService = inject(AdminOrdersService);
private readonly adminAuthService = inject(AdminAuthService);
private readonly route = inject(ActivatedRoute);
private readonly router = inject(Router);
orders: AdminOrder[] = [];
selectedOrder: AdminOrder | null = null;
loading = false;
detailLoading = false;
confirmingOrderId: string | null = null;
errorMessage: string | null = null;
ngOnInit(): void {
this.loadOrders();
}
loadOrders(): void {
this.loading = true;
this.errorMessage = null;
this.adminOrdersService.listOrders().subscribe({
next: (orders) => {
this.orders = orders;
this.loading = false;
},
error: () => {
this.loading = false;
this.errorMessage = 'Impossibile caricare gli ordini.';
}
});
}
openDetails(orderId: string): void {
this.detailLoading = true;
this.adminOrdersService.getOrder(orderId).subscribe({
next: (order) => {
this.selectedOrder = order;
this.detailLoading = false;
},
error: () => {
this.detailLoading = false;
this.errorMessage = 'Impossibile caricare il dettaglio ordine.';
}
});
}
confirmPayment(orderId: string): void {
this.confirmingOrderId = orderId;
this.adminOrdersService.confirmPayment(orderId).subscribe({
next: (updatedOrder) => {
this.confirmingOrderId = null;
this.orders = this.orders.map((order) => order.id === updatedOrder.id ? updatedOrder : order);
if (this.selectedOrder?.id === updatedOrder.id) {
this.selectedOrder = updatedOrder;
}
},
error: () => {
this.confirmingOrderId = null;
this.errorMessage = 'Conferma pagamento non riuscita.';
}
});
}
logout(): void {
this.adminAuthService.logout().subscribe({
next: () => {
void this.router.navigate(['/', this.resolveLang(), 'admin', 'login']);
},
error: () => {
void this.router.navigate(['/', this.resolveLang(), 'admin', 'login']);
}
});
}
private resolveLang(): string {
for (const level of this.route.pathFromRoot) {
const lang = level.snapshot.paramMap.get('lang');
if (lang && SUPPORTED_LANGS.has(lang)) {
return lang;
}
}
return 'it';
}
}