305 lines
8.0 KiB
TypeScript
305 lines
8.0 KiB
TypeScript
import {
|
|
Component,
|
|
Inject,
|
|
OnInit,
|
|
PLATFORM_ID,
|
|
Renderer2,
|
|
} from '@angular/core';
|
|
import { DOCUMENT } from '@angular/common';
|
|
import { CommonModule } from '@angular/common';
|
|
import { CardComponent } from '../../../../shared/components/ui/card/card.component';
|
|
// Wir müssen KpiColor hier importieren, um es als Typ verwenden zu können
|
|
import {
|
|
KpiCardComponent,
|
|
KpiColor,
|
|
} from '../../../../shared/components/data-display/kpi-card/kpi-card.component';
|
|
import {
|
|
OrdersTableComponent,
|
|
Order,
|
|
} from '../../../../shared/components/data-display/orders-table/orders-table.component';
|
|
import { FormFieldComponent } from '../../../../shared/components/form/form-field/form-field.component';
|
|
import { FormGroupComponent } from '../../../../shared/components/form/form-group/form-group.component';
|
|
import {
|
|
FormSelectComponent,
|
|
SelectOption,
|
|
} from '../../../../shared/components/form/form-select/form-select.component';
|
|
|
|
import {
|
|
FormBuilder,
|
|
FormGroup,
|
|
FormsModule,
|
|
Validators,
|
|
} from '@angular/forms';
|
|
|
|
import { FormTextareaComponent } from '../../../../shared/components/form/form-textarea/form-textarea.component';
|
|
|
|
import { SlideToggleComponent } from '../../../../shared/components/form/slide-toggle/slide-toggle.component';
|
|
|
|
import { isPlatformBrowser } from '@angular/common';
|
|
|
|
import { ExpansionPanelComponent } from '../../../../shared/components/layout/expansion-panel/expansion-panel.component';
|
|
|
|
import { PageHeaderComponent } from '../../../../shared/components/layout/page-header/page-header.component';
|
|
|
|
import { ButtonComponent } from '../../../../shared/components/ui/button/button.component';
|
|
|
|
import { ChipComponent } from '../../../../shared/components/ui/chip/chip.component';
|
|
|
|
import { ReactiveFormsModule } from '@angular/forms';
|
|
|
|
// Wir definieren ein Interface für unsere KPI-Daten für Typsicherheit
|
|
interface Kpi {
|
|
value: string;
|
|
label: string;
|
|
color: KpiColor; // <-- Hier verwenden wir den importierten Typ
|
|
iconName: string;
|
|
}
|
|
|
|
@Component({
|
|
selector: 'app-demo2',
|
|
standalone: true,
|
|
imports: [
|
|
CommonModule,
|
|
|
|
KpiCardComponent,
|
|
OrdersTableComponent,
|
|
FormGroupComponent,
|
|
FormFieldComponent,
|
|
FormSelectComponent,
|
|
FormsModule,
|
|
FormTextareaComponent,
|
|
SlideToggleComponent,
|
|
ExpansionPanelComponent,
|
|
PageHeaderComponent,
|
|
ButtonComponent,
|
|
ChipComponent,
|
|
ReactiveFormsModule
|
|
],
|
|
templateUrl: './demo2.component.html',
|
|
})
|
|
export class Demo2Component {
|
|
|
|
demoForm: FormGroup;
|
|
|
|
|
|
kpiData: Kpi[] = [
|
|
{
|
|
value: '€ 14.750',
|
|
label: 'Umsatz',
|
|
color: 'green',
|
|
iconName: 'placeholder',
|
|
},
|
|
{
|
|
value: '1.284',
|
|
label: 'Neue Nutzer',
|
|
color: 'blue',
|
|
iconName: 'placeholder',
|
|
},
|
|
{
|
|
value: '312',
|
|
label: 'Bestellungen',
|
|
color: 'orange',
|
|
iconName: 'placeholder',
|
|
},
|
|
{
|
|
value: '99.8%',
|
|
label: 'Verfügbarkeit',
|
|
color: 'purple',
|
|
iconName: 'placeholder',
|
|
},
|
|
];
|
|
|
|
ordersData: Order[] = [
|
|
{
|
|
id: '10543',
|
|
user: {
|
|
name: 'Max Mustermann',
|
|
email: 'max.m@example.com',
|
|
avatarUrl: 'https://i.pravatar.cc/40?u=max',
|
|
},
|
|
amount: '€ 129,99',
|
|
status: 'success',
|
|
statusText: 'Abgeschlossen',
|
|
},
|
|
{
|
|
id: '10542',
|
|
user: {
|
|
name: 'Erika Mustermann',
|
|
email: 'erika.m@example.com',
|
|
avatarUrl: 'https://i.pravatar.cc/40?u=erika',
|
|
},
|
|
amount: '€ 49,50',
|
|
status: 'warning',
|
|
statusText: 'In Bearbeitung',
|
|
},
|
|
{
|
|
id: '10541',
|
|
user: {
|
|
name: 'Peter Pan',
|
|
email: 'peter.p@example.com',
|
|
avatarUrl: 'https://i.pravatar.cc/40?u=peter',
|
|
},
|
|
amount: '€ 87,00',
|
|
status: 'danger',
|
|
statusText: 'Storniert',
|
|
},
|
|
{
|
|
id: '10543',
|
|
user: {
|
|
name: 'Max Mustermann',
|
|
email: 'max.m@example.com',
|
|
avatarUrl: 'https://i.pravatar.cc/40?u=max',
|
|
},
|
|
amount: '€ 129,99',
|
|
status: 'success',
|
|
statusText: 'Abgeschlossen',
|
|
},
|
|
{
|
|
id: '10542',
|
|
user: {
|
|
name: 'Erika Mustermann',
|
|
email: 'erika.m@example.com',
|
|
avatarUrl: 'https://i.pravatar.cc/40?u=erika',
|
|
},
|
|
amount: '€ 49,50',
|
|
status: 'warning',
|
|
statusText: 'In Bearbeitung',
|
|
},
|
|
{
|
|
id: '10541',
|
|
user: {
|
|
name: 'Peter Pan',
|
|
email: 'peter.p@example.com',
|
|
avatarUrl: 'https://i.pravatar.cc/40?u=peter',
|
|
},
|
|
amount: '€ 87,00',
|
|
status: 'danger',
|
|
statusText: 'Storniert',
|
|
},
|
|
{
|
|
id: '10543',
|
|
user: {
|
|
name: 'Max Mustermann',
|
|
email: 'max.m@example.com',
|
|
avatarUrl: 'https://i.pravatar.cc/40?u=max',
|
|
},
|
|
amount: '€ 129,99',
|
|
status: 'success',
|
|
statusText: 'Abgeschlossen',
|
|
},
|
|
{
|
|
id: '10542',
|
|
user: {
|
|
name: 'Erika Mustermann',
|
|
email: 'erika.m@example.com',
|
|
avatarUrl: 'https://i.pravatar.cc/40?u=erika',
|
|
},
|
|
amount: '€ 49,50',
|
|
status: 'warning',
|
|
statusText: 'In Bearbeitung',
|
|
},
|
|
{
|
|
id: '10541',
|
|
user: {
|
|
name: 'Peter Pan',
|
|
email: 'peter.p@example.com',
|
|
avatarUrl: 'https://i.pravatar.cc/40?u=peter',
|
|
},
|
|
amount: '€ 87,00',
|
|
status: 'danger',
|
|
statusText: 'Storniert',
|
|
},
|
|
];
|
|
|
|
aktuellesPasswort: any = '';
|
|
neuesPasswort: any = '';
|
|
|
|
selectedCountry: string | null = null;
|
|
|
|
countryOptions: SelectOption[] = [
|
|
{ value: 'de', label: 'Deutschland' },
|
|
{ value: 'at', label: 'Österreich' },
|
|
{ value: 'ch', label: 'Schweiz' },
|
|
];
|
|
|
|
biografie: string =
|
|
'Dies ist eine Beispiel-Biografie, die über mehrere Zeilen gehen kann.';
|
|
|
|
benachrichtigungenAktiv: boolean = true;
|
|
profilIstPrivat: boolean = false;
|
|
|
|
private readonly darkModeKey = 'app-dark-mode-setting';
|
|
darkModeAktiv: boolean = false;
|
|
|
|
|
|
constructor(
|
|
private renderer: Renderer2,
|
|
@Inject(DOCUMENT) private document: Document,
|
|
@Inject(PLATFORM_ID) private platformId: Object,
|
|
|
|
private fb: FormBuilder
|
|
) {
|
|
this.demoForm = this.fb.group({
|
|
username: [''], // Entspricht dem [(value)]="benutzername"
|
|
email: ['', [Validators.required, Validators.email]],
|
|
password: ['', [Validators.required]]
|
|
});
|
|
}
|
|
|
|
ngOnInit(): void {
|
|
this.loadThemeSetting();
|
|
}
|
|
|
|
private loadThemeSetting(): void {
|
|
if (isPlatformBrowser(this.platformId)) {
|
|
try {
|
|
const storedValue = localStorage.getItem(this.darkModeKey);
|
|
// Setze den Zustand der Komponente basierend auf dem gespeicherten Wert.
|
|
this.darkModeAktiv = storedValue === 'true';
|
|
} catch (e) {
|
|
console.error('Could not access localStorage:', e);
|
|
}
|
|
}
|
|
// Wende das Theme an - entweder den Standardwert (false) oder den geladenen Wert.
|
|
this.updateTheme(this.darkModeAktiv);
|
|
}
|
|
|
|
onDarkModeChange(isEnabled: boolean): void {
|
|
this.darkModeAktiv = isEnabled;
|
|
|
|
// --- KORREKTUR 2: Speichere die neue Einstellung ---
|
|
if (isPlatformBrowser(this.platformId)) {
|
|
try {
|
|
localStorage.setItem(this.darkModeKey, String(isEnabled));
|
|
} catch (e) {
|
|
console.error('Could not write to localStorage:', e);
|
|
}
|
|
}
|
|
|
|
// Wende die visuelle Änderung an.
|
|
this.updateTheme(isEnabled);
|
|
}
|
|
|
|
// This method is CORRECT. It just needs to be called.
|
|
private updateTheme(isEnabled: boolean): void {
|
|
if (isEnabled) {
|
|
this.renderer.addClass(this.document.body, 'dark-theme');
|
|
} else {
|
|
this.renderer.removeClass(this.document.body, 'dark-theme');
|
|
}
|
|
}
|
|
|
|
handleDeleteOrder(orderId: string): void {
|
|
console.log('Lösche Bestellung mit ID:', orderId);
|
|
// Hier könnten Sie z.B. einen Bestätigungs-Dialog öffnen
|
|
}
|
|
handleViewDetails(orderId: string): void {
|
|
console.log('View Bestellung mit ID:', orderId);
|
|
// Hier könnten Sie z.B. einen Bestätigungs-Dialog öffnen
|
|
}
|
|
handleEditOrder(orderId: string): void {
|
|
console.log('Edit Bestellung mit ID:', orderId);
|
|
// Hier könnten Sie z.B. einen Bestätigungs-Dialog öffnen
|
|
}
|
|
}
|