This commit is contained in:
Tizian.Breuch
2025-12-04 13:43:45 +01:00
parent 05c2b6b5c9
commit ec6e6bdd7a
7 changed files with 76 additions and 1139 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -19,6 +19,9 @@ export interface CreateAddress {
postalCode: string; postalCode: string;
country: string; country: string;
type: AddressType; type: AddressType;
// FEHLTEN:
firstName: string;
lastName: string;
} }
export interface UpdateAddress extends CreateAddress { export interface UpdateAddress extends CreateAddress {

View File

@@ -34,6 +34,9 @@ export interface OrderDetail {
totalAmount: number; totalAmount: number;
shippingAddress: Address; shippingAddress: Address;
billingAddress: Address; billingAddress: Address;
shippingAddressId?: string;
billingAddressId?: string;
paymentMethodId?: string;
paymentMethod?: string; paymentMethod?: string;
shippingTrackingNumber?: string; shippingTrackingNumber?: string;
shippedDate?: string; shippedDate?: string;

View File

@@ -0,0 +1,9 @@
// Das Backend sendet dies bei Validierungsfehlern (400 Bad Request)
export interface ValidationProblemDetails {
type?: string;
title?: string;
status?: number;
detail?: string;
instance?: string;
errors?: { [key: string]: string[] };
}

View File

@@ -8,6 +8,9 @@ export interface User {
lastActive?: string; lastActive?: string;
firstName?: string; firstName?: string;
lastName?: string; lastName?: string;
phoneNumber?: string;
defaultShippingAddressId?: string;
defaultBillingAddressId?: string;
} }
export interface UpdateUserRolesRequest { export interface UpdateUserRolesRequest {

View File

@@ -1,129 +1,129 @@
<aside class="sidebar" [class.collapsed]="isCollapsed"> <aside class="sidebar" [class.collapsed]="isCollapsed">
<nav class="sidebar-nav"> <nav class="sidebar-nav">
<!-- Toggle bleibt wie er ist, da er keine Route ist -->
<div class="nav-item" (click)="toggleSidebar()"> <div class="nav-item" (click)="toggleSidebar()">
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>Toggle</span> <span>Toggle</span>
</div> </div>
<!-- Products -->
<div <div
class="nav-item" class="nav-item"
[class.active]="activeRoute === 'home'" routerLink="/shop/products"
(click)="setActive('home')" routerLinkActive="active"
> >
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>products</span>
</div>
<!-- Home -->
<div
class="nav-item"
routerLink="/shop/home"
routerLinkActive="active"
>
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>Home</span> <span>Home</span>
</div> </div>
<!-- Categories -->
<div <div
class="nav-item" class="nav-item"
[class.active]="activeRoute === 'categories'" routerLink="/shop/categories"
(click)="setActive('categories')" routerLinkActive="active"
> >
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>categories</span> <span>categories</span>
</div> </div>
<!-- Discounts -->
<div <div
class="nav-item" class="nav-item"
[class.active]="activeRoute === 'discounts'" routerLink="/shop/discounts"
(click)="setActive('discounts')" routerLinkActive="active"
> >
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>discounts</span> <span>discounts</span>
</div> </div>
<!-- Orders -->
<div <div
class="nav-item" class="nav-item"
[class.active]="activeRoute === 'orders'" routerLink="/shop/orders"
(click)="setActive('orders')" routerLinkActive="active"
> >
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>orders</span> <span>orders</span>
</div> </div>
<!-- Payment Methods -->
<div <div
class="nav-item" class="nav-item"
[class.active]="activeRoute === 'payment-methods'" routerLink="/shop/payment-methods"
(click)="setActive('payment-methods')" routerLinkActive="active"
> >
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>payment-methods</span> <span>payment-methods</span>
</div> </div>
<!-- Reviews -->
<div <div
class="nav-item" class="nav-item"
[class.active]="activeRoute === 'products'" routerLink="/shop/reviews"
(click)="setActive('products')" routerLinkActive="active"
> >
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>products</span>
</div>
<div
class="nav-item"
[class.active]="activeRoute === 'reviews'"
(click)="setActive('reviews')"
>
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>reviews</span> <span>reviews</span>
</div> </div>
<!-- <div
class="nav-item"
[class.active]="activeRoute === 'settings'"
(click)="setActive('settings')"
>
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>settings</span> <!-- Shipping Methods -->
</div> -->
<div <div
class="nav-item" class="nav-item"
[class.active]="activeRoute === 'shipping-methods'" routerLink="/shop/shipping-methods"
(click)="setActive('shipping-methods')" routerLinkActive="active"
> >
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>shipping-methods</span> <span>shipping-methods</span>
</div> </div>
<!-- Shop Info -->
<div <div
class="nav-item" class="nav-item"
[class.active]="activeRoute === 'shop-info'" routerLink="/shop/shop-info"
(click)="setActive('shop-info')" routerLinkActive="active"
> >
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>shop-info</span> <span>shop-info</span>
</div> </div>
<!-- Supplier List -->
<div <div
class="nav-item" class="nav-item"
[class.active]="activeRoute === 'supplier-list'" routerLink="/shop/supplier-list"
(click)="setActive('supplier-list')" routerLinkActive="active"
> >
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>supplier-list</span> <span>supplier-list</span>
</div> </div>
<!-- Users -->
<div <div
class="nav-item" class="nav-item"
[class.active]="activeRoute === 'users'" routerLink="/shop/users"
(click)="setActive('users')" routerLinkActive="active"
> >
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>users</span> <span>users</span>
</div> </div>
<!-- Analytics -->
<div <div
class="nav-item" class="nav-item"
[class.active]="activeRoute === 'analytics'" routerLink="/shop/analytics"
(click)="setActive('analytics')" routerLinkActive="active"
> >
<app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon> <app-icon [iconName]="'placeholder'" [svgColor]="'#8e44ad'"></app-icon>
<span>analytics</span> <span>analytics</span>
</div> </div>
</nav> </nav>
</aside> </aside>

View File

@@ -1,51 +1,40 @@
// /src/app/core/components/default-layout/sidebar/sidebar.component.ts
import { Component, OnInit, inject } from '@angular/core'; import { Component, OnInit, inject } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { RouterLink, RouterLinkActive } from '@angular/router'; // RouterLink und RouterLinkActive importieren // WICHTIG: RouterLink und RouterLinkActive importieren
import { RouterLink, RouterLinkActive, Router } from '@angular/router';
import { IconComponent } from '../../ui/icon/icon.component'; import { IconComponent } from '../../ui/icon/icon.component';
import { StorageService } from '../../../../core/services/storage.service'; import { StorageService } from '../../../../core/services/storage.service';
import { Router } from '@angular/router';
@Component({ @Component({
selector: 'app-sidebar', selector: 'app-sidebar',
standalone: true, standalone: true,
imports: [CommonModule, IconComponent], // RouterLink und RouterLinkActive hier hinzufügen // WICHTIG: Hier im Array hinzufügen
imports: [CommonModule, IconComponent, RouterLink, RouterLinkActive],
templateUrl: './sidebar.component.html', templateUrl: './sidebar.component.html',
styleUrl: './sidebar.component.css', styleUrl: './sidebar.component.css',
}) })
export class SidebarComponent implements OnInit { export class SidebarComponent implements OnInit {
// --- Abhängigkeiten mit moderner inject()-Syntax ---
private storageService = inject(StorageService); private storageService = inject(StorageService);
private readonly sidebarCollapsedKey = 'app-sidebar-collapsed'; private readonly sidebarCollapsedKey = 'app-sidebar-collapsed';
public isCollapsed = false; public isCollapsed = false;
activeRoute = 'dashboard';
constructor(private router: Router) {} constructor(private router: Router) {}
ngOnInit(): void { ngOnInit(): void {
this.loadCollapsedState(); this.loadCollapsedState();
} }
setActive(route: string): void {
this.activeRoute = route;
this.router.navigateByUrl('/shop/' + route);
}
toggleSidebar(): void { toggleSidebar(): void {
this.isCollapsed = !this.isCollapsed; this.isCollapsed = !this.isCollapsed;
this.saveCollapsedState(); this.saveCollapsedState();
} }
private loadCollapsedState(): void { private loadCollapsedState(): void {
// Der Service kümmert sich um die Browser-Prüfung und gibt boolean oder null zurück this.isCollapsed = this.storageService.getItem<boolean>(this.sidebarCollapsedKey) ?? false;
this.isCollapsed =
this.storageService.getItem<boolean>(this.sidebarCollapsedKey) ?? false;
} }
private saveCollapsedState(): void { private saveCollapsedState(): void {
// Der Service kümmert sich um die Serialisierung des booleans
this.storageService.setItem(this.sidebarCollapsedKey, this.isCollapsed); this.storageService.setItem(this.sidebarCollapsedKey, this.isCollapsed);
} }
} }