update angular core & cli to v19

This commit is contained in:
Marcel Arndt 2025-04-11 12:04:04 +02:00
parent dde00abe54
commit d8a2930247
53 changed files with 4137 additions and 3574 deletions

File diff suppressed because it is too large Load Diff

View File

@ -10,17 +10,17 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "^18.1.0", "@angular/animations": "^19.2.6",
"@angular/cdk": "^18.1.1", "@angular/cdk": "^18.1.1",
"@angular/common": "^18.1.0", "@angular/common": "^19.2.6",
"@angular/compiler": "^18.1.0", "@angular/compiler": "^19.2.6",
"@angular/core": "^18.1.0", "@angular/core": "^19.2.6",
"@angular/forms": "^18.1.0", "@angular/forms": "^19.2.6",
"@angular/material": "^18.1.1", "@angular/material": "^18.1.1",
"@angular/material-date-fns-adapter": "^18.1.1", "@angular/material-date-fns-adapter": "^18.1.1",
"@angular/platform-browser": "^18.1.0", "@angular/platform-browser": "^19.2.6",
"@angular/platform-browser-dynamic": "^18.1.0", "@angular/platform-browser-dynamic": "^19.2.6",
"@angular/router": "^18.1.0", "@angular/router": "^19.2.6",
"@apollo/client": "^3.0.0", "@apollo/client": "^3.0.0",
"@azure/msal-angular": "^3.0.22", "@azure/msal-angular": "^3.0.22",
"@azure/msal-browser": "^3.19.1", "@azure/msal-browser": "^3.19.1",
@ -46,13 +46,13 @@
"graphql-ws": "^5.16.0", "graphql-ws": "^5.16.0",
"rxjs": "~7.8.0", "rxjs": "~7.8.0",
"tslib": "^2.3.0", "tslib": "^2.3.0",
"zone.js": "~0.14.3" "zone.js": "~0.15.0"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^18.1.1", "@angular-devkit/build-angular": "^19.2.7",
"@angular/cli": "^18.1.1", "@angular/cli": "^19.2.7",
"@angular/compiler-cli": "^18.1.0", "@angular/compiler-cli": "^19.2.6",
"@angular/localize": "^18.1.1", "@angular/localize": "^19.2.6",
"@types/jasmine": "~5.1.0", "@types/jasmine": "~5.1.0",
"autoprefixer": "^10.4.19", "autoprefixer": "^10.4.19",
"jasmine-core": "~5.1.0", "jasmine-core": "~5.1.0",

View File

@ -4,11 +4,10 @@ import { AppShellComponent } from './core/components/app-shell/app-shell.compone
import { MsalService } from '@azure/msal-angular'; import { MsalService } from '@azure/msal-angular';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
standalone: true, imports: [AppShellComponent, RouterOutlet],
imports: [AppShellComponent, RouterOutlet], templateUrl: './app.component.html',
templateUrl: './app.component.html', styleUrl: './app.component.scss'
styleUrl: './app.component.scss',
}) })
export class AppComponent { export class AppComponent {
title = 'dashboard'; title = 'dashboard';

View File

@ -1,9 +1,9 @@
import { import {
APP_INITIALIZER,
ApplicationConfig, ApplicationConfig,
ErrorHandler, ErrorHandler,
importProvidersFrom, importProvidersFrom,
provideZoneChangeDetection, provideZoneChangeDetection,
provideAppInitializer,
} from '@angular/core'; } from '@angular/core';
import { provideRouter } from '@angular/router'; import { provideRouter } from '@angular/router';
@ -19,15 +19,13 @@ import { GlobalErrorHandler } from './core/telemetry/global-error-handler';
export const appConfig: ApplicationConfig = { export const appConfig: ApplicationConfig = {
providers: [ providers: [
{ provideAppInitializer(() => {
provide: APP_INITIALIZER, const initializerFn = faroInitializer();
useFactory: faroInitializer, return initializerFn();
deps: [], }),
multi: true,
},
{ {
provide: ErrorHandler, provide: ErrorHandler,
useClass: GlobalErrorHandler useClass: GlobalErrorHandler,
}, },
provideZoneChangeDetection({ eventCoalescing: true }), provideZoneChangeDetection({ eventCoalescing: true }),
provideRouter(routes), provideRouter(routes),

View File

@ -19,23 +19,22 @@ import { AvatarComponent } from '../avatar/avatar.component';
import { RoleDirective } from '../ms-authentication/role.directive'; import { RoleDirective } from '../ms-authentication/role.directive';
@Component({ @Component({
selector: 'app-app-shell', selector: 'app-app-shell',
standalone: true, imports: [
imports: [ MatButtonModule,
MatButtonModule, MatIconModule,
MatIconModule, MatToolbarModule,
MatToolbarModule, MatSidenavModule,
MatSidenavModule, MatListModule,
MatListModule, AvatarComponent,
AvatarComponent, RouterOutlet,
RouterOutlet, RouterLink,
RouterLink, RouterLinkActive,
RouterLinkActive, AsyncPipe,
AsyncPipe, RoleDirective,
RoleDirective, ],
], templateUrl: './app-shell.component.html',
templateUrl: './app-shell.component.html', styleUrl: './app-shell.component.scss'
styleUrl: './app-shell.component.scss',
}) })
export class AppShellComponent { export class AppShellComponent {
isHandset$: Observable<boolean>; isHandset$: Observable<boolean>;

View File

@ -5,10 +5,9 @@ import { map } from 'rxjs';
import { AuthService } from '../ms-authentication/auth.service'; import { AuthService } from '../ms-authentication/auth.service';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-avatar',
selector: 'dks-avatar', template: `<div
template: `<div
class="flex items-center justify-center rounded-full h-10 w-10 bg-gray-100 text-blue-500 cursor-pointer transition ease-in-out hover:bg-white hover:shadow-md hover:scale-105 duration-200 " class="flex items-center justify-center rounded-full h-10 w-10 bg-gray-100 text-blue-500 cursor-pointer transition ease-in-out hover:bg-white hover:shadow-md hover:scale-105 duration-200 "
[matMenuTriggerFor]="menu" [matMenuTriggerFor]="menu"
> >
@ -17,7 +16,7 @@ import { AuthService } from '../ms-authentication/auth.service';
<mat-menu #menu="matMenu"> <mat-menu #menu="matMenu">
<button mat-menu-item (click)="logout()">Logout</button> <button mat-menu-item (click)="logout()">Logout</button>
</mat-menu>`, </mat-menu>`,
imports: [AsyncPipe, MatMenuModule], imports: [AsyncPipe, MatMenuModule]
}) })
export class AvatarComponent { export class AvatarComponent {
private authService = inject(AuthService); private authService = inject(AuthService);

View File

@ -8,7 +8,7 @@ export interface ConfirmDialogData {
} }
@Component({ @Component({
template: `<div class="flex flex-col items-center justify-start p-4"> template: `<div class="flex flex-col items-center justify-start p-4">
<div class="text-lg font-bold pb-2">{{ ref.data.title }}</div> <div class="text-lg font-bold pb-2">{{ ref.data.title }}</div>
<div class="pb-4 border-b border-gray-400">{{ ref.data.body }}</div> <div class="pb-4 border-b border-gray-400">{{ ref.data.body }}</div>
<div class="pt-4"> <div class="pt-4">
@ -16,9 +16,8 @@ export interface ConfirmDialogData {
<button mat-stroked-button color="warn" [dialogClose]="true">Bestätigen</button> <button mat-stroked-button color="warn" [dialogClose]="true">Bestätigen</button>
</div> </div>
</div>`, </div>`,
standalone: true, imports: [MatButtonModule, DialogCloseDirective],
imports: [MatButtonModule, DialogCloseDirective], changeDetection: ChangeDetectionStrategy.OnPush
changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class ConfirmDialogComponent { export class ConfirmDialogComponent {
ref: DialogRef<ConfirmDialogData> = inject(DialogRef); ref: DialogRef<ConfirmDialogData> = inject(DialogRef);

View File

@ -15,7 +15,8 @@ import * as echarts from 'echarts/core';
import { CanvasRenderer } from 'echarts/renderers'; import { CanvasRenderer } from 'echarts/renderers';
@Directive({ @Directive({
selector: '[dksEcharts]' selector: '[dksEcharts]',
standalone: false
}) })
export class EchartsDirective implements OnInit, OnDestroy, OnChanges { export class EchartsDirective implements OnInit, OnDestroy, OnChanges {
@Input() options?: EChartsOption; @Input() options?: EChartsOption;

View File

@ -15,10 +15,9 @@ import { HotToastService } from '@ngxpert/hot-toast';
import { Tour, Ticket, AccountingState, TicketValidationState } from '../../../core/data-access/graphql/generated/generated'; import { Tour, Ticket, AccountingState, TicketValidationState } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-accounting-item',
selector: 'dks-accounting-item', template: ` <div class="flex justify-between">
template: ` <div class="flex justify-between">
<div class="flex items-center"> <div class="flex items-center">
<button <button
mat-icon-button mat-icon-button
@ -45,22 +44,22 @@ import { Tour, Ticket, AccountingState, TicketValidationState } from '../../../c
tour.revenueDeviation | currency : 'EUR' : 'symbol' : '1.2-2' : 'de-DE' tour.revenueDeviation | currency : 'EUR' : 'symbol' : '1.2-2' : 'de-DE'
}} }}
</ng-template>`, </ng-template>`,
styles: [ styles: [
` `
:host { :host {
@apply flex flex-col rounded border p-2 m-1 bg-white cursor-pointer; @apply flex flex-col rounded border p-2 m-1 bg-white cursor-pointer;
} }
`, `,
], ],
imports: [ imports: [
MatButtonModule, MatButtonModule,
MatIconModule, MatIconModule,
MatBadgeModule, MatBadgeModule,
ClipboardModule, ClipboardModule,
NgIf, NgIf,
NgClass, NgClass,
CurrencyPipe, CurrencyPipe,
], ]
}) })
export class AccountingItemComponent implements AfterViewInit { export class AccountingItemComponent implements AfterViewInit {
toast = inject(HotToastService); toast = inject(HotToastService);

View File

@ -3,10 +3,9 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { TourStateMeta } from '../../../core/data-access/graphql/generated/generated'; import { TourStateMeta } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-accounting-lane-footer',
selector: 'dks-accounting-lane-footer', template: `<span *ngIf="withTourCount" class="text-left text-xs">
template: `<span *ngIf="withTourCount" class="text-left text-xs">
{{ tourStateMeta.count }} Touren {{ tourStateMeta.count }} Touren
</span> </span>
<span *ngIf="withRevenueSum" class="text-left text-xs"> <span *ngIf="withRevenueSum" class="text-left text-xs">
@ -15,14 +14,14 @@ import { TourStateMeta } from '../../../core/data-access/graphql/generated/gener
| currency : 'EUR' : 'symbol' : '1.2-2' : 'de-DE' | currency : 'EUR' : 'symbol' : '1.2-2' : 'de-DE'
}} }}
</span>`, </span>`,
styles: [ styles: [
` `
:host { :host {
@apply flex flex-col items-center justify-center p-2; @apply flex flex-col items-center justify-center p-2;
} }
`, `,
], ],
imports: [NgIf, AsyncPipe, CurrencyPipe], imports: [NgIf, AsyncPipe, CurrencyPipe]
}) })
export class AccountingLaneFooterComponent { export class AccountingLaneFooterComponent {
@Input() tourStateMeta!: TourStateMeta; @Input() tourStateMeta!: TourStateMeta;

View File

@ -20,10 +20,9 @@ import {
} from '../../../core/data-access/graphql/generated/generated'; } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-accounting-lane-header-filter',
selector: 'dks-accounting-lane-header-filter', template: `
template: `
<ng-container [ngSwitch]="state"> <ng-container [ngSwitch]="state">
<button <button
mat-icon-button mat-icon-button
@ -75,17 +74,17 @@ import {
</mat-menu> </mat-menu>
</form> </form>
`, `,
styles: [], styles: [],
imports: [ imports: [
NgSwitch, NgSwitch,
NgSwitchCase, NgSwitchCase,
NgFor, NgFor,
FormsModule, FormsModule,
MatButtonModule, MatButtonModule,
MatIconModule, MatIconModule,
MatMenuModule, MatMenuModule,
MatCheckboxModule, MatCheckboxModule,
], ]
}) })
export class AccountingLaneHeaderFilterComponent implements AfterViewInit { export class AccountingLaneHeaderFilterComponent implements AfterViewInit {
@Input() state!: AccountingState; @Input() state!: AccountingState;

View File

@ -10,10 +10,9 @@ import { AccountingLaneHeaderFilterComponent } from './accounting-lane-header-fi
import { AccountingFilterArgs, AccountingState } from '../../../core/data-access/graphql/generated/generated'; import { AccountingFilterArgs, AccountingState } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-accounting-lane-header',
selector: 'dks-accounting-lane-header', template: `<div></div>
template: `<div></div>
<ng-container [ngSwitch]="state"> <ng-container [ngSwitch]="state">
<div *ngSwitchCase="AccountingState.Billable">Abrechenbar</div> <div *ngSwitchCase="AccountingState.Billable">Abrechenbar</div>
<div *ngSwitchCase="AccountingState.PreparedForBilling"> <div *ngSwitchCase="AccountingState.PreparedForBilling">
@ -27,14 +26,14 @@ import { AccountingFilterArgs, AccountingState } from '../../../core/data-access
[state]="state" [state]="state"
(filterChange)="filterChanged($event)" (filterChange)="filterChanged($event)"
></dks-accounting-lane-header-filter>`, ></dks-accounting-lane-header-filter>`,
styles: [ styles: [
` `
:host { :host {
@apply flex items-center justify-between p-2 bg-gray-50; @apply flex items-center justify-between p-2 bg-gray-50;
} }
`, `,
], ],
imports: [NgSwitch, NgSwitchCase, AccountingLaneHeaderFilterComponent], imports: [NgSwitch, NgSwitchCase, AccountingLaneHeaderFilterComponent]
}) })
export class AccountingLaneHeaderComponent { export class AccountingLaneHeaderComponent {
@Input() state!: AccountingState; @Input() state!: AccountingState;

View File

@ -36,29 +36,28 @@ import { AccountingLaneFooterComponent } from './accounting-lane-footer.componen
import { AccountingLaneHeaderComponent } from './accounting-lane-header.component'; import { AccountingLaneHeaderComponent } from './accounting-lane-header.component';
@Component({ @Component({
selector: 'dks-accounting-lane', selector: 'dks-accounting-lane',
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: './accounting-lane.component.html',
templateUrl: './accounting-lane.component.html', styles: [
styles: [ `
`
:host { :host {
@apply rounded bg-gray-200 h-full w-full grid; @apply rounded bg-gray-200 h-full w-full grid;
grid-template-rows: auto 1fr auto; grid-template-rows: auto 1fr auto;
} }
`, `,
], ],
imports: [ imports: [
AccountingLaneHeaderComponent, AccountingLaneHeaderComponent,
AccountingLaneFooterComponent, AccountingLaneFooterComponent,
AccountingItemComponent, AccountingItemComponent,
NgFor, NgFor,
NgIf, NgIf,
NgClass, NgClass,
AsyncPipe, AsyncPipe,
CurrencyPipe, CurrencyPipe,
ScrollingModule, ScrollingModule,
], ]
}) })
export class AccountingLaneComponent { export class AccountingLaneComponent {
private dialog = inject(DialogService); private dialog = inject(DialogService);

View File

@ -6,10 +6,9 @@ import { MatTabsModule } from '@angular/material/tabs';
import { Tour } from '../../../core/data-access/graphql/generated/generated'; import { Tour } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-accounting-tour-overview',
selector: 'dks-accounting-tour-overview', template: `
template: `
<div class="px-4 py-2 flex justify-between"> <div class="px-4 py-2 flex justify-between">
<div class="flex flex-col text-gray-600 text-sm"> <div class="flex flex-col text-gray-600 text-sm">
<span class="font-medium">Startzeit</span> <span class="font-medium">Startzeit</span>
@ -71,8 +70,8 @@ import { Tour } from '../../../core/data-access/graphql/generated/generated';
</div> </div>
</div> </div>
`, `,
styles: [], styles: [],
imports: [MatTabsModule, MatIconModule, MatDividerModule, NgIf, DatePipe], imports: [MatTabsModule, MatIconModule, MatDividerModule, NgIf, DatePipe]
}) })
export class AccountingTourOverviewComponent { export class AccountingTourOverviewComponent {
@Input() tour!: Tour; @Input() tour!: Tour;

View File

@ -6,10 +6,9 @@ import { MatListModule } from '@angular/material/list';
import { Ticket, TicketValidationState, Tour } from '../../../core/data-access/graphql/generated/generated'; import { Ticket, TicketValidationState, Tour } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-accounting-tour-ticket',
selector: 'dks-accounting-tour-ticket', template: `
template: `
<div class="grid grid-cols-4"> <div class="grid grid-cols-4">
<mat-list class="col-span-2" role="list"> <mat-list class="col-span-2" role="list">
<div mat-subheader class="text-sm">Ticket Informationen</div> <div mat-subheader class="text-sm">Ticket Informationen</div>
@ -87,17 +86,17 @@ import { Ticket, TicketValidationState, Tour } from '../../../core/data-access/g
</mat-list> </mat-list>
</div> </div>
`, `,
styles: [], styles: [],
imports: [ imports: [
MatIconModule, MatIconModule,
MatListModule, MatListModule,
MatDividerModule, MatDividerModule,
NgIf, NgIf,
NgFor, NgFor,
NgSwitch, NgSwitch,
NgSwitchCase, NgSwitchCase,
DatePipe, DatePipe,
], ]
}) })
export class AccountingTourTicketComponent { export class AccountingTourTicketComponent {
@Input() tour!: Tour & { ticket: Ticket }; @Input() tour!: Tour & { ticket: Ticket };

View File

@ -10,10 +10,9 @@ import { AccountingTourOverviewComponent } from './accounting-tour-overview.comp
import { AccountingTourTicketComponent } from './accounting-tour-ticket.component'; import { AccountingTourTicketComponent } from './accounting-tour-ticket.component';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-accounting-tour-view',
selector: 'dks-accounting-tour-view', template: `<h3 class="py-2 px-3 !mb-0">
template: `<h3 class="py-2 px-3 !mb-0">
{{ ref.data.ordinanceType }} - {{ ref.data.ordinanceType }} -
{{ ref.data.patientName }} {{ ref.data.patientName }}
{{ ref.data.patientSurname }} {{ ref.data.patientSurname }}
@ -31,13 +30,13 @@ import { AccountingTourTicketComponent } from './accounting-tour-ticket.componen
></dks-accounting-tour-ticket> ></dks-accounting-tour-ticket>
</mat-tab> </mat-tab>
</mat-tab-group> `, </mat-tab-group> `,
styles: [], styles: [],
imports: [ imports: [
MatTabsModule, MatTabsModule,
MatIconModule, MatIconModule,
AccountingTourOverviewComponent, AccountingTourOverviewComponent,
AccountingTourTicketComponent, AccountingTourTicketComponent,
], ]
}) })
export class AccountingTourViewComponent { export class AccountingTourViewComponent {
ref: DialogRef<Tour & { ticket: Ticket }, undefined | any> = ref: DialogRef<Tour & { ticket: Ticket }, undefined | any> =

View File

@ -3,10 +3,9 @@ import { AccountingLaneComponent } from './accounting-lane/accounting-lane.compo
import { AccountingState } from '../../core/data-access/graphql/generated/generated'; import { AccountingState } from '../../core/data-access/graphql/generated/generated';
@Component({ @Component({
selector: 'dks-dashboard-accounting', selector: 'dks-dashboard-accounting',
standalone: true, imports: [AccountingLaneComponent],
imports: [AccountingLaneComponent], template: `<section class="h-full p-6 grid grid-cols-1 md:grid-cols-3 gap-6">
template: `<section class="h-full p-6 grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="col-span-1 md:col-span-5 flex justify-end items-center"> <div class="col-span-1 md:col-span-5 flex justify-end items-center">
<!-- Action Buttons --> <!-- Action Buttons -->
</div> </div>
@ -18,8 +17,8 @@ import { AccountingState } from '../../core/data-access/graphql/generated/genera
></dks-accounting-lane> ></dks-accounting-lane>
<dks-accounting-lane [accountingState]="AccountingState.Billed"></dks-accounting-lane> <dks-accounting-lane [accountingState]="AccountingState.Billed"></dks-accounting-lane>
</section>`, </section>`,
styles: [ styles: [
` `
:host { :host {
display: block; display: block;
height: calc(100% - 64px); height: calc(100% - 64px);
@ -28,8 +27,8 @@ import { AccountingState } from '../../core/data-access/graphql/generated/genera
grid-template-rows: 2rem 1fr; grid-template-rows: 2rem 1fr;
} }
`, `,
], ],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class DashboardAccountingComponent { export class DashboardAccountingComponent {
AccountingState = AccountingState; AccountingState = AccountingState;

View File

@ -32,10 +32,11 @@ interface Anomaly {
} }
@Component({ @Component({
selector: 'dks-anomaly-list-item', selector: 'dks-anomaly-list-item',
templateUrl: './anomaly-list-item.component.html', templateUrl: './anomaly-list-item.component.html',
styleUrls: ['./anomaly-list-item.component.css'], styleUrls: ['./anomaly-list-item.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false
}) })
export class AnomalyListItemComponent { export class AnomalyListItemComponent {
isHovering = false; isHovering = false;

View File

@ -18,10 +18,11 @@ import {
import { AnomaliesService } from '../anomalies.service'; import { AnomaliesService } from '../anomalies.service';
@Component({ @Component({
selector: 'dks-anomaly-list', selector: 'dks-anomaly-list',
templateUrl: './anomaly-list.component.html', templateUrl: './anomaly-list.component.html',
styleUrls: ['./anomaly-list.component.css'], styleUrls: ['./anomaly-list.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false
}) })
export class AnomalyListComponent implements OnInit, OnDestroy { export class AnomalyListComponent implements OnInit, OnDestroy {
@ViewChild(MatPaginator, { static: true }) private paginator!: MatPaginator; @ViewChild(MatPaginator, { static: true }) private paginator!: MatPaginator;

View File

@ -9,9 +9,10 @@ interface SolutionTarget {
} }
@Component({ @Component({
selector: 'dks-anomaly-solution-dialog', selector: 'dks-anomaly-solution-dialog',
templateUrl: './anomaly-solution-dialog.component.html', templateUrl: './anomaly-solution-dialog.component.html',
styleUrls: ['./anomaly-solution-dialog.component.css'], styleUrls: ['./anomaly-solution-dialog.component.css'],
standalone: false
}) })
export class AnomalySolutionDialogComponent { export class AnomalySolutionDialogComponent {
constructor( constructor(

View File

@ -41,10 +41,11 @@ interface AnomalyFlatNode {
} }
@Component({ @Component({
selector: 'dks-anomaly-tree', selector: 'dks-anomaly-tree',
templateUrl: './anomaly-tree.component.html', templateUrl: './anomaly-tree.component.html',
styleUrls: ['./anomaly-tree.component.css'], styleUrls: ['./anomaly-tree.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false
}) })
export class AnomalyTreeComponent implements OnInit, OnDestroy { export class AnomalyTreeComponent implements OnInit, OnDestroy {
@ViewChild(MatPaginator, { static: true }) private paginator!: MatPaginator; @ViewChild(MatPaginator, { static: true }) private paginator!: MatPaginator;

View File

@ -1,9 +1,10 @@
import { ChangeDetectionStrategy, Component } from '@angular/core'; import { ChangeDetectionStrategy, Component } from '@angular/core';
@Component({ @Component({
selector: 'dks-control-center-dashboard', selector: 'dks-control-center-dashboard',
templateUrl: './control-center-dashboard.component.html', templateUrl: './control-center-dashboard.component.html',
styleUrls: ['./control-center-dashboard.component.scss'], styleUrls: ['./control-center-dashboard.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false
}) })
export class ControlCenterDashboardComponent {} export class ControlCenterDashboardComponent {}

View File

@ -12,10 +12,11 @@ import {
} from '../../../../core/data-access/graphql/generated/generated'; } from '../../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
selector: 'dks-tours-per-time-kpi', selector: 'dks-tours-per-time-kpi',
templateUrl: './tours-per-time-kpi.component.html', templateUrl: './tours-per-time-kpi.component.html',
styleUrls: ['./tours-per-time-kpi.component.css'], styleUrls: ['./tours-per-time-kpi.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false
}) })
export class ToursPerTimeKPIComponent implements OnInit { export class ToursPerTimeKPIComponent implements OnInit {
@Input() ordinanceType!: string; @Input() ordinanceType!: string;

View File

@ -3,9 +3,10 @@ import { DialogRef } from '@ngneat/dialog';
import { Tour } from '../../../../core/data-access/graphql/generated/generated'; import { Tour } from '../../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
selector: 'dks-tour-view-dialog', selector: 'dks-tour-view-dialog',
templateUrl: './tour-view-dialog.component.html', templateUrl: './tour-view-dialog.component.html',
styleUrls: ['./tour-view-dialog.component.css'], styleUrls: ['./tour-view-dialog.component.css'],
standalone: false
}) })
export class TourViewDialogComponent { export class TourViewDialogComponent {
ref = inject<DialogRef<Partial<Tour>>>(DialogRef); ref = inject<DialogRef<Partial<Tour>>>(DialogRef);

View File

@ -7,10 +7,11 @@ import { TourViewDialogComponent } from './tour-view-dialog/tour-view-dialog.com
import { Tour } from '../../../core/data-access/graphql/generated/generated'; import { Tour } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
selector: 'dks-upcoming-tours', selector: 'dks-upcoming-tours',
templateUrl: './upcoming-tours.component.html', templateUrl: './upcoming-tours.component.html',
styleUrls: ['./upcoming-tours.component.css'], styleUrls: ['./upcoming-tours.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false
}) })
export class UpcomingToursComponent { export class UpcomingToursComponent {
upcomingTours$; upcomingTours$;

View File

@ -13,11 +13,10 @@ import { UtilNgxEchartsModule } from '../../../../core/components/ngx-echarts/ut
import { TimePerTourMetric } from '../../../../core/data-access/graphql/generated/generated'; import { TimePerTourMetric } from '../../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
selector: 'dks-average-revenue-metric', selector: 'dks-average-revenue-metric',
standalone: true, imports: [CommonModule, UtilNgxEchartsModule],
imports: [CommonModule, UtilNgxEchartsModule], templateUrl: './average-revenue-metric.component.html',
templateUrl: './average-revenue-metric.component.html', styleUrls: ['./average-revenue-metric.component.css']
styleUrls: ['./average-revenue-metric.component.css'],
}) })
export class AverageRevenueMetricComponent implements OnChanges { export class AverageRevenueMetricComponent implements OnChanges {
@Input() metrics: TimePerTourMetric[] = []; @Input() metrics: TimePerTourMetric[] = [];

View File

@ -6,11 +6,10 @@ import { TimePerTourMetric } from '../../../../core/data-access/graphql/generate
import { summarizeMetrics } from '../../util/summarize-metrics'; import { summarizeMetrics } from '../../util/summarize-metrics';
@Component({ @Component({
selector: 'dks-average-revenue-summary', selector: 'dks-average-revenue-summary',
standalone: true, imports: [CommonModule, MatIconModule],
imports: [CommonModule, MatIconModule], templateUrl: './average-revenue-summary.component.html',
templateUrl: './average-revenue-summary.component.html', styleUrls: ['./average-revenue-summary.component.css']
styleUrls: ['./average-revenue-summary.component.css'],
}) })
export class AverageRevenueSummaryComponent { export class AverageRevenueSummaryComponent {
@Input() set metrics(value: TimePerTourMetric[]) { @Input() set metrics(value: TimePerTourMetric[]) {

View File

@ -18,11 +18,10 @@ import { TimePerTourMetric } from '../../../../core/data-access/graphql/generate
import { MetricTimeScale } from '../../types'; import { MetricTimeScale } from '../../types';
@Component({ @Component({
selector: 'dks-breakeven-metric', selector: 'dks-breakeven-metric',
standalone: true, imports: [CommonModule, UtilNgxEchartsModule],
imports: [CommonModule, UtilNgxEchartsModule], templateUrl: './breakeven-metric.component.html',
templateUrl: './breakeven-metric.component.html', styleUrls: ['./breakeven-metric.component.css']
styleUrls: ['./breakeven-metric.component.css'],
}) })
export class BreakevenMetricComponent implements OnChanges { export class BreakevenMetricComponent implements OnChanges {
@Input() metrics: TimePerTourMetric[] = []; @Input() metrics: TimePerTourMetric[] = [];

View File

@ -6,11 +6,10 @@ import { TimePerTourMetric } from '../../../../core/data-access/graphql/generate
import { summarizeMetrics } from '../../util/summarize-metrics'; import { summarizeMetrics } from '../../util/summarize-metrics';
@Component({ @Component({
selector: 'dks-breakeven-summary', selector: 'dks-breakeven-summary',
standalone: true, imports: [CommonModule, MatIconModule],
imports: [CommonModule, MatIconModule], templateUrl: './breakeven-summary.component.html',
templateUrl: './breakeven-summary.component.html', styleUrls: ['./breakeven-summary.component.css']
styleUrls: ['./breakeven-summary.component.css'],
}) })
export class BreakevenSummaryComponent { export class BreakevenSummaryComponent {
@Input() set metrics(value: TimePerTourMetric[]) { @Input() set metrics(value: TimePerTourMetric[]) {

View File

@ -12,20 +12,19 @@ import { TimePerTourMetricComponent } from '../time-per-tour-metric/time-per-tou
import { TimePerTourSummaryComponent } from '../time-per-tour-summary/time-per-tour-summary.component'; import { TimePerTourSummaryComponent } from '../time-per-tour-summary/time-per-tour-summary.component';
@Component({ @Component({
selector: 'dks-metric-summary', selector: 'dks-metric-summary',
standalone: true, imports: [
imports: [ CommonModule,
CommonModule, AverageRevenueMetricComponent,
AverageRevenueMetricComponent, AverageRevenueSummaryComponent,
AverageRevenueSummaryComponent, BreakevenMetricComponent,
BreakevenMetricComponent, BreakevenSummaryComponent,
BreakevenSummaryComponent, TimePerTourMetricComponent,
TimePerTourMetricComponent, TimePerTourSummaryComponent,
TimePerTourSummaryComponent, MatSlideToggleModule,
MatSlideToggleModule, ],
], templateUrl: './metric-summary.component.html',
templateUrl: './metric-summary.component.html', styleUrls: ['./metric-summary.component.css']
styleUrls: ['./metric-summary.component.css'],
}) })
export class MetricSummaryComponent { export class MetricSummaryComponent {
@Input() set metrics(metrics: TimePerTourMetric[]) { @Input() set metrics(metrics: TimePerTourMetric[]) {

View File

@ -14,11 +14,10 @@ import { TimePerTourMetric } from '../../../../core/data-access/graphql/generate
import { MetricTimeScale } from '../../types'; import { MetricTimeScale } from '../../types';
@Component({ @Component({
selector: 'dks-time-per-tour-metric', selector: 'dks-time-per-tour-metric',
standalone: true, imports: [CommonModule, UtilNgxEchartsModule],
imports: [CommonModule, UtilNgxEchartsModule], templateUrl: './time-per-tour-metric.component.html',
templateUrl: './time-per-tour-metric.component.html', styleUrls: ['./time-per-tour-metric.component.css']
styleUrls: ['./time-per-tour-metric.component.css'],
}) })
export class TimePerTourMetricComponent implements OnChanges { export class TimePerTourMetricComponent implements OnChanges {
@Input() metrics: TimePerTourMetric[] = []; @Input() metrics: TimePerTourMetric[] = [];

View File

@ -6,11 +6,10 @@ import { summarizeMetrics } from '../../util/summarize-metrics';
import { TimePerTourMetric } from '../../../../core/data-access/graphql/generated/generated'; import { TimePerTourMetric } from '../../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
selector: 'dks-time-per-tour-summary', selector: 'dks-time-per-tour-summary',
standalone: true, imports: [CommonModule, MatIconModule],
imports: [CommonModule, MatIconModule], templateUrl: './time-per-tour-summary.component.html',
templateUrl: './time-per-tour-summary.component.html', styleUrls: ['./time-per-tour-summary.component.css']
styleUrls: ['./time-per-tour-summary.component.css'],
}) })
export class TimePerTourSummaryComponent { export class TimePerTourSummaryComponent {
@Input() set metrics(value: TimePerTourMetric[]) { @Input() set metrics(value: TimePerTourMetric[]) {

View File

@ -14,11 +14,10 @@ import { summarizeMetrics } from '../../util/summarize-metrics';
import { TimePerTourMetric } from '../../../../core/data-access/graphql/generated/generated'; import { TimePerTourMetric } from '../../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
selector: 'dks-view-type-selector', selector: 'dks-view-type-selector',
standalone: true, imports: [NgIf, NgSwitch, NgSwitchCase, NgClass, AsyncPipe, CurrencyPipe, MatIconModule],
imports: [NgIf, NgSwitch, NgSwitchCase, NgClass, AsyncPipe, CurrencyPipe, MatIconModule], templateUrl: './view-type-selector.component.html',
templateUrl: './view-type-selector.component.html', styleUrls: ['./view-type-selector.component.css']
styleUrls: ['./view-type-selector.component.css'],
}) })
export class ViewTypeSelectorComponent { export class ViewTypeSelectorComponent {
@Input() viewType!: DashboardViewType; @Input() viewType!: DashboardViewType;

View File

@ -20,9 +20,10 @@ import {
import { mergeMetrics } from '../util/merge-metric'; import { mergeMetrics } from '../util/merge-metric';
@Component({ @Component({
selector: 'dks-dayview', selector: 'dks-dayview',
templateUrl: './dayview.component.html', templateUrl: './dayview.component.html',
styleUrls: ['./dayview.component.css'], styleUrls: ['./dayview.component.css'],
standalone: false
}) })
export class DayviewComponent { export class DayviewComponent {
OrdinanceTypes = OrdinanceTypes; OrdinanceTypes = OrdinanceTypes;

View File

@ -1,9 +1,10 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
@Component({ @Component({
selector: 'dks-manager-dashboard', selector: 'dks-manager-dashboard',
templateUrl: './manager-dashboard.component.html', templateUrl: './manager-dashboard.component.html',
styleUrls: ['./manager-dashboard.component.css'], styleUrls: ['./manager-dashboard.component.css'],
standalone: false
}) })
export class ManagerDashboardComponent { export class ManagerDashboardComponent {
tabs: { title: string; route: string }[] = [ tabs: { title: string; route: string }[] = [

View File

@ -21,9 +21,10 @@ import {
import { mergeMetrics } from '../util/merge-metric'; import { mergeMetrics } from '../util/merge-metric';
@Component({ @Component({
selector: 'dks-monthview', selector: 'dks-monthview',
templateUrl: './monthview.component.html', templateUrl: './monthview.component.html',
styleUrls: ['./monthview.component.css'], styleUrls: ['./monthview.component.css'],
standalone: false
}) })
export class MonthviewComponent { export class MonthviewComponent {
OrdinanceTypes = OrdinanceTypes; OrdinanceTypes = OrdinanceTypes;

View File

@ -5,9 +5,10 @@ import { ManagerDashboardService } from '../manager-dashboard.service';
import { OrdinanceTypes } from '../types'; import { OrdinanceTypes } from '../types';
@Component({ @Component({
selector: 'dks-overview', selector: 'dks-overview',
templateUrl: './overview.component.html', templateUrl: './overview.component.html',
styleUrls: ['./overview.component.css'], styleUrls: ['./overview.component.css'],
standalone: false
}) })
export class OverviewComponent { export class OverviewComponent {
OrdinanceTypes = OrdinanceTypes; OrdinanceTypes = OrdinanceTypes;

View File

@ -8,19 +8,17 @@ import {
import { Component, Input, OnChanges, OnInit } from '@angular/core'; import { Component, Input, OnChanges, OnInit } from '@angular/core';
@Component({ @Component({
selector: 'dks-time-per-tour-by-car', selector: 'dks-time-per-tour-by-car',
templateUrl: './time-per-tour-by-car.component.html', templateUrl: './time-per-tour-by-car.component.html',
styleUrls: ['./time-per-tour-by-car.component.css'], styleUrls: ['./time-per-tour-by-car.component.css'],
animations: [ animations: [
trigger('detailExpand', [ trigger('detailExpand', [
state('collapsed', style({ height: '0px', minHeight: '0' })), state('collapsed', style({ height: '0px', minHeight: '0' })),
state('expanded', style({ height: '*' })), state('expanded', style({ height: '*' })),
transition( transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
'expanded <=> collapsed', ]),
animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)') ],
), standalone: false
]),
],
}) })
export class TimePerTourByCarComponent implements OnInit, OnChanges { export class TimePerTourByCarComponent implements OnInit, OnChanges {
@Input() columns: { id: string; title: string }[] = []; @Input() columns: { id: string; title: string }[] = [];

View File

@ -3,9 +3,10 @@ import { Interval, isWithinInterval } from 'date-fns';
import { interval, map, startWith } from 'rxjs'; import { interval, map, startWith } from 'rxjs';
@Component({ @Component({
selector: 'dks-time-per-tour-kpi', selector: 'dks-time-per-tour-kpi',
templateUrl: './time-per-tour-kpi.component.html', templateUrl: './time-per-tour-kpi.component.html',
styleUrls: ['./time-per-tour-kpi.component.css'], styleUrls: ['./time-per-tour-kpi.component.css'],
standalone: false
}) })
export class TimePerTourKPIComponent { export class TimePerTourKPIComponent {
@Input() text = ''; @Input() text = '';

View File

@ -18,18 +18,17 @@ import {
import CategoryColors from './category-colors'; import CategoryColors from './category-colors';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-ticket-item',
selector: 'dks-ticket-item', templateUrl: './ticket-item.component.html',
templateUrl: './ticket-item.component.html', styles: [
styles: [ `
`
:host { :host {
@apply flex flex-col rounded border-l-2 border-r-8 p-2 m-2 bg-white cursor-pointer; @apply flex flex-col rounded border-l-2 border-r-8 p-2 m-2 bg-white cursor-pointer;
} }
`, `,
], ],
imports: [MatIconModule, MatBadgeModule, NgIf], imports: [MatIconModule, MatBadgeModule, NgIf]
}) })
export class TicketItemComponent implements OnInit { export class TicketItemComponent implements OnInit {
@Input() ticket!: Ticket & { tours: Tour[] }; @Input() ticket!: Ticket & { tours: Tour[] };

View File

@ -3,10 +3,9 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { TicketStateMeta } from '../../../core/data-access/graphql/generated/generated'; import { TicketStateMeta } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-ticket-lane-footer',
selector: 'dks-ticket-lane-footer', template: `<span *ngIf="withTicketCount" class="text-left text-xs">
template: `<span *ngIf="withTicketCount" class="text-left text-xs">
{{ ticketStateMeta.count }} Tickets {{ ticketStateMeta.count }} Tickets
</span> </span>
<span *ngIf="withApprovalRequiredCount" class="text-left text-xs"> <span *ngIf="withApprovalRequiredCount" class="text-left text-xs">
@ -22,14 +21,14 @@ import { TicketStateMeta } from '../../../core/data-access/graphql/generated/gen
<span *ngIf="withTdNotCompanyCount" class="text-left text-xs"> <span *ngIf="withTdNotCompanyCount" class="text-left text-xs">
{{ ticketStateMeta.tdNotCompanyCount }} davon fehlender Transportschein {{ ticketStateMeta.tdNotCompanyCount }} davon fehlender Transportschein
</span> `, </span> `,
styles: [ styles: [
` `
:host { :host {
@apply flex flex-col items-center justify-center p-2; @apply flex flex-col items-center justify-center p-2;
} }
`, `,
], ],
imports: [NgIf, AsyncPipe, CurrencyPipe], imports: [NgIf, AsyncPipe, CurrencyPipe]
}) })
export class TicketLaneFooterComponent { export class TicketLaneFooterComponent {
@Input() ticketStateMeta!: TicketStateMeta; @Input() ticketStateMeta!: TicketStateMeta;

View File

@ -21,10 +21,9 @@ import {
} from '../../../core/data-access/graphql/generated/generated'; } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-ticket-lane-header-filter',
selector: 'dks-ticket-lane-header-filter', template: `
template: `
<ng-container [ngSwitch]="state"> <ng-container [ngSwitch]="state">
<button <button
mat-icon-button mat-icon-button
@ -100,17 +99,17 @@ import {
</mat-menu> </mat-menu>
</form> </form>
`, `,
styles: [], styles: [],
imports: [ imports: [
NgSwitch, NgSwitch,
NgSwitchCase, NgSwitchCase,
NgFor, NgFor,
FormsModule, FormsModule,
MatButtonModule, MatButtonModule,
MatIconModule, MatIconModule,
MatMenuModule, MatMenuModule,
MatCheckboxModule, MatCheckboxModule,
], ]
}) })
export class TicketLaneHeaderFilterComponent implements AfterViewInit { export class TicketLaneHeaderFilterComponent implements AfterViewInit {
@Input() state!: TicketValidationState; @Input() state!: TicketValidationState;

View File

@ -13,10 +13,9 @@ import {
import { TicketLaneHeaderFilterComponent } from './ticket-lane-header-filter.component'; import { TicketLaneHeaderFilterComponent } from './ticket-lane-header-filter.component';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-ticket-lane-header',
selector: 'dks-ticket-lane-header', template: `<div></div>
template: `<div></div>
<ng-container [ngSwitch]="state"> <ng-container [ngSwitch]="state">
<div *ngSwitchCase="TicketValidationState.Created">Touren angenommen</div> <div *ngSwitchCase="TicketValidationState.Created">Touren angenommen</div>
<div *ngSwitchCase="TicketValidationState.UserInteractionRequired"> <div *ngSwitchCase="TicketValidationState.UserInteractionRequired">
@ -34,14 +33,14 @@ import { TicketLaneHeaderFilterComponent } from './ticket-lane-header-filter.com
[state]="state" [state]="state"
(filterChange)="filterChanged($event)" (filterChange)="filterChanged($event)"
></dks-ticket-lane-header-filter>`, ></dks-ticket-lane-header-filter>`,
styles: [ styles: [
` `
:host { :host {
@apply flex items-center justify-between p-2 bg-gray-50; @apply flex items-center justify-between p-2 bg-gray-50;
} }
`, `,
], ],
imports: [NgSwitch, NgSwitchCase, TicketLaneHeaderFilterComponent], imports: [NgSwitch, NgSwitchCase, TicketLaneHeaderFilterComponent]
}) })
export class TicketLaneHeaderComponent { export class TicketLaneHeaderComponent {
@Input() state!: TicketValidationState; @Input() state!: TicketValidationState;

View File

@ -37,29 +37,28 @@ import { TicketLaneFooterComponent } from './ticket-lane-footer.component';
import { TicketLaneHeaderComponent } from './ticket-lane-header.component'; import { TicketLaneHeaderComponent } from './ticket-lane-header.component';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-ticket-lane',
selector: 'dks-ticket-lane', templateUrl: './ticket-lane.component.html',
templateUrl: './ticket-lane.component.html', styles: [
styles: [ `
`
:host { :host {
@apply rounded bg-gray-200 h-full w-full grid; @apply rounded bg-gray-200 h-full w-full grid;
grid-template-rows: auto 1fr auto; grid-template-rows: auto 1fr auto;
} }
`, `,
], ],
imports: [ imports: [
TicketLaneHeaderComponent, TicketLaneHeaderComponent,
TicketLaneFooterComponent, TicketLaneFooterComponent,
TicketItemComponent, TicketItemComponent,
TicketViewComponent, TicketViewComponent,
NgIf, NgIf,
NgFor, NgFor,
AsyncPipe, AsyncPipe,
RoleDirective, RoleDirective,
ScrollingModule, ScrollingModule,
], ]
}) })
export class TicketLaneComponent { export class TicketLaneComponent {
private dialog = inject(DialogService); private dialog = inject(DialogService);

View File

@ -20,10 +20,9 @@ import {
} from '../../../core/data-access/graphql/generated/generated'; } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-ticket-documents-missing',
selector: 'dks-ticket-documents-missing', template: `<div class="flex items-center p-3">
template: `<div class="flex items-center p-3">
<form #form="ngForm" class="flex flex-col w-full"> <form #form="ngForm" class="flex flex-col w-full">
<div class="flex justify-end pt-4"> <div class="flex justify-end pt-4">
<button mat-stroked-button class="mr-2" (click)="form.resetForm()"> <button mat-stroked-button class="mr-2" (click)="form.resetForm()">
@ -54,15 +53,15 @@ import {
</div> </div>
</form> </form>
</div>`, </div>`,
imports: [ imports: [
NgIf, NgIf,
MatButtonModule, MatButtonModule,
MatIconModule, MatIconModule,
MatFormFieldModule, MatFormFieldModule,
MatRadioModule, MatRadioModule,
MatCheckboxModule, MatCheckboxModule,
FormsModule, FormsModule,
], ]
}) })
export class TicketDocumentsMissingComponent { export class TicketDocumentsMissingComponent {
@Input() ticket!: Ticket & { tours: Tour[] }; @Input() ticket!: Ticket & { tours: Tour[] };

View File

@ -15,10 +15,9 @@ import {
} from '../../../core/data-access/graphql/generated/generated'; } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-ticket-overview',
selector: 'dks-ticket-overview', template: `<div class="grid grid-cols-4">
template: `<div class="grid grid-cols-4">
<mat-list class="col-span-2" role="list"> <mat-list class="col-span-2" role="list">
<div mat-subheader class="text-sm">Ticket Informationen</div> <div mat-subheader class="text-sm">Ticket Informationen</div>
<mat-list-item role="listitem"> <mat-list-item role="listitem">
@ -84,15 +83,15 @@ import {
</mat-list-item> </mat-list-item>
</mat-list> </mat-list>
</div>`, </div>`,
imports: [ imports: [
MatListModule, MatListModule,
MatIconModule, MatIconModule,
NgClass, NgClass,
NgIf, NgIf,
NgForOf, NgForOf,
NgSwitch, NgSwitch,
NgSwitchCase, NgSwitchCase,
], ]
}) })
export class TicketOverviewComponent { export class TicketOverviewComponent {
@Input() ticket!: Ticket & { tours: Tour[] }; @Input() ticket!: Ticket & { tours: Tour[] };

View File

@ -19,10 +19,9 @@ import {
} from '../../../core/data-access/graphql/generated/generated'; } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-ticket-td-uncertain',
selector: 'dks-ticket-td-uncertain', template: `<div class="flex flex-col p-3">
template: `<div class="flex flex-col p-3">
<form #form="ngForm" class="flex flex-col w-full"> <form #form="ngForm" class="flex flex-col w-full">
<div class="flex justify-end pt-4"> <div class="flex justify-end pt-4">
<button mat-stroked-button class="mr-2" (click)="form.resetForm()"> <button mat-stroked-button class="mr-2" (click)="form.resetForm()">
@ -52,14 +51,14 @@ import {
</div> </div>
</form> </form>
</div>`, </div>`,
imports: [ imports: [
NgIf, NgIf,
MatButtonModule, MatButtonModule,
MatIconModule, MatIconModule,
MatFormFieldModule, MatFormFieldModule,
MatRadioModule, MatRadioModule,
FormsModule, FormsModule,
], ]
}) })
export class TicketTdUncertainComponent { export class TicketTdUncertainComponent {
@Input() ticket!: Ticket & { tours: Tour[] }; @Input() ticket!: Ticket & { tours: Tour[] };

View File

@ -16,10 +16,9 @@ import {
} from '../../../core/data-access/graphql/generated/generated'; } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-ticket-tours',
selector: 'dks-ticket-tours', template: ` <div class="max-h-96 overflow-y-auto">
template: ` <div class="max-h-96 overflow-y-auto">
<table mat-table [dataSource]="dataSource" class="w-full"> <table mat-table [dataSource]="dataSource" class="w-full">
<ng-container matColumnDef="select"> <ng-container matColumnDef="select">
<th mat-header-cell *matHeaderCellDef> <th mat-header-cell *matHeaderCellDef>
@ -79,15 +78,15 @@ import {
></tr> ></tr>
</table> </table>
</div>`, </div>`,
imports: [ imports: [
NgIf, NgIf,
NgClass, NgClass,
DatePipe, DatePipe,
RoleDirective, RoleDirective,
MatButtonModule, MatButtonModule,
MatCheckboxModule, MatCheckboxModule,
MatTableModule, MatTableModule,
], ]
}) })
export class TicketToursComponent implements OnInit { export class TicketToursComponent implements OnInit {
@Input() ticket!: Ticket & { tours: Tour[] }; @Input() ticket!: Ticket & { tours: Tour[] };

View File

@ -22,10 +22,9 @@ import {
} from '../../../core/data-access/graphql/generated/generated'; } from '../../../core/data-access/graphql/generated/generated';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-ticket-user-action-required',
selector: 'dks-ticket-user-action-required', template: `<div class="flex flex-col p-3">
template: `<div class="flex flex-col p-3">
<form #form="ngForm" class="flex flex-col w-full"> <form #form="ngForm" class="flex flex-col w-full">
<div class="flex justify-end pt-4"> <div class="flex justify-end pt-4">
<button mat-stroked-button class="mr-2" (click)="form.resetForm()"> <button mat-stroked-button class="mr-2" (click)="form.resetForm()">
@ -100,15 +99,15 @@ import {
</div> </div>
</form> </form>
</div>`, </div>`,
imports: [ imports: [
NgIf, NgIf,
MatButtonModule, MatButtonModule,
MatIconModule, MatIconModule,
MatFormFieldModule, MatFormFieldModule,
MatRadioModule, MatRadioModule,
MatInputModule, MatInputModule,
FormsModule, FormsModule,
], ]
}) })
export class TicketUserActionRequiredComponent implements OnInit { export class TicketUserActionRequiredComponent implements OnInit {
@Input() ticket!: Ticket & { tours: Tour[] }; @Input() ticket!: Ticket & { tours: Tour[] };

View File

@ -19,22 +19,21 @@ import { TicketToursComponent } from './ticket-tours.component';
import { TicketUserActionRequiredComponent } from './ticket-user-action-required.component'; import { TicketUserActionRequiredComponent } from './ticket-user-action-required.component';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-ticket-view',
selector: 'dks-ticket-view', templateUrl: './ticket-view.component.html',
templateUrl: './ticket-view.component.html', imports: [
imports: [ MatTabsModule,
MatTabsModule, MatIconModule,
MatIconModule, TicketOverviewComponent,
TicketOverviewComponent, TicketToursComponent,
TicketToursComponent, TicketUserActionRequiredComponent,
TicketUserActionRequiredComponent, TicketTdUncertainComponent,
TicketTdUncertainComponent, TicketDocumentsMissingComponent,
TicketDocumentsMissingComponent, NgIf,
NgIf, NgSwitch,
NgSwitch, NgSwitchCase,
NgSwitchCase, ]
],
}) })
export class TicketViewComponent { export class TicketViewComponent {
private ticketsService = inject(TicketsService); private ticketsService = inject(TicketsService);

View File

@ -8,10 +8,9 @@ import { TicketLaneComponent } from './ticket-lane/ticket-lane.component';
import { TicketsSearchDialogComponent } from './tickets-search-dialog/tickets-search-dialog.component'; import { TicketsSearchDialogComponent } from './tickets-search-dialog/tickets-search-dialog.component';
@Component({ @Component({
standalone: true, changeDetection: ChangeDetectionStrategy.OnPush,
changeDetection: ChangeDetectionStrategy.OnPush, selector: 'dks-tickets-page',
selector: 'dks-tickets-page', template: `<section class="h-full p-6 grid grid-cols-1 md:grid-cols-4 gap-6">
template: `<section class="h-full p-6 grid grid-cols-1 md:grid-cols-4 gap-6">
<div class="col-span-1 md:col-span-4 flex justify-end items-center"> <div class="col-span-1 md:col-span-4 flex justify-end items-center">
<button mat-icon-button (click)="showSearchDialog()"> <button mat-icon-button (click)="showSearchDialog()">
<mat-icon>search</mat-icon> <mat-icon>search</mat-icon>
@ -39,8 +38,8 @@ import { TicketsSearchDialogComponent } from './tickets-search-dialog/tickets-se
[ticketState]="TicketState.Archived" [ticketState]="TicketState.Archived"
></dks-ticket-lane> --> ></dks-ticket-lane> -->
</section>`, </section>`,
styles: [ styles: [
` `
:host { :host {
display: block; display: block;
height: calc(100% - 64px); height: calc(100% - 64px);
@ -49,14 +48,14 @@ import { TicketsSearchDialogComponent } from './tickets-search-dialog/tickets-se
grid-template-rows: 2rem 1fr; grid-template-rows: 2rem 1fr;
} }
`, `,
], ],
imports: [ imports: [
TicketLaneComponent, TicketLaneComponent,
TicketsSearchDialogComponent, TicketsSearchDialogComponent,
MatButtonModule, MatButtonModule,
MatIconModule, MatIconModule,
RoleDirective, RoleDirective,
], ]
}) })
export class TicketsPageComponent { export class TicketsPageComponent {
private dialog = inject(DialogService); private dialog = inject(DialogService);

View File

@ -19,8 +19,7 @@ import { TicketViewComponent } from '../ticket-view/ticket-view.component';
import { TicketsService } from '../tickets.service'; import { TicketsService } from '../tickets.service';
@Component({ @Component({
standalone: true, template: `<div class="flex flex-col items-center justify-start p-4">
template: `<div class="flex flex-col items-center justify-start p-4">
<div class="text-lg font-bold pb-2">Ticket suchen</div> <div class="text-lg font-bold pb-2">Ticket suchen</div>
<hr /> <hr />
<mat-form-field class="w-full"> <mat-form-field class="w-full">
@ -57,16 +56,16 @@ import { TicketsService } from '../tickets.service';
</div> </div>
</div> </div>
</div>`, </div>`,
imports: [ imports: [
TicketViewComponent, TicketViewComponent,
MatFormFieldModule, MatFormFieldModule,
MatInputModule, MatInputModule,
ReactiveFormsModule, ReactiveFormsModule,
AsyncPipe, AsyncPipe,
NgFor, NgFor,
NgIf, NgIf,
], ],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class TicketsSearchDialogComponent { export class TicketsSearchDialogComponent {
private ticketsService = inject(TicketsService); private ticketsService = inject(TicketsService);

View File

@ -20,8 +20,7 @@
"ES2022", "ES2022",
"dom", "dom",
"esnext.asynciterable" "esnext.asynciterable"
], ]
"allowSyntheticDefaultImports": true
}, },
"angularCompilerOptions": { "angularCompilerOptions": {
"enableI18nLegacyMessageIdFormat": false, "enableI18nLegacyMessageIdFormat": false,