Compare commits
2 Commits
dfe631edf6
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec6e6bdd7a | ||
|
|
05c2b6b5c9 |
38
package-lock.json
generated
38
package-lock.json
generated
@@ -746,9 +746,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@angular/ssr": {
|
"node_modules/@angular/ssr": {
|
||||||
"version": "19.2.17",
|
"version": "19.2.19",
|
||||||
"resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-19.2.17.tgz",
|
"resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-19.2.19.tgz",
|
||||||
"integrity": "sha512-9ABOYrHrCYnOiihkeHvN+QIaIN+1Js4QfT4cXAtZs/f+yFaURGre7yvyK1KncMBKwxXzjcqvu1QquFMU/m/JLw==",
|
"integrity": "sha512-7HqC3K99DdzDakB/4mkqGqY6REQNMxskU1VVkH9D7SthZSuxhWIMVBojVhBDd+JOUYiyQlwEGMBevbrgbtfKlQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.3.0"
|
"tslib": "^2.3.0"
|
||||||
@@ -4262,9 +4262,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@npmcli/package-json/node_modules/glob": {
|
"node_modules/@npmcli/package-json/node_modules/glob": {
|
||||||
"version": "10.4.5",
|
"version": "10.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
|
||||||
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
|
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -6658,9 +6658,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/cacache/node_modules/glob": {
|
"node_modules/cacache/node_modules/glob": {
|
||||||
"version": "10.4.5",
|
"version": "10.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
|
||||||
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
|
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -9796,9 +9796,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/js-yaml": {
|
"node_modules/js-yaml": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
|
||||||
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
|
"integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -11437,9 +11437,9 @@
|
|||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/node-forge": {
|
"node_modules/node-forge": {
|
||||||
"version": "1.3.1",
|
"version": "1.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz",
|
||||||
"integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
|
"integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "(BSD-3-Clause OR GPL-2.0)",
|
"license": "(BSD-3-Clause OR GPL-2.0)",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -14075,10 +14075,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tar": {
|
"node_modules/tar": {
|
||||||
"version": "7.5.1",
|
"version": "7.5.2",
|
||||||
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz",
|
||||||
"integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==",
|
"integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==",
|
||||||
"license": "ISC",
|
"license": "BlueOak-1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@isaacs/fs-minipass": "^4.0.0",
|
"@isaacs/fs-minipass": "^4.0.0",
|
||||||
"chownr": "^3.0.0",
|
"chownr": "^3.0.0",
|
||||||
|
|||||||
1070
src/_styles_OLD.txt
1070
src/_styles_OLD.txt
File diff suppressed because it is too large
Load Diff
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
9
src/app/core/models/shared.models.ts
Normal file
9
src/app/core/models/shared.models.ts
Normal 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[] };
|
||||||
|
}
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user