@xiriframework/xiri-ng 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/xiriframework-xiri-ng.mjs +499 -187
- package/fesm2022/xiriframework-xiri-ng.mjs.map +1 -1
- package/package.json +1 -1
- package/skills/xiri-ng-expert/SKILL.md +29 -2
- package/skills/xiri-ng-expert/references/components.md +13 -1
- package/skills/xiri-ng-expert/references/form-fields.md +75 -0
- package/types/xiriframework-xiri-ng.d.ts +27 -0
- package/types/xiriframework-xiri-ng.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xiriframework-xiri-ng.mjs","sources":["../../../projects/xiri-ng/src/lib/pipes/safehtml.pipe.ts","../../../projects/xiri-ng/src/lib/pipes/url.pipe.ts","../../../projects/xiri-ng/src/lib/layout/cols.directive.ts","../../../projects/xiri-ng/src/lib/formfields/file/file.component.ts","../../../projects/xiri-ng/src/lib/formfields/file/file.component.html","../../../projects/xiri-ng/src/lib/formfields/timelimit/timelimit.component.ts","../../../projects/xiri-ng/src/lib/formfields/timelimit/timelimit.component.html","../../../projects/xiri-ng/src/lib/formfields/volume/volume.component.ts","../../../projects/xiri-ng/src/lib/formfields/volume/volume.component.html","../../../projects/xiri-ng/src/lib/services/locale.service.ts","../../../projects/xiri-ng/src/lib/formfields/helper/fieldmain.ts","../../../projects/xiri-ng/src/lib/formfields/datetimerange/datetimerange.component.ts","../../../projects/xiri-ng/src/lib/formfields/datetimerange/datetimerange.component.html","../../../projects/xiri-ng/src/lib/formfields/daterange/daterange.component.ts","../../../projects/xiri-ng/src/lib/formfields/daterange/daterange.component.html","../../../projects/xiri-ng/src/lib/formfields/date/date.component.ts","../../../projects/xiri-ng/src/lib/formfields/date/date.component.html","../../../projects/xiri-ng/src/lib/formfields/yearmonth/yearmonth.component.ts","../../../projects/xiri-ng/src/lib/formfields/yearmonth/yearmonth.component.html","../../../projects/xiri-ng/src/lib/services/snackbar.service.ts","../../../projects/xiri-ng/src/lib/services/data.service.ts","../../../projects/xiri-ng/src/lib/search/search.component.ts","../../../projects/xiri-ng/src/lib/search/search.component.html","../../../projects/xiri-ng/src/lib/formfields/treeselect/treeselect.component.ts","../../../projects/xiri-ng/src/lib/formfields/treeselect/treeselect.component.html","../../../projects/xiri-ng/src/lib/formfields/select/select.directive.ts","../../../projects/xiri-ng/src/lib/formfields/chips/chips.component.ts","../../../projects/xiri-ng/src/lib/formfields/chips/chips.component.html","../../../projects/xiri-ng/src/lib/formfields/form-fields.component.ts","../../../projects/xiri-ng/src/lib/formfields/form-fields.component.html","../../../projects/xiri-ng/src/lib/raw-table/xiri-raw-table.component.ts","../../../projects/xiri-ng/src/lib/raw-table/xiri-raw-table.component.html","../../../projects/xiri-ng/src/lib/buttonstyle/buttonstyle.component.ts","../../../projects/xiri-ng/src/lib/buttonstyle/buttonstyle.component.html","../../../projects/xiri-ng/src/lib/done/done.component.ts","../../../projects/xiri-ng/src/lib/done/done.component.html","../../../projects/xiri-ng/src/lib/error/error.component.ts","../../../projects/xiri-ng/src/lib/error/error.component.html","../../../projects/xiri-ng/src/lib/services/download.service.ts","../../../projects/xiri-ng/src/lib/services/error.util.ts","../../../projects/xiri-ng/src/lib/dialog/dialog.component.ts","../../../projects/xiri-ng/src/lib/dialog/dialog.component.html","../../../projects/xiri-ng/src/lib/services/response-handler.service.ts","../../../projects/xiri-ng/src/lib/button/button.component.ts","../../../projects/xiri-ng/src/lib/button/button.component.html","../../../projects/xiri-ng/src/lib/table/inline-edit.service.ts","../../../projects/xiri-ng/src/lib/services/storage-base.ts","../../../projects/xiri-ng/src/lib/services/localStorage.service.ts","../../../projects/xiri-ng/src/lib/table/tree.service.ts","../../../projects/xiri-ng/src/lib/buttonline/buttonline.component.ts","../../../projects/xiri-ng/src/lib/buttonline/buttonline.component.html","../../../projects/xiri-ng/src/lib/services/sessionStorage.service.ts","../../../projects/xiri-ng/src/lib/empty-state/empty-state.component.ts","../../../projects/xiri-ng/src/lib/empty-state/empty-state.component.html","../../../projects/xiri-ng/src/lib/table/table.component.ts","../../../projects/xiri-ng/src/lib/table/table.component.html","../../../projects/xiri-ng/src/lib/services/form.service.ts","../../../projects/xiri-ng/src/lib/form/form.component.ts","../../../projects/xiri-ng/src/lib/form/form.component.html","../../../projects/xiri-ng/src/lib/sidepanel/sidepanel-ref.ts","../../../projects/xiri-ng/src/lib/progress/progress.component.ts","../../../projects/xiri-ng/src/lib/progress/progress.component.html","../../../projects/xiri-ng/src/lib/infopoint/infopoint.component.ts","../../../projects/xiri-ng/src/lib/infopoint/infopoint.component.html","../../../projects/xiri-ng/src/lib/list/list.component.ts","../../../projects/xiri-ng/src/lib/list/list.component.html","../../../projects/xiri-ng/src/lib/header/header.component.ts","../../../projects/xiri-ng/src/lib/header/header.component.html","../../../projects/xiri-ng/src/lib/stepper/stepper.component.ts","../../../projects/xiri-ng/src/lib/stepper/stepper.component.html","../../../projects/xiri-ng/src/lib/query/query.component.ts","../../../projects/xiri-ng/src/lib/query/query.component.html","../../../projects/xiri-ng/src/lib/links/links.component.ts","../../../projects/xiri-ng/src/lib/links/links.component.html","../../../projects/xiri-ng/src/lib/cardlink/cardlink.component.ts","../../../projects/xiri-ng/src/lib/cardlink/cardlink.component.html","../../../projects/xiri-ng/src/lib/skeleton/skeleton.component.ts","../../../projects/xiri-ng/src/lib/skeleton/skeleton.component.html","../../../projects/xiri-ng/src/lib/card/card.component.ts","../../../projects/xiri-ng/src/lib/card/card.component.html","../../../projects/xiri-ng/src/lib/tabs/tabs.component.ts","../../../projects/xiri-ng/src/lib/tabs/tabs.component.html","../../../projects/xiri-ng/src/lib/expansion/expansion.component.ts","../../../projects/xiri-ng/src/lib/expansion/expansion.component.html","../../../projects/xiri-ng/src/lib/stat/stat.component.ts","../../../projects/xiri-ng/src/lib/stat/stat.component.html","../../../projects/xiri-ng/src/lib/section/section.component.ts","../../../projects/xiri-ng/src/lib/section/section.component.html","../../../projects/xiri-ng/src/lib/multi-stat/multi-stat.component.ts","../../../projects/xiri-ng/src/lib/multi-stat/multi-stat.component.html","../../../projects/xiri-ng/src/lib/status/status.component.ts","../../../projects/xiri-ng/src/lib/status/status.component.html","../../../projects/xiri-ng/src/lib/callout/callout.component.ts","../../../projects/xiri-ng/src/lib/callout/callout.component.html","../../../projects/xiri-ng/src/lib/dyncomponent/dyncomponent.component.ts","../../../projects/xiri-ng/src/lib/dyncomponent/dyncomponent.component.html","../../../projects/xiri-ng/src/lib/sidepanel/sidepanel.component.ts","../../../projects/xiri-ng/src/lib/sidepanel/sidepanel.service.ts","../../../projects/xiri-ng/src/lib/alert/alert.component.ts","../../../projects/xiri-ng/src/lib/alert/alert.component.html","../../../projects/xiri-ng/src/lib/multiprogress/multiprogress.component.ts","../../../projects/xiri-ng/src/lib/multiprogress/multiprogress.component.html","../../../projects/xiri-ng/src/lib/imagetext/imagetext.component.ts","../../../projects/xiri-ng/src/lib/imagetext/imagetext.component.html","../../../projects/xiri-ng/src/lib/sidenav/sidenav.component.ts","../../../projects/xiri-ng/src/lib/sidenav/sidenav.component.html","../../../projects/xiri-ng/src/lib/breadcrumb/breadcrumb.component.ts","../../../projects/xiri-ng/src/lib/breadcrumb/breadcrumb.component.html","../../../projects/xiri-ng/src/lib/timeline/timeline.component.ts","../../../projects/xiri-ng/src/lib/timeline/timeline.component.html","../../../projects/xiri-ng/src/lib/echarts/echarts-host.component.ts","../../../projects/xiri-ng/src/lib/echarts/echarts-host.component.html","../../../projects/xiri-ng/src/lib/echarts/color.ts","../../../projects/xiri-ng/src/lib/echarts/tooltip.ts","../../../projects/xiri-ng/src/lib/barchart/barchart.component.ts","../../../projects/xiri-ng/src/lib/linechart/linechart.component.ts","../../../projects/xiri-ng/src/lib/piechart/piechart.component.ts","../../../projects/xiri-ng/src/lib/gaugechart/gaugechart.component.ts","../../../projects/xiri-ng/src/lib/bulletchart/bulletchart.component.ts","../../../projects/xiri-ng/src/lib/heatmap/heatmap.component.ts","../../../projects/xiri-ng/src/lib/calendar/calendar.component.ts","../../../projects/xiri-ng/src/lib/tree/tree.component.ts","../../../projects/xiri-ng/src/lib/sankey/sankey.component.ts","../../../projects/xiri-ng/src/lib/gantt/gantt.component.ts","../../../projects/xiri-ng/src/lib/echarts/params.ts","../../../projects/xiri-ng/src/lib/page-header/page-header.component.ts","../../../projects/xiri-ng/src/lib/page-header/page-header.component.html","../../../projects/xiri-ng/src/lib/divider/divider.component.ts","../../../projects/xiri-ng/src/lib/divider/divider.component.html","../../../projects/xiri-ng/src/lib/stat-grid/stat-grid.component.ts","../../../projects/xiri-ng/src/lib/stat-grid/stat-grid.component.html","../../../projects/xiri-ng/src/lib/toolbar/toolbar.component.ts","../../../projects/xiri-ng/src/lib/toolbar/toolbar.component.html","../../../projects/xiri-ng/src/lib/description-list/description-list.component.ts","../../../projects/xiri-ng/src/lib/description-list/description-list.component.html","../../../projects/xiri-ng/src/lib/services/theme.service.ts","../../../projects/xiri-ng/src/lib/provider.ts","../../../projects/xiri-ng/src/public-api.ts","../../../projects/xiri-ng/src/xiriframework-xiri-ng.ts"],"sourcesContent":["import { DomSanitizer } from '@angular/platform-browser';\nimport { inject, Pipe, PipeTransform } from '@angular/core';\n\n\n@Pipe( {\n\t name: 'safeHtml'\n } )\nexport class SafehtmlPipe implements PipeTransform {\n\t\n\tprivate sanitizer: DomSanitizer = inject( DomSanitizer );\n\t\n\ttransform( style: string ): string {\n\t\treturn this.sanitizer.bypassSecurityTrustHtml( style ) as string;\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DefaultUrlSerializer, Params } from '@angular/router';\n\nexport interface XiriUrl {\n\tpath: string;\n\tqueryParams: Params;\n}\n\n// Trennt einen URL-String in Pfad und Query-Params. Der Pfad wird als String an\n// [routerLink] gebunden, damit RouterLink relative Links (z. B. \"Test/Query/Page\")\n// weiterhin relativ zur ActivatedRoute auflöst (Prefix bleibt erhalten). Ein an\n// [routerLink] gebundener UrlTree würde dagegen IMMER absolut navigieren und den\n// Prefix verlieren. Die Query kommt separat über [queryParams] rein — sonst würde\n// ein \"?\" im Pfad-String von createUrlTree als Segment percent-encodiert → 404.\nconst serializer = new DefaultUrlSerializer();\n\n@Pipe( { name: 'xiriUrl' } )\nexport class XiriUrlPipe implements PipeTransform {\n\n\ttransform( url: string | null | undefined ): XiriUrl | null {\n\t\tif ( !url )\n\t\t\treturn null;\n\t\tconst tree = serializer.parse( url );\n\t\treturn { path: url.split( /[?#]/ )[ 0 ], queryParams: tree.queryParams };\n\t}\n}\n","import { Directive, computed, input } from '@angular/core';\n\nexport type XiriCols = number | { sm?: number; md?: number; lg?: number; xl?: number };\n\nexport function colsToClasses(cols: XiriCols | undefined): string {\n\tif (cols === undefined) return 'xcol';\n\tif (typeof cols === 'number') return `xcol xcol-md-${ cols }`;\n\tconst parts = ['xcol'];\n\tfor (const bp of ['sm', 'md', 'lg', 'xl'] as const)\n\t\tif (cols[bp] !== undefined) parts.push(`xcol-${ bp }-${ cols[bp] }`);\n\treturn parts.join(' ');\n}\n\n@Directive({\n\tselector: '[xiriCols]',\n\thost: { '[class]': 'classes()' }\n})\nexport class XiriColsDirective {\n\txiriCols = input<XiriCols>();\n\tclasses = computed(() => colsToClasses(this.xiriCols()));\n}\n","import { ChangeDetectorRef, Component, ElementRef, inject, Input, OnDestroy } from '@angular/core';\nimport {\n\tMatError,\n\tMatFormField,\n\tMatFormFieldControl,\n\tMatHint,\n\tMatLabel,\n\tMatSuffix\n} from \"@angular/material/form-field\";\nimport {\n\tControlValueAccessor,\n\tFormControl,\n\tFormGroup,\n\tFormsModule,\n\tNgControl,\n\tReactiveFormsModule\n} from \"@angular/forms\";\nimport { Subject } from \"rxjs\";\nimport { FocusMonitor } from \"@angular/cdk/a11y\";\nimport { XiriFormField } from \"../field.interface\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatInput } from '@angular/material/input';\n\ninterface FileForm {\n\tfiles: FormControl<File[] | null>\n\ttext: FormControl<string | null>\n}\n\ninterface FileData {\n\tfile: File\n\tname: string;\n\tdata: string;\n}\n\ninterface FileValue {\n\tname: string;\n\tdata: string;\n}\n\n@Component( {\n\t selector: 'xiri-file',\n\t templateUrl: './file.component.html',\n\t styleUrls: [ './file.component.scss' ],\n\t host: {\n\t\t '[id]': 'id',\n\t\t '[attr.aria-describedby]': 'describedBy'\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriFileComponent\n\t } ],\n\t imports: [\n\t\t MatFormField,\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatLabel,\n\t\t MatInput,\n\t\t MatIconButton,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatHint,\n\t\t MatError,\n\t ]\n } )\nexport class XiriFileComponent implements ControlValueAccessor, MatFormFieldControl<FileValue[] | null | undefined>, OnDestroy {\n\tprivate focusMonitor = inject( FocusMonitor );\n\tngControl = inject( NgControl, { optional: true, self: true } );\n\tprivate _elementRef = inject<ElementRef<HTMLElement>>( ElementRef );\n\tprivate cdr = inject( ChangeDetectorRef );\n\t\n\t\n\tstatic nextId = 0;\n\tid = `xiri-file-${ XiriFileComponent.nextId++ }`;\n\tdescribedBy = '';\n\t\n\tparts: FormGroup<FileForm>;\n\tstateChanges = new Subject<void>();\n\tfocused = false;\n\tcontrolType = 'xiri-file';\n\t\n\treadonly placeholder!: string;\n\tpublic required = false;\n\tpublic disabled = false;\n\tshouldLabelFloat = true;\n\n\tprivate _field!: XiriFormField;\n\tcurrentFiles: FileData[] = [];\n\t\n\tconstructor() {\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\t\t\n\t\tthis.parts = new FormGroup<FileForm>( {\n\t\t\t files: new FormControl<File[] | null>( null ),\n\t\t\t text: new FormControl<string | null>( null )\n\t\t } );\n\t\t\n\t\tthis.focusMonitor.monitor( this._elementRef, true ).subscribe( origin => {\n\t\t\tthis.ngControl?.control?.markAsTouched();\n\t\t\tthis.focused = !!origin;\n\t\t\tthis.cdr.markForCheck();\n\t\t} );\n\t}\n\t\n\tonChange: ( value: FileValue[] | null | undefined ) => void = () => { /* intentionally empty */ };\n\tonTouched = () => { /* intentionally empty */ };\n\t\n\tngOnDestroy() {\n\t\tthis.stateChanges.complete();\n\t\tthis.focusMonitor.stopMonitoring( this._elementRef );\n\t}\n\t\n\t@Input()\n\tget value(): FileValue[] | null | undefined {\n\n\t\tif ( this.errorState )\n\t\t\treturn undefined;\n\t\tif ( this.currentFiles.length == 0 )\n\t\t\treturn null;\n\n\t\treturn this.currentFiles.map( ( file ) => {\n\t\t\treturn {\n\t\t\t\tname: file.name,\n\t\t\t\tdata: file.data\n\t\t\t};\n\t\t} );\n\t}\n\n\tset value( input: FileValue[] | null | undefined ) {\n\n\t\tif ( input === null || input === undefined )\n\t\t\treturn;\n\n\t\t// console.log( 'xiriFile input', input );\n\t\t// this.onChange( this.value );\n\t\t// this.stateChanges.next();\n\t}\n\t\n\t\n\t@Input()\n\tget field(): XiriFormField {\n\t\treturn this._field;\n\t}\n\t\n\tset field( value: XiriFormField ) {\n\t\t\n\t\tthis._field = value;\n\n\t\tthis.required = value.required ?? false;\n\t\tthis.disabled = value.disabled ?? false;\n\t\tif ( this.disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\t\n\tget errorState(): boolean {\n\t\treturn this.parts.invalid && !!this.ngControl?.touched;\n\t}\n\t\n\tget empty() {\n\t\treturn this.value === null;\n\t}\n\t\n\twriteValue( value: FileValue[] | null | undefined ): void {\n\t\tthis.value = value;\n\t}\n\n\tregisterOnChange( fn: ( value: FileValue[] | null | undefined ) => void ): void {\n\t\tthis.onChange = fn;\n\t}\n\n\tregisterOnTouched( fn: () => void ): void {\n\t\tthis.onTouched = fn;\n\t}\n\n\tsetDisabledState( isDisabled: boolean ): void {\n\t\tthis.disabled = isDisabled;\n\t}\n\n\tsetDescribedByIds( ids: string[] ) {\n\t\tthis.describedBy = ids.join( ' ' );\n\t}\n\n\tonContainerClick(): void { /* intentionally empty */ }\n\t\n\tfileChange( event: Event ) {\n\t\t\n\t\tconst element = event.currentTarget as HTMLInputElement;\n\t\tconst fileList: FileList | null = element.files;\n\t\t\n\t\tif ( fileList === null || fileList.length === 0 || fileList.length > 100 )\n\t\t\treturn;\n\t\t\n\t\tconst fieldFiles = this.parts.get( 'files' );\n\t\tconst fieldText = this.parts.get( 'text' );\n\t\tconst files = [];\n\n\t\tfor ( let i = 0; i < fileList.length; i++ ) {\n\t\t\tconst file = fileList.item( i );\n\t\t\tif ( file === null || file.size > ( this._field.max ?? Infinity ) ) {\n\t\t\t\tconsole.log( 'file too large or null', file, this._field );\n\t\t\t\tthis.currentFiles = [];\n\t\t\t\tfieldFiles?.setValue( null );\n\t\t\t\tfieldText?.setValue( null );\n\t\t\t\t\n\t\t\t\tthis.onChange( this.value );\n\t\t\t\tthis.stateChanges.next();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tconst reader = new FileReader();\n\t\t\t\n\t\t\treader.addEventListener( \"load\", () => {\n\t\t\t\tthis.currentFiles.push( {\n\t\t\t\t\t file: file,\n\t\t\t\t\t name: file.name,\n\t\t\t\t\t data: reader.result as string\n\t\t\t\t } );\n\n\t\t\t\tthis.onChange( this.value );\n\t\t\t\tthis.stateChanges.next();\n\t\t\t\tthis.cdr.markForCheck();\n\t\t\t}, false );\n\t\t\t\n\t\t\treader.readAsDataURL( file );\n\t\t\tfiles.push( file );\n\t\t}\n\t\t\n\t\tfieldFiles?.setValue( files );\n\t\tfieldText?.setValue( files.map( ( file ) => file.name ).join( ', ' ) );\n\t}\n\t\n\tpublic getErrorMessage(): string {\n\t\t\n\t\tconst errors = this.parts.get( 'text' )?.errors;\n\n\t\tif ( errors?.required )\n\t\t\treturn 'required';\n\t\t\n\t\tconsole.log( 'unknown error file', errors );\n\t\t\n\t\treturn 'error';\n\t}\n\t\n}\n","<mat-form-field [formGroup]=\"parts\" floatLabel=\"auto\" class=\"fileselect\" (click)=\"fileInput.click()\">\n\t<mat-label>{{ field.name }}</mat-label>\n\n\t<input matInput formControlName=\"text\" type=\"text\" [required]=\"required\" readonly>\n\t<button mat-icon-button matSuffix class=\"form-field-button\" aria-label=\"Datei auswählen\">\n\t\t<mat-icon>file_upload</mat-icon>\n\t</button>\n\n\t<input hidden type=\"file\" [accept]=\"field.accept\" [multiple]=\"field.multiple\" (change)=\"fileChange($event)\" #fileInput>\n\n\t@if (field.hint) {\n\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t}\n\t@if (errorState) {\n\t\t<mat-error>{{ getErrorMessage() }}</mat-error>\n\t}\n</mat-form-field>","import { ChangeDetectorRef, Component, ElementRef, inject, Input, OnDestroy, OnInit } from '@angular/core';\nimport { MatFormField, MatFormFieldControl, MatLabel } from \"@angular/material/form-field\";\nimport {\n\tAbstractControl,\n\tControlValueAccessor,\n\tFormControl,\n\tFormGroup,\n\tFormsModule,\n\tNgControl,\n\tReactiveFormsModule,\n\tValidationErrors\n} from \"@angular/forms\";\nimport { Subject } from \"rxjs\";\nimport { FocusMonitor } from \"@angular/cdk/a11y\";\nimport { coerceBooleanProperty } from \"@angular/cdk/coercion\";\nimport { KeyValuePipe } from '@angular/common';\nimport { MatOption } from '@angular/material/core';\nimport { MatSelect } from '@angular/material/select';\nimport { MatCheckbox } from '@angular/material/checkbox';\n\ninterface TimelimitForm {\n\tcheck: FormControl<boolean>\n\twd0: FormControl<boolean>\n\twd1: FormControl<boolean>\n\twd2: FormControl<boolean>\n\twd3: FormControl<boolean>\n\twd4: FormControl<boolean>\n\twd5: FormControl<boolean>\n\twd6: FormControl<boolean>\n\tfromhour: FormControl<number>\n\tfrommin: FormControl<number>\n\ttohour: FormControl<number>\n\ttomin: FormControl<number>\n\tinout: FormControl<boolean>\n}\n\ninterface TimelimitValue {\n\tcheck: boolean;\n\twd: boolean[];\n\tfromhour: number;\n\tfrommin: number;\n\ttohour: number;\n\ttomin: number;\n\tin: boolean;\n}\n\n\n@Component( {\n\t selector: 'xiri-timelimit',\n\t templateUrl: './timelimit.component.html',\n\t styleUrls: [ './timelimit.component.scss' ],\n\t host: {\n\t\t '[id]': 'id',\n\t\t '[attr.aria-describedby]': 'describedBy'\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriTimelimitComponent\n\t } ],\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatCheckbox,\n\t\t MatLabel,\n\t\t MatFormField,\n\t\t MatSelect,\n\t\t MatOption,\n\t\t KeyValuePipe,\n\t ]\n } )\nexport class XiriTimelimitComponent implements ControlValueAccessor, MatFormFieldControl<TimelimitValue>, OnInit, OnDestroy {\n\tprivate focusMonitor = inject( FocusMonitor );\n\tngControl = inject( NgControl, { optional: true, self: true } );\n\tprivate _elementRef = inject<ElementRef<HTMLElement>>( ElementRef );\n\tprivate cdr = inject( ChangeDetectorRef );\n\t\n\t\n\tstatic nextId = 0;\n\tid = `xiri-timelimit-${ XiriTimelimitComponent.nextId++ }`;\n\tdescribedBy = '';\n\t\n\treadonly autofilled: boolean = false;\n\t\n\terrorState = false;\n\tparts: FormGroup<TimelimitForm>;\n\tstateChanges = new Subject<void>();\n\tfocused = false;\n\tcontrolType = 'xiri-timelimit';\n\t\n\tprivate _placeholder = '';\n\tprivate _required = true;\n\tprivate _disabled = false;\n\tshouldLabelFloat = true;\n\t\n\thours = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09',\n\t '10', '11', '12', '13', '14', '15', '16', '17', '18', '19',\n\t '20', '21', '22', '23', '24' ];\n\tminutes = {\n\t\t0: '00',\n\t\t5: '05',\n\t\t10: '10',\n\t\t15: '15',\n\t\t20: '20',\n\t\t25: '25',\n\t\t30: '30',\n\t\t35: '35',\n\t\t40: '40',\n\t\t45: '45',\n\t\t50: '50',\n\t\t55: '55'\n\t};\n\t\n\tconstructor() {\n\t\tif ( this.ngControl != null ) {\n\t\t\tthis.ngControl.valueAccessor = this;\n\t\t}\n\t\t\n\t\tthis.parts = new FormGroup<TimelimitForm>( {\n\t\t\t check: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd0: new FormControl( true, { nonNullable: true } ),\n\t\t\t wd1: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd2: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd3: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd4: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd5: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd6: new FormControl( false, { nonNullable: true } ),\n\t\t\t fromhour: new FormControl( 0, { nonNullable: true } ),\n\t\t\t frommin: new FormControl( 0, { nonNullable: true } ),\n\t\t\t tohour: new FormControl( 24, { nonNullable: true } ),\n\t\t\t tomin: new FormControl( 0, { nonNullable: true } ),\n\t\t\t inout: new FormControl( true, { nonNullable: true } ),\n\t\t } );\n\t\t\n\t\tthis.focusMonitor.monitor( this._elementRef.nativeElement, true ).subscribe( origin => {\n\n\t\t\tif ( this.focused && !origin ) {\n\t\t\t\tthis.onTouched();\n\t\t\t}\n\t\t\tthis.focused = !!origin;\n\t\t\tif ( this.focused )\n\t\t\t\tthis.ngControl?.control?.markAllAsTouched();\n\n\t\t\tthis.onChange( this.value );\n\t\t\tthis.stateChanges.next();\n\t\t\tthis.cdr.markForCheck();\n\t\t} );\n\t}\n\t\n\tonChange: ( value: TimelimitValue ) => void = () => { /* intentionally empty */ };\n\tonTouched = () => { /* intentionally empty */ };\n\t\n\tngOnInit() {\n\t\t\n\t\tthis.ngControl?.control?.setValidators( [ this.validate.bind( this ) ] );\n\t\tthis.ngControl?.control?.updateValueAndValidity();\n\t}\n\t\n\tvalidate( { value }: AbstractControl ): ValidationErrors | null {\n\n\t\tconst limit = value as TimelimitValue | null;\n\t\tlet isNotValid = false;\n\n\t\tif ( limit === null )\n\t\t\tisNotValid = true;\n\t\telse if ( limit.check ) {\n\t\t\tif ( limit.tohour == 24 && limit.tomin != 0 )\n\t\t\t\tisNotValid = true;\n\t\t\tif ( limit.fromhour == 24 )\n\t\t\t\tisNotValid = true;\n\t\t\tif ( limit.fromhour > limit.tohour )\n\t\t\t\tisNotValid = true;\n\t\t\tif ( limit.fromhour == limit.tohour && limit.frommin >= limit.tomin )\n\t\t\t\tisNotValid = true;\n\t\t\tif ( ( ( limit.wd[ 0 ] &&\n\t\t\t limit.wd[ 1 ] &&\n\t\t\t limit.wd[ 2 ] &&\n\t\t\t limit.wd[ 3 ] &&\n\t\t\t limit.wd[ 4 ] &&\n\t\t\t limit.wd[ 5 ] &&\n\t\t\t limit.wd[ 6 ] ) ||\n\t\t\t ( !limit.wd[ 0 ] &&\n\t\t\t !limit.wd[ 1 ] &&\n\t\t\t !limit.wd[ 2 ] &&\n\t\t\t !limit.wd[ 3 ] &&\n\t\t\t !limit.wd[ 4 ] &&\n\t\t\t !limit.wd[ 5 ] &&\n\t\t\t !limit.wd[ 6 ] ) ) &&\n\t\t\t limit.fromhour == 0 && limit.frommin == 0 && limit.tohour == 24 && limit.frommin == 0 ) {\n\t\t\t\tisNotValid = true;\n\t\t\t}\n\t\t}\n\n\t\treturn isNotValid ? { invalid: isNotValid } : null;\n\t}\n\t\n\tngOnDestroy() {\n\t\tthis.stateChanges.complete();\n\t\tthis.focusMonitor.stopMonitoring( this._elementRef.nativeElement );\n\t}\n\t\n\tpublic changed() {\n\t\tthis.onChange( this.value );\n\t}\n\t\n\t@Input()\n\tget placeholder(): string {\n\t\treturn this._placeholder;\n\t}\n\t\n\tset placeholder( value: string ) {\n\t\tthis._placeholder = value;\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget required(): boolean {\n\t\treturn this._required;\n\t}\n\t\n\tset required( value: boolean ) {\n\t\tthis._required = coerceBooleanProperty( value );\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget disabled(): boolean {\n\t\treturn this._disabled;\n\t}\n\t\n\tset disabled( value: boolean ) {\n\t\tthis._disabled = coerceBooleanProperty( value );\n\t\tif ( this._disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget value(): TimelimitValue {\n\n\t\tconst value = this.parts.getRawValue();\n\t\treturn {\n\t\t\tcheck: value.check,\n\t\t\twd: [ value.wd0, value.wd1, value.wd2, value.wd3, value.wd4, value.wd5, value.wd6 ],\n\t\t\tfromhour: value.fromhour,\n\t\t\tfrommin: value.frommin,\n\t\t\ttohour: value.tohour,\n\t\t\ttomin: value.tomin,\n\t\t\tin: value.inout\n\t\t};\n\t}\n\n\tset value( input: TimelimitValue | null | undefined ) {\n\n\t\tif ( input === null || input === undefined )\n\t\t\treturn;\n\n\t\tthis.parts.setValue( {\n\t\t\t check: input.check,\n\t\t\t wd0: input.wd[ 0 ],\n\t\t\t wd1: input.wd[ 1 ],\n\t\t\t wd2: input.wd[ 2 ],\n\t\t\t wd3: input.wd[ 3 ],\n\t\t\t wd4: input.wd[ 4 ],\n\t\t\t wd5: input.wd[ 5 ],\n\t\t\t wd6: input.wd[ 6 ],\n\t\t\t fromhour: parseInt( String( input.fromhour ) ),\n\t\t\t frommin: parseInt( String( input.frommin ) ),\n\t\t\t tohour: parseInt( String( input.tohour ) ),\n\t\t\t tomin: parseInt( String( input.tomin ) ),\n\t\t\t inout: input.in\n\t\t } );\n\n\t\tthis.onChange( this.value );\n\t\tthis.stateChanges.next();\n\t}\n\n\tget empty() {\n\t\treturn this.value === null;\n\t}\n\n\twriteValue( value: TimelimitValue | null | undefined ): void {\n\t\tthis.value = value;\n\t}\n\n\tregisterOnChange( fn: ( value: TimelimitValue ) => void ): void {\n\t\tthis.onChange = fn;\n\t}\n\n\tregisterOnTouched( fn: () => void ): void {\n\t\tthis.onTouched = fn;\n\t}\n\n\tsetDisabledState( isDisabled: boolean ): void {\n\t\tthis.disabled = isDisabled;\n\t}\n\n\tsetDescribedByIds( ids: string[] ) {\n\t\tthis.describedBy = ids.join( ' ' );\n\t}\n\n\tonContainerClick(): void { /* intentionally empty */ }\n\n\tpublic _texts: Record<string, string> = {};\n\n\t@Input()\n\tget texts(): Record<string, string> {\n\n\t\treturn this._texts;\n\t}\n\n\tset texts( input: Record<string, string> ) {\n\n\t\tif ( input === null || input === undefined )\n\t\t\treturn;\n\t\tthis._texts = input;\n\t}\n\n\tonCompare(): number {\n\t\treturn -1;\n\t}\n\t\n}\n","<div class=\"timelimit\" [formGroup]=\"parts\">\n\n\t<mat-checkbox id=\"check\" formControlName=\"check\" (change)=\"changed()\">{{ _texts.check }}</mat-checkbox>\n\n\t<div [hidden]=\"!parts.value.check\" class=\"space\">\n\t\t<div class=\"xrow xsmall\">\n\t\t\t<div class=\"xcol-12\">\n\t\t\t\t<mat-label>{{ _texts.weekdays }}</mat-label>\n\t\t\t\t<div class=\"form-group timelimit-weekdays\">\n\t\t\t\t\t<mat-checkbox id=\"wd0\" formControlName=\"wd0\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd0 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd1\" formControlName=\"wd1\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd1 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd2\" formControlName=\"wd2\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd2 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd3\" formControlName=\"wd3\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd3 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd4\" formControlName=\"wd4\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd4 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd5\" formControlName=\"wd5\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd5 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd6\" formControlName=\"wd6\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd6 }}</mat-checkbox>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"xcol-md-6\">\n\t\t\t\t<mat-label>{{ _texts.from }}</mat-label>\n\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t<mat-form-field class=\"time\">\n\t\t\t\t\t\t<mat-select formControlName=\"fromhour\" panelWidth=\"auto\">\n\t\t\t\t\t\t\t@for (h of hours; track h; let i = $index) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"i\">{{ h }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t<mat-form-field class=\"time\">\n\t\t\t\t\t\t<mat-select formControlName=\"frommin\" panelWidth=\"auto\">\n\t\t\t\t\t\t\t@for (m of minutes | keyvalue:onCompare; track m; let i = $index) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"i\">{{ m.value }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t</mat-form-field>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"xcol-md-6\">\n\t\t\t\t<mat-label>{{ _texts.to }}</mat-label>\n\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t<mat-form-field class=\"time\">\n\t\t\t\t\t\t<mat-select formControlName=\"tohour\" panelWidth=\"auto\">\n\t\t\t\t\t\t\t@for (h of hours; track h; let i = $index) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"i\">{{ h }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t<mat-form-field class=\"time\">\n\t\t\t\t\t\t<mat-select formControlName=\"tomin\" panelWidth=\"auto\">\n\t\t\t\t\t\t\t@for (m of minutes | keyvalue; track m; let i = $index) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"i\">{{ m.value }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t</mat-form-field>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"xcol-12\">\n\t\t\t\t<mat-checkbox id=\"inout\" formControlName=\"inout\" (change)=\"changed()\">{{ _texts.inout }}</mat-checkbox>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>","import {\n\tChangeDetectorRef,\n\tComponent,\n\tDoCheck,\n\tElementRef,\n\tinject,\n\tInput,\n\tOnDestroy\n} from '@angular/core';\nimport {\n\tControlValueAccessor,\n\tFormControl,\n\tFormGroup,\n\tFormsModule,\n\tNgControl,\n\tReactiveFormsModule\n} from '@angular/forms';\nimport { MatError, MatFormField, MatFormFieldControl, MatHint, MatLabel } from '@angular/material/form-field';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Subject } from 'rxjs';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { XiriFormField } from \"../field.interface\";\nimport { MatInput } from '@angular/material/input';\n\ninterface VolumeForm {\n\tvoll: FormControl<number>\n\tvolw: FormControl<number>\n\tvolh: FormControl<number>\n}\n\ntype VolumeValue = [ number, number, number ] | null | undefined;\n\n@Component( {\n\t selector: 'xiri-volume',\n\t templateUrl: './volume.component.html',\n\t styleUrls: [ './volume.component.scss' ],\n\t host: {\n\t\t '[id]': 'id',\n\t\t '[attr.aria-describedby]': 'describedBy'\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriVolumeComponent\n\t } ],\n\t imports: [\n\t\t MatFormField,\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatLabel,\n\t\t MatInput,\n\t\t MatHint,\n\t\t MatError,\n\t ]\n } )\nexport class XiriVolumeComponent implements ControlValueAccessor, MatFormFieldControl<VolumeValue>, DoCheck, OnDestroy {\n\tprivate focusMonitor = inject( FocusMonitor );\n\tngControl = inject( NgControl, { optional: true, self: true } );\n\tprivate _elementRef = inject<ElementRef<HTMLElement>>( ElementRef );\n\tprivate cdr = inject( ChangeDetectorRef );\n\t\n\t\n\tstatic nextId = 0;\n\tid = `xiri-volume-${ XiriVolumeComponent.nextId++ }`;\n\tdescribedBy = '';\n\t\n\tpublic min: number | null = null;\n\tpublic max: number | null = null;\n\t\n\treadonly autofilled!: boolean;\n\n\tparts: FormGroup<VolumeForm>;\n\tstateChanges = new Subject<void>();\n\tfocused = false;\n\tcontrolType = 'xiri-volume';\n\t\n\treadonly placeholder!: string;\n\tpublic required = false;\n\tpublic disabled = false;\n\tshouldLabelFloat = true;\n\tprivate _lastValue: [ number, number, number ] | null = null;\n\tprivate _field!: XiriFormField;\n\t\n\tconstructor() {\n\t\t\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\t\t\n\t\tthis.parts = new FormGroup<VolumeForm>( {\n\t\t\t voll: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t volw: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t volh: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t } );\n\t\t\n\t\tthis.focusMonitor.monitor( this._elementRef, true ).subscribe( origin => {\n\t\t\tthis.ngControl?.control?.markAsTouched();\n\t\t\tthis.focused = !!origin;\n\t\t\tthis.runCheck();\n\t\t\tthis.cdr.markForCheck();\n\t\t} );\n\t}\n\t\n\tonChange: ( value: VolumeValue ) => void = () => { /* intentionally empty */ };\n\tonTouched = () => { /* intentionally empty */ };\n\t\n\tngDoCheck(): void {\n\t\tthis.runCheck();\n\t}\n\t\n\tngOnDestroy() {\n\t\tif ( this.changeTO )\n\t\t\tclearTimeout( this.changeTO );\n\t\t\n\t\tthis.stateChanges.complete();\n\t\tthis.focusMonitor.stopMonitoring( this._elementRef );\n\t}\n\t\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\tthis._field = value;\n\t\t\n\t\tif ( value.min )\n\t\t\tthis.min = value.min;\n\t\tif ( value.max )\n\t\t\tthis.max = value.max;\n\t\t\n\t\tthis.required = coerceBooleanProperty( value.required );\n\t\tthis.disabled = coerceBooleanProperty( value.disabled );\n\t\tif ( this.disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\t\n\tget field(): XiriFormField {\n\t\treturn this._field;\n\t}\n\t\n\t@Input()\n\tget value(): VolumeValue {\n\n\t\tconst { value: { voll, volw, volh } } = this.parts;\n\n\t\tif ( this.errorState )\n\t\t\treturn undefined;\n\t\tif ( voll == null || volw == null || volh == null )\n\t\t\treturn null;\n\n\t\treturn [ voll, volw, volh ];\n\t}\n\n\tset value( input: VolumeValue ) {\n\t\t\n\t\tif ( input === null || input === undefined )\n\t\t\treturn;\n\t\t\n\t\tthis.parts.setValue( {\n\t\t\t voll: input[ 0 ],\n\t\t\t volw: input[ 1 ],\n\t\t\t volh: input[ 2 ],\n\t\t } );\n\t\t\n\t\tthis.changeValue( this.value );\n\t}\n\t\n\tprivate runCheck(): void {\n\t\t\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\t\t\n\t\tconst val = this.value;\n\t\tif ( val === undefined || val === null || this._lastValue === null || this._lastValue === undefined ) {\n\t\t\tif ( this._lastValue === val )\n\t\t\t\tthis.stateChanges.next();\n\t\t\telse\n\t\t\t\tthis.changeValue( val );\n\t\t} else if ( val[ 0 ] ==\n\t\t this._lastValue[ 0 ] &&\n\t\t val[ 1 ] ==\n\t\t this._lastValue[ 1 ] &&\n\t\t val[ 2 ] ==\n\t\t this._lastValue[ 2 ] )\n\t\t\tthis.stateChanges.next();\n\t\telse\n\t\t\tthis.changeValue( val );\n\t}\n\t\n\tprivate changeTO: ReturnType<typeof setTimeout> | null = null;\n\n\tprivate changeValue( val: VolumeValue ) {\n\n\t\tthis._lastValue = val ?? null;\n\t\tif ( this.changeTO )\n\t\t\tclearTimeout( this.changeTO );\n\t\t\n\t\tthis.changeTO = setTimeout( () => {\n\t\t\tthis.onChange( val );\n\t\t\tthis.stateChanges.next();\n\t\t\tthis.cdr.markForCheck();\n\t\t}, 0 );\n\t}\n\t\n\tget errorState(): boolean {\n\t\treturn this.parts.invalid && !!this.ngControl?.touched;\n\t}\n\t\n\tpublic getErrorMessage(): string {\n\t\treturn 'error';\n\t}\n\t\n\tget empty() {\n\t\treturn this.value === null;\n\t}\n\t\n\twriteValue( value: VolumeValue ): void {\n\t\tthis.value = value;\n\t}\n\n\tregisterOnChange( fn: ( value: VolumeValue ) => void ): void {\n\t\tthis.onChange = fn;\n\t}\n\n\tregisterOnTouched( fn: () => void ): void {\n\t\tthis.onTouched = fn;\n\t}\n\n\tsetDisabledState( isDisabled: boolean ): void {\n\t\tthis.disabled = isDisabled;\n\t}\n\n\tsetDescribedByIds( ids: string[] ) {\n\t\tthis.describedBy = ids.join( ' ' );\n\t}\n\n\tonContainerClick(): void { /* intentionally empty */ }\n}\n","<mat-form-field [formGroup]=\"parts\" floatLabel=\"auto\">\n\t<mat-label>{{ field.name }}</mat-label>\n\t<div role=\"group\" [formGroup]=\"parts\">\n\t\t<input matInput id=\"voll\" formControlName=\"voll\" type=\"number\" [attr.min]=\"min\" [attr.max]=\"max\" [required]=\"required\">\n\t\t<input matInput id=\"volw\" formControlName=\"volw\" type=\"number\" [attr.min]=\"min\" [attr.max]=\"max\" [required]=\"required\">\n\t\t<input matInput id=\"volh\" formControlName=\"volh\" type=\"number\" [attr.min]=\"min\" [attr.max]=\"max\" [required]=\"required\">\n\t</div>\n\n\t@if (field.hint) {\n\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t}\n\t@if (parts.invalid) {\n\t\t<mat-error>{{ getErrorMessage() }}</mat-error>\n\t}\n</mat-form-field>","import { Service, signal, computed, effect, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { DateAdapter } from '@angular/material/core';\nimport { Locale, format, fromUnixTime, transpose } from 'date-fns';\nimport { tz } from '@date-fns/tz';\nimport { de } from 'date-fns/locale/de';\nimport { enGB } from 'date-fns/locale/en-GB';\n\n// `string & {}` lässt jeden String zu, behält aber die Autocomplete für die eingebauten Sprachen.\nexport type XiriLanguage = 'de' | 'en' | ( string & {} );\n\nexport interface XiriValidationMessages {\n\trequired: string;\n\tinvalidFormat: string;\n\tinvalidEmail: string;\n\tvalueRequired: string;\n\tminLength: ( min: number ) => string;\n\tmaxLength: ( max: number ) => string;\n\tminNumber: ( min: number ) => string;\n\tmaxNumber: ( max: number ) => string;\n\tminDate: ( date: string ) => string;\n\tmaxDate: ( date: string ) => string;\n\tminDateRange: ( date: string ) => string;\n\tmaxDateRange: ( date: string ) => string;\n\tminSelection: ( min: number ) => string;\n\tmaxSelection: ( max: number ) => string;\n}\n\nexport interface XiriLanguageDefinition {\n\t// BCP-47-Locale für Intl (Zahlen/Datumsformatierung), z. B. 'de-DE', 'fr-FR'.\n\tlocaleString: string;\n\t// date-fns-Locale für Material-Datepicker + Monatsnamen. Weglassen bei Text-only-Apps ohne Datepicker.\n\tdateFnsLocale?: Locale;\n\tvalidationMessages: XiriValidationMessages;\n}\n\nconst deValidationMessages: XiriValidationMessages = {\n\trequired: 'Pflichtfeld – bitte ausfüllen',\n\tinvalidFormat: 'Bitte ein gültiges Format eingeben',\n\tinvalidEmail: 'Bitte eine gültige E-Mail-Adresse eingeben',\n\tvalueRequired: 'Bitte einen Wert angeben',\n\tminLength: min => `Mindestens ${ min } Zeichen erforderlich`,\n\tmaxLength: max => `Maximal ${ max } Zeichen erlaubt`,\n\tminNumber: min => `Mindestens ${ min } erforderlich`,\n\tmaxNumber: max => `Maximal ${ max } erlaubt`,\n\tminDate: date => `Datum darf nicht vor ${ date } liegen`,\n\tmaxDate: date => `Datum darf nicht nach ${ date } liegen`,\n\tminDateRange: date => `Startdatum muss nach ${ date } liegen`,\n\tmaxDateRange: date => `Enddatum muss vor ${ date } liegen`,\n\tminSelection: min => `Mindestens ${ min } Einträge auswählen`,\n\tmaxSelection: max => `Maximal ${ max } Einträge auswählen`,\n};\n\nconst enValidationMessages: XiriValidationMessages = {\n\trequired: 'Required field',\n\tinvalidFormat: 'Please enter a valid format',\n\tinvalidEmail: 'Please enter a valid email address',\n\tvalueRequired: 'Please provide a value',\n\tminLength: min => `At least ${ min } characters required`,\n\tmaxLength: max => `Maximum ${ max } characters allowed`,\n\tminNumber: min => `Minimum value is ${ min }`,\n\tmaxNumber: max => `Maximum value is ${ max }`,\n\tminDate: date => `Date must not be before ${ date }`,\n\tmaxDate: date => `Date must not be after ${ date }`,\n\tminDateRange: date => `Start date must be after ${ date }`,\n\tmaxDateRange: date => `End date must be before ${ date }`,\n\tminSelection: min => `Select at least ${ min } items`,\n\tmaxSelection: max => `Select at most ${ max } items`,\n};\n\n@Service()\nexport class XiriLocaleService {\n\tprivate readonly platformId = inject( PLATFORM_ID );\n\tprivate readonly isBrowser = isPlatformBrowser( this.platformId );\n\tprivate readonly dateAdapter = inject<DateAdapter<unknown>>( DateAdapter, { optional: true } );\n\n\t// Registry aller bekannten Sprachen — de/en eingebaut, weitere per registerLanguage().\n\tprivate readonly registry = new Map<XiriLanguage, XiriLanguageDefinition>( [\n\t\t[ 'de', { localeString: 'de-DE', dateFnsLocale: de, validationMessages: deValidationMessages } ],\n\t\t[ 'en', { localeString: 'en-GB', dateFnsLocale: enGB, validationMessages: enValidationMessages } ],\n\t] );\n\n\tprivate readonly _language = signal<XiriLanguage>( 'de' );\n\treadonly language = this._language.asReadonly();\n\treadonly localeString = computed( () => this.registry.get( this._language() )?.localeString ?? 'de-DE' );\n\t// Aktives date-fns-Locale (für Datums-Formatierung + Datepicker). Undefined bei Text-only-Sprache.\n\treadonly dateFnsLocale = computed( () => this.registry.get( this._language() )?.dateFnsLocale );\n\n\t// Zeitzone für alle Unix<->Local-Umrechnungen (locale-nahe Präsentations-Info, analog Go-uicontext).\n\tprivate currentTimezone = 'Europe/Vienna';\n\n\tconstructor() {\n\t\tconst stored = this.readStoredLanguage();\n\t\t// Nur wiederherstellen, wenn die Sprache bekannt ist (de/en oder bereits registriert).\n\t\tif ( stored && this.registry.has( stored ) )\n\t\t\tthis._language.set( stored );\n\t\t// Material-Datepicker-Locale (Picker-UI) an die Sprache angleichen — reine Frontend-Interaktion.\n\t\t// Ohne bereitgestellten DateAdapter (Text-only-Formular) oder ohne date-fns-Locale wird übersprungen.\n\t\teffect( () => {\n\t\t\tconst locale = this.dateFnsLocale();\n\t\t\tif ( locale )\n\t\t\t\tthis.dateAdapter?.setLocale( locale );\n\t\t} );\n\t}\n\n\t// Sprache registrieren/überschreiben. Vor setLanguage() bzw. dem ersten Formular-Render aufrufen (App-Init).\n\tregisterLanguage( code: XiriLanguage, def: XiriLanguageDefinition ): void {\n\t\tthis.registry.set( code, def );\n\t\t// Über Reload persistierte Custom-Sprache einklinken, sobald sie (nach)registriert wird —\n\t\t// der Konstruktor kennt beim Restore nur de/en.\n\t\tif ( this.readStoredLanguage() === code )\n\t\t\tthis._language.set( code );\n\t}\n\n\tsetLanguage( lang: XiriLanguage ): void {\n\t\tif ( !this.registry.has( lang ) ) {\n\t\t\tconsole.warn( `XiriLocaleService: unbekannte Sprache '${ lang }' – zuerst registerLanguage() aufrufen.` );\n\t\t\treturn;\n\t\t}\n\t\tthis._language.set( lang );\n\t\tthis.storeLanguage( lang );\n\t}\n\n\t// Validierungs-Fehlertexte der aktiven Sprache; Fallback de, falls (unerwartet) nicht vorhanden.\n\tvalidationMessagesFor(): XiriValidationMessages {\n\t\treturn this.registry.get( this._language() )?.validationMessages\n\t\t\t?? this.registry.get( 'de' )!.validationMessages;\n\t}\n\n\t// ── Zeitzone + Datums-/Zahlen-Formatierung (locale-abhängig) ─────────────────────────────\n\n\tsetTimezone( timezone: string ): void {\n\t\tthis.currentTimezone = timezone;\n\t}\n\n\tunixToLocal( stime: number ): Date | null {\n\t\tif ( stime === null || stime === undefined )\n\t\t\treturn null;\n\t\treturn fromUnixTime( stime, { in: tz( this.currentTimezone ) } );\n\t}\n\n\tunixToStringDateTime( stime: number ): string {\n\t\tconst date = this.unixToLocal( stime );\n\t\treturn date === null ? '' : format( date, 'yyyy-MM-dd HH:mm', { locale: this.dateFnsLocale() } );\n\t}\n\n\tunixToStringDate( stime: number ): string {\n\t\tconst date = this.unixToLocal( stime );\n\t\t// Kein Punkt hinter LLL: die Interpunktion des Monatskürzels bringt das jeweilige Locale\n\t\t// selbst mit (de/fr: 'Mär.'/'juil.', en: 'Jul' ohne) — ein fixer Punkt gäbe sonst '18. Mär..'.\n\t\treturn date === null ? '' : format( date, 'd. LLL', { locale: this.dateFnsLocale() } );\n\t}\n\n\tunixToStringDateYear( stime: number ): string {\n\t\tconst date = this.unixToLocal( stime );\n\t\treturn date === null ? '' : format( date, 'd. LLL yy', { locale: this.dateFnsLocale() } );\n\t}\n\n\tdateToUnix( date: Date ): number {\n\t\treturn Math.floor( transpose( date, tz( this.currentTimezone ) ).getTime() / 1000 );\n\t}\n\n\tformatNumber( value: number, webformat?: string ): string {\n\t\tif ( value === null || value === undefined )\n\t\t\treturn '';\n\n\t\tconst digits = webformat === 'integer'\n\t\t\t? 0\n\t\t\t: /^float\\d+$/.test( webformat ?? '' )\n\t\t\t\t? Number( webformat!.slice( 5 ) )\n\t\t\t\t: undefined;\n\n\t\tconst options: Intl.NumberFormatOptions = { style: 'decimal' };\n\t\tif ( digits !== undefined ) {\n\t\t\toptions.minimumFractionDigits = digits;\n\t\t\toptions.maximumFractionDigits = digits;\n\t\t}\n\n\t\treturn new Intl.NumberFormat( this.localeString(), options ).format( value );\n\t}\n\n\t// localStorage-Zugriff abgesichert: im SSR nicht vorhanden, in jsdom-Tests ggf. undefined,\n\t// im Private-Mode wirft es SecurityError. In all diesen Fällen still ohne Persistenz weiterlaufen.\n\tprivate readStoredLanguage(): string | null {\n\t\tif ( !this.isBrowser )\n\t\t\treturn null;\n\t\ttry {\n\t\t\treturn localStorage.getItem( 'xiri-language' );\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate storeLanguage( lang: XiriLanguage ): void {\n\t\tif ( !this.isBrowser )\n\t\t\treturn;\n\t\ttry {\n\t\t\tlocalStorage.setItem( 'xiri-language', lang );\n\t\t} catch {\n\t\t\t// Persistenz nicht verfügbar (Private-Mode o. Ä.) — Sprachwechsel gilt trotzdem für die Session.\n\t\t}\n\t}\n}\n","import {\n\tafterRenderEffect,\n\tbooleanAttribute,\n\tChangeDetectorRef,\n\tComponent,\n\tElementRef,\n\tinject,\n\tInput,\n\tnumberAttribute,\n\tOnDestroy,\n\tOnInit,\n\toutput,\n\tsignal,\n\tinput\n} from \"@angular/core\";\nimport {\n\tAbstractControl,\n\tControlValueAccessor,\n\tFormGroupDirective,\n\tNgControl,\n\tNgForm,\n\tValidators\n} from \"@angular/forms\";\nimport { MatFormFieldControl } from \"@angular/material/form-field\";\nimport { Subject, Subscription } from \"rxjs\";\nimport { _ErrorStateTracker, ErrorStateMatcher } from \"@angular/material/core\";\nimport { FocusMonitor } from \"@angular/cdk/a11y\";\n\n\n@Component( {\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriFieldMain\n\t } ],\n\t imports: [],\n\t template: ``\n } )\nexport abstract class XiriFieldMain<T = unknown>\n\timplements ControlValueAccessor,\n\t MatFormFieldControl<T>,\n\t OnInit,\n\t OnDestroy {\n\n\tprotected _elementRef = inject<ElementRef<HTMLElement>>( ElementRef );\n\tprotected _changeDetectorRef = inject( ChangeDetectorRef );\n\tprotected _focusMonitor = inject( FocusMonitor );\n\tpublic _defaultErrorStateMatcher = inject( ErrorStateMatcher );\n\tpublic ngControl = inject( NgControl, { self: true, optional: true } );\n\tprivate _parentForm = inject( NgForm, { optional: true } );\n\tprivate _parentFormGroup = inject( FormGroupDirective, { optional: true } );\n\n\treadonly stateChanges: Subject<void> = new Subject<void>();\n\treadonly autofilled: boolean = false;\n\treadonly valueChange = output<T>();\n\n\t_onChange: ( value: T ) => void = () => { /* intentionally empty */ };\n\t_onTouched = () => { /* intentionally empty */ };\n\n\tprotected touched = false;\n\tprotected _errorStateTracker: _ErrorStateTracker;\n\tprotected _previousControl: AbstractControl | null | undefined;\n\tprotected subs: Subscription = new Subscription();\n\n\tdisableAutomaticLabeling?: boolean;\n\tcontrolType = 'xiri-form-field';\n\n\tprotected constructor() {\n\t\tthis._errorStateTracker = new _ErrorStateTracker(\n\t\t\tthis._defaultErrorStateMatcher,\n\t\t\tthis.ngControl,\n\t\t\tthis._parentFormGroup,\n\t\t\tthis._parentForm,\n\t\t\tthis.stateChanges,\n\t\t);\n\n\t\tafterRenderEffect( () => {\n\t\t\tthis.doCheckLogic();\n\t\t} );\n\t}\n\n\tngOnInit() {\n\t\tthis.subs.add( this._focusMonitor.monitor( this._elementRef, true ).subscribe( origin => {\n\t\t\tthis.focused = !!origin;\n\t\t\tif ( !this.focused ) {\n\t\t\t\tif ( !this.touched ) {\n\t\t\t\t\tthis.ngControl?.control?.markAsTouched();\n\t\t\t\t\tthis.touched = true;\n\t\t\t\t}\n\t\t\t\tthis.startChangeValue();\n\t\t\t}\n\t\t} ) );\n\n\t\tthis.stateChanges.next();\n\t}\n\n\tngOnDestroy() {\n\t\tthis._focusMonitor.stopMonitoring( this._elementRef );\n\t\tthis.subs.unsubscribe();\n\t\tthis.stateChanges.complete();\n\t}\n\n\tprivate doCheckLogic(): void {\n\t\tconst ngControl = this.ngControl;\n\n\t\tif ( ngControl ) {\n\t\t\tif ( this._previousControl !== ngControl.control ) {\n\t\t\t\tif (\n\t\t\t\t\tthis._previousControl !== undefined &&\n\t\t\t\t\tngControl.disabled !== null &&\n\t\t\t\t\tngControl.disabled !== this.disabled\n\t\t\t\t) {\n\t\t\t\t\tthis.disabled = ngControl.disabled;\n\t\t\t\t}\n\n\t\t\t\tthis._previousControl = ngControl.control;\n\t\t\t}\n\n\t\t\tthis.updateErrorState();\n\n\t\t\tif ( ngControl.touched != this.touched ) {\n\t\t\t\tthis.touched = true;\n\t\t\t\tthis.startChangeValue();\n\t\t\t}\n\t\t}\n\t}\n\n\n\t@Input()\n\tget id(): string {\n\t\treturn this._id;\n\t}\n\n\tset id( value: string ) {\n\t\tthis._id = value;\n\t}\n\n\tprotected _id!: string;\n\n\n\treadonly tabIndex = input(0, { transform: (value: unknown) => (value == null ? 0 : numberAttribute(value)) });\n\n\n\t@Input()\n\tget value(): T {\n\t\treturn this._value;\n\t}\n\n\tset value( value: T ) {\n\t\tthis._value = value;\n\t}\n\n\tprotected abstract startChangeValue(): void;\n\n\tprotected runChangeValue( val: T ) {\n\t\tthis._onTouched();\n\t\tthis._onChange( val );\n\t\tthis.valueChange.emit( val );\n\t\tthis.stateChanges.next();\n\t\tthis._changeDetectorRef.markForCheck();\n\t}\n\n\tprotected _value: T = null as T;\n\n\tget empty() {\n\t\treturn this._value === null;\n\t}\n\n\t@Input( { transform: booleanAttribute } )\n\tget disabled(): boolean {\n\t\treturn this._disabled();\n\t}\n\n\tset disabled( value: boolean ) {\n\t\tthis._disabled.set( value );\n\t\tthis._changeDetectorRef.markForCheck();\n\t\tthis.stateChanges.next();\n\t}\n\n\tprotected _disabled = signal<boolean>( false );\n\n\tsetDisabledState(): void { /* intentionally empty */ }\n\n\n\t@Input( { transform: booleanAttribute } )\n\tget required(): boolean {\n\t\treturn this._required ?? this.ngControl?.control?.hasValidator( Validators.required ) ?? false;\n\t}\n\n\tset required( value: boolean ) {\n\t\tthis._required = value;\n\t\tthis.stateChanges.next();\n\t}\n\n\tprotected _required: boolean | undefined;\n\n\n\t@Input()\n\tget placeholder(): string {\n\t\treturn this._placeholder;\n\t}\n\n\tset placeholder( value: string ) {\n\t\tthis._placeholder = value;\n\t\tthis.stateChanges.next();\n\t}\n\n\tprotected _placeholder!: string;\n\n\tpublic focused = false;\n\n\twriteValue( value: T ): void {\n\t\tthis._value = value;\n\t}\n\n\tregisterOnChange( fn: ( value: T ) => void ): void {\n\t\tthis._onChange = fn;\n\t}\n\n\tregisterOnTouched( fn: () => void ): void {\n\t\tthis._onTouched = fn;\n\t}\n\n\n\tsetDescribedByIds( ids: string[] ) {\n\t\tif ( ids.length ) {\n\t\t\tthis._elementRef.nativeElement.setAttribute( 'aria-describedby', ids.join( ' ' ) );\n\t\t} else {\n\t\t\tthis._elementRef.nativeElement.removeAttribute( 'aria-describedby' );\n\t\t}\n\t}\n\n\tget shouldLabelFloat(): boolean {\n\t\treturn !this.empty || this.focused;\n\t}\n\n\tonContainerClick() {\n\t\tif ( !this.focused ) {\n\t\t\tthis.focus();\n\t\t}\n\t}\n\n\tfocus( options?: FocusOptions ): void {\n\t\tthis._elementRef.nativeElement.focus( options );\n\t}\n\n\t@Input()\n\tget errorStateMatcher() {\n\t\treturn this._errorStateTracker.matcher;\n\t}\n\n\tset errorStateMatcher( value: ErrorStateMatcher ) {\n\t\tthis._errorStateTracker.matcher = value;\n\t}\n\n\tget errorState() {\n\t\treturn this._errorStateTracker.errorState;\n\t}\n\n\tset errorState( value: boolean ) {\n\t\tthis._errorStateTracker.errorState = value;\n\t}\n\n\tupdateErrorState() {\n\t\tthis._errorStateTracker.updateErrorState();\n\t}\n\n\tprotected _markAsTouched() {\n\t\tthis._onTouched();\n\t\tthis._changeDetectorRef.markForCheck();\n\t\tthis.stateChanges.next();\n\t}\n\n\treadonly ariaDescribedby = input<string>(undefined, { alias: \"aria-describedby\" });\n\n\tget userAriaDescribedBy(): string {\n\t\treturn this.ariaDescribedby() ?? '';\n\t}\n\n}\n","import {\n\tComponent,\n\tinject,\n\tInput, OnInit,\n} from '@angular/core';\nimport {\n\tControlValueAccessor,\n\tFormBuilder,\n\tFormControl,\n\tFormGroup,\n\tFormsModule,\n\tReactiveFormsModule\n} from '@angular/forms';\nimport { MatFormFieldControl, MatSuffix } from '@angular/material/form-field';\nimport { XiriLocaleService } from '../../services/locale.service';\nimport { XiriFormField } from \"../field.interface\";\nimport { MatOption } from \"@angular/material/core\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatSelect } from '@angular/material/select';\nimport {\n\tMatDatepicker,\n\tMatDatepickerInput,\n\tMatDatepickerToggle,\n\tMatDatepickerToggleIcon\n} from '@angular/material/datepicker';\nimport { MatInput } from '@angular/material/input';\nimport { XiriFieldMain } from \"../helper/fieldmain\";\n\n\ninterface DateTimeRangeForm {\n\tdate: FormControl<Date | null>\n\tfhour: FormControl<number>\n\tfminute: FormControl<number>\n\tthour: FormControl<number>\n\ttminute: FormControl<number>\n}\n\nlet nextUniqueIdXiriDateTimeRange = 0;\n\nclass DateTimeRange {\n\tconstructor( public start: number, public end: number ) {\n\t}\n}\n\n\n@Component( {\n\t selector: 'xiri-date-time-range',\n\t templateUrl: './datetimerange.component.html',\n\t styleUrl: './datetimerange.component.scss',\n\t host: {\n\t\t '[id]': 'id',\n\t\t '(focus)': 'focus()',\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriDateTimeRangeComponent\n\t } ],\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatInput,\n\t\t MatDatepickerInput,\n\t\t MatSelect,\n\t\t MatOption,\n\t\t MatDatepickerToggle,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatDatepickerToggleIcon,\n\t\t MatDatepicker,\n\t ]\n } )\nexport class XiriDateTimeRangeComponent extends XiriFieldMain<DateTimeRange | null | undefined> implements ControlValueAccessor,\n MatFormFieldControl<DateTimeRange | null | undefined>, OnInit {\n\t\n\tprotected _uid = `xiri-date-${ nextUniqueIdXiriDateTimeRange++ }`;\n\t\n\tpublic minDate: Date | null = null;\n\tpublic maxDate: Date | null = null;\n\t\n\tparts: FormGroup<DateTimeRangeForm>;\n\t\n\tprivate _lastValue: DateTimeRange | null = null;\n\t\n\thours = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09',\n\t '10', '11', '12', '13', '14', '15', '16', '17', '18', '19',\n\t '20', '21', '22', '23' ];\n\tminutes = [ '00', '05', '10', '15',\n\t '20', '25', '30', '35',\n\t '40', '45', '50', '55', ];\n\t\n\tprivate dateService = inject( XiriLocaleService );\n\tprivate fb = inject( FormBuilder );\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis._id = this._uid;\n\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\n\t\tthis.parts = this.fb.group<DateTimeRangeForm>( {\n\t\t\t date: new FormControl<Date | null>( null ),\n\t\t\t fhour: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t fminute: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t thour: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t tminute: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t } );\n\t}\n\t\n\tngOnInit() {\n\t\tthis.subs.add( this.parts.valueChanges.subscribe( () => {\n\t\t\tthis.runCheck();\n\t\t} ) );\n\t\t\n\t\tsuper.ngOnInit();\n\t}\n\t\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\t\n\t\tif ( value.min )\n\t\t\tthis.minDate = this.dateService.unixToLocal( value.min );\n\t\tif ( value.max )\n\t\t\tthis.maxDate = this.dateService.unixToLocal( value.max );\n\t\t\n\t\tthis.required = !!value.required;\n\t\tthis.disabled = !!value.disabled;\n\t\tif ( this.disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget value(): DateTimeRange | null | undefined {\n\t\t\n\t\tconst { date, fhour, fminute, thour, tminute } = this.parts.value;\n\t\t\n\t\tif ( !date && !this.required && !this.parts.valid )\n\t\t\treturn this._disabled() ? null : undefined;\n\t\tif ( !date || fhour === undefined || fminute === undefined || thour === undefined || tminute === undefined )\n\t\t\treturn null;\n\t\t\n\t\tconst to = new Date( date.getTime() );\n\t\t\n\t\tdate.setHours( fhour );\n\t\tdate.setMinutes( fminute );\n\t\t\n\t\tto.setHours( thour );\n\t\tto.setMinutes( tminute );\n\t\t\n\t\tconst unixFrom = this.dateService.dateToUnix( date );\n\t\tconst unixTo = this.dateService.dateToUnix( to );\n\t\t\n\t\tif ( unixFrom > unixTo )\n\t\t\treturn new DateTimeRange( unixTo, unixFrom );\n\t\telse\n\t\t\treturn new DateTimeRange( unixFrom, unixTo );\n\t}\n\t\n\tset value( input: DateTimeRange | null | undefined ) {\n\t\t\n\t\tif ( input === null || input === undefined ) {\n\t\t\tif ( !this.required ) {\n\t\t\t\tthis.parts.setValue( {\n\t\t\t\t\t date: null,\n\t\t\t\t\t fhour: 0,\n\t\t\t\t\t fminute: 0,\n\t\t\t\t\t thour: 0,\n\t\t\t\t\t tminute: 0,\n\t\t\t\t } );\n\n\t\t\t\tthis.startChangeValue();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst fromDate = this.dateService.unixToLocal( input.start );\n\t\tconst toDate = this.dateService.unixToLocal( input.end );\n\n\t\tif ( fromDate === null || toDate === null )\n\t\t\treturn;\n\n\t\tconst fromHour = fromDate.getHours() ?? 0;\n\t\tconst fromMinute = fromDate.getMinutes() ?? 0;\n\t\tconst toHour = toDate.getHours() ?? 0;\n\t\tconst toMinute = toDate.getMinutes() ?? 0;\n\t\t\n\t\tthis.parts.setValue( {\n\t\t\t date: fromDate,\n\t\t\t fhour: fromHour,\n\t\t\t fminute: fromMinute,\n\t\t\t thour: toHour,\n\t\t\t tminute: toMinute,\n\t\t } );\n\t\t\n\t\tthis.startChangeValue();\n\t}\n\t\n\tprivate runCheck(): void {\n\t\t\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\t\t\n\t\tconst val = this.value;\n\t\tif ( val === this._lastValue )\n\t\t\tthis.stateChanges.next();\n\t\telse if ( val === null || val === undefined || this._lastValue === null || this._lastValue === undefined )\n\t\t\tthis.changeValue( val );\n\t\telse if ( val.start == this._lastValue.start && val.end == this._lastValue.end )\n\t\t\tthis.stateChanges.next();\n\t\telse\n\t\t\tthis.changeValue( val );\n\t}\n\t\n\tprotected startChangeValue(): void {\n\t\tthis.runChangeValue( this.value );\n\t}\n\t\n\tprivate changeValue( val: DateTimeRange | null | undefined ) {\n\n\t\tthis._lastValue = val ?? null;\n\t\tthis.runChangeValue( val );\n\t}\n\t\n\tget empty() {\n\t\tconst inputElement = this._elementRef.nativeElement.childNodes[ 0 ] as HTMLInputElement;\n\t\treturn this.value === null && inputElement.value === '';\n\t}\n\t\n\twriteValue( value: DateTimeRange | null ): void {\n\t\tthis.value = value;\n\t}\n\t\n\tgetInt( num: string ): number {\n\t\t\n\t\treturn parseInt( num );\n\t}\n}\n","<ng-container [formGroup]=\"parts\">\n\t<input matInput formControlName=\"date\" [matDatepicker]=\"picker\" [required]=\"required\" [min]=\"minDate\" [max]=\"maxDate\">\n\n\t<mat-select formControlName=\"fhour\" class=\"time\" [required]=\"required\">\n\t\t@for (h of hours; track h; let i = $index) {\n\t\t\t<mat-option [value]=\"getInt(h)\">{{ h }}</mat-option>\n\t\t}\n\t</mat-select>\n\t<span class=\"spacert\">:</span>\n\t<mat-select formControlName=\"fminute\" class=\"time\" [required]=\"required\">\n\t\t@for (m of minutes; track m; let i = $index) {\n\t\t\t<mat-option [value]=\"getInt(m)\">{{ m }}</mat-option>\n\t\t}\n\t</mat-select>\n\n\t<span class=\"spacer\">-</span>\n\n\t<mat-select formControlName=\"thour\" class=\"time\" [required]=\"required\">\n\t\t@for (h of hours; track h; let i = $index) {\n\t\t\t<mat-option [value]=\"getInt(h)\">{{ h }}</mat-option>\n\t\t}\n\t</mat-select>\n\t<span class=\"spacert\">:</span>\n\t<mat-select formControlName=\"tminute\" class=\"time\" [required]=\"required\">\n\t\t@for (m of minutes; track m; let i = $index) {\n\t\t\t<mat-option [value]=\"getInt(m)\">{{ m }}</mat-option>\n\t\t}\n\t</mat-select>\n\n\t<mat-datepicker-toggle matIconSuffix [for]=\"picker\">\n\t\t<mat-icon matDatepickerToggleIcon>today</mat-icon>\n\t</mat-datepicker-toggle>\n\t<mat-datepicker #picker></mat-datepicker>\n</ng-container>","import {\n\tComponent,\n\tinject,\n\tInput,\n\tOnInit,\n} from '@angular/core';\nimport {\n\tControlValueAccessor,\n\tFormBuilder,\n\tFormControl,\n\tFormGroup,\n\tFormsModule,\n\tReactiveFormsModule\n} from '@angular/forms';\nimport { MatFormFieldControl, MatSuffix } from '@angular/material/form-field';\nimport { XiriLocaleService } from '../../services/locale.service';\nimport { XiriFormField } from \"../field.interface\";\nimport { MatIcon } from '@angular/material/icon';\nimport {\n\tMatDatepickerToggle,\n\tMatDatepickerToggleIcon,\n\tMatDateRangeInput,\n\tMatDateRangePicker,\n\tMatEndDate,\n\tMatStartDate\n} from '@angular/material/datepicker';\nimport { XiriFieldMain } from \"../helper/fieldmain\";\n\n\ninterface DateRangeForm {\n\tstart: FormControl<Date | null>\n\tend: FormControl<Date | null>\n}\n\nlet nextUniqueIdXiriDateRange = 0;\n\nclass DateRange {\n\tconstructor( public start: number, public end: number ) {\n\t}\n}\n\n@Component( {\n\t selector: 'xiri-date-range',\n\t templateUrl: './daterange.component.html',\n\t styleUrl: './daterange.component.scss',\n\t host: {\n\t\t '[id]': 'id',\n\t\t '(focus)': 'focus()',\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriDateRangeComponent\n\t } ],\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatDateRangeInput,\n\t\t MatStartDate,\n\t\t MatEndDate,\n\t\t MatDatepickerToggle,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatDatepickerToggleIcon,\n\t\t MatDateRangePicker,\n\t ]\n } )\nexport class XiriDateRangeComponent extends XiriFieldMain<DateRange | null | undefined> implements OnInit,\n ControlValueAccessor,\n MatFormFieldControl<DateRange | null | undefined> {\n\t\n\tprotected _uid = `xiri-date-${ nextUniqueIdXiriDateRange++ }`;\n\t\n\tpublic minDate: Date | null = null;\n\tpublic maxDate: Date | null = null;\n\t\n\tparts: FormGroup<DateRangeForm>;\n\t\n\tprivate _lastValue: DateRange | null = null;\n\t\n\tprivate dateService = inject( XiriLocaleService );\n\tprivate fb = inject( FormBuilder );\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis._id = this._uid;\n\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\n\t\tthis.parts = this.fb.group<DateRangeForm>( {\n\t\t\t start: new FormControl<Date | null>( null ),\n\t\t\t end: new FormControl<Date | null>( null ),\n\t\t } );\n\t}\n\t\n\tngOnInit() {\n\t\t\n\t\tthis.subs.add( this.parts.valueChanges.subscribe( () => {\n\t\t\tthis.runCheck();\n\t\t} ) );\n\t\t\n\t\tsuper.ngOnInit();\n\t}\n\t\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\t\n\t\tif ( value.min )\n\t\t\tthis.minDate = this.dateService.unixToLocal( value.min );\n\t\tif ( value.max )\n\t\t\tthis.maxDate = this.dateService.unixToLocal( value.max );\n\t\t\n\t\tthis.required = !!value.required;\n\t\tthis.disabled = !!value.disabled;\n\t\tif ( this.disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget value(): DateRange | null | undefined {\n\t\t\n\t\tconst { start, end } = this.parts.value;\n\n\t\tif ( start == null || end == null ) {\n\t\t\tif ( this.required ) {\n\t\t\t\treturn this.parts.valid ? null : this._disabled() ? null : undefined;\n\t\t\t} else {\n\t\t\t\tif ( start === end )\n\t\t\t\t\treturn this.parts.valid ? null : this._disabled() ? null : undefined;\n\t\t\t\telse\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t\t\n\t\tconst unixFrom = this.dateService.dateToUnix( start );\n\t\tconst unixTo = this.dateService.dateToUnix( end );\n\t\t\n\t\tif ( unixFrom > unixTo )\n\t\t\treturn new DateRange( unixTo, unixFrom );\n\t\telse\n\t\t\treturn new DateRange( unixFrom, unixTo );\n\t}\n\t\n\tset value( input: DateRange | null | undefined ) {\n\t\t\n\t\tif ( input === null || input === undefined ) {\n\t\t\tthis.parts.setValue( {\n\t\t\t\t start: null,\n\t\t\t\t end: null,\n\t\t\t } );\n\n\t\t\tthis.startChangeValue();\n\t\t\treturn;\n\t\t}\n\n\t\tconst start = this.dateService.unixToLocal( input.start );\n\t\tconst end = this.dateService.unixToLocal( input.end );\n\n\t\tthis.parts.setValue( {\n\t\t\t start: start,\n\t\t\t end: end,\n\t\t } );\n\n\t\tthis.startChangeValue();\n\t}\n\t\n\tprivate runCheck(): void {\n\t\t\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\t\t\n\t\tconst val = this.value;\n\t\tif ( val === this._lastValue )\n\t\t\tthis.stateChanges.next();\n\t\telse if ( val === null || val === undefined || this._lastValue === null || this._lastValue === undefined )\n\t\t\tthis.changeValue( val );\n\t\telse if ( val.start == this._lastValue.start && val.end == this._lastValue.end )\n\t\t\tthis.stateChanges.next();\n\t\telse\n\t\t\tthis.changeValue( val );\n\t}\n\t\n\tprotected startChangeValue(): void {\n\t\tthis.runChangeValue( this.value );\n\t}\n\t\n\tprivate changeValue( val: DateRange | null | undefined ) {\n\n\t\tthis._lastValue = val ?? null;\n\t\tthis.runChangeValue( val );\n\t}\n\t\n\tget empty() {\n\t\tconst inputElement1 = this._elementRef.nativeElement.childNodes[ 0 ].childNodes[ 0 ] as HTMLInputElement;\n\t\tconst inputElement2 = this._elementRef.nativeElement.childNodes[ 0 ].childNodes[ 1 ] as HTMLInputElement;\n\t\treturn this.value === null && inputElement1.value === '' && inputElement2.value === '';\n\t}\n\t\n\twriteValue( value: DateRange | null ): void {\n\t\tthis.value = value;\n\t}\n}\n","<ng-container [formGroup]=\"parts\">\n\t<mat-date-range-input [rangePicker]=\"picker\" [required]=\"required\" [min]=\"minDate\" [max]=\"maxDate\">\n\t\t<input matStartDate formControlName=\"start\" placeholder=\"Start date\" [required]=\"required\">\n\t\t<input matEndDate formControlName=\"end\" placeholder=\"End date\" [required]=\"required\">\n\t</mat-date-range-input>\n\n\t<mat-datepicker-toggle matIconSuffix [for]=\"picker\">\n\t\t<mat-icon matDatepickerToggleIcon>today</mat-icon>\n\t</mat-datepicker-toggle>\n\t<mat-date-range-picker #picker></mat-date-range-picker>\n</ng-container>","import {\n\tComponent,\n\tinject,\n\tInput,\n\tOnInit,\n} from '@angular/core';\nimport {\n\tControlValueAccessor,\n\tFormControl,\n\tFormGroup,\n\tFormBuilder,\n\tFormsModule,\n\tReactiveFormsModule\n} from '@angular/forms';\nimport { MatFormFieldControl, MatSuffix } from '@angular/material/form-field';\nimport { XiriLocaleService } from '../../services/locale.service';\nimport { XiriFormField } from \"../field.interface\";\nimport { MatOption } from \"@angular/material/core\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatSelect } from '@angular/material/select';\nimport {\n\tMatDatepickerInput,\n\tMatDatepickerToggle,\n\tMatDatepickerToggleIcon,\n\tMatDatepicker\n} from '@angular/material/datepicker';\nimport { MatInput } from '@angular/material/input';\nimport { XiriFieldMain } from \"../helper/fieldmain\";\n\ninterface DateForm {\n\tdate: FormControl<Date | null>\n\thour: FormControl<number>\n\tminute: FormControl<number>\n}\n\nlet nextUniqueIdXiriDate = 0;\n\n\n@Component( {\n\t selector: 'xiri-date',\n\t templateUrl: './date.component.html',\n\t styleUrl: './date.component.scss',\n\t host: {\n\t\t '[id]': 'id',\n\t\t '(focus)': 'focus()',\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriDateComponent\n\t } ],\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatInput,\n\t\t MatDatepickerInput,\n\t\t MatSelect,\n\t\t MatOption,\n\t\t MatDatepickerToggle,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatDatepickerToggleIcon,\n\t\t MatDatepicker,\n\t ]\n } )\nexport class XiriDateComponent extends XiriFieldMain<number | null | undefined> implements OnInit,\n ControlValueAccessor,\n MatFormFieldControl<number | null | undefined> {\n\t\n\tprotected _uid = `xiri-date-${ nextUniqueIdXiriDate++ }`;\n\n\tpublic minDate: Date | null = null;\n\tpublic maxDate: Date | null = null;\n\n\tparts: FormGroup<DateForm>;\n\n\tprivate _lastValue: number | null = null;\n\tpublic type = 'date';\n\t\n\t\n\thours = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09',\n\t '10', '11', '12', '13', '14', '15', '16', '17', '18', '19',\n\t '20', '21', '22', '23' ];\n\tminutes = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09',\n\t '10', '11', '12', '13', '14', '15', '16', '17', '18', '19',\n\t '20', '21', '22', '23', '24', '25', '26', '27', '28', '29',\n\t '30', '31', '32', '33', '34', '35', '36', '37', '38', '39',\n\t '40', '41', '42', '43', '44', '45', '46', '47', '48', '49',\n\t '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', ];\n\t\n\tprivate dateService = inject( XiriLocaleService );\n\tprivate fb = inject( FormBuilder );\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis._id = this._uid;\n\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\n\t\tthis.parts = this.fb.group<DateForm>( {\n\t\t\t date: new FormControl<Date | null>( null ),\n\t\t\t hour: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t minute: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t } );\n\t}\n\t\n\tngOnInit() {\n\t\t\n\t\tthis.subs.add( this.parts.valueChanges.subscribe( () => {\n\t\t\tthis.runCheck();\n\t\t} ) );\n\t\t\n\t\tsuper.ngOnInit();\n\t}\n\t\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\t\n\t\tthis.type = value.subtype ? value.subtype : 'date';\n\t\t\n\t\tif ( value.min )\n\t\t\tthis.minDate = this.dateService.unixToLocal( value.min );\n\t\tif ( value.max )\n\t\t\tthis.maxDate = this.dateService.unixToLocal( value.max );\n\t\t\n\t\tthis.required = !!value.required;\n\t\tthis.disabled = !!value.disabled;\n\t\tif ( this.disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget value(): number | null | undefined {\n\t\t\n\t\tconst { date, hour, minute } = this.parts.value;\n\t\t\n\t\tif ( !date && !this.required && !this.parts.valid )\n\t\t\treturn this._disabled() ? null : undefined;\n\t\tif ( !date || hour === undefined || minute === undefined )\n\t\t\treturn null;\n\t\t\n\t\tdate.setHours( hour );\n\t\tdate.setMinutes( minute );\n\t\t\n\t\treturn this.dateService.dateToUnix( date );\n\t}\n\t\n\tset value( input: number | null | undefined ) {\n\n\t\tif ( input === null || input === undefined ) {\n\t\t\tthis.parts.setValue( {\n\t\t\t\t date: null,\n\t\t\t\t hour: 0,\n\t\t\t\t minute: 0,\n\t\t\t } );\n\n\t\t\tthis.startChangeValue();\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = this.dateService.unixToLocal( input );\n\t\tconst hour = current?.getHours() ?? 0;\n\t\tconst minute = current?.getMinutes() ?? 0;\n\n\t\tthis.parts.setValue( {\n\t\t\t date: current,\n\t\t\t hour: hour,\n\t\t\t minute: minute,\n\t\t } );\n\n\t\tthis.startChangeValue();\n\t}\n\t\n\tprivate runCheck(): void {\n\t\t\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\t\t\n\t\tconst val = this.value;\n\t\tif ( val === this._lastValue )\n\t\t\tthis.stateChanges.next();\n\t\telse\n\t\t\tthis.changeValue( val );\n\t}\n\t\n\tprotected startChangeValue(): void {\n\t\tthis.runChangeValue( this.value );\n\t}\n\t\n\tprivate changeValue( val: number | null | undefined ) {\n\n\t\tthis._lastValue = val ?? null;\n\t\tthis.runChangeValue( val );\n\t}\n\t\n\toverride get empty() {\n\t\tconst inputElement = this._elementRef.nativeElement.childNodes[ 0 ] as HTMLInputElement;\n\t\treturn this.value === null && inputElement.value === '';\n\t}\n\t\n\toverride writeValue( value: number | null ): void {\n\t\tthis.value = value;\n\t}\n}\n","<ng-container [formGroup]=\"parts\">\n\t<input matInput formControlName=\"date\" class=\"date\" [required]=\"required\" [min]=\"minDate\" [max]=\"maxDate\" [matDatepicker]=\"picker\">\n\n\t@if (type === 'datetime') {\n\t\t<mat-select formControlName=\"hour\" class=\"time\" [required]=\"required\">\n\t\t\t@for (h of hours; track h; let i = $index) {\n\t\t\t\t<mat-option [value]=\"i\">{{ h }}</mat-option>\n\t\t\t}\n\t\t</mat-select>\n\t\t<span class=\"spacer\">:</span>\n\t\t<mat-select formControlName=\"minute\" class=\"time\" [required]=\"required\">\n\t\t\t@for (m of minutes; track m; let i = $index) {\n\t\t\t\t<mat-option [value]=\"i\">{{ m }}</mat-option>\n\t\t\t}\n\t\t</mat-select>\n\t}\n\n\t<mat-datepicker-toggle matIconSuffix [for]=\"picker\">\n\t\t<mat-icon matDatepickerToggleIcon>today</mat-icon>\n\t</mat-datepicker-toggle>\n\t<mat-datepicker #picker></mat-datepicker>\n</ng-container>","import {\n\tComponent,\n\tinject,\n\tInput,\n\tOnInit,\n\tviewChild\n} from '@angular/core';\nimport {\n\tControlValueAccessor,\n\tFormControl,\n\tFormsModule,\n\tReactiveFormsModule\n} from '@angular/forms';\nimport { MatFormFieldControl, MatSuffix } from '@angular/material/form-field';\nimport { MAT_DATE_FORMATS } from '@angular/material/core';\nimport { MatIcon } from '@angular/material/icon';\nimport {\n\tMatDatepicker,\n\tMatDatepickerInput,\n\tMatDatepickerToggle,\n\tMatDatepickerToggleIcon\n} from '@angular/material/datepicker';\nimport { MatInput } from '@angular/material/input';\nimport { XiriLocaleService } from '../../services/locale.service';\nimport { XiriFormField } from '../field.interface';\nimport { XiriFieldMain } from '../helper/fieldmain';\n\nlet nextUniqueIdXiriYearMonth = 0;\n\nexport const XIRI_YEAR_MONTH_FORMATS = {\n\tparse: { dateInput: 'MM.yyyy' },\n\tdisplay: {\n\t\tdateInput: 'MM.yyyy',\n\t\tmonthYearLabel: 'MMM yyyy',\n\t\tdateA11yLabel: 'LL',\n\t\tmonthYearA11yLabel: 'MMMM yyyy',\n\t},\n};\n\n@Component( {\n\t selector: 'xiri-yearmonth',\n\t templateUrl: './yearmonth.component.html',\n\t styleUrl: './yearmonth.component.scss',\n\t host: {\n\t\t '[id]': 'id',\n\t\t '(focus)': 'focus()',\n\t },\n\t providers: [\n\t\t { provide: MatFormFieldControl, useExisting: XiriYearMonthComponent },\n\t\t { provide: MAT_DATE_FORMATS, useValue: XIRI_YEAR_MONTH_FORMATS },\n\t ],\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatInput,\n\t\t MatDatepickerInput,\n\t\t MatDatepickerToggle,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatDatepickerToggleIcon,\n\t\t MatDatepicker,\n\t ]\n } )\nexport class XiriYearMonthComponent extends XiriFieldMain<number | null | undefined> implements OnInit,\n ControlValueAccessor,\n MatFormFieldControl<number | null | undefined> {\n\n\tprotected _uid = `xiri-yearmonth-${ nextUniqueIdXiriYearMonth++ }`;\n\n\tpublic minDate: Date | null = null;\n\tpublic maxDate: Date | null = null;\n\n\tdateControl = new FormControl<Date | null>( null );\n\n\treadonly picker = viewChild<MatDatepicker<Date>>('picker');\n\n\tprivate _lastValue: number | null = null;\n\tpublic type = 'yearmonth';\n\n\tprivate dateService = inject( XiriLocaleService );\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis._id = this._uid;\n\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\t}\n\n\tngOnInit() {\n\t\tthis.subs.add( this.dateControl.valueChanges.subscribe( () => {\n\t\t\tthis.runCheck();\n\t\t} ) );\n\n\t\tsuper.ngOnInit();\n\t}\n\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\tif ( value.min )\n\t\t\tthis.minDate = this.dateService.unixToLocal( value.min );\n\t\tif ( value.max )\n\t\t\tthis.maxDate = this.dateService.unixToLocal( value.max );\n\n\t\tthis.required = !!value.required;\n\t\tthis.disabled = !!value.disabled;\n\t\tif ( this.disabled )\n\t\t\tthis.dateControl.disable();\n\t\telse\n\t\t\tthis.dateControl.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\n\t@Input()\n\tget value(): number | null | undefined {\n\t\tconst date = this.dateControl.value;\n\n\t\tif ( !date && !this.required && !this.dateControl.valid )\n\t\t\treturn this._disabled() ? null : undefined;\n\t\tif ( !date )\n\t\t\treturn null;\n\n\t\treturn this.dateService.dateToUnix( date );\n\t}\n\n\tset value( input: number | null | undefined ) {\n\t\tif ( input === null || input === undefined ) {\n\t\t\tthis.dateControl.setValue( null );\n\t\t\tthis.startChangeValue();\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = this.dateService.unixToLocal( input );\n\n\t\tif ( current ) {\n\t\t\tcurrent.setDate( 1 );\n\t\t\tcurrent.setHours( 0, 0, 0, 0 );\n\t\t}\n\n\t\tthis.dateControl.setValue( current );\n\t\tthis.startChangeValue();\n\t}\n\n\tonYearMonthSelected( date: Date ): void {\n\t\tconst normalized = new Date( date.getFullYear(), date.getMonth(), 1, 0, 0, 0, 0 );\n\t\tthis.dateControl.setValue( normalized );\n\t\tthis.picker()?.close();\n\t}\n\n\tprivate runCheck(): void {\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\n\t\tconst val = this.value;\n\t\tif ( val === this._lastValue )\n\t\t\tthis.stateChanges.next();\n\t\telse\n\t\t\tthis.changeValue( val );\n\t}\n\n\tprotected startChangeValue(): void {\n\t\tthis.runChangeValue( this.value );\n\t}\n\n\tprivate changeValue( val: number | null | undefined ) {\n\t\tthis._lastValue = val ?? null;\n\t\tthis.runChangeValue( val );\n\t}\n\n\toverride get empty() {\n\t\treturn this.dateControl.value === null;\n\t}\n\n\toverride writeValue( value: number | null ): void {\n\t\tthis.value = value;\n\t}\n}\n","<input matInput [formControl]=\"dateControl\" class=\"date\" [required]=\"required\"\n [min]=\"minDate\" [max]=\"maxDate\" [matDatepicker]=\"picker\">\n\n<mat-datepicker-toggle matIconSuffix [for]=\"picker\">\n\t<mat-icon matDatepickerToggleIcon>today</mat-icon>\n</mat-datepicker-toggle>\n<mat-datepicker #picker startView=\"multi-year\" (monthSelected)=\"onYearMonthSelected($event)\"></mat-datepicker>\n","import { inject, Injectable } from '@angular/core';\nimport { MatSnackBar, MatSnackBarConfig, MatSnackBarRef, TextOnlySnackBar } from '@angular/material/snack-bar';\n\nexport type XiriSnackbarType = 'success' | 'error' | 'info' | 'warning';\n\n@Injectable( {\n\t providedIn: 'root',\n } )\nexport class XiriSnackbarService {\n\n\tprivate snackbar = inject( MatSnackBar );\n\n\tsuccess( message: string, duration = 3000, action?: string ): MatSnackBarRef<TextOnlySnackBar> {\n\t\treturn this.show( message, 'success', duration, action );\n\t}\n\n\terror( message: string, duration = 5000, action?: string ): MatSnackBarRef<TextOnlySnackBar> {\n\t\treturn this.show( message, 'error', duration, action );\n\t}\n\n\tinfo( message: string, duration = 3000, action?: string ): MatSnackBarRef<TextOnlySnackBar> {\n\t\treturn this.show( message, 'info', duration, action );\n\t}\n\n\twarning( message: string, duration = 4000, action?: string ): MatSnackBarRef<TextOnlySnackBar> {\n\t\treturn this.show( message, 'warning', duration, action );\n\t}\n\n\thandleResponse( response: unknown ): boolean {\n\t\tconst res = response as { message?: string; messageType?: string } | null | undefined;\n\t\tif ( !res?.message || !res?.messageType ) return false;\n\t\tswitch ( res.messageType as XiriSnackbarType ) {\n\t\t\tcase 'success': this.success( res.message ); break;\n\t\t\tcase 'error': this.error( res.message ); break;\n\t\t\tcase 'info': this.info( res.message ); break;\n\t\t\tcase 'warning': this.warning( res.message ); break;\n\t\t\tdefault: this.info( res.message );\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate show( message: string, type: XiriSnackbarType, duration: number, action?: string ): MatSnackBarRef<TextOnlySnackBar> {\n\t\tconst config: MatSnackBarConfig = {\n\t\t\tduration: duration,\n\t\t\thorizontalPosition: 'center',\n\t\t\tverticalPosition: 'bottom',\n\t\t\tpanelClass: [ `xiri-snackbar-${ type }` ],\n\t\t\tpoliteness: type === 'error' ? 'assertive' : 'polite',\n\t\t};\n\n\t\treturn this.snackbar.open( message, action || undefined, config );\n\t}\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Observable, tap } from 'rxjs';\nimport { XiriSnackbarService } from './snackbar.service';\n\nexport class XiriDataServiceConfig {\n\tapi = '/api/';\n}\n\nexport const defaultXiriDataServiceConfig: XiriDataServiceConfig = {\n\tapi: '/api/',\n};\n\n@Injectable( {\n\t providedIn: 'root',\n } )\nexport class XiriDataService {\n\t\n\tprivate http: HttpClient = inject( HttpClient );\n\tprivate config: XiriDataServiceConfig = inject( XiriDataServiceConfig );\n\tprivate snackbar = inject( XiriSnackbarService );\n\n\tpublic get( url: string ): Observable<object> {\n\t\treturn this.http.get( this.config.api + url ).pipe(\n\t\t\ttap( ( res: object ) => this.snackbar.handleResponse( res ) )\n\t\t);\n\t}\n\n\tpublic post( url: string, data: unknown ): Observable<unknown> {\n\t\treturn this.http.post( this.config.api + url, data ).pipe(\n\t\t\ttap( ( res: unknown ) => this.snackbar.handleResponse( res ) )\n\t\t);\n\t}\n\n\tpublic postFile( url: string, data: unknown ): Observable<Blob> {\n\t\treturn this.http.post( this.config.api + url, data, { responseType: 'blob' } );\n\t}\n\n\tpublic postFileResponse( url: string, data: unknown ): Observable<HttpResponse<Blob>> {\n\t\treturn this.http.post( this.config.api + url, data, { observe: 'response', responseType: 'blob' } );\n\t}\n\n\t/** @deprecated Use postFileResponse() + XiriDownloadService.download() instead */\n\tpublic postDownload( url: string, data: unknown ) {\n\t\tconsole.warn( 'XiriDataService.postDownload() is deprecated. Use postFileResponse() + XiriDownloadService.download() instead.' );\n\t\tconst downForm = document.createElement( 'form' );\n\t\tdownForm.target = '_blank';\n\t\tdownForm.method = 'POST';\n\t\tdownForm.action = url;\n\t\t\n\t\tconst input = document.createElement( 'input' );\n\t\tinput.type = 'hidden';\n\t\tinput.name = 'data';\n\t\tinput.setAttribute( 'value', JSON.stringify( data ) );\n\t\tdownForm.appendChild( input );\n\t\t\n\t\tdocument.body.appendChild( downForm );\n\t\tdownForm.submit();\n\t}\n\t\n\tpublic getConfigApi(): string {\n\t\treturn this.config.api;\n\t}\n}\n","import {\n\tComponent,\n\tDestroyRef,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tOnInit,\n\toutput,\n\tviewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { debounceTime, distinctUntilChanged, Subject } from \"rxjs\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { FormsModule } from '@angular/forms';\n\n@Component( {\n\t selector: 'xiri-search',\n\t templateUrl: './search.component.html',\n\t styleUrls: [ './search.component.scss' ],\n\t host: {\n\t\t '(document:keydown.escape)': 'onKeydownHandler()'\n\t },\n\t imports: [\n\t\t FormsModule,\n\t\t CdkTrapFocus,\n\t\t MatIconButton,\n\t\t MatIcon,\n\t ],\n } )\nexport class XiriSearchComponent implements OnInit {\n\n\tchanged = output<string>();\n\tplaceholder = input<string>( '' );\n\n\topen = input<boolean>( false );\n\treset = input<number>( -1 );\n\tescape = input<boolean>( true );\n\tfocus = input<number>( -1 );\n\n\tprivate _search = viewChild<ElementRef>( 'search' );\n\tprivate destroyRef = inject( DestroyRef );\n\tprivate filter: Subject<string> = new Subject<string>();\n\t\n\tpublic _text = '';\n\tpublic show = false;\n\t\n\tconstructor() {\n\t\t\n\t\teffect( () => {\n\t\t\tconst num = this.reset();\n\t\t\tif ( num != -1 ) {\n\t\t\t\tthis.show = this.open();\n\t\t\t\tthis._text = '';\n\t\t\t\tthis.filter.next( this._text );\n\t\t\t}\n\t\t} );\n\t\teffect( () => {\n\t\t\tconst num = this.focus();\n\t\t\tif ( num != -1 ) {\n\t\t\t\tthis.show = true;\n\t\t\t\tthis._search()?.nativeElement.focus();\n\t\t\t}\n\t\t} );\n\t\teffect( () => {\n\t\t\tconst value = this.text();\n\t\t\tif ( value ) {\n\t\t\t\tthis._text = value;\n\t\t\t\tthis.show = true;\n\t\t\t}\n\t\t} );\n\t}\n\t\n\tngOnInit(): void {\n\t\tthis.filter.pipe( debounceTime( 200 ), distinctUntilChanged(), takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( value => {\n\t\t\t\tthis.changed.emit( value );\n\t\t\t} );\n\t\t\n\t\tif ( this.open() )\n\t\t\tthis.show = true;\n\t}\n\t\n\tonKeydownHandler() {\n\t\t\n\t\tif ( this.escape() && this.show ) {\n\t\t\tthis.show = this.open() ? true : !this.show;\n\t\t\tthis._text = '';\n\t\t\tthis.filter.next( this._text );\n\t\t}\n\t}\n\t\n\ttext = input<string>( '' );\n\t\n\tsearchDo() {\n\t\tthis.filter.next( this._text );\n\t}\n\n\tclick(): void {\n\t\tthis.show = this.open() ? true : !this.show;\n\t\tthis._text = '';\n\t\t\n\t\tthis.filter.next( this._text );\n\t}\n\t\n}\n","<div class=\"search\" [class.open]=\"show\">\n\t@if (show) {\n\t\t<input type=\"text\" name=\"input\" class=\"input lens\" autocomplete=\"off\"\n\t\t [cdkTrapFocusAutoCapture]=\"show\" [cdkTrapFocus]=\"show\"\n\t\t [placeholder]=\"placeholder()\"\n\t\t [class.open]=\"show\"\n\t\t (keyup)=\"searchDo()\" [value]=\"_text\" [(ngModel)]=\"_text\">\n\t}\n\t<button mat-icon-button color=\"primary\" (click)=\"click()\" [attr.aria-label]=\"show ? 'Suche schließen' : 'Suche öffnen'\">\n\t\t<mat-icon>{{ show ? 'close' : 'search' }}</mat-icon>\n\t</button>\n</div>","import {\n\tAfterViewInit,\n\tComponent,\n\tinject,\n\tInput,\n\tsignal,\n\tviewChild\n} from '@angular/core';\nimport { MatFormFieldControl } from \"@angular/material/form-field\";\nimport { ControlValueAccessor } from \"@angular/forms\";\nimport { BehaviorSubject } from \"rxjs\";\nimport {\n\tMatTree,\n\tMatTreeNestedDataSource,\n\tMatTreeNode, MatTreeNodeDef,\n\tMatTreeNodePadding,\n\tMatTreeNodeToggle\n} from \"@angular/material/tree\";\nimport { SelectionModel } from \"@angular/cdk/collections\";\nimport { XiriDataService } from \"../../services/data.service\";\nimport { XiriSnackbarService } from '../../services/snackbar.service';\nimport { XiriFormField } from \"../field.interface\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { XiriSearchComponent } from '../../search/search.component';\nimport { XiriFieldMain } from \"../helper/fieldmain\";\n\n\n// Node ids are backend values passed through untouched — an int64 row id or a string\n// key. Coercing them to number would round anything above 2^53 and make a non-numeric\n// key NaN.\nexport type XiriTreeselectId = string | number;\n\nclass XiriTreeselectTreeNode {\n\tchildren!: XiriTreeselectTreeNode[];\n\tid!: XiriTreeselectId;\n\tname!: string;\n\thidden!: boolean;\n\tstate!: number;\n\tparent!: XiriTreeselectTreeNode | null;\n}\n\nlet nextUniqueIdXiriTreeselect = 0;\n\n@Component( {\n\t selector: 'xiri-treeselect',\n\t templateUrl: './treeselect.component.html',\n\t styleUrl: './treeselect.component.scss',\n\t host: {\n\t\t '[id]': 'id',\n\t\t '(focus)': 'focus()',\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriTreeselectComponent\n\t } ],\n\t imports: [\n\t\t XiriSearchComponent,\n\t\t MatProgressSpinner,\n\t\t MatTree,\n\t\t MatTreeNode,\n\t\t MatTreeNodeToggle,\n\t\t MatTreeNodePadding,\n\t\t MatIconButton,\n\t\t MatCheckbox,\n\t\t MatIcon,\n\t\t MatTreeNodeDef,\n\t ]\n } )\nexport class XiriTreeselectComponent extends XiriFieldMain<XiriTreeselectId[] | undefined> implements ControlValueAccessor,\n MatFormFieldControl<XiriTreeselectId[] | undefined>,\n AfterViewInit {\n\t\n\tprivate dataService = inject( XiriDataService );\n\tprivate snackbar = inject( XiriSnackbarService );\n\t\n\tprotected _uid = `xiri-treeselect-${ nextUniqueIdXiriTreeselect++ }`;\n\t\n\tpublic loading = signal<boolean>( true );\n\tprivate _field!: XiriFormField;\n\t\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis._id = this._uid;\n\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\n\t\tthis.dataSource = new MatTreeNestedDataSource();\n\t\tthis.dataSource.data = [];\n\t}\n\t\n\tpublic ngAfterViewInit(): void {\n\t\t\n\t\tthis.subs.add( this.dataChange.subscribe( data => {\n\t\t\t\n\t\t\tif ( data === null )\n\t\t\t\treturn;\n\t\t\t\n\t\t\tthis.dataSource.data = data;\n\t\t\t// this.tree().expandAll();\n\t\t\t\n\t\t\tthis._input.forEach( x => {\n\t\t\t\tthis.dataSource.data.forEach( d => {\n\t\t\t\t\tconst node = this.findNodeById( x, d );\n\t\t\t\t\tif ( node )\n\t\t\t\t\t\tthis.treeItemSelectionToggle( node );\n\t\t\t\t} );\n\t\t\t} );\n\t\t\t\n\t\t\tthis.loading.set( false );\n\t\t} ) );\n\t}\n\t\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\t\n\t\tthis._field = value;\n\t\t\n\t\tthis.required = !!value.required;\n\t\tthis.disabled = !!value.disabled;\n\t\t\n\t\tif ( value.url ) {\n\t\t\tthis.dataService.get( value.url ).subscribe(\n\t\t\t\t{\n\t\t\t\t\tnext: ( response: unknown ) => {\n\t\t\t\t\t\tconst data = ( response as { data?: ( XiriTreeselectTreeNode & { length?: number } ) | null } ).data;\n\t\t\t\t\t\tlet groups: XiriTreeselectTreeNode[];\n\t\t\t\t\t\tif ( data === undefined || data === null || data.length === 0 )\n\t\t\t\t\t\t\tgroups = [];\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tgroups = [ data ];\n\t\t\t\t\t\tthis.buildTree( groups, null );\n\t\t\t\t\t\tthis.dataChange.next( groups );\n\t\t\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t\t\t},\n\t\t\t\t\terror: ( err ) => {\n\t\t\t\t\t\tconsole.log( 'error database-tree', err );\n\t\t\t\t\t\tthis.snackbar.error( 'Unknown Error! Please try again later' );\n\t\t\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t} else {\n\t\t\tlet groups = ( value.list ?? [] ) as unknown as XiriTreeselectTreeNode[];\n\t\t\tif ( !groups || groups.length === 0 )\n\t\t\t\tgroups = [];\n\n\t\t\tthis.buildTree( groups, null );\n\t\t\tthis.dataChange.next( groups );\n\t\t}\n\n\t\tthis.stateChanges.next();\n\t}\n\n\tget field(): XiriFormField {\n\t\treturn this._field;\n\t}\n\n\tprivate buildTree( input: XiriTreeselectTreeNode[], parent: XiriTreeselectTreeNode | null ) {\n\t\tfor ( let i = 0; i != input.length; i++ ) {\n\t\t\tinput[ i ].parent = parent;\n\t\t\tinput[ i ].state = 0;\n\t\t\tif ( input[ i ].children ) {\n\t\t\t\tthis.buildTree( input[ i ].children, input[ i ] );\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate _input: XiriTreeselectId[] = [];\n\t// Unterdrückt das Zurückschreiben an das FormControl, während writeValue die Auswahl aus dem\n\t// Modell in den Baum spiegelt (CVA-Vertrag: writeValue darf onChange nicht auslösen).\n\tprivate _suppressEmit = false;\n\n\t@Input()\n\tget value(): XiriTreeselectId[] | undefined {\n\n\t\tconst result = this.checklistSelection.selected.filter( x => x.state === 1 && !x.children ).map( x => x.id );\n\t\tif ( this.required && result.length == 0 )\n\t\t\treturn undefined;\n\n\t\treturn result;\n\t}\n\n\tset value( input: XiriTreeselectId[] | undefined ) {\n\n\t\tif ( input === null || input === undefined )\n\t\t\tinput = [];\n\n\t\tthis._input = input;\n\t\tthis.startChangeValue();\n\t}\n\t\n\tprivate runCheck(): void {\n\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\n\t\tif ( this._suppressEmit )\n\t\t\treturn;\n\n\t\tconst val = this.value;\n\t\tthis.runChangeValue( val );\n\t}\n\t\n\tprotected startChangeValue(): void {\n\t\tthis.runChangeValue( this.value );\n\t}\n\t\n\tget empty() {\n\t\treturn this.value === undefined || this.value.length === 0;\n\t}\n\t\n\twriteValue( value: XiriTreeselectId[] ): void {\n\t\tthis._input = value ?? [];\n\t\tthis.applyInputSelection();\n\t}\n\n\t// Spiegelt this._input in die sichtbare Baum-Auswahl (checklistSelection + node.state), ohne\n\t// an das FormControl zurückzuschreiben. Dadurch räumt ein programmatisches reset()/setValue()\n\t// (z. B. Query-Filter-Chip entfernen oder „Alle zurücksetzen\") die Auswahl wirklich ab, statt\n\t// den alten Stand über den value-Getter erneut zu emittieren.\n\tprivate applyInputSelection(): void {\n\t\tconst data = this.dataSource?.data ?? [];\n\t\tif ( data.length === 0 )\n\t\t\treturn; // Baumdaten noch nicht geladen – ngAfterViewInit wendet _input später an\n\n\t\tthis._suppressEmit = true;\n\t\ttry {\n\t\t\tthis.checklistSelection.clear();\n\t\t\tdata.forEach( root => this.resetNodeState( root ) );\n\t\t\tfor ( const id of this._input ) {\n\t\t\t\tfor ( const d of data ) {\n\t\t\t\t\tconst node = this.findNodeById( id, d );\n\t\t\t\t\tif ( node )\n\t\t\t\t\t\tthis.treeItemSelectionToggle( node );\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._suppressEmit = false;\n\t\t}\n\t\tthis._changeDetectorRef.markForCheck();\n\t}\n\n\tprivate resetNodeState( node: XiriTreeselectTreeNode ): void {\n\t\tnode.state = 0;\n\t\tif ( node.children )\n\t\t\tnode.children.forEach( child => this.resetNodeState( child ) );\n\t}\n\t\n\t/**\n\t * Tree\n\t */\n\tpublic tree = viewChild.required<MatTree<XiriTreeselectTreeNode>>( MatTree );\n\tprivate dataChange = new BehaviorSubject<XiriTreeselectTreeNode[] | null>( null );\n\tpublic dataSource: MatTreeNestedDataSource<XiriTreeselectTreeNode>;\n\tprivate checklistSelection = new SelectionModel<XiriTreeselectTreeNode>( true /* multiple */ );\n\t\n\tgetChildren = ( node: XiriTreeselectTreeNode ): XiriTreeselectTreeNode[] => node.children;\n\t\n\thasChild = ( _: number, node: XiriTreeselectTreeNode ) => !!node.children && node.children.length != 0;\n\t\n\ttreeItemSelectionToggle( node: XiriTreeselectTreeNode ): void {\n\t\t\n\t\tthis.checklistSelection.toggle( node );\n\t\tconst state = this.checklistSelection.isSelected( node );\n\t\t\n\t\tnode.state = state ? 1 : 0;\n\t\tif ( node.children ) {\n\t\t\tfor ( let i = 0; i != node.children.length; i++ ) {\n\t\t\t\tthis.treeItemSelectionChildren( node.children[ i ], state );\n\t\t\t}\n\t\t}\n\t\t\n\t\tif ( node.parent )\n\t\t\tthis.treeItemSelectionParent( node.parent );\n\t\t\n\t\tthis.runCheck();\n\t}\n\t\n\tprivate treeItemSelectionParent( node: XiriTreeselectTreeNode ): void {\n\t\t\n\t\tconst result0 = node.children.filter( child => child.state === 0 );\n\t\tconst result1 = node.children.filter( child => child.state === 1 );\n\t\t\n\t\tif ( result1.length === node.children.length ) {\n\t\t\tthis.checklistSelection.select( node );\n\t\t\tnode.state = 1;\n\t\t} else if ( result0.length === node.children.length ) {\n\t\t\tthis.checklistSelection.deselect( node );\n\t\t\tnode.state = 0;\n\t\t} else {\n\t\t\tthis.checklistSelection.deselect( node );\n\t\t\tnode.state = 2;\n\t\t}\n\t\t\n\t\tif ( node.parent )\n\t\t\tthis.treeItemSelectionParent( node.parent );\n\t}\n\t\n\tprivate treeItemSelectionChildren( node: XiriTreeselectTreeNode, state: boolean ): void {\n\t\t\n\t\tif ( state )\n\t\t\tthis.checklistSelection.select( node );\n\t\telse\n\t\t\tthis.checklistSelection.deselect( node );\n\t\t\n\t\tnode.state = state ? 1 : 0;\n\t\t\n\t\tif ( node.children ) {\n\t\t\tfor ( let i = 0; i != node.children.length; i++ ) {\n\t\t\t\tthis.treeItemSelectionChildren( node.children[ i ], state );\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic searchDo( value: string ) {\n\t\t\n\t\tif ( value && value.length )\n\t\t\tthis.dataSource.data.forEach( x => this.filterByName( x, value.toLowerCase(), false ) );\n\t\telse\n\t\t\tthis.dataSource.data.forEach( x => this.filterClear( x ) );\n\t}\n\t\n\tprivate filterByName( node: XiriTreeselectTreeNode, search: string, value: boolean ): boolean {\n\t\t\n\t\tif ( value ) {\n\t\t\tnode.hidden = false;\n\t\t\tif ( node.children ) {\n\t\t\t\tnode.children.forEach( x => this.filterByName( x, search, true ) );\n\t\t\t\t\n\t\t\t\tif ( search.length > 3 )\n\t\t\t\t\tthis.tree().expand( node );\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tif ( node.name.toLowerCase().indexOf( search ) === -1 ) {\n\t\t\tnode.hidden = true;\n\t\t\tif ( node.children ) {\n\t\t\t\tconst ret = node.children.filter( x => this.filterByName( x, search, false ) );\n\t\t\t\tif ( ret.length ) {\n\t\t\t\t\tthis.tree().expand( node );\n\t\t\t\t\tnode.hidden = false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn !node.hidden;\n\t\t} else {\n\t\t\tnode.hidden = false;\n\t\t\tif ( node.children ) {\n\t\t\t\tnode.children.forEach( x => this.filterByName( x, search, true ) );\n\t\t\t\t\n\t\t\t\tif ( search.length > 3 )\n\t\t\t\t\tthis.tree().expand( node );\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\t\n\tprivate filterClear( node: XiriTreeselectTreeNode ): void {\n\t\t\n\t\tnode.hidden = false;\n\t\tif ( node.children ) {\n\t\t\tnode.children.forEach( x => this.filterClear( x ) );\n\t\t}\n\t}\n\t\n\tprivate findNodeById( id: XiriTreeselectId, node: XiriTreeselectTreeNode ): XiriTreeselectTreeNode | null {\n\n\t\tif ( node.id == id )\n\t\t\treturn node;\n\t\t\n\t\tif ( node.children ) {\n\t\t\tfor ( let i = 0; i != node.children.length; i++ ) {\n\t\t\t\tconst result = this.findNodeById( id, node.children[ i ] );\n\t\t\t\tif ( result )\n\t\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n}\n","<div class=\"main\">\n\t<div class=\"line\">\n\t\t<div class=\"xrow xsmall\">\n\t\t\t<div class=\"xcol xcol-md-6 header\"><span>{{ field.name }}</span></div>\n\t\t\t<div class=\"xcol xcol-md-6 search\">\n\t\t\t\t@if (field.search !== false) {\n\t\t\t\t\t<xiri-search (changed)=\"searchDo($event)\"></xiri-search>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"tree\">\n\t\t@if (loading()) {\n\t\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t\t}\n\t\t<mat-tree [dataSource]=\"dataSource\" [childrenAccessor]=\"getChildren\">\n\t\t\t<mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding=\"\" matTreeNodePaddingIndent=\"20px\" [hidden]=\"node.hidden\"\n\t\t\t [class.notree]=\"!field.tree\">\n\t\t\t\t<button mat-icon-button disabled aria-hidden=\"true\">\n\t\t\t\t\t<mat-icon style=\"visibility: hidden\">chevron_right</mat-icon>\n\t\t\t\t</button>\n\t\t\t\t<mat-checkbox class=\"checklist-leaf-node\" [checked]=\"node.state === 1\"\n\t\t\t\t (change)=\"treeItemSelectionToggle(node)\">{{ node.name }}\n\t\t\t\t</mat-checkbox>\n\t\t\t</mat-tree-node>\n\t\t\t<mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding=\"\" matTreeNodePaddingIndent=\"20px\" [hidden]=\"node.hidden\">\n\t\t\t\t<button mat-icon-button matTreeNodeToggle [attr.aria-label]=\"tree().isExpanded(node) ? 'Zuklappen' : 'Aufklappen'\">\n\t\t\t\t\t<mat-icon class=\"mat-icon-rtl-mirror\">\n\t\t\t\t\t\t{{ tree().isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n\t\t\t\t\t</mat-icon>\n\t\t\t\t</button>\n\t\t\t\t<mat-checkbox class=\"group\"\n\t\t\t\t [checked]=\"node.state === 1\"\n\t\t\t\t [indeterminate]=\"node.state === 2\"\n\t\t\t\t (change)=\"treeItemSelectionToggle(node)\">{{ node.name }}\n\t\t\t\t</mat-checkbox>\n\t\t\t</mat-tree-node>\n\t\t</mat-tree>\n\t</div>\n</div>","import { ChangeDetectorRef, Directive, effect, inject, input, OnInit, OnDestroy } from \"@angular/core\";\nimport { UntypedFormControl } from \"@angular/forms\";\nimport {\n\tcatchError,\n\tdebounceTime,\n\tof,\n\tReplaySubject,\n\tSubject,\n\tswitchMap,\n\ttap\n} from \"rxjs\";\nimport { filter, takeUntil } from \"rxjs/operators\";\nimport { XiriFormFieldSelectOption } from \"../field.interface\";\nimport { XiriDataService } from \"../../services/data.service\";\n\nexport type XiriSelectPredicate = ( filter: string, element: XiriFormFieldSelectOption ) => boolean;\nexport const DEFAULT_PREDICATE: XiriSelectPredicate = ( filter: string,\n el: XiriFormFieldSelectOption ): boolean => el.name.toLowerCase()\n\t .indexOf(\n\t\t filter ) >\n -1;\n\nexport type XiriSelectCompare = ( a: XiriFormFieldSelectOption, b: XiriFormFieldSelectOption ) => boolean;\nexport const DEFAULT_COMPARE: XiriSelectCompare = ( a: XiriFormFieldSelectOption,\n b: XiriFormFieldSelectOption ) => a && b && a.id === b.id;\n\n@Directive( {\n\t selector: \"[xiriSelect]\",\n\t exportAs: \"xiriSelect\"\n } )\nexport class XiriSelectDirective implements OnInit, OnDestroy {\n\tprivate dataService = inject( XiriDataService );\n\tprivate cdr = inject( ChangeDetectorRef );\n\t\n\tget formControl() {\n\t\treturn this._filterFormControl;\n\t}\n\t\n\tget filter() {\n\t\treturn this._filteredValuesSubject.asObservable();\n\t}\n\t\n\t/** control for the MatSelect filter keyword multi-selection */\n\tprivate _filterFormControl: UntypedFormControl = new UntypedFormControl();\n\t\n\t/** list of _allValues filtered by search keyword */\n\tprivate _filteredValuesSubject: ReplaySubject<XiriFormFieldSelectOption[]> = new ReplaySubject<XiriFormFieldSelectOption[]>(\n\t\t1\n\t);\n\t\n\t/** indicate search operation is in progress */\n\tpublic searching = false;\n\t\n\t// @ViewChild('multiSelect', { static: true }) multiSelect: MatSelect;\n\t\n\t/** Subject that emits when the component has been destroyed. */\n\tprotected _onDestroy = new Subject<void>();\n\t\n\t\n\tpredicate = input<XiriSelectPredicate>(DEFAULT_PREDICATE);\n\n\tcompare = input<XiriSelectCompare>(DEFAULT_COMPARE);\n\n\tserverSideSearch = input<boolean>(false);\n\n\tserverUrl = input<string>('');\n\n\tserverParams = input<Record<string, unknown>>({});\n\n\t/** list of _allValues */\n\tprivate _allValues: XiriFormFieldSelectOption[] = [] as XiriFormFieldSelectOption[];\n\tvalues = input<XiriFormFieldSelectOption[]>([]);\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tlet value = this.values();\n\t\t\tif ( value === undefined )\n\t\t\t\tvalue = [];\n\n\t\t\tthis._allValues = value;\n\t\t\tthis._filteredValuesSubject.next( this._allValues.slice() );\n\t\t});\n\t}\n\n\tngOnInit() {\n\t\tif ( this.serverSideSearch() ) {\n\t\t\tthis._filterFormControl.valueChanges\n\t\t\t\t.pipe(\n\t\t\t\t\tfilter( search => !!search ),\n\t\t\t\t\ttap( () => this.searching = true ),\n\t\t\t\t\tdebounceTime( 200 ),\n\t\t\t\t\tswitchMap( ( search: string ) => {\n\t\t\t\t\t\treturn this.dataService.post( this.serverUrl(),\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t ...this.serverParams(),\n\t\t\t\t\t\t\t search: search\n\t\t\t\t\t\t } )\n\t\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\t\tcatchError( ( err ) => {\n\t\t\t\t\t\t\t\t\tconsole.log( 'catch 1', err );\n\t\t\t\t\t\t\t\t\treturn of( [] );\n\t\t\t\t\t\t\t\t} ) )\n\t\t\t\t\t} ),\n\t\t\t\t\ttap( ( filteredList ) => {\n\t\t\t\t\t\tthis._filteredValuesSubject.next(\n\t\t\t\t\t\t\tthis._allValues.slice().concat( filteredList as XiriFormFieldSelectOption[] )\n\t\t\t\t\t\t)\n\t\t\t\t\t} ),\n\t\t\t\t\ttap( () => {\n\t\t\t\t\t\tthis.searching = false;\n\t\t\t\t\t\tthis.cdr.markForCheck();\n\t\t\t\t\t} ),\n\t\t\t\t\ttakeUntil( this._onDestroy ),\n\t\t\t\t).subscribe();\n\t\t} else {\n\t\t\tthis._filterFormControl.valueChanges\n\t\t\t\t.pipe( takeUntil( this._onDestroy ) )\n\t\t\t\t.subscribe( () => {\n\t\t\t\t\tthis.searching = true;\n\t\t\t\t\tthis.applyFilter();\n\t\t\t\t\tthis.searching = false;\n\t\t\t\t\tthis.cdr.markForCheck();\n\t\t\t\t} );\n\t\t}\n\n\t}\n\t\n\tngOnDestroy() {\n\t\tthis._onDestroy.next();\n\t\tthis._onDestroy.complete();\n\t}\n\t\n\tprivate applyFilter() {\n\t\tif ( !this._allValues ) {\n\t\t\treturn;\n\t\t}\n\t\t// get the search keyword\n\t\tlet search = this._filterFormControl.value;\n\t\tif ( !search ) {\n\t\t\tthis._filteredValuesSubject.next( this._allValues.slice() );\n\t\t\treturn;\n\t\t} else {\n\t\t\tsearch = search.toLowerCase();\n\t\t}\n\t\t// filter the _allValues\n\t\tthis._filteredValuesSubject.next(\n\t\t\tthis._allValues.filter( el => this.predicate()( search, el ) )\n\t\t);\n\t}\n\t\n\t// [showToggleAllCheckbox]=\"field.multiple\" (toggleAll)=\"xiriSelect.toggleSelectAll($event)\"\n\t/**\n\ttoggleSelectAll(selectAllValue: boolean) {\n\t\tthis._filteredValuesSubject.pipe(take(1), takeUntil(this._onDestroy))\n\t\t\t.subscribe(val => {\n\t\t\t\tif (selectAllValue) {\n\t\t\t\t\tthis._filterFormControl.patchValue(val);\n\t\t\t\t} else {\n\t\t\t\t\tthis._filterFormControl.patchValue([]);\n\t\t\t\t}\n\t\t\t});\n\t}\n\t **/\n}\n","import { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport {\n\tComponent,\n\tElementRef,\n\tforwardRef,\n\tinput,\n\tsignal,\n\tviewChild\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MatAutocomplete, MatAutocompleteSelectedEvent, MatAutocompleteTrigger } from '@angular/material/autocomplete';\nimport { MatChipGrid, MatChipInput, MatChipInputEvent, MatChipRemove, MatChipRow } from '@angular/material/chips';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriFormField, XiriFormFieldSelectOption } from '../field.interface';\nimport { MatOption } from '@angular/material/core';\n\n@Component( {\n\t selector: 'xiri-chips',\n\t templateUrl: './chips.component.html',\n\t styleUrl: './chips.component.scss',\n\t providers: [ {\n\t\t provide: NG_VALUE_ACCESSOR,\n\t\t useExisting: forwardRef( () => XiriChipsComponent ),\n\t\t multi: true\n\t } ],\n\t imports: [\n\t\t MatFormField,\n\t\t MatLabel,\n\t\t MatChipGrid,\n\t\t MatChipRow,\n\t\t MatChipRemove,\n\t\t MatChipInput,\n\t\t MatAutocompleteTrigger,\n\t\t MatAutocomplete,\n\t\t MatOption,\n\t\t MatIcon\n\t ]\n } )\nexport class XiriChipsComponent implements ControlValueAccessor {\n\n\tfield = input.required<XiriFormField>();\n\n\tchips = signal<( string | number )[]>( [] );\n\tfilteredOptions = signal<XiriFormFieldSelectOption[]>( [] );\n\n\treadonly separatorKeyCodes = [ ENTER, COMMA ] as const;\n\n\tchipInput = viewChild<ElementRef<HTMLInputElement>>( 'chipInput' );\n\n\tprivate onChange: ( value: ( string | number )[] ) => void = () => { /* intentionally empty */ };\n\tprivate onTouched: () => void = () => { /* intentionally empty */ };\n\n\twriteValue( value: ( string | number )[] ): void {\n\t\tthis.chips.set( value || [] );\n\t}\n\n\tregisterOnChange( fn: ( value: ( string | number )[] ) => void ): void {\n\t\tthis.onChange = fn;\n\t}\n\n\tregisterOnTouched( fn: () => void ): void {\n\t\tthis.onTouched = fn;\n\t}\n\n\tadd( event: MatChipInputEvent ): void {\n\t\tconst value = ( event.value || '' ).trim();\n\t\tif ( !value ) return;\n\n\t\tconst current = [ ...this.chips() ];\n\t\tif ( !current.includes( value ) ) {\n\t\t\tcurrent.push( value );\n\t\t\tthis.chips.set( current );\n\t\t\tthis.onChange( current );\n\t\t}\n\t\tevent.chipInput.clear();\n\t}\n\n\tremove( chip: string | number ): void {\n\t\tconst current = this.chips().filter( c => c !== chip );\n\t\tthis.chips.set( current );\n\t\tthis.onChange( current );\n\t}\n\n\tselected( event: MatAutocompleteSelectedEvent ): void {\n\t\tconst option = event.option.value as XiriFormFieldSelectOption;\n\t\tconst current = [ ...this.chips() ];\n\t\tif ( !current.includes( option.id ) ) {\n\t\t\tcurrent.push( option.id );\n\t\t\tthis.chips.set( current );\n\t\t\tthis.onChange( current );\n\t\t}\n\t\tconst chipInput = this.chipInput();\n\t\tif ( chipInput ) {\n\t\t\tchipInput.nativeElement.value = '';\n\t\t}\n\t}\n\n\tfilterOptions( value: string ): void {\n\t\tconst list = this.field().list || [];\n\t\tif ( !value ) {\n\t\t\tthis.filteredOptions.set( list );\n\t\t\treturn;\n\t\t}\n\t\tconst filterValue = value.toLowerCase();\n\t\tthis.filteredOptions.set(\n\t\t\tlist.filter( option => option.name.toLowerCase().includes( filterValue ) )\n\t\t);\n\t}\n\n\tonInputChange( event: Event ): void {\n\t\tconst input = event.target as HTMLInputElement;\n\t\tthis.filterOptions( input.value );\n\t\tthis.onTouched();\n\t}\n\n\tonFocus(): void {\n\t\tthis.filterOptions( '' );\n\t}\n\n\tchipColor( chip: string | number ): string {\n\t\tconst option = this.field().list?.find( o => o.id === chip );\n\t\treturn option?.color ? 'chip-' + option.color : '';\n\t}\n\n\tdisplayLabel( chip: string | number ): string {\n\t\tif ( typeof chip === 'number' ) {\n\t\t\tconst option = this.field().list?.find( o => o.id === chip );\n\t\t\treturn option?.name ?? String( chip );\n\t\t}\n\t\treturn chip;\n\t}\n}\n","<mat-form-field>\n\t@if (field().name) {\n\t\t<mat-label>{{ field().name }}</mat-label>\n\t}\n\t<mat-chip-grid #chipGrid>\n\t\t@for (chip of chips(); track chip) {\n\t\t\t<mat-chip-row (removed)=\"remove(chip)\" [class]=\"chipColor(chip)\">\n\t\t\t\t{{ displayLabel(chip) }}\n\t\t\t\t<button matChipRemove [attr.aria-label]=\"'Entfernen: ' + displayLabel( chip )\">\n\t\t\t\t\t<mat-icon>cancel</mat-icon>\n\t\t\t\t</button>\n\t\t\t</mat-chip-row>\n\t\t}\n\t</mat-chip-grid>\n\t<input #chipInput\n\t [matChipInputFor]=\"chipGrid\"\n\t [matChipInputSeparatorKeyCodes]=\"separatorKeyCodes\"\n\t [matChipInputAddOnBlur]=\"true\"\n\t (matChipInputTokenEnd)=\"add($event)\"\n\t (input)=\"onInputChange($event)\"\n\t (focus)=\"onFocus()\"\n\t [matAutocomplete]=\"auto\"\n\t [placeholder]=\"field().hint || ''\">\n\t<mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\n\t\t@for (option of filteredOptions(); track option.id) {\n\t\t\t<mat-option [value]=\"option\">{{ option.name }}</mat-option>\n\t\t}\n\t</mat-autocomplete>\n</mat-form-field>\n","import {\n\tafterRenderEffect,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tOnInit,\n\toutput,\n\tsignal,\n\tuntracked\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n\tAbstractControl,\n\tFormsModule,\n\tReactiveFormsModule,\n\tUntypedFormBuilder,\n\tUntypedFormGroup,\n\tValidationErrors,\n\tValidatorFn,\n\tValidators\n} from '@angular/forms';\nimport { XiriFormField, XiriFormFieldCondition, XiriFormFieldSelectOption } from './field.interface';\nimport { colsToClasses } from '../layout/cols.directive';\nimport { Observable } from \"rxjs\";\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { XiriFileComponent } from './file/file.component';\nimport { XiriTimelimitComponent } from './timelimit/timelimit.component';\nimport { XiriVolumeComponent } from './volume/volume.component';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { MatRadioButton, MatRadioGroup } from '@angular/material/radio';\nimport { XiriDateTimeRangeComponent } from './datetimerange/datetimerange.component';\nimport { XiriDateRangeComponent } from './daterange/daterange.component';\nimport { XiriDateComponent } from './date/date.component';\nimport { XiriYearMonthComponent } from './yearmonth/yearmonth.component';\nimport { XiriTreeselectComponent } from './treeselect/treeselect.component';\nimport { XiriSelectDirective } from './select/select.directive';\nimport { NgxMatSelectSearchModule } from 'ngx-mat-select-search';\nimport { MatOption } from '@angular/material/core';\nimport { MatSelect } from '@angular/material/select';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { AsyncPipe } from '@angular/common';\nimport { MatError, MatFormField, MatHint, MatLabel, MatPrefix, MatSuffix } from '@angular/material/form-field';\nimport { SafehtmlPipe } from \"../pipes/safehtml.pipe\";\nimport { XiriChipsComponent } from './chips/chips.component';\nimport { XiriLocaleService } from '../services/locale.service';\n\nexport type XiriFormFieldDisplay = 'full' | 'line' | 'small';\n\nfunction formatValidationDate( localeString: string, unixSeconds: number ): string {\n\treturn new Intl.DateTimeFormat( localeString ).format( new Date( unixSeconds * 1000 ) );\n}\n\n\n@Component( {\n\t selector: 'xiri-form-fields',\n\t templateUrl: './form-fields.component.html',\n\t styleUrl: './form-fields.component.scss',\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatFormField,\n\t\t MatLabel,\n\t\t MatInput,\n\t\t MatPrefix,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatHint,\n\t\t MatError,\n\t\t MatIconButton,\n\t\t MatSelect,\n\t\t MatOption,\n\t\t NgxMatSelectSearchModule,\n\t\t XiriSelectDirective,\n\t\t XiriTreeselectComponent,\n\t\t XiriDateComponent,\n\t\t XiriYearMonthComponent,\n\t\t XiriDateRangeComponent,\n\t\t XiriDateTimeRangeComponent,\n\t\t MatCheckbox,\n\t\t MatRadioButton,\n\t\t MatRadioGroup,\n\t\t XiriVolumeComponent,\n\t\t XiriTimelimitComponent,\n\t\t XiriFileComponent,\n\t\t MatProgressSpinner,\n\t\t AsyncPipe,\n\t\t SafehtmlPipe,\n\t\t XiriChipsComponent,\n\t ]\n } )\nexport class XiriFormFieldsComponent implements OnInit {\n\t\n\tprivate formBuilder = inject( UntypedFormBuilder );\n\tprivate destroyRef = inject( DestroyRef );\n\tprivate elementRef = inject<ElementRef<HTMLElement>>( ElementRef );\n\tprivate readonly localeService = inject( XiriLocaleService );\n\t\n\tform = input<XiriFormField[] | null>( null );\n\tdisplay = input<XiriFormFieldDisplay>( 'full' );\n\tdisabled = input<boolean>( false );\n\tformChange = output<UntypedFormGroup>();\n\tcheck = input<Observable<void> | null>( null );\n\t\n\t// fields: XiriFormField[] = [];\n\tformGroup: UntypedFormGroup;\n\tprivate lastValue: string | null = null;\n\tprivate _fields: XiriFormField[] | null = null;\n\tcollapsedSections = signal<Set<string>>( new Set() );\n\tprivate _fieldsLoaded = false;\n\tprivate _initialEmitDone = false;\n\tprivate _autoFocusDone = false;\n\n\tconstructor() {\n\n\t\t// Fokussiert nach dem ersten Render das erste sichtbare, interaktive Feld (spart den ersten Klick).\n\t\t// Nicht-interaktive Feldtypen (header, divider, info, html) rendern kein fokussierbares Element\n\t\t// und werden dadurch automatisch übersprungen, ebenso versteckte (showWhen/collapsed) Felder,\n\t\t// die per @if gar nicht ins DOM kommen. Felder mit field.hide bleiben aber via [hidden] im DOM und\n\t\t// müssen daher explizit über einen [hidden]-Vorfahren ausgefiltert werden. Der Selektor beschränkt\n\t\t// sich bewusst auf echte Eingabe-Elemente, damit der klappbare Header (tabindex=\"0\") kein Ziel ist.\n\t\tafterRenderEffect( () => {\n\t\t\tthis.fields();\n\t\t\tif ( this._autoFocusDone )\n\t\t\t\treturn;\n\t\t\tconst target = Array.from(\n\t\t\t\tthis.elementRef.nativeElement.querySelectorAll<HTMLElement>( 'input, mat-select, textarea' )\n\t\t\t).find( el => !el.closest( '[hidden]' ) );\n\t\t\tif ( target ) {\n\t\t\t\tthis._autoFocusDone = true;\n\t\t\t\ttarget.focus( { preventScroll: true } );\n\t\t\t}\n\t\t} );\n\t\t\n\t\tthis.formGroup = this.formBuilder.group( {} );\n\t\t\n\t\teffect( () => {\n\t\t\tconst isDisabled = this.disabled();\n\t\t\tif ( isDisabled ) {\n\t\t\t\tthis.formGroup.disable( { emitEvent: false } );\n\t\t\t} else {\n\t\t\t\tthis.formGroup.enable( { emitEvent: false } );\n\t\t\t\t// Felder die vom Backend als disabled kamen, wieder deaktivieren\n\t\t\t\tif ( this._fields ) {\n\t\t\t\t\tfor ( const field of this._fields ) {\n\t\t\t\t\t\tif ( field.disabled ) {\n\t\t\t\t\t\t\tthis.formGroup.get( field.id )?.disable( { emitEvent: false } );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t\t\n\t\t// Track form input changes and emit after controls are created\n\t\teffect( () => {\n\t\t\tconst formInput = this.form();\n\t\t\tif ( formInput !== null ) {\n\t\t\t\t// Force evaluation of computed to create controls\n\t\t\t\tthis.fields();\n\t\t\t\t// Schedule emission for next microtask to ensure view is ready\n\t\t\t\tif ( this._fieldsLoaded && !this._initialEmitDone ) {\n\t\t\t\t\tthis._initialEmitDone = true;\n\t\t\t\t\t// Use queueMicrotask to emit after current change detection cycle\n\t\t\t\t\tqueueMicrotask( () => {\n\t\t\t\t\t\tthis.formChange.emit( this.formGroup );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\t\n\tngOnInit(): void {\n\t\t\n\t\tthis.check()?.pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe( () => {\n\t\t\tthis.validateAllFormFields();\n\t\t} );\n\t\t\n\t\tthis.formGroup.valueChanges.pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe( () => {\n\t\t\tif ( this._fieldsLoaded ) {\n\t\t\t\tconst currentValue = JSON.stringify( this.formGroup.value );\n\t\t\t\tif ( currentValue === this.lastValue )\n\t\t\t\t\treturn;\n\t\t\t\tthis.lastValue = currentValue;\n\t\t\t\tthis.formChange.emit( this.formGroup );\n\t\t\t}\n\t\t} );\n\t}\n\t\n\tfields = computed( () => {\n\t\t\n\t\tthis._fieldsLoaded = false;\n\t\tif ( this._fields !== null ) {\n\t\t\tfor ( let i = 0; i != this._fields.length; i++ ) {\n\t\t\t\tthis.formGroup.removeControl( this._fields[ i ].id );\n\t\t\t}\n\t\t\tthis._fields = null;\n\t\t}\n\t\t\n\t\tconst fields = this.form();\n\t\tif ( fields == null ) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tthis._fields = fields;\n\n\t\tconst initialCollapsed = new Set<string>();\n\t\tfor ( const f of fields ) {\n\t\t\tif ( f.type === 'header' && f.collapsible && f.collapsed )\n\t\t\t\tinitialCollapsed.add( f.id );\n\t\t}\n\t\tuntracked( () => this.collapsedSections.set( initialCollapsed ) );\n\n\t\tthis.createControl();\n\t\t\n\t\tthis.lastValue = JSON.stringify( this.formGroup.value );\n\t\tthis._fieldsLoaded = true;\n\t\treturn this._fields;\n\t} );\n\t\n\tprivate createControl(): void {\n\n\t\tconst fields = this._fields;\n\t\tif ( fields === null )\n\t\t\treturn;\n\n\t\tfor ( let i = 0; i != fields.length; i++ ) {\n\t\t\tconst field = fields[ i ];\n\t\t\t\n\t\t\tif ( field.formtype )\n\t\t\t\tfield.type = field.formtype;\n\t\t\tif ( !field.subtype )\n\t\t\t\tfield.subtype = field.type;\n\t\t\tif ( !field.class )\n\t\t\t\tfield.class = field.cols !== undefined ? colsToClasses( field.cols ) : 'xcol';\n\t\t\t\n\t\t\tswitch ( field.type ) {\n\t\t\t\tcase 'email':\n\t\t\t\t\tfield.type = 'text';\n\t\t\t\t\tfield.subtype = 'email';\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'password':\n\t\t\t\t\tfield.subtype = 'password';\n\t\t\t\t\tfield.pwdhide = true;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'objectlist':\n\t\t\t\t\tfield.multiple = true;\n\t\t\t\t\tif ( field.subtype != 'objectlist' )\n\t\t\t\t\t\tfield.type = field.subtype;\n\t\t\t\t\telse {\n\t\t\t\t\t\tif ( field.tree === undefined )\n\t\t\t\t\t\t\tfield.tree = true;\n\t\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\t\tfield.type = 'treeselect';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'volume':\n\t\t\t\t\tfield.required = true;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'treeselect':\n\t\t\t\t\tfield.tree = true;\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'multiselect':\n\t\t\t\t\tfield.tree = false;\n\t\t\t\t\tfield.type = 'treeselect';\n\t\t\t\t\t\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'radio':\n\t\t\t\t\tfillListFromArray( field );\n\t\t\t\t\tif ( field.value === undefined && field.list?.length )\n\t\t\t\t\t\tfield.value = field.list[ 0 ].id;\n\t\t\t\t\tfield.multiple = false;\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'select':\n\t\t\t\tcase 'object':\n\t\t\t\tcase 'model':\n\t\t\t\t\tif ( field.type == 'object' || field.type == 'model' ) {\n\t\t\t\t\t\tfield.type = 'select';\n\t\t\t\t\t\tfield.subtype = 'model';\n\t\t\t\t\t\tfield.multiple = false;\n\t\t\t\t\t}\n\t\t\t\t\tif ( field.subtype == 'object' )\n\t\t\t\t\t\tfield.subtype = 'model';\n\n\t\t\t\t\tfillListFromArray( field );\n\n\t\t\t\t\tif ( field.subtype === 'model' ) {\n\t\t\t\t\t\tif ( field.value === undefined && field.list !== undefined && field.list.length != 0 )\n\t\t\t\t\t\t\tfield.value = field.list[ 0 ].id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( field.value === undefined || field.value === null )\n\t\t\t\t\t\t\tfield.value = [];\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\t\n\t\t\t\t\tfield.serverSideSearch = !!field.url;\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'date':\n\t\t\t\tcase 'datetime':\n\t\t\t\t\tfield.type = 'date';\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tif ( field.subtype == 'datetime' )\n\t\t\t\t\t\tfield.class += ' datetime';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'yearmonth':\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tfield.class += ' yearmonth';\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'daterange':\n\t\t\t\tcase 'datetimerange':\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'bool':\n\t\t\t\t\tif ( field.name === undefined && field.placeholder )\n\t\t\t\t\t\tfield.name = field.placeholder;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'question':\n\t\t\t\t\tif ( field.question )\n\t\t\t\t\t\tfield.value = field.question;\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\t// if ( field.hint || (field.type == 'textarea' && field.max) )\n\t\t\t//\tfield.class += ' hashint';\n\t\t\t\n\t\t\tif ( field.value === undefined ) {\n\t\t\t\tif ( field.type == 'text' || field.type == 'textarea' )\n\t\t\t\t\tfield.value = '';\n\t\t\t\telse if ( field.type == 'bool' )\n\t\t\t\t\tfield.value = false;\n\t\t\t}\n\t\t\t\n\t\t\tfield.required = !!field.required;\n\t\t\tfield.disabled = !!field.disabled;\n\t\t\t\n\t\t\tconst control = this.formBuilder.control(\n\t\t\t\tfield.value,\n\t\t\t\tthis.bindValidations( field )\n\t\t\t);\n\t\t\t\n\t\t\tfield.control = control;\n\t\t\tthis.formGroup.addControl( field.id, control );\n\t\t}\n\t}\n\t\n\tprivate bindValidations( field: XiriFormField ) {\n\n\t\tconst validList: ValidatorFn[] = [];\n\n\t\tif ( field.validations === undefined ) {\n\n\t\t\tfield.validations = [];\n\t\t\t// Sprache wird bei jedem Zugriff auf `message` frisch aus dem Service gelesen (Getter),\n\t\t\t// damit die Fehlertexte bei einem Sprachwechsel ohne Neuaufbau der Validatoren umschalten.\n\t\t\tconst localeService = this.localeService;\n\t\t\tconst messagesFor = () => localeService.validationMessagesFor();\n\t\t\tconst localeStringFor = () => localeService.localeString();\n\n\t\t\tif ( field.min !== undefined ) {\n\t\t\t\tconst min = field.min;\n\t\t\t\tif ( field.type == 'number' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'min',\n\t\t\t\t\t\t validator: Validators.min( min ),\n\t\t\t\t\t\t get message() { return messagesFor().minNumber( min ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'date' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'min',\n\t\t\t\t\t\t validator: Validators.min( min ),\n\t\t\t\t\t\t get message() { return messagesFor().minDate( formatValidationDate( localeStringFor(), min ) ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'daterange' || field.type == 'datetimerange' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'min',\n\t\t\t\t\t\t validator: validatorDateRangeStart( min ),\n\t\t\t\t\t\t get message() { return messagesFor().minDateRange( formatValidationDate( localeStringFor(), min ) ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'multiselect' || field.type == 'treeselect' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'min',\n\t\t\t\t\t\t validator: validatorArrayMin( min ),\n\t\t\t\t\t\t get message() { return messagesFor().minSelection( min ); }\n\t\t\t\t\t } );\n\t\t\t\telse\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'minlength',\n\t\t\t\t\t\t validator: Validators.minLength( min ),\n\t\t\t\t\t\t get message() { return messagesFor().minLength( min ); }\n\t\t\t\t\t } );\n\t\t\t}\n\t\t\tif ( field.max !== undefined ) {\n\t\t\t\tconst max = field.max;\n\t\t\t\tif ( field.type == 'number' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'max',\n\t\t\t\t\t\t validator: Validators.max( max ),\n\t\t\t\t\t\t get message() { return messagesFor().maxNumber( max ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'date' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'max',\n\t\t\t\t\t\t validator: Validators.max( max ),\n\t\t\t\t\t\t get message() { return messagesFor().maxDate( formatValidationDate( localeStringFor(), max ) ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'daterange' || field.type == 'datetimerange' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'max',\n\t\t\t\t\t\t validator: validatorDateRangeEnd( max ),\n\t\t\t\t\t\t get message() { return messagesFor().maxDateRange( formatValidationDate( localeStringFor(), max ) ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'multiselect' || field.type == 'treeselect' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'max',\n\t\t\t\t\t\t validator: validatorArrayMax( max ),\n\t\t\t\t\t\t get message() { return messagesFor().maxSelection( max ); }\n\t\t\t\t\t } );\n\t\t\t\telse\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'maxlength',\n\t\t\t\t\t\t validator: Validators.maxLength( max ),\n\t\t\t\t\t\t get message() { return messagesFor().maxLength( max ); }\n\t\t\t\t\t } );\n\t\t\t}\n\n\t\t\tif ( field.pattern !== undefined ) {\n\t\t\t\tfield.validations.push( {\n\t\t\t\t\t id: 'pattern',\n\t\t\t\t\t validator: Validators.pattern( field.pattern ),\n\t\t\t\t\t get message() { return messagesFor().invalidFormat; }\n\t\t\t\t } );\n\t\t\t} else {\n\t\t\t\tif ( field.type == 'text' && field.subtype == 'email' ) {\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'email',\n\t\t\t\t\t\t validator: Validators.email,\n\t\t\t\t\t\t get message() { return messagesFor().invalidEmail; }\n\t\t\t\t\t } );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( field.required == true ) {\n\t\t\t\tfield.validations.push( {\n\t\t\t\t\t id: 'required',\n\t\t\t\t\t validator: Validators.required,\n\t\t\t\t\t get message() { return messagesFor().required; },\n\t\t\t\t } );\n\t\t\t} else {\n\t\t\t\tfield.validations.push( {\n\t\t\t\t\t id: 'undefined',\n\t\t\t\t\t validator: validatorUndefined(),\n\t\t\t\t\t get message() { return messagesFor().valueRequired; },\n\t\t\t\t } );\n\t\t\t}\n\t\t}\n\n\t\tfield.validations.forEach( valid => {\n\t\t\tvalidList.push( valid.validator );\n\t\t} );\n\n\t\treturn validList.length ? Validators.compose( validList ) : null;\n\t}\n\t\n\tprivate validateAllFormFields() {\n\n\t\tthis.formGroup.markAsDirty();\n\t\tthis.formGroup.markAllAsTouched();\n\t\tthis.formGroup.updateValueAndValidity();\n\t}\n\t\n\tisFieldVisible( field: XiriFormField ): boolean {\n\t\t\n\t\t// Check if field is inside a collapsed section\n\t\tif ( this.isInCollapsedSection( field ) )\n\t\t\treturn false;\n\t\t\n\t\tif ( !field.showWhen )\n\t\t\treturn true;\n\t\t\n\t\tconst conditions: XiriFormFieldCondition[] = Array.isArray( field.showWhen )\n\t\t ? field.showWhen\n\t\t : [ field.showWhen ];\n\t\t\n\t\treturn conditions.every( condition => this.evaluateCondition( condition ) );\n\t}\n\t\n\ttoggleSection( header: XiriFormField ): void {\n\t\tthis.collapsedSections.update( set => {\n\t\t\tconst next = new Set( set );\n\t\t\tif ( next.has( header.id ) )\n\t\t\t\tnext.delete( header.id );\n\t\t\telse\n\t\t\t\tnext.add( header.id );\n\t\t\treturn next;\n\t\t} );\n\t}\n\t\n\tisSectionCollapsed( headerId: string ): boolean {\n\t\treturn this.collapsedSections().has( headerId );\n\t}\n\n\tprivate isInCollapsedSection( field: XiriFormField ): boolean {\n\t\tconst fields = this._fields;\n\t\tif ( !fields ) return false;\n\n\t\t// Ein header startet seine eigene Section und ist nie Teil einer vorherigen\n\t\tif ( field.type === 'header' ) return false;\n\n\t\tconst idx = fields.indexOf( field );\n\t\tif ( idx <= 0 ) return false;\n\n\t\t// Walk backwards to find the nearest header or divider\n\t\tfor ( let i = idx - 1; i >= 0; i-- ) {\n\t\t\tconst f = fields[ i ];\n\t\t\tif ( f.type === 'header' ) {\n\t\t\t\treturn !!f.collapsible && this.collapsedSections().has( f.id );\n\t\t\t}\n\t\t\tif ( f.type === 'divider' ) {\n\t\t\t\treturn false; // Divider breaks the section\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\t\n\tprivate evaluateCondition( condition: XiriFormFieldCondition ): boolean {\n\t\t\n\t\tconst control = this.formGroup.get( condition.field );\n\t\tif ( !control )\n\t\t\treturn false;\n\t\t\n\t\tconst fieldValue = control.value;\n\t\t\n\t\tswitch ( condition.operator ) {\n\t\t\tcase 'equals':\n\t\t\t\treturn fieldValue === condition.value;\n\t\t\tcase 'notEquals':\n\t\t\t\treturn fieldValue !== condition.value;\n\t\t\tcase 'contains':\n\t\t\t\treturn typeof fieldValue === 'string' && fieldValue.includes( condition.value as string );\n\t\t\tcase 'greaterThan':\n\t\t\t\treturn fieldValue > ( condition.value as number );\n\t\t\tcase 'lessThan':\n\t\t\t\treturn fieldValue < ( condition.value as number );\n\t\t\tcase 'in':\n\t\t\t\treturn Array.isArray( condition.value ) && condition.value.includes( fieldValue );\n\t\t\tcase 'notEmpty':\n\t\t\t\treturn fieldValue !== null && fieldValue !== undefined && fieldValue !== '';\n\t\t\tdefault:\n\t\t\t\treturn true;\n\t\t}\n\t}\n}\n\nfunction fillListFromArray( field: XiriFormField ): void {\n\tif ( field.list === undefined && field.array !== undefined ) {\n\t\tconst list: XiriFormFieldSelectOption[] = [];\n\t\tfield.array.forEach( val => {\n\t\t\tlist.push( {\n\t\t\t\t id: val as unknown as number,\n\t\t\t\t name: val as unknown as string,\n\t\t\t } )\n\t\t} );\n\t\tfield.list = list;\n\t}\n}\n\nfunction validatorDateRangeStart( min: number ): ValidatorFn {\n\treturn ( control: AbstractControl ): ValidationErrors | null => {\n\t\tif ( control.value === undefined || control.value === null || control.value.start === null )\n\t\t\treturn null;\n\t\tconst ok = min < control.value.start;\n\t\treturn ok ? null : { min: { value: control.value } };\n\t};\n}\n\nfunction validatorDateRangeEnd( max: number ): ValidatorFn {\n\treturn ( control: AbstractControl ): ValidationErrors | null => {\n\t\tif ( control.value === undefined || control.value === null || control.value.end === null )\n\t\t\treturn null;\n\t\tconst ok = max > control.value.end;\n\t\treturn ok ? null : { max: { value: control.value } };\n\t};\n}\n\nfunction validatorUndefined(): ValidatorFn {\n\treturn ( control: AbstractControl ): ValidationErrors | null => {\n\t\treturn control.value === undefined ? { undefined: { value: control.value } } : null;\n\t};\n}\n\nfunction validatorArrayMin( min: number ): ValidatorFn {\n\treturn ( control: AbstractControl ): ValidationErrors | null => {\n\t\tif ( control.value === null || control.value === undefined )\n\t\t\treturn null;\n\t\tconst ok = control.value.length >= min;\n\t\treturn ok ? null : { min: { value: control.value } };\n\t};\n}\n\nfunction validatorArrayMax( max: number ): ValidatorFn {\n\treturn ( control: AbstractControl ): ValidationErrors | null => {\n\t\tif ( control.value === null || control.value === undefined )\n\t\t\treturn null;\n\t\tconst ok = control.value.length <= max;\n\t\treturn ok ? null : { max: { value: control.value } };\n\t};\n}\n","<form class=\"xrow dynamic-form\" [formGroup]=\"formGroup\" [class]=\"display()\">\n\t@for (field of fields(); track field.id) {\n\t\t@if (isFieldVisible(field)) {\n\t\t@switch (field.type) {\n\t\t\t@case ('text') {\n\t\t\t\t<mat-form-field [class]=\"field.class\" [formGroup]=\"formGroup\" floatLabel=\"auto\" [hidden]=\"field.hide\">\n\t\t\t\t\t@if (field.name) {\n\t\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t}\n\t\t\t\t\t<input matInput\n\t\t\t\t\t [formControlName]=\"field.id\"\n\t\t\t\t\t [type]=\"field.subtype || 'text'\"\n\t\t\t\t\t [autocomplete]=\"field.name\"\n\t\t\t\t\t [attr.minlength]=\"field.min\"\n\t\t\t\t\t [attr.maxlength]=\"field.max\"\n\t\t\t\t\t [required]=\"!!field.required\">\n\t\t\t\t\t@if (field.textPrefix) {\n\t\t\t\t\t\t<span matTextPrefix=\"\">{{ field.textPrefix }}</span>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.textSuffix) {\n\t\t\t\t\t\t<span matTextSuffix=\"\">{{ field.textSuffix }}</span>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.iconPrefix) {\n\t\t\t\t\t\t<mat-icon matPrefix>{{ field.iconPrefix }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.iconSuffix) {\n\t\t\t\t\t\t<mat-icon matSuffix>{{ field.iconSuffix }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.max) {\n\t\t\t\t\t\t<mat-hint align=\"end\">{{ formGroup.get(field.id)?.value?.length || 0 }} / {{ field.max }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('number') {\n\t\t\t\t<mat-form-field [class]=\"field.class\" [formGroup]=\"formGroup\" floatLabel=\"auto\" [hidden]=\"field.hide\">\n\t\t\t\t\t@if (field.name) {\n\t\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t}\n\t\t\t\t\t<input matInput\n\t\t\t\t\t [formControlName]=\"field.id\"\n\t\t\t\t\t [autocomplete]=\"field.name || field.id\"\n\t\t\t\t\t [lang]=\"field.locale || ''\"\n\t\t\t\t\t [type]=\"field.type\"\n\t\t\t\t\t [attr.min]=\"field.min\"\n\t\t\t\t\t [attr.max]=\"field.max\"\n\t\t\t\t\t [required]=\"!!field.required\">\n\t\t\t\t\t@if (field.textPrefix) {\n\t\t\t\t\t\t<span matTextPrefix=\"\">{{ field.textPrefix }}</span>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.textSuffix) {\n\t\t\t\t\t\t<span matTextSuffix=\"\">{{ field.textSuffix }}</span>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.iconPrefix) {\n\t\t\t\t\t\t<mat-icon matPrefix>{{ field.iconPrefix }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.iconSuffix) {\n\t\t\t\t\t\t<mat-icon matSuffix>{{ field.iconSuffix }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('password') {\n\t\t\t\t<mat-form-field [class]=\"field.class\" [formGroup]=\"formGroup\" floatLabel=\"auto\" [hidden]=\"field.hide\">\n\t\t\t\t\t@if (field.name) {\n\t\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t}\n\t\t\t\t\t<input matInput\n\t\t\t\t\t [formControlName]=\"field.id\"\n\t\t\t\t\t [type]=\"field.pwdhide ? 'password' : 'text'\"\n\t\t\t\t\t [autocomplete]=\"field.name\"\n\t\t\t\t\t [attr.minlength]=\"field.min\"\n\t\t\t\t\t [attr.maxlength]=\"field.max\"\n\t\t\t\t\t [required]=\"!!field.required\">\n\t\t\t\t\t<button mat-icon-button matSuffix class=\"form-field-button\" (click)=\"field.pwdhide = !field.pwdhide\" [attr.aria-label]=\"'Hide password'\"\n\t\t\t\t\t [attr.aria-pressed]=\"field.pwdhide\">\n\t\t\t\t\t\t<mat-icon>{{ field.pwdhide ? 'visibility_off' : 'visibility' }}</mat-icon>\n\t\t\t\t\t</button>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.max) {\n\t\t\t\t\t\t<mat-hint align=\"end\">{{ formGroup.get(field.id)?.value?.length || 0 }} / {{ field.max }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('select') {\n\t\t\t\t<mat-form-field [class]=\"field.class\" [formGroup]=\"formGroup\" floatLabel=\"auto\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t@if (field.search === false) {\n\t\t\t\t\t\t<mat-select [formControlName]=\"field.id\" [multiple]=\"field.multiple\" [required]=\"!!field.required\" panelClass=\"selectPanel\">\n\t\t\t\t\t\t\t@for (x of field.list; track x.id) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"x.id\" [disabled]=\"x.disabled\">{{ x.name }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<mat-select [formControlName]=\"field.id\" [multiple]=\"field.multiple\" [required]=\"!!field.required\" panelClass=\"selectPanel\">\n\t\t\t\t\t\t\t<mat-option>\n\t\t\t\t\t\t\t\t<ngx-mat-select-search [formControl]=\"xiriSelect.formControl\" xiriSelect #xiriSelect=\"xiriSelect\"\n\t\t\t\t\t\t\t\t [values]=\"field.list || []\" [searching]=\"xiriSelect.searching\"\n\t\t\t\t\t\t\t\t [serverSideSearch]=\"!!field.serverSideSearch\" [serverUrl]=\"field.url || ''\"\n\t\t\t\t\t\t\t\t [serverParams]=\"field.params || {}\"></ngx-mat-select-search>\n\t\t\t\t\t\t\t</mat-option>\n\t\t\t\t\t\t\t@for (x of xiriSelect.filter | async; track x.id) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"x.id\" [disabled]=\"x.disabled\">{{ x.name }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('treeselect') {\n\t\t\t\t<div class=\"treeselect\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-treeselect [field]=\"field\" [formControlName]=\"field.id\"\n\t\t\t\t\t [class.error]=\"formGroup.get(field.id)?.touched && formGroup.get(field.id)?.invalid\"></xiri-treeselect>\n\t\t\t\t\t<div class=\"xhint\" aria-live=\"polite\" [class.error]=\"formGroup.get(field.id)?.touched && formGroup.get(field.id)?.invalid\">\n\t\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (field.max) {\n\t\t\t\t\t\t\t<mat-hint align=\"end\">{{ formGroup.get(field.id)?.value?.length || 0 }} / {{ field.max }}</mat-hint>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.touched && formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('date') {\n\t\t\t\t<mat-form-field [formGroup]=\"formGroup\" class=\"date\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t<xiri-date [field]=\"field\" [formControlName]=\"field.id\"></xiri-date>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('yearmonth') {\n\t\t\t\t<mat-form-field [formGroup]=\"formGroup\" class=\"yearmonth\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t<xiri-yearmonth [field]=\"field\" [formControlName]=\"field.id\"></xiri-yearmonth>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('daterange') {\n\t\t\t\t<mat-form-field [formGroup]=\"formGroup\" class=\"daterange\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t<xiri-date-range [field]=\"field\" [formControlName]=\"field.id\"></xiri-date-range>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('datetimerange') {\n\t\t\t\t<mat-form-field [formGroup]=\"formGroup\" class=\"datetimerange\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t<xiri-date-time-range [field]=\"field\" [formControlName]=\"field.id\"></xiri-date-time-range>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('bool') {\n\t\t\t\t<div class=\"bool\" [class]=\"field.class\" [formGroup]=\"formGroup\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-checkbox [formControlName]=\"field.id\">{{ field.name }}</mat-checkbox>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('radio') {\n\t\t\t\t<div class=\"radio\" [class]=\"field.class\" [formGroup]=\"formGroup\" [hidden]=\"field.hide\">\n\t\t\t\t\t@if (field.name) {\n\t\t\t\t\t\t<span class=\"radio-label\" [id]=\"field.id + '-label'\">{{ field.name }}</span>\n\t\t\t\t\t}\n\t\t\t\t\t<mat-radio-group\n\t\t\t\t\t\t[formControlName]=\"field.id\"\n\t\t\t\t\t\t[attr.aria-labelledby]=\"field.name ? field.id + '-label' : null\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@for (x of field.list; track x.id) {\n\t\t\t\t\t\t\t<mat-radio-button [value]=\"x.id\" [disabled]=\"x.disabled\">{{ x.name }}</mat-radio-button>\n\t\t\t\t\t\t}\n\t\t\t\t\t</mat-radio-group>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('volume') {\n\t\t\t\t<div [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-volume [field]=\"field\" [formControlName]=\"field.id\"></xiri-volume>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('timelimit') {\n\t\t\t\t<div [class]=\"field.class\" [formGroup]=\"formGroup\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-timelimit matInput [formControlName]=\"field.id\" [required]=\"!!field.required\" [texts]=\"field.texts || {}\"></xiri-timelimit>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('textarea') {\n\t\t\t\t<mat-form-field [class]=\"field.class\" [formGroup]=\"formGroup\" [hidden]=\"field.hide\">\n\t\t\t\t\t@if (field.name) {\n\t\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t}\n\t\t\t\t\t<textarea matInput [formControlName]=\"field.id\" [required]=\"!!field.required\" [rows]=\"field.rows || 5\"></textarea>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.max) {\n\t\t\t\t\t\t<mat-hint align=\"end\">{{ formGroup.get(field.id)?.value?.length || 0 }} / {{ field.max }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('file') {\n\t\t\t\t<div [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-file [field]=\"field\" [formControlName]=\"field.id\"></xiri-file>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('info') {\n\t\t\t\t<div class=\"info\" [class]=\"field.class\">{{ field.value }}</div>\n\t\t\t}\n\t\t\t@case ('header') {\n\t\t\t\t@if (field.collapsible) {\n\t\t\t\t\t<div class=\"header collapsible\" [class]=\"field.class\" role=\"button\" tabindex=\"0\"\n\t\t\t\t\t [attr.aria-expanded]=\"!isSectionCollapsed(field.id)\"\n\t\t\t\t\t (click)=\"toggleSection(field)\" (keydown.enter)=\"toggleSection(field)\" (keydown.space)=\"toggleSection(field); $event.preventDefault()\">\n\t\t\t\t\t\t<mat-icon class=\"collapse-icon\" [class.collapsed]=\"isSectionCollapsed(field.id)\">expand_more</mat-icon>\n\t\t\t\t\t\t{{ field.value }}\n\t\t\t\t\t</div>\n\t\t\t\t} @else {\n\t\t\t\t\t<div class=\"header\" [class]=\"field.class\">{{ field.value }}</div>\n\t\t\t\t}\n\t\t\t}\n\t\t\t@case ('divider') {\n\t\t\t\t<div class=\"divider\" [class]=\"field.class\">\n\t\t\t\t\t@if (field.value) {\n\t\t\t\t\t\t<span class=\"divider-text\">{{ field.value }}</span>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('html') {\n\t\t\t\t<div class=\"html\" [class]=\"field.class\" [innerHtml]=\"$any(field.value) | safeHtml\"></div>\n\t\t\t}\n\t\t\t@case ('question') {\n\t\t\t\t<div class=\"xcol question\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<div class=\"left\">\n\t\t\t\t\t\t<mat-icon [class]=\"field.iconColor || 'warn'\" inline=\"true\">{{ field.icon }}</mat-icon>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"right\">{{ field.value }}</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('waiting') {\n\t\t\t\t<div class=\"xcol waiting\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<div class=\"left\">\n\t\t\t\t\t\t@if (!field.done) {\n\t\t\t\t\t\t\t<mat-spinner diameter=\"40\"></mat-spinner>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (field.done) {\n\t\t\t\t\t\t\t<mat-icon inline=\"true\">done</mat-icon>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"right\">{{ field.value }}</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('chips') {\n\t\t\t\t<div [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-chips [field]=\"field\" [formControlName]=\"field.id\"></xiri-chips>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@default {\n\t\t\t\t<div>default: {{ field.type }}</div>\n\t\t\t}\n\t\t}\n\t\t}\n\t}\n</form>\n","import { Component, computed, effect, input, signal } from '@angular/core';\nimport {\n\tMatTableDataSource,\n\tMatTable,\n\tMatColumnDef,\n\tMatHeaderCellDef,\n\tMatHeaderCell,\n\tMatCellDef,\n\tMatCell,\n\tMatHeaderRowDef,\n\tMatHeaderRow,\n\tMatRowDef,\n\tMatRow\n} from \"@angular/material/table\";\nimport { XiriTableField } from \"./tabefield.interface\";\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\nimport { RouterLink } from '@angular/router';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { MatIcon } from '@angular/material/icon';\n\n\n/** A single table row: a map of column id → cell value (value shapes vary by column format). */\nexport type XiriRawTableRow = Record<string, unknown>;\n\nexport interface XiriRawTableSettings {\n\tdata: unknown\n\tfields?: XiriTableField[]\n\tdensity?: 'compact' | 'regular' | 'relaxed'\n\tdense?: number\n\tforceMinWidth?: boolean\n\tshowHeader?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-raw-table',\n\t templateUrl: './xiri-raw-table.component.html',\n\t styleUrl: './xiri-raw-table.component.scss',\n\t imports: [ MatTable,\n\t MatColumnDef,\n\t MatHeaderCellDef,\n\t MatHeaderCell,\n\t MatCellDef,\n\t MatCell,\n\t MatIcon,\n\t MatTooltip,\n\t RouterLink,\n\t MatHeaderRowDef,\n\t MatHeaderRow,\n\t MatRowDef,\n\t MatRow,\n\t SafehtmlPipe,\n\t XiriUrlPipe ],\n } )\nexport class XiriRawTableComponent {\n\t\n\tsettings = input.required<XiriRawTableSettings>();\n\tshowHeader = computed( () => this.settings().showHeader === true );\n\n\tdisplayedColumns: XiriTableField[] = [];\n\tcolumnsToDisplay: string[] = [];\n\tdataSource = new MatTableDataSource<XiriRawTableRow>();\n\ttableClass = signal( 'dense-6' );\n\n\tconstructor() {\n\t\teffect( () => {\n\t\t\tconst DENSITY_TO_LEVEL = { compact: 6, regular: 2, relaxed: 1 } as const;\n\t\t\tconst density = this.settings().density;\n\t\t\tconst level = density ? DENSITY_TO_LEVEL[ density ] : ( this.settings().dense || 6 );\n\t\t\tthis.tableClass.set( 'dense-' + level + ( this.settings().forceMinWidth ? ' force-min-width' : '' ) );\n\n\t\t\tthis.loadFields( this.settings().fields ?? [] );\n\t\t\tthis.dataSource.data = this.settings().data as XiriRawTableRow[];\n\t\t} );\n\t}\n\t\n\tprivate loadFields( fields: XiriTableField[] ) {\n\n\t\tthis.displayedColumns = [];\n\t\tthis.columnsToDisplay = [];\n\n\t\tfor ( let fid = 0; fid != fields.length; fid++ ) {\n\t\t\tconst column = fields[ fid ];\n\n\t\t\tif ( column.format == 'id' )\n\t\t\t\tcontinue;\n\t\t\tif ( !column.display )\n\t\t\t\tcolumn.display = '';\n\t\t\tif ( column.format )\n\t\t\t\tcolumn.display = column.format + ' ' + column.display;\n\t\t\tif ( column.align )\n\t\t\t\tcolumn.display += ` align-${ column.align }`;\n\n\t\t\tthis.displayedColumns.push( column );\n\t\t\tthis.columnsToDisplay.push( column.name );\n\t\t}\n\t}\n}\n","<div class=\"table-out\" [class]=\"tableClass()\">\n\t<table mat-table [dataSource]=\"dataSource\">\n\t\t@for (column of displayedColumns; track column) {\n\t\t\t<ng-container [matColumnDef]=\"column.name\">\n\t\t\t\t<th mat-header-cell *matHeaderCellDef [class]=\"column.display\"> {{ column.header }}</th>\n\t\t\t\t@switch (column.format) {\n\t\t\t\t\t@case ('icon') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t@if ($any(column.icons)[ $any(row)[ column.id ] ]) {\n\t\t\t\t\t\t\t\t<mat-icon [class]=\"$any(column.icons)[ $any(row)[ column.id ] ][ 'color' ] || 'primary'\"\n\t\t\t\t\t\t\t\t [matTooltip]=\"$any(column.icons)[ $any(row)[ column.id ] ][ 'hint' ]\"\n\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!$any(column.icons)[ $any(row)[ column.id ] ][ 'hint' ]\">{{ $any(column.icons)[$any(row)[column.id]]['icon'] }}\n\t\t\t\t\t\t\t\t</mat-icon>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('html') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [innerHtml]=\"$any(row)[column.id] | safeHtml\" [class]=\"column.display\"></td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('link') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t@if ($any(row)[column.id + 'Link']) {\n\t\t\t\t\t\t\t\t@let cellUrl = $any(row)[column.id + 'Link'] | xiriUrl;\n\t\t\t\t\t\t\t\t<a [routerLink]=\"cellUrl?.path\" [queryParams]=\"cellUrl?.queryParams\" class=\"tablelink\">{{ $any(row)[column.id] }}</a>\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<span>{{ $any(row)[column.id] }}</span>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('text2') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t<div>{{ $any(row)[column.id][0] }}</div>\n\t\t\t\t\t\t\t<div>{{ $any(row)[column.id][1] }}</div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('textn') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t@for (line of $any(row)[column.id]; track $index) {\n\t\t\t\t\t\t\t\t<div>{{ line }}</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('linkrow') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t@if ($any(row)[column.id + 'Link']) {\n\t\t\t\t\t\t\t\t@let rowUrl = $any(row)[column.id + 'Link'] | xiriUrl;\n\t\t\t\t\t\t\t\t<a [routerLink]=\"rowUrl?.path\" [queryParams]=\"rowUrl?.queryParams\">\n\t\t\t\t\t\t\t\t\t<div class=\"linkrow\">\n\t\t\t\t\t\t\t\t\t\t@if ($any(row)['icon']) {\n\t\t\t\t\t\t\t\t\t\t\t@if ($any(row)['iconSet']) {\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"$any(row)['iconColor'] || 'primary'\" [fontSet]=\"$any(row)['iconSet']\">{{ $any(row)['icon'] }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"$any(row)['iconColor'] || 'primary'\">{{ $any(row)['icon'] }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t<span class=\"text\" [class.hasIcon]=\"$any(row)['icon']\">{{ $any(row)[column.id] }}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('number') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t{{ column.textPrefix }}{{ $any(row)[column.id][0] }}{{ column.textSuffix }}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('chips') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t<div class=\"xiri-chips-display\">\n\t\t\t\t\t\t\t\t@for (chip of $any(row)[column.id]; track chip.label) {\n\t\t\t\t\t\t\t\t\t<span class=\"xiri-chip-display\" [class]=\"chip.color || ''\">{{ chip.label }}</span>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@default {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">{{ $any(row)[column.id] }}</td>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</ng-container>\n\t\t}\n\n\t\t@if (showHeader()) {\n\t\t\t<tr mat-header-row *matHeaderRowDef=\"columnsToDisplay\"></tr>\n\t\t}\n\t\t<tr mat-row *matRowDef=\"let row; columns: columnsToDisplay;\"></tr>\n\t</table>\n</div>","import { Component, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MatButton, MatFabButton, MatIconButton, MatMiniFabButton } from \"@angular/material/button\";\nimport { MatIcon } from \"@angular/material/icon\";\nimport { XiriButton } from \"../button/button.component\";\nimport { MatTooltip } from \"@angular/material/tooltip\";\nimport { MatProgressSpinner } from \"@angular/material/progress-spinner\";\n\n@Component( {\n\t selector: 'xiri-buttonstyle',\n\t imports: [\n\t\t MatButton,\n\t\t MatFabButton,\n\t\t MatIcon,\n\t\t MatIconButton,\n\t\t MatMiniFabButton,\n\t\t MatTooltip,\n\t\t MatProgressSpinner,\n\t\t NgTemplateOutlet\n\t ],\n\t templateUrl: './buttonstyle.component.html',\n\t styleUrl: './buttonstyle.component.scss',\n } )\nexport class XiriButtonstyleComponent {\n\tbutton = input.required<XiriButton>();\n\tdisabled = input.required<boolean>();\n\tloading = input<boolean>( false );\n\t// Remaining seconds until the next poll tick; shown inside the button while > 0.\n\tcountdown = input<number>( 0 );\n\t// Optional backend-defined label shown while polling; overrides the countdown when set.\n\tpollText = input<string>( '' );\n}\n","<ng-template #textContent>\n\t@if (loading()) {\n\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t@if (pollText() || countdown() > 0) {\n\t\t\t<span class=\"poll-countdown\">{{ pollText() || countdown() + 's' }}</span>\n\t\t}\n\t} @else {\n\t\t{{ button().text }}\n\t}\n</ng-template>\n\n<!-- Guard sitzt hier, nicht nur in xiri-button: form, dialog, alert und stepper\n rendern XiriButton direkt ueber buttonstyle. -->\n@if (!button().hide) {\n\t@switch (button().type) {\n\t\t@case ('icon') {\n\t\t\t<button mat-icon-button [matTooltip]=\"button().hint\" [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [attr.aria-label]=\"button().hint || button().text\"\n\t\t\t [color]=\"button().color || 'primary'\" [disabled]=\"disabled() || loading()\">\n\t\t\t\t@if (loading()) {\n\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon>{{ button().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t\t@case ('icontext') {\n\t\t\t<button mat-fab extended=\"true\"\n\t\t\t class=\"icontext\"\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t@if (loading()) {\n\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t@if (pollText() || countdown() > 0) {\n\t\t\t\t\t\t<span class=\"poll-countdown\">{{ pollText() || countdown() + 's' }}</span>\n\t\t\t\t\t}\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon>{{ button().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t{{ button().text }}\n\t\t\t</button>\n\t\t}\n\t\t@case ('raised') {\n\t\t\t<button mat-raised-button\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"textContent\"></ng-container>\n\t\t\t</button>\n\t\t}\n\t\t@case ('basic') {\n\t\t\t<button mat-button\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"textContent\"></ng-container>\n\t\t\t</button>\n\t\t}\n\t\t@case ('stroked') {\n\t\t\t<button mat-stroked-button\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"textContent\"></ng-container>\n\t\t\t</button>\n\t\t}\n\t\t@case ('flat') {\n\t\t\t<button mat-flat-button\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"textContent\"></ng-container>\n\t\t\t</button>\n\t\t}\n\t\t@case ('minifab') {\n\t\t\t<button mat-mini-fab [matTooltip]=\"button().hint\" [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [attr.aria-label]=\"button().hint || button().text\"\n\t\t\t [color]=\"button().color || 'primary'\" [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t@if (loading()) {\n\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon>{{ button().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t\t@case ('fab') {\n\t\t\t<button mat-fab [matTooltip]=\"button().hint\" [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [attr.aria-label]=\"button().hint || button().text\"\n\t\t\t [color]=\"button().color || 'primary'\" [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t@if (loading()) {\n\t\t\t\t\t<mat-spinner diameter=\"24\"></mat-spinner>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon>{{ button().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t\t@default {\n\t\t\t@if (button().icon) {\n\t\t\t\t<button mat-icon-button [matTooltip]=\"button().hint\" [matTooltipDisabled]=\"!button().hint\"\n\t\t\t\t [attr.aria-label]=\"button().hint || button().text\"\n\t\t\t\t [color]=\"button().color || 'primary'\" [disabled]=\"disabled() || loading()\"\n\t\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t\t@if (loading()) {\n\t\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<mat-icon>{{ button().icon }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t</button>\n\t\t\t}\n\t\t\t@if (button().text) {\n\t\t\t\t<button mat-raised-button\n\t\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"textContent\"></ng-container>\n\t\t\t\t</button>\n\t\t\t}\n\t\t}\n\t}\n}\n","import { Component } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\n\n@Component( {\n\t selector: 'xiri-done',\n\t templateUrl: './done.component.html',\n\t styleUrl: './done.component.scss',\n\t imports: [ MatIcon ],\n } )\nexport class XiriDoneComponent {\n}\n","<mat-icon aria-label=\"Erfolgreich abgeschlossen\" role=\"status\">done</mat-icon>\n","import { Component, input } from '@angular/core';\n\n@Component( {\n\t selector: 'xiri-error',\n\t templateUrl: './error.component.html',\n\t styleUrl: './error.component.scss',\n } )\nexport class XiriErrorComponent {\n\t\n\ttext = input.required<string>();\n}\n","<div class=\"error\">\n\t{{ text() }}\n</div>\n","import { Injectable } from '@angular/core';\nimport { HttpResponse } from '@angular/common/http';\n\n\n@Injectable( {\n\t providedIn: 'root',\n } )\nexport class XiriDownloadService {\n\n\t/**\n\t * Opens an empty tab and returns its handle for a later download( …, tab ).\n\t *\n\t * MUST be called synchronously from the click handler: after an HTTP round trip the\n\t * transient user activation is gone and the browser blocks the popup. Returns null\n\t * when it was blocked anyway — pass that through, download() then saves the file.\n\t */\n\tpublic openTab(): Window | null {\n\t\treturn window.open( 'about:blank', '_blank' );\n\t}\n\n\t/**\n\t * Turns the response body into a file. With a tab handle from openTab() the file is\n\t * displayed in that tab, otherwise it is saved via a download anchor.\n\t */\n\tpublic download( result: HttpResponse<Blob>, filename: string, tab?: Window | null ): boolean {\n\n\t\tconst contentDisposition = result.headers.get( 'content-disposition' );\n\t\tif ( contentDisposition ) {\n\t\t\tfilename = contentDisposition.split( 'filename=' )[ 1 ];\n\t\t\tfilename = filename.replace( /\"/g, '' );\n\t\t}\n\n\t\tconst contentType = result.headers.get( 'content-type' ) ?? undefined;\n\t\tconst file = new File( [ result.body as BlobPart ], filename, { type: contentType } );\n\t\tconst fileData = URL.createObjectURL( file );\n\n\t\tif ( tab ) {\n\t\t\t// ponytail: caps window.opener reach. A blob: document is same-origin anyway, so this is\n\t\t\t// no licence to display untrusted HTML — only a correct Content-Type keeps it a viewer.\n\t\t\ttab.opener = null;\n\t\t\ttab.location.replace( fileData );\n\t\t\t// ponytail: 60s is plenty to load; without it the blob lives until the page reloads.\n\t\t\tsetTimeout( () => URL.revokeObjectURL( fileData ), 60 * 1000 )\n\t\t\treturn true;\n\t\t}\n\n\t\tconst a = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'a' ) as HTMLAnchorElement;\n\t\ta.download = filename;\n\t\ta.rel = 'noopener';\n\t\ta.href = fileData;\n\t\t// a.target = '_blank';\n\t\t\n\t\tsetTimeout( () => {\n\t\t\tURL.revokeObjectURL( fileData );\n\t\t}, 2 * 1000 )\n\t\tsetTimeout( () => a.click(), 0 )\n\t\t\n\t\treturn true;\n\t}\n}\n","import { HttpErrorResponse } from '@angular/common/http';\n\nexport function parseHttpError( err: HttpErrorResponse ): string {\n\tif ( err.status === 400 || err.status === 424 )\n\t\treturn err.error?.error || 'Format Error';\n\tif ( err.status === 403 )\n\t\treturn err.error?.error || 'Access denied';\n\tif ( err.status === 404 )\n\t\treturn 'Not found';\n\tif ( err.status === 0 )\n\t\treturn 'Connection error';\n\treturn 'Unknown error';\n}\n","import { Component, DestroyRef, inject, OnDestroy, signal, Type } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n\tMAT_DIALOG_DATA,\n\tMatDialogActions,\n\tMatDialogContent,\n\tMatDialogRef,\n\tMatDialogTitle\n} from '@angular/material/dialog';\nimport { Subject } from 'rxjs';\nimport { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';\nimport { XiriDataService } from '../services/data.service';\nimport { XiriButton } from \"../button/button.component\";\nimport { XiriSnackbarService } from '../services/snackbar.service';\nimport { XiriRawTableComponent, XiriRawTableSettings } from \"../raw-table/xiri-raw-table.component\";\nimport { Router } from \"@angular/router\";\nimport { XiriButtonstyleComponent } from '../buttonstyle/buttonstyle.component';\nimport { MatDivider } from '@angular/material/divider';\nimport { XiriDoneComponent } from '../done/done.component';\nimport { XiriErrorComponent } from '../error/error.component';\nimport { XiriFormFieldsComponent } from '../formfields/form-fields.component';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriFormField } from \"../formfields/field.interface\";\nimport { XiriDownloadService } from \"../services/download.service\";\nimport { parseHttpError } from '../services/error.util';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n\nexport type XiriDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\nexport interface XiriDialogSettings {\n\turl?: string\n\tsize?: XiriDialogSize | string\n\n\ttype: \"form\" | \"data\" | \"question\" | \"waiting\" | \"table\" | \"component\"\n\tdata?: unknown\n\tfilter?: Record<string, unknown> | null\n}\n\n// Backend response loaded into the dialog (form definition, question, table, done/goto etc.).\nexport interface XiriDialogResponse {\n\tbuttons?: XiriButton[]\n\tsize?: XiriDialogSize | string\n\turl?: string\n\theader?: string\n\ttype?: string\n\tcontent?: unknown\n\tfields?: unknown\n\tmodel?: Record<string, unknown>\n\textra?: Record<string, unknown>\n\ttime?: number\n\tdone?: boolean\n\terror?: string\n\tgoto?: string\n\t[ key: string ]: unknown\n}\n\nconst DIALOG_SIZE_MAP: Record<string, string> = {\n\tsm: '400px',\n\tmd: '600px',\n\tlg: '900px',\n\txl: '1200px',\n\tfull: '95vw',\n};\n\n@Component( {\n\t selector: 'xiri-dialog',\n\t templateUrl: './dialog.component.html',\n\t styleUrls: [ './dialog.component.scss' ],\n\t imports: [ MatDialogTitle,\n\t MatDialogContent,\n\t MatProgressSpinner,\n\t XiriRawTableComponent,\n\t XiriFormFieldsComponent,\n\t NgComponentOutlet,\n\t XiriErrorComponent,\n\t XiriDoneComponent,\n\t MatDivider,\n\t MatDialogActions,\n\t XiriButtonstyleComponent,\n\t MatIconButton,\n\t MatIcon ]\n } )\nexport class XiriDialogComponent implements OnDestroy {\n\tdialogRef = inject<MatDialogRef<XiriDialogComponent>>( MatDialogRef );\n\tinitData = inject<XiriDialogSettings>( MAT_DIALOG_DATA );\n\tprivate breakpointObserver = inject( BreakpointObserver );\n\tprivate dataService = inject( XiriDataService );\n\tprivate router = inject( Router );\n\tprivate snackbar = inject( XiriSnackbarService );\n\t\n\t\n\ttype = signal('form');\n\theader = signal('');\n\tpublic buttons = signal<XiriButton[]>([]);\n\tprivate url = '';\n\tprivate extra = {};\n\tprivate destroyRef = inject( DestroyRef );\n\n\tprivate downloadService = inject( XiriDownloadService );\n\t\n\tpublic formFields = signal<XiriFormField[] | null>( null );\n\tpublic componentData = signal<unknown>( null );\n\t// Dynamisch nachgeladene XiriDynComponentComponent (vermeidet zirkulären Import dialog -> dyncomponent)\n\tpublic dynComponentType = signal<Type<unknown> | null>( null );\n\tpublic loading = signal<boolean>( true );\n\tpublic done = signal<boolean>( false );\n\tpublic error = signal<string>( '' );\n\t\n\tprivate formValues: Record<string, unknown> | null = null;\n\tpublic formValid = signal<boolean>(false);\n\tpublic checkSubject: Subject<void> = new Subject<void>();\n\t\n\tprivate to: ReturnType<typeof setTimeout> | null = null;\n\tprivate refreshTime = 2000;\n\trawTable!: XiriRawTableSettings;\n\n\tprivate effectiveSize: string | undefined;\n\n\tconstructor() {\n\n\t\tthis.dialogRef.addPanelClass( 'xiri-dialog-sized' );\n\t\tthis.effectiveSize = this.initData.size;\n\n\t\tthis.breakpointObserver\n\t\t\t.observe( [ Breakpoints.XSmall, Breakpoints.Small ] )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( ( state: BreakpointState ) => {\n\t\t\t\tthis.applyDialogSize( state.matches );\n\t\t\t} );\n\t\t\n\t\tif ( this.initData.url )\n\t\t\tthis.url = this.initData.url;\n\t\t\n\t\tif ( this.initData.type == 'form' )\n\t\t\tthis.loadData( this.initData as unknown as XiriDialogResponse );\n\t\telse if ( this.initData.type == 'data' )\n\t\t\tthis.send( { data: this.initData.data } );\n\t\telse if ( this.initData.filter )\n\t\t\tthis.send( this.initData.filter );\n\t\telse\n\t\t\tthis.send( null );\n\t\t\n\t}\n\t\n\tprivate send( data: unknown ) {\n\n\t\tthis.loading.set( true );\n\t\tthis.error.set( '' );\n\n\t\tconst req = data === null ?\n\t\t this.dataService.get( this.url ) :\n\t\t this.dataService.post( this.url, { ...( data as object ), ...this.extra } );\n\n\t\t// this.buttons = [];\n\n\t\treq.pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe(\n\t\t\t{\n\t\t\t\tnext: ( res: unknown ) => {\n\t\t\t\t\tif ( res )\n\t\t\t\t\t\tthis.loadData( res as XiriDialogResponse );\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.showError( { status: 500 } );\n\t\t\t\t},\n\t\t\t\terror: ( err ) => {\n\t\t\t\t\tthis.showError( err );\n\t\t\t\t}\n\t\t\t} );\n\t}\n\n\tprivate showError( err: unknown ) {\n\t\tthis.loading.set( false );\n\t\tthis.error.set( parseHttpError( err as HttpErrorResponse ) );\n\t\t\n\t\t// this.header = 'Error';\n\t\tif ( this.buttons().length == 0 ) {\n\t\t\tthis.buttons.set( [ {\n\t\t\t\ttext: 'Close',\n\t\t\t\taction: 'close',\n\t\t\t\ttype: 'raised',\n\t\t\t} ] );\n\t\t}\n\t}\n\t\n\tprivate applyDialogSize( isMobile: boolean ): void {\n\t\tif ( isMobile ) {\n\t\t\tthis.dialogRef.updateSize( '90vw' );\n\t\t\treturn;\n\t\t}\n\t\tconst raw = this.effectiveSize;\n\t\tconst width = ( raw ? DIALOG_SIZE_MAP[ raw ] : undefined ) ?? raw ?? '600px';\n\t\tthis.dialogRef.updateSize( width );\n\t\tif ( raw === 'full' )\n\t\t\tthis.dialogRef.addPanelClass( 'xiri-dialog-full' );\n\t}\n\n\tprivate loadData( res: XiriDialogResponse ): void {\n\n\t\tif ( res.buttons ) {\n\t\t\tif ( res.size && res.size !== this.effectiveSize ) {\n\t\t\t\tthis.effectiveSize = res.size;\n\t\t\t\tthis.applyDialogSize( this.breakpointObserver.isMatched( [ Breakpoints.XSmall, Breakpoints.Small ] ) );\n\t\t\t}\n\t\t\tif ( res.url )\n\t\t\t\tthis.url = res.url;\n\n\t\t\tlet formData: XiriFormField[] | null = [];\n\t\t\tconst inFields: unknown = res.content || res.fields;\n\t\t\tconst model = res.model || {};\n\t\t\tthis.header.set( res.header ?? '' );\n\t\t\tthis.buttons.set( res.buttons );\n\t\t\tthis.type.set( res.type ? res.type : 'form' );\n\t\t\tthis.extra = res.extra || {};\n\n\t\t\tif ( this.type() == 'form' ) {\n\t\t\t\t( inFields as XiriFormField[] ).forEach( ( origField: XiriFormField ) => {\n\t\t\t\t\tif ( origField.hide == true )\n\t\t\t\t\t\treturn;\n\t\t\t\t\tconst field = { ...origField };\n\t\t\t\t\tif ( model[ field.id ] !== undefined )\n\t\t\t\t\t\tfield.value = model[ field.id ];\n\n\t\t\t\t\tformData!.push( field );\n\t\t\t\t} );\n\t\t\t} else if ( this.type() == 'question' ) {\n\t\t\t\tconst field = { ...( inFields as XiriFormField ) };\n\t\t\t\tfield.type = 'question';\n\t\t\t\tformData.push( field );\n\t\t\t\tthis.formValid.set( true );\n\t\t\t} else if ( this.type() == 'waiting' ) {\n\t\t\t\tconst field = { ...( inFields as XiriFormField & { text?: unknown } ) };\n\t\t\t\tfield.type = 'waiting';\n\t\t\t\tfield.done = false;\n\t\t\t\tfield.value = field.text;\n\t\t\t\tformData.push( field );\n\t\t\t} else if ( this.type() == 'table' ) {\n\t\t\t\tthis.rawTable = inFields as XiriRawTableSettings;\n\t\t\t\tformData = [];\n\t\t\t} else if ( this.type() == 'component' ) {\n\t\t\t\tthis.componentData.set( inFields );\n\t\t\t\tthis.formValid.set( true );\n\t\t\t\tformData = null;\n\t\t\t\t// dyncomponent lazy laden, um den zirkulären Import zu vermeiden\n\t\t\t\timport( '../dyncomponent/dyncomponent.component' ).then(\n\t\t\t\t\tm => this.dynComponentType.set( m.XiriDynComponentComponent )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.formValid.set( true );\n\t\t\t\tformData = inFields as XiriFormField[];\n\t\t\t}\n\t\t\t\n\t\t\tthis.formFields.set( formData );\n\n\t\t\tif ( this.type() == 'waiting' ) {\n\t\t\t\tthis.dialogRef.disableClose = true;\n\t\t\t\tthis.refreshTime = res.time || 2000;\n\t\t\t\t// formData.done = false;\n\t\t\t\t// this.formFields.set( formData );\n\t\t\t\tthis.refresh();\n\t\t\t}\n\t\t\t\n\t\t} else if ( res.done ) {\n\t\t\t\n\t\t\tthis.done.set( true );\n\t\t\tthis.formFields.set( null );\n\n\t\t\tthis.type.set( '' );\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.dialogRef.close( res );\n\t\t\t}, 1000 );\n\t\t} else {\n\t\t\tthis.dialogRef.close( res );\n\t\t}\n\t\t\n\t\tthis.loading.set( false );\n\t}\n\t\n\tprivate refresh() {\n\t\t\n\t\tthis.to = setTimeout( () => {\n\t\t\tthis.to = null;\n\t\t\t\n\t\t\tthis.dataService.get( this.url ).pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe(\n\t\t\t\t{\n\t\t\t\t\tnext: ( raw: object ) => {\n\t\t\t\t\t\tconst res = raw as XiriDialogResponse;\n\t\t\t\t\t\tif ( res.done ) {\n\t\t\t\t\t\t\tif ( res.error ) {\n\t\t\t\t\t\t\t\tthis.dialogRef.disableClose = false;\n\t\t\t\t\t\t\t\tthis.error.set( res.error );\n\t\t\t\t\t\t\t\tthis.formFields.set( null );\n\t\t\t\t\t\t\t\tthis.snackbar.error( res.error );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.url = res.url ?? '';\n\t\t\t\t\t\t\t\tthis.extra = res;\n\t\t\t\t\t\t\t\tthis.download( null );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tthis.refresh();\n\t\t\t\t\t},\n\t\t\t\t\terror: ( err ) => {\n\t\t\t\t\t\tconsole.log( \"dialog refresh error\", err );\n\t\t\t\t\t\tthis.snackbar.error( err.error?.error || 'Unknown Error' );\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ( this.refreshTime < 10000 )\n\t\t\t\t\t\t\tthis.refreshTime += 2000;\n\t\t\t\t\t\tthis.refresh();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, this.refreshTime );\n\t}\n\t\n\tpublic download( data: unknown, tab?: Window | null ) {\n\n\t\tif ( data === null ) {\n\t\t\t// TODO: fix, this is actually an external link\n\t\t\t\n\t\t\tconst file = window.open( this.dataService.getConfigApi() + this.url, 'Report' );\n\t\t\tif ( file === null || typeof ( file ) == 'undefined' ) {\n\t\t\t\tthis.buttons.set( [ {\n\t\t\t\t\ttext: 'Download',\n\t\t\t\t\taction: 'download',\n\t\t\t\t\ttype: 'raised',\n\t\t\t\t\tdefault: true,\n\t\t\t\t} ] );\n\t\t\t} else\n\t\t\t\tthis.dialogRef.close( this.extra );\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.dataService.postFileResponse( this.url, data )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe(\n\t\t\t\t\t{\n\t\t\t\t\t\tnext: ( result ) => {\n\n\t\t\t\t\t\t\tconst ret = this.downloadService.download( result, 'Report', tab );\n\t\t\t\t\t\t\tif ( !ret )\n\t\t\t\t\t\t\t\tthis.buttons.set( [ {\n\t\t\t\t\t\t\t\t\ttext: 'Download',\n\t\t\t\t\t\t\t\t\taction: 'href',\n\t\t\t\t\t\t\t\t\ttype: 'raised',\n\t\t\t\t\t\t\t\t\tdefault: true,\n\t\t\t\t\t\t\t\t\turl: this.url\n\t\t\t\t\t\t\t\t} ] );\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tthis.dialogRef.close( this.extra );\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}, error: ( err: HttpErrorResponse ) => {\n\t\t\t\t\t\t\ttab?.close();\n\t\t\t\t\t\t\tthis.snackbar.error( err.error?.error || 'Unknown Error' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t}\n\t\n\tclickButton( button: XiriButton ): void {\n\n\t\tif ( button.default && !this.formValid() )\n\t\t\treturn;\n\n\t\tif ( button.action == 'close' )\n\t\t\tthis.dialogRef.close( null );\n\t\telse if ( button.action == 'return' )\n\t\t\tthis.dialogRef.close( {\n\t\t\t\t valid: this.formValid(),\n\t\t\t\t values: this.formValues\n\t\t\t } );\n\t\telse if ( button.action == 'get' ) {\n\t\t\tthis.url = button.url ? button.url : '';\n\t\t\tthis.startSend( null );\n\t\t} else if ( button.action == 'post' ) {\n\t\t\tthis.url = button.url ? button.url : '';\n\t\t\tthis.startSend( button.data );\n\t\t} else if ( button.action == 'download' ) {\n\t\t\tconst data = this.type() == 'form' ? this.formValues : null;\n\t\t\t// Only the blob path needs a tab handle; data === null is an external link that\n\t\t\t// opens its own tab. openTab() must run here, inside the click.\n\t\t\tthis.download( data, data !== null && button.target === '_blank' ? this.downloadService.openTab() : null );\n\t\t} else if ( button.action == 'link' ) {\n\t\t\tthis.router.navigate( [ button.url ] ).then();\n\t\t} else if ( button.action == 'href' ) {\n\t\t\twindow.location.href = button.url ?? '';\n\t\t} else {\n\t\t\tif ( this.loading() )\n\t\t\t\treturn;\n\n\t\t\tif ( this.type() == 'form' )\n\t\t\t\tthis.startSend( this.formValues );\n\t\t\telse\n\t\t\t\tthis.startSend( [] );\n\t\t}\n\t}\n\t\n\tprivate startSend( data: unknown ): void {\n\n\t\tsetTimeout( () => {\n\t\t\tif ( this.formValid() )\n\t\t\t\tthis.send( data );\n\t\t\telse\n\t\t\t\tthis.checkSubject.next();\n\t\t}, 10 );\n\t}\n\n\tpublic formChanged( event: { valid: boolean; value: Record<string, unknown> | null } ) {\n\n\t\tthis.formValid.set( event.valid );\n\t\tthis.formValues = event.value;\n\t}\n\t\n\tngOnDestroy() {\n\t\tif ( this.to )\n\t\t\tclearTimeout( this.to );\n\t}\n}\n","<div class=\"dialog\">\n\t<div class=\"dialog-header\">\n\t\t<h1 mat-dialog-title>{{ header() }}</h1>\n\t\t@if (type() !== 'waiting') {\n\t\t\t<button mat-icon-button aria-label=\"Schließen\" (click)=\"dialogRef.close(null)\"><mat-icon>close</mat-icon></button>\n\t\t}\n\t</div>\n\t<mat-dialog-content>\n\t\t@if (loading() && formFields() === null) {\n\t\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t\t}\n\t\t@if (formFields() !== null) {\n\t\t\t@if (type() === 'table') {\n\t\t\t\t<xiri-raw-table [settings]=\"rawTable\"></xiri-raw-table>\n\t\t\t} @else {\n\t\t\t\t<xiri-form-fields [form]=\"formFields()\" (formChange)=\"formChanged($event)\" [disabled]=\"loading()\"\n\t\t\t\t [check]=\"checkSubject.asObservable()\"></xiri-form-fields>\n\t\t\t}\n\t\t}\n\t\t@if (componentData() !== null && dynComponentType() !== null) {\n\t\t\t<ng-container [ngComponentOutlet]=\"dynComponentType()\"\n\t\t\t [ngComponentOutletInputs]=\"{ data: componentData() }\"></ng-container>\n\t\t}\n\t\t@if (error()) {\n\t\t\t<xiri-error class=\"error\" [text]=\"error()\"></xiri-error>\n\t\t}\n\t\t@if (done()) {\n\t\t\t<div class=\"xcol done\">\n\t\t\t\t<xiri-done></xiri-done>\n\t\t\t</div>\n\t\t}\n\t</mat-dialog-content>\n\t@if (!done() && !(loading() && formFields() === null) && (loading() || buttons().length > 0)) {\n\t\t<mat-divider></mat-divider>\n\t\t<mat-dialog-actions [class.one]=\"buttons().length===1\">\n\t\t\t@if (loading()) {\n\t\t\t\t<mat-spinner diameter=\"30\" class=\"actions-spinner\"></mat-spinner>\n\t\t\t} @else {\n\t\t\t\t@for (button of buttons(); track $index) {\n\t\t\t\t\t<xiri-buttonstyle [button]=\"button\" (click)=\"clickButton( button )\" [disabled]=\"!!button.default && !formValid()\"></xiri-buttonstyle>\n\t\t\t\t}\n\t\t\t}\n\t\t</mat-dialog-actions>\n\t}\n</div>","import { inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\n\n\ninterface XiriHandlerResponse {\n\tpage?: string;\n\trefresh?: string;\n\ttable?: string;\n\tgoto?: string;\n\tupdate?: string;\n\tid?: unknown;\n\tfield?: unknown;\n\tcontent?: unknown;\n}\n\n@Injectable( {\n\t providedIn: 'root',\n } )\nexport class XiriResponseHandlerService {\n\n\tprivate router = inject( Router );\n\n\thandle( result: unknown, callbacks?: {\n\t\tonTableRefresh?: () => void;\n\t\tonTableUpdate?: ( id: unknown, field: string, content: unknown ) => void;\n\t} ): void {\n\t\tif ( !result )\n\t\t\treturn;\n\t\tconst res = result as XiriHandlerResponse;\n\t\tif ( res.page == 'refresh' || res.refresh == 'page' )\n\t\t\tthis.router.navigate( [ this.router.url ] ).then();\n\t\telse if ( res.table == 'refresh' || res.refresh == 'table' ) {\n\t\t\tif ( callbacks?.onTableRefresh )\n\t\t\t\tcallbacks.onTableRefresh();\n\t\t\telse\n\t\t\t\tthis.router.navigate( [ this.router.url ] ).then();\n\t\t}\n\t\telse if ( res.goto )\n\t\t\tthis.router.navigate( [ res.goto ] ).then();\n\t\telse if ( res.table == 'update' || res.update == 'table' )\n\t\t\tcallbacks?.onTableUpdate?.( res.id, res.field as string, res.content );\n\t}\n}\n","import { Component, computed, DestroyRef, effect, inject, input, OnDestroy, output, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { XiriDialogComponent } from \"../dialog/dialog.component\";\nimport { XiriColor } from '../types/color.type';\nimport { MatDialog, MatDialogRef } from \"@angular/material/dialog\";\nimport { XiriDataService } from \"../services/data.service\";\nimport { RouterLink } from \"@angular/router\";\nimport { Location } from \"@angular/common\";\nimport { XiriButtonstyleComponent } from \"../buttonstyle/buttonstyle.component\";\nimport { XiriDownloadService } from \"../services/download.service\";\nimport { XiriResponseHandlerService } from \"../services/response-handler.service\";\nimport { MatMenu, MatMenuItem, MatMenuTrigger } from \"@angular/material/menu\";\nimport { MatIcon } from \"@angular/material/icon\";\nimport { MatIconButton } from \"@angular/material/button\";\nimport { MatTooltip } from \"@angular/material/tooltip\";\nimport { XiriUrlPipe } from \"../pipes/url.pipe\";\n\n\nexport interface XiriButton {\n\ttext: string\n\ttype: string\n\taction: string\n\t\n\tdefault?: boolean\n\turl?: string\n\thide?: boolean\n\tcolor?: XiriColor\n\ticon?: string\n\ticonColor?: XiriColor\n\tfontIcon?: string\n\tfontSet?: string\n\tclass?: string\n\thint?: string\n\ttabIndex?: number\n\tinline?: boolean\n\tdisabled?: boolean\n\t// When true, the button triggers its action automatically once on load,\n\t// as soon as it is no longer disabled (i.e. filter is valid/present).\n\tautoLoad?: boolean\n\n\tdata?: Record<string, unknown>\n\t// Link target for action \"href\". For action \"download\", \"_blank\" displays the file in a new\n\t// tab instead of saving it — needs a Content-Type the browser can render (e.g. application/pdf).\n\ttarget?: string\n\tloading?: boolean\n\tfilename?: string\n\n\t// send btns\n\tcheck?: string[]\n\tsend?: string[]\n\n\t// menu items (for action \"menu\")\n\tmenuItems?: { action: string, url?: string, icon?: string, color?: string, text?: string, data?: Record<string, unknown> }[]\n}\n\nexport interface XiriButtonResult {\n\tbutton: XiriButton\n\tresult: unknown\n\tdone: boolean\n\tloading: boolean\n}\n\n// Backend response handled by the button (api result, dialog afterClosed result or poll tick).\nexport interface XiriButtonResponse {\n\tpoll?: number\n\tpollUrl?: string\n\ttext?: string\n\tbutton?: Partial<XiriButton>\n\t[ key: string ]: unknown\n}\n\n\n@Component( {\n\t selector: 'xiri-button',\n\t templateUrl: './button.component.html',\n\t styleUrl: './button.component.scss',\n\t imports: [\n\t\t XiriButtonstyleComponent,\n\t\t RouterLink,\n\t\t MatMenu, MatMenuItem, MatMenuTrigger,\n\t\t MatIcon, MatIconButton, MatTooltip,\n\t XiriUrlPipe\n\t ],\n } )\nexport class XiriButtonComponent implements OnDestroy {\n\tbutton = input.required<XiriButton>();\n\tdisabled = input<boolean>( false );\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\turl = input<string | undefined>( undefined );\n\t\n\t// \t\tif ( JSON.stringify( this._filterData ) === JSON.stringify( values ) )\n\t// \t\t\treturn;\n\t\n\tresult = output<XiriButtonResult>();\n\t\n\tprivate dialogRef?: MatDialogRef<XiriDialogComponent> = undefined;\n\tprivate destroyRef = inject( DestroyRef );\n\tprotected loading = signal<boolean>( false );\n\t// Guards the one-shot auto-load trigger (see constructor) so it fires only once.\n\tprivate _autoTriggered = false;\n\n\t// Self-polling: when a processed response (api result or dialog afterClosed) contains a\n\t// \"poll\" interval (ms), the button keeps GET-polling \"pollUrl\" until a response without\n\t// \"poll\" arrives, showing a countdown inside the button.\n\tprivate pollTimer?: ReturnType<typeof setTimeout>;\n\tprivate countdownTimer?: ReturnType<typeof setInterval>;\n\tprotected polling = signal<{ intervalMs: number; nextAt: number; url: string; text?: string } | null>( null );\n\tprivate _now = signal<number>( Date.now() );\n\tprotected countdown = computed<number>( () => {\n\t\tconst p = this.polling();\n\t\tif ( !p )\n\t\t\treturn 0;\n\t\tconst secs = Math.ceil( ( p.nextAt - this._now() ) / 1000 );\n\t\treturn secs > 0 ? secs : 0;\n\t} );\n\t// Optional backend-defined label shown in the button while polling (overrides the countdown).\n\tprotected pollText = computed<string>( () => this.polling()?.text ?? '' );\n\n\t// Backend-driven overrides applied to the button via a \"button\" patch in a response\n\t// (text, color, icon, type, hint, disabled). Persists until the next action starts.\n\tprivate buttonOverride = signal<Partial<XiriButton> | null>( null );\n\tprotected displayButton = computed<XiriButton>( () => {\n\t\tconst o = this.buttonOverride();\n\t\treturn o ? { ...this.button(), ...o } : this.button();\n\t} );\n\t\n\tprivate dataService = inject( XiriDataService );\n\tprivate location = inject( Location );\n\tprivate dialog = inject( MatDialog );\n\tprivate downloadService = inject( XiriDownloadService );\n\tprivate responseHandler = inject( XiriResponseHandlerService );\n\t\n\t_disabled = computed( () => {\n\t\t\n\t\tif ( this.filterData() === null )\n\t\t\treturn true;\n\t\telse if ( this.displayButton().disabled )\n\t\t\treturn true;\n\t\telse if ( this.loading() )\n\t\t\treturn true;\n\n\t\treturn this.disabled();\n\t} );\n\t\n\t_url = computed( () => {\n\t\tif ( this.url() )\n\t\t\treturn this.url();\n\t\treturn this.displayButton().url;\n\t} );\n\n\tconstructor() {\n\t\t// Auto-load: when the button opts in via autoLoad, run its action once as soon\n\t\t// as it becomes enabled (filter valid/present). Subsequent filter changes do not\n\t\t// re-trigger it — only the initial load is automatic.\n\t\teffect( () => {\n\t\t\tthis.filterData(); // track filter changes so the effect re-evaluates\n\t\t\t// A hidden button is not rendered, so it must not fire its action either.\n\t\t\tif ( this.button().autoLoad && !this.displayButton().hide && !this._autoTriggered && !this._disabled() ) {\n\t\t\t\tthis._autoTriggered = true;\n\t\t\t\tthis.runAction();\n\t\t\t}\n\t\t} );\n\t}\n\n\tclicked( event: MouseEvent ) {\n\t\tevent.stopPropagation();\n\t\tthis.runAction();\n\t}\n\n\tprivate runAction() {\n\n\t\tif ( this._disabled() ) {\n\t\t\tthis.result.emit( {\n\t\t\t\t button: this.button(),\n\t\t\t\t result: null,\n\t\t\t\t done: false,\n\t\t\t\t loading: false,\n\t\t\t } );\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tswitch ( this.button().action ) {\n\t\t\tcase 'link':\n\t\t\tcase 'href':\n\t\t\tcase 'close':\n\t\t\tcase 'return':\n\t\t\t\tthis.result.emit( {\n\t\t\t\t\t button: this.button(),\n\t\t\t\t\t result: null,\n\t\t\t\t\t done: true,\n\t\t\t\t\t loading: false,\n\t\t\t\t } );\n\t\t\t\tbreak;\n\t\t\tcase 'dialog':\n\t\t\t\tthis.actionDialog();\n\t\t\t\tbreak;\n\t\t\tcase 'api':\n\t\t\t\tthis.actionApi();\n\t\t\t\tbreak;\n\t\t\tcase 'download':\n\t\t\t\tthis.actionDownload();\n\t\t\t\tbreak;\n\t\t\tcase 'back':\n\t\t\t\tthis.location.back();\n\t\t\t\tbreak;\n\t\t\tcase 'debug':\n\t\t\tcase 'simulate':\n\t\t\t\tthis.result.emit( {\n\t\t\t\t\t button: this.button(),\n\t\t\t\t\t result: true,\n\t\t\t\t\t done: true,\n\t\t\t\t\t loading: false,\n\t\t\t\t } );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.log( \"xiri-button unknown action\", this.button().action );\n\t\t}\n\t}\n\t\n\tprivate actionDialog( dialogData?: Record<string, unknown> ) {\n\n\t\tlet data: Record<string, unknown>;\n\t\tif ( dialogData ) {\n\t\t\tdata = dialogData;\n\t\t} else {\n\t\t\tdata = Object.assign( {}, this.button() ) as unknown as Record<string, unknown>;\n\t\t\tdata['type'] = 'load';\n\t\t}\n\t\tdata['filter'] = this.filterData();\n\n\t\tthis.buttonOverride.set( null );\n\t\tthis.loading.set( true );\n\n\t\tthis.dialogRef = this.dialog.open( XiriDialogComponent, {\n\t\t\tdata: data,\n\t\t} );\n\n\t\tthis.dialogRef.afterClosed().pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe( result => {\n\t\t\tthis.processResult( result );\n\t\t} );\n\t}\n\n\topenMenuDialog( event: MouseEvent, item: Record<string, unknown> ) {\n\t\tevent.stopPropagation();\n\t\tconst data = Object.assign( {}, item ) as Record<string, unknown>;\n\t\tdata['type'] = 'load';\n\t\tthis.actionDialog( data );\n\t}\n\t\n\tprivate actionApi() {\n\n\t\tconst data = { ...this.filterData(), ...this.button().data };\n\t\tthis.buttonOverride.set( null );\n\t\tthis.loading.set( true );\n\t\t\n\t\tthis.result.emit( {\n\t\t\t button: this.button(),\n\t\t\t result: null,\n\t\t\t done: false,\n\t\t\t loading: true,\n\t\t } );\n\t\t\n\t\tthis.dataService.post( this.button().url ?? '', data )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( {\n\t\t\t\t next: ( result: unknown ) => {\n\t\t\t\t\t\t this.processResult( result as XiriButtonResponse );\n\t\t\t\t\t },\n\t\t\t\t\t error: ( err: unknown ) => {\n\t\t\t\t\t\t console.log( \"xiri-button api error\", err );\n\t\t\t\t\t\t this.result.emit( {\n\t\t\t\t\t\t\t button: this.button(),\n\t\t\t\t\t\t\t result: null,\n\t\t\t\t\t\t\t done: true,\n\t\t\t\t\t\t\t loading: false,\n\t\t\t\t\t\t } );\n\t\t\t\t\t\t this.loading.set( false );\n\t\t\t\t\t }\n\t\t\t\t } );\n\t}\n\n\t// Decides what to do with a response (api result or dialog afterClosed result):\n\t// poll present → keep polling; otherwise → final handling (snackbar/refresh/goto + emit).\n\tprivate processResult( result: XiriButtonResponse | null ) {\n\t\tif ( result && result.button )\n\t\t\tthis.buttonOverride.set( { ...( this.buttonOverride() ?? {} ), ...result.button } );\n\t\tif ( result && result.poll && result.poll > 0 ) {\n\t\t\tthis.startPolling( result.pollUrl || this.button().url || '', result.poll, result.text );\n\t\t\treturn;\n\t\t}\n\t\tthis.stopPolling();\n\t\tthis.responseHandler.handle( result );\n\t\tthis.result.emit( {\n\t\t\t button: this.button(),\n\t\t\t result: result,\n\t\t\t done: true,\n\t\t\t loading: false,\n\t\t } );\n\t}\n\n\tprivate startPolling( url: string, intervalMs: number, text?: string ) {\n\t\tthis.cancelPollTimers();\n\t\tconst now = Date.now();\n\t\tthis.polling.set( { intervalMs, nextAt: now + intervalMs, url, text } );\n\t\tthis._now.set( now );\n\t\tthis.loading.set( true );\n\t\tthis.pollTimer = setTimeout( () => {\n\t\t\tthis.pollTimer = undefined;\n\t\t\tthis.pollTick( url );\n\t\t}, intervalMs );\n\t\tthis.countdownTimer = setInterval( () => this._now.set( Date.now() ), 1000 );\n\t}\n\n\tprivate pollTick( url: string ) {\n\t\tthis.dataService.get( url )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( {\n\t\t\t\t next: ( res: unknown ) => this.processResult( res as XiriButtonResponse ),\n\t\t\t\t error: ( err: unknown ) => {\n\t\t\t\t\t\t console.log( \"xiri-button poll error\", err );\n\t\t\t\t\t\t this.stopPolling();\n\t\t\t\t\t\t this.result.emit( {\n\t\t\t\t\t\t\t button: this.button(),\n\t\t\t\t\t\t\t result: null,\n\t\t\t\t\t\t\t done: true,\n\t\t\t\t\t\t\t loading: false,\n\t\t\t\t\t\t } );\n\t\t\t\t\t }\n\t\t\t } );\n\t}\n\n\tprivate cancelPollTimers() {\n\t\tif ( this.pollTimer ) {\n\t\t\tclearTimeout( this.pollTimer );\n\t\t\tthis.pollTimer = undefined;\n\t\t}\n\t\tif ( this.countdownTimer ) {\n\t\t\tclearInterval( this.countdownTimer );\n\t\t\tthis.countdownTimer = undefined;\n\t\t}\n\t}\n\n\tprivate stopPolling() {\n\t\tthis.cancelPollTimers();\n\t\tthis.polling.set( null );\n\t\tthis.loading.set( false );\n\t}\n\n\tprivate actionDownload() {\n\n\t\tconst data = { ...this.filterData(), ...this.button().data };\n\t\tthis.loading.set( true );\n\n\t\t// Must happen before the request: openTab() needs the click's user activation.\n\t\t// Without one (e.g. autoLoad) it returns null and the file is saved instead.\n\t\tconst tab = this.button().target === '_blank' ? this.downloadService.openTab() : null;\n\n\t\tthis.dataService.postFileResponse( this._url() ?? '', data )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe(\n\t\t\t\t\t{\n\t\t\t\t\t\tnext: ( result ) => {\n\n\t\t\t\t\t\t\tlet filename: string;\n\t\t\t\t\t\t\tconst btn = this.button();\n\t\t\t\t\t\t\tif ( btn.filename != undefined )\n\t\t\t\t\t\t\t\tfilename = btn.filename;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t// ponytail: no extension guess when the file is displayed — the\n\t\t\t\t\t\t\t\t// viewer would offer \"Report.csv\" for a PDF on save.\n\t\t\t\t\t\t\t\tfilename = ( btn.text != undefined ? btn.text : 'Download' )\n\t\t\t\t\t\t\t\t\t\t+ ( tab ? '' : '.csv' )\n\n\t\t\t\t\t\t\tthis.downloadService.download( result, filename, tab );\n\n\t\t\t\t\t\t\tthis.result.emit( {\n\t\t\t\t\t\t\t\t button: this.button(),\n\t\t\t\t\t\t\t\t result: result,\n\t\t\t\t\t\t\t\t done: true,\n\t\t\t\t\t\t\t\t loading: false,\n\t\t\t\t\t\t\t } );\n\t\t\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror: ( err: unknown ) => {\n\t\t\t\t\t\t\tconsole.log( \"xiri-button download error\", err );\n\t\t\t\t\t\t\ttab?.close();\n\t\t\t\t\t\t\tthis.result.emit( {\n\t\t\t\t\t\t\t\t button: this.button(),\n\t\t\t\t\t\t\t\t result: null,\n\t\t\t\t\t\t\t\t done: true,\n\t\t\t\t\t\t\t\t loading: false,\n\t\t\t\t\t\t\t } );\n\t\t\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.stopPolling();\n\t\tif ( this.dialogRef ) {\n\t\t\tthis.dialogRef.close( null );\n\t\t}\n\t}\n}\n","<!-- hide has always been part of the XiriButton contract; a hidden button must not\n render and must not run its action (see the autoLoad effect). -->\n@if (!displayButton().hide) {\n\t@switch (button().action) {\n\t\t@case ('link') {\n\t\t\t@let linkUrl = _url() | xiriUrl;\n\t\t\t<a [routerLink]=\"linkUrl?.path\" [queryParams]=\"linkUrl?.queryParams\" [href]=\"_url()\" (click)=\"clicked($event)\">\n\t\t\t\t<xiri-buttonstyle [button]=\"displayButton()\" [disabled]=\"_disabled()\" [loading]=\"loading()\" [countdown]=\"countdown()\" [pollText]=\"pollText()\"></xiri-buttonstyle>\n\t\t\t</a>\n\t\t}\n\t\t@case ('href') {\n\t\t\t<a [href]=\"_url()\" [target]=\"button().target\" (click)=\"clicked($event)\">\n\t\t\t\t<xiri-buttonstyle [button]=\"displayButton()\" [disabled]=\"_disabled()\" [loading]=\"loading()\" [countdown]=\"countdown()\" [pollText]=\"pollText()\"></xiri-buttonstyle>\n\t\t\t</a>\n\t\t}\n\t\t@case ('menu') {\n\t\t\t<button mat-icon-button [matMenuTriggerFor]=\"menuRef\"\n\t\t\t [class]=\"displayButton().color || 'primary'\"\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [attr.aria-label]=\"displayButton().hint || displayButton().text\"\n\t\t\t (click)=\"$event.stopPropagation()\">\n\t\t\t\t<mat-icon>{{ displayButton().icon }}</mat-icon>\n\t\t\t</button>\n\t\t\t<mat-menu #menuRef=\"matMenu\">\n\t\t\t\t@for (item of button().menuItems; track item) {\n\t\t\t\t\t@switch (item.action) {\n\t\t\t\t\t\t@case ('link') {\n\t\t\t\t\t\t\t@let menuUrl = item.url | xiriUrl;\n\t\t\t\t\t\t\t<a mat-menu-item [routerLink]=\"menuUrl?.path\" [queryParams]=\"menuUrl?.queryParams\">\n\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@case ('href') {\n\t\t\t\t\t\t\t<a mat-menu-item [href]=\"item.url\" target=\"_blank\">\n\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@case ('dialog') {\n\t\t\t\t\t\t\t<button mat-menu-item (click)=\"openMenuDialog($event, item)\">\n\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</mat-menu>\n\t\t}\n\t\t@default {\n\t\t\t<xiri-buttonstyle [button]=\"displayButton()\" [disabled]=\"_disabled()\" [loading]=\"loading()\" [countdown]=\"countdown()\" [pollText]=\"pollText()\" (click)=\"clicked($event)\"></xiri-buttonstyle>\n\t\t}\n\t}\n}\n","import { afterNextRender, inject, Injectable, Injector, signal } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { XiriDataService } from '../services/data.service';\nimport { XiriSnackbarService } from '../services/snackbar.service';\nimport { XiriTableField } from '../raw-table/tabefield.interface';\nimport { XiriTableCellValue, XiriTableRow } from './tree.service';\n\nexport interface EditableOption { value: string; label: string; color?: string }\n\n// A single chip value as stored on a chips-format cell.\ninterface ChipValue { label: string; color?: string }\n\n// Shape of the per-cell save response: optional field updates applied back to the row.\ninterface InlineEditResult { updates?: Record<string, XiriTableCellValue> }\n\n// Reads a human-readable message out of an unknown HTTP error value.\nfunction errorMessage( err: unknown ): string | undefined {\n\tconst inner = ( err as { error?: { error?: string } | string } )?.error;\n\tif ( inner && typeof inner === 'object' && 'error' in inner )\n\t\treturn inner.error;\n\treturn undefined;\n}\n\n\n@Injectable()\nexport class XiriTableInlineEditService {\n\n\tprivate dataService = inject( XiriDataService );\n\tprivate snackbar = inject( XiriSnackbarService );\n\tprivate injector = inject( Injector );\n\n\teditingCell = signal<{ row: XiriTableRow; field: string } | null>( null );\n\teditingChipsValues = signal<string[]>( [] );\n\teditableOptionsLoading = signal( false );\n\tloadedEditableOptions = signal<EditableOption[]>( [] );\n\tsavingCell = signal<{ row: XiriTableRow; field: string } | null>( null );\n\n\t// Inline-edit select search (client- and server-side)\n\tsearchControl = new FormControl<string>( '', { nonNullable: true } );\n\tsearching = signal( false );\n\tdisplayedOptions = signal<EditableOption[]>( [] );\n\n\tprivate editingOriginalValue: XiriTableCellValue = null;\n\tprivate editableOptionsSub: Subscription | null = null;\n\tprivate optionCache = new Map<string, EditableOption>();\n\tprivate searchSub: Subscription | null = null;\n\tprivate searchReqSub: Subscription | null = null;\n\n\tprivate getEditUrl!: () => string;\n\tprivate getDisplayedColumns!: () => XiriTableField[];\n\tprivate abort$!: Subject<void>;\n\tprivate onSaved!: ( row: XiriTableRow, fieldId: string ) => void;\n\tprivate onDataUpdate!: () => void;\n\tprivate onCallReturn!: ( result: unknown ) => void;\n\n\tprivate get editUrl(): string { return this.getEditUrl?.(); }\n\tprivate get displayedColumns(): XiriTableField[] { return this.getDisplayedColumns?.() ?? []; }\n\n\tinit( config: {\n\t\tgetEditUrl: () => string;\n\t\tgetDisplayedColumns: () => XiriTableField[];\n\t\tabort$: Subject<void>;\n\t\tonSaved: ( row: XiriTableRow, fieldId: string ) => void;\n\t\tonDataUpdate: () => void;\n\t\tonCallReturn: ( result: unknown ) => void;\n\t} ): void {\n\t\tthis.getEditUrl = config.getEditUrl;\n\t\tthis.getDisplayedColumns = config.getDisplayedColumns;\n\t\tthis.abort$ = config.abort$;\n\t\tthis.onSaved = config.onSaved;\n\t\tthis.onDataUpdate = config.onDataUpdate;\n\t\tthis.onCallReturn = config.onCallReturn;\n\t}\n\n\tstart( row: XiriTableRow, column: XiriTableField, skipSavingCheck = false ): void {\n\t\tif ( !column.editable || !this.editUrl || ( !skipSavingCheck && this.savingCell() ) )\n\t\t\treturn;\n\t\tconst val = row[ column.id ] as XiriTableCellValue;\n\t\tthis.editingOriginalValue = Array.isArray( val ) ? JSON.parse( JSON.stringify( val ) ) : val;\n\t\tif ( column.format === 'chips' && Array.isArray( val ) && !column.editableOptionsUrl ) {\n\t\t\tthis.editingChipsValues.set( ( val as unknown as ChipValue[] ).map( ( c ) => {\n\t\t\t\tconst opt = column.editableOptions?.find( o => o.label === c.label );\n\t\t\t\treturn opt?.value || c.label;\n\t\t\t} ) );\n\t\t}\n\t\tthis.editingCell.set( { row, field: column.id } );\n\n\t\tif ( column.editableOptionsUrl ) {\n\t\t\tthis.editableOptionsLoading.set( true );\n\t\t\tthis.loadedEditableOptions.set( [] );\n\t\t\tthis.editableOptionsSub?.unsubscribe();\n\t\t\tconst separator = column.editableOptionsUrl.includes( '?' ) ? '&' : '?';\n\t\t\tconst optionsUrl = column.editableOptionsUrl + separator + 'id=' + encodeURIComponent( String( row.id ) ) + '&field=' + encodeURIComponent( column.id );\n\t\t\tthis.editableOptionsSub = this.dataService.get( optionsUrl ).subscribe( {\n\t\t\t\tnext: ( raw: unknown ) => {\n\t\t\t\t\tconst result = ( raw ?? [] ) as EditableOption[];\n\t\t\t\t\tthis.loadedEditableOptions.set( result );\n\t\t\t\t\tthis.editableOptionsLoading.set( false );\n\t\t\t\t\tif ( column.format === 'chips' && Array.isArray( val ) ) {\n\t\t\t\t\t\tthis.editingChipsValues.set( ( val as unknown as ChipValue[] ).map( ( c ) => {\n\t\t\t\t\t\t\tconst opt = result.find( ( o ) => o.label === c.label );\n\t\t\t\t\t\t\treturn opt?.value || c.label;\n\t\t\t\t\t\t} ) );\n\t\t\t\t\t}\n\t\t\t\t\tthis.editableOptionsSub = null;\n\t\t\t\t\tthis.initSearch( column, row );\n\t\t\t\t\tthis.focus();\n\t\t\t\t},\n\t\t\t\terror: () => {\n\t\t\t\t\tthis.editableOptionsLoading.set( false );\n\t\t\t\t\tthis.editableOptionsSub = null;\n\t\t\t\t\tthis.cancel();\n\t\t\t\t\tthis.snackbar.error( 'Optionen konnten nicht geladen werden' );\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.initSearch( column, row );\n\t\t\tthis.focus();\n\t\t}\n\t}\n\n\t/** Sets up the search box + subscription for searchable inline-edit selects. */\n\tprivate initSearch( column: XiriTableField, row: XiriTableRow ): void {\n\t\tthis.teardownSearch();\n\t\tif ( !column.editableOptionsSearch && !column.editableSearchUrl )\n\t\t\treturn;\n\t\tconst base = this.baseOptions( column );\n\t\tbase.forEach( o => this.optionCache.set( o.value, o ) );\n\t\tthis.displayedOptions.set( base.slice() );\n\t\tthis.searchControl.setValue( '', { emitEvent: false } );\n\t\tthis.searchSub = this.searchControl.valueChanges.pipe(\n\t\t\tdebounceTime( 200 ),\n\t\t\ttakeUntil( this.abort$ )\n\t\t).subscribe( term => this.runSearch( column, row, term ?? '' ) );\n\t}\n\n\t/** Runs the search: server-side POST when editableSearchUrl is set, otherwise local label filter. */\n\tprivate runSearch( column: XiriTableField, row: XiriTableRow, term: string ): void {\n\t\tconst base = this.baseOptions( column );\n\t\tif ( column.editableSearchUrl ) {\n\t\t\tif ( !term ) {\n\t\t\t\tthis.searchReqSub?.unsubscribe();\n\t\t\t\tthis.searchReqSub = null;\n\t\t\t\tthis.searching.set( false );\n\t\t\t\tthis.displayedOptions.set( base.slice() );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.searching.set( true );\n\t\t\tthis.searchReqSub?.unsubscribe();\n\t\t\tthis.searchReqSub = this.dataService.post( column.editableSearchUrl, { id: row.id, field: column.id, search: term } )\n\t\t\t\t.pipe( takeUntil( this.abort$ ) ).subscribe( {\n\t\t\t\t\tnext: ( result: unknown ) => {\n\t\t\t\t\t\tconst opts: EditableOption[] = ( result ?? [] ) as EditableOption[];\n\t\t\t\t\t\topts.forEach( o => this.optionCache.set( o.value, o ) );\n\t\t\t\t\t\tthis.displayedOptions.set( opts );\n\t\t\t\t\t\tthis.searching.set( false );\n\t\t\t\t\t\tthis.searchReqSub = null;\n\t\t\t\t\t},\n\t\t\t\t\terror: () => {\n\t\t\t\t\t\tthis.searching.set( false );\n\t\t\t\t\t\tthis.searchReqSub = null;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t} else {\n\t\t\tconst t = term.toLowerCase();\n\t\t\tthis.displayedOptions.set( t ? base.filter( o => o.label.toLowerCase().includes( t ) ) : base.slice() );\n\t\t}\n\t}\n\n\tprivate teardownSearch(): void {\n\t\tthis.searchSub?.unsubscribe();\n\t\tthis.searchSub = null;\n\t\tthis.searchReqSub?.unsubscribe();\n\t\tthis.searchReqSub = null;\n\t\tthis.searching.set( false );\n\t\tthis.displayedOptions.set( [] );\n\t\tthis.optionCache.clear();\n\t\tthis.searchControl.setValue( '', { emitEvent: false } );\n\t}\n\n\t/** The unfiltered option list: static options on the column, or those loaded via editableOptionsUrl. */\n\tprivate baseOptions( column: XiriTableField ): EditableOption[] {\n\t\treturn column.editableOptions ?? this.loadedEditableOptions();\n\t}\n\n\tcancel(): void {\n\t\tconst editing = this.editingCell();\n\t\tif ( editing ) {\n\t\t\tediting.row[ editing.field ] = this.editingOriginalValue;\n\t\t\tthis.editingCell.set( null );\n\t\t\tthis.editingOriginalValue = null;\n\t\t}\n\t\tthis.editableOptionsSub?.unsubscribe();\n\t\tthis.editableOptionsSub = null;\n\t\tthis.loadedEditableOptions.set( [] );\n\t\tthis.editableOptionsLoading.set( false );\n\t\tthis.teardownSearch();\n\t}\n\n\tsave( row: XiriTableRow, column: XiriTableField ): void {\n\t\tconst editing = this.editingCell();\n\t\tif ( !editing || editing.row !== row || editing.field !== column.id ) return;\n\t\tconst newValue = row[ column.id ] as XiriTableCellValue;\n\t\tconst originalValue = this.editingOriginalValue;\n\t\tthis.editingCell.set( null );\n\t\tthis.editingOriginalValue = null;\n\t\tthis.loadedEditableOptions.set( [] );\n\t\tthis.editableOptionsLoading.set( false );\n\t\tthis.teardownSearch();\n\n\t\tconst unchanged = Array.isArray( newValue )\n\t\t\t? JSON.stringify( newValue ) === JSON.stringify( originalValue )\n\t\t\t: newValue === originalValue;\n\t\tif ( unchanged ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst value: XiriTableCellValue = column.format === 'chips' && Array.isArray( newValue )\n\t\t\t? ( newValue as unknown as ChipValue[] ).map( ( c ) => c.label )\n\t\t\t: newValue;\n\t\tconst payload = { id: row.id, field: column.id, value };\n\t\tthis.savingCell.set( { row, field: column.id } );\n\t\tthis.dataService.post( this.editUrl, payload ).pipe( takeUntil( this.abort$ ) ).subscribe( {\n\t\t\tnext: ( raw: unknown ) => {\n\t\t\t\tconst result = raw as InlineEditResult | null;\n\t\t\t\tthis.savingCell.set( null );\n\t\t\t\tif ( result?.updates ) {\n\t\t\t\t\tconst updates = result.updates;\n\t\t\t\t\tObject.keys( updates ).forEach( key => {\n\t\t\t\t\t\trow[ key ] = updates[ key ];\n\t\t\t\t\t} );\n\t\t\t\t\tthis.onDataUpdate();\n\t\t\t\t}\n\t\t\t\tthis.onSaved( row, column.id );\n\t\t\t\tthis.onCallReturn( result );\n\t\t\t},\n\t\t\terror: ( err: unknown ) => {\n\t\t\t\tthis.savingCell.set( null );\n\t\t\t\trow[ column.id ] = originalValue;\n\t\t\t\tthis.onDataUpdate();\n\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Unknown Error' );\n\t\t\t}\n\t\t} );\n\t}\n\n\tisEditing( row: XiriTableRow, fieldId: string ): boolean {\n\t\tconst editing = this.editingCell();\n\t\treturn editing !== null && editing.row === row && editing.field === fieldId;\n\t}\n\n\tisSaving( row: XiriTableRow, fieldId: string ): boolean {\n\t\tconst saving = this.savingCell();\n\t\treturn saving !== null && saving.row === row && saving.field === fieldId;\n\t}\n\n\tonKeydown( event: KeyboardEvent, row: XiriTableRow, column: XiriTableField ): void {\n\t\tif ( event.key === 'Enter' ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.save( row, column );\n\t\t} else if ( event.key === 'Escape' ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.cancel();\n\t\t} else if ( event.key === 'Tab' ) {\n\t\t\tconst matSelect = ( event.target as HTMLElement ).closest( 'mat-select' );\n\t\t\tif ( matSelect && matSelect.classList.contains( 'mat-mdc-select-open' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tconst direction = event.shiftKey ? -1 : 1;\n\t\t\tconst nextColumn = this.getAdjacentEditableColumn( column.id, direction );\n\t\t\tthis.save( row, column );\n\t\t\tif ( nextColumn ) {\n\t\t\t\tthis.start( row, nextColumn, true );\n\t\t\t}\n\t\t}\n\t}\n\n\tfocus(): void {\n\t\tafterNextRender( () => {\n\t\t\tconst el = document.querySelector( '.xiri-inline-edit input, .xiri-inline-edit mat-select' ) as HTMLElement;\n\t\t\tel?.focus();\n\t\t}, { injector: this.injector } );\n\t}\n\n\tgetAdjacentEditableColumn( currentField: string, direction: 1 | -1 ): XiriTableField | null {\n\t\tconst noInlineEdit = new Set( [ 'buttons', 'icon', 'html', 'link', 'input', 'text2', 'textn', 'number', 'header' ] );\n\t\tconst currentIndex = this.displayedColumns.findIndex( c => c.id === currentField );\n\t\tif ( currentIndex === -1 ) return null;\n\t\tfor ( let i = currentIndex + direction; i >= 0 && i < this.displayedColumns.length; i += direction ) {\n\t\t\tconst col = this.displayedColumns[ i ];\n\t\t\tif ( col.editable && !noInlineEdit.has( col.format ?? '' ) ) {\n\t\t\t\treturn col;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tflashSaved( row: XiriTableRow, fieldId: string, dataSource: MatTableDataSource<XiriTableRow> ): void {\n\t\tafterNextRender( () => {\n\t\t\tconst rowIndex = dataSource.data.indexOf( row );\n\t\t\tconst colIndex = this.displayedColumns.findIndex( c => c.id === fieldId );\n\t\t\tif ( rowIndex === -1 || colIndex === -1 ) return;\n\t\t\tconst rows = document.querySelectorAll( '.xiritable tr.mat-mdc-row' );\n\t\t\tconst rowEl = rows[ rowIndex ];\n\t\t\tif ( !rowEl ) return;\n\t\t\tconst cells = rowEl.querySelectorAll( 'td.mat-mdc-cell' );\n\t\t\tconst cell = cells[ colIndex ] as HTMLElement;\n\t\t\tif ( !cell ) return;\n\t\t\tcell.classList.add( 'xiri-cell-saved' );\n\t\t\tsetTimeout( () => cell.classList.remove( 'xiri-cell-saved' ), 500 );\n\t\t}, { injector: this.injector } );\n\t}\n\n\tgetOptions( column: XiriTableField ): EditableOption[] {\n\t\tif ( !column.editableOptionsSearch && !column.editableSearchUrl )\n\t\t\treturn this.baseOptions( column );\n\t\t// While searching, return the currently shown options but always keep the\n\t\t// selected value(s) present so the trigger label stays correct even when\n\t\t// the active search result no longer contains them.\n\t\tconst shown = this.displayedOptions().slice();\n\t\tconst present = new Set( shown.map( o => o.value ) );\n\t\tfor ( const val of this.selectedValues( column ) ) {\n\t\t\tif ( !present.has( val ) )\n\t\t\t\tshown.unshift( this.optionCache.get( val ) ?? { value: val, label: val } );\n\t\t}\n\t\treturn shown;\n\t}\n\n\t/** The currently selected value(s) of the editing cell. */\n\tprivate selectedValues( column: XiriTableField ): string[] {\n\t\tif ( column.format === 'chips' )\n\t\t\treturn this.editingChipsValues();\n\t\tconst row = this.editingCell()?.row;\n\t\tconst v = row ? row[ column.id ] : null;\n\t\treturn v !== null && v !== undefined && v !== '' ? [ String( v ) ] : [];\n\t}\n\n\tonChipsChange( row: XiriTableRow, column: XiriTableField, selectedValues: string[] ): void {\n\t\tthis.editingChipsValues.set( selectedValues );\n\t\trow[ column.id ] = selectedValues.map( val => {\n\t\t\tconst opt = this.optionCache.get( val ) ?? this.getOptions( column ).find( o => o.value === val );\n\t\t\treturn { label: opt?.label || val, color: opt?.color || '' };\n\t\t} );\n\t}\n}\n","interface XiriStorageEntry {\n\ttime: number;\n\tvalue: unknown;\n}\n\n/**\n * Shared implementation for the local- and session-storage services. Internal\n * (not part of the public API); the concrete XiriLocalStorageService and\n * XiriSessionStorageService differ only in which Storage backend they pass in.\n */\nexport abstract class XiriStorageServiceBase {\n\n\tprivate data: Record<string, XiriStorageEntry> = {};\n\n\tprotected constructor( private readonly storage?: Storage ) {\n\t}\n\n\tpublic clear() {\n\n\t\tthis.data = {};\n\t\tthis.storage?.clear();\n\t}\n\n\tpublic set( name: string, value: unknown ) {\n\n\t\tconst val = {\n\t\t\ttime: Date.now(),\n\t\t\tvalue: value,\n\t\t}\n\n\t\tthis.data[ name ] = val;\n\t\tthis.storage?.setItem( name, JSON.stringify( val ) );\n\t}\n\n\tprivate getStruct( name: string ): XiriStorageEntry | null {\n\n\t\tif ( this.data[ name ] )\n\t\t\treturn this.data[ name ];\n\n\t\tconst valstr = this.storage?.getItem( name );\n\t\tif ( valstr ) {\n\t\t\tconst val = JSON.parse( valstr ) as XiriStorageEntry;\n\t\t\tthis.data[ name ] = val;\n\t\t\treturn val;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic remove( name: string ) {\n\n\t\tdelete this.data[ name ];\n\t\tthis.storage?.removeItem( name );\n\t}\n\n\tpublic get( name: string ): unknown {\n\n\t\tconst val = this.getStruct( name );\n\t\tif ( !val )\n\t\t\treturn null;\n\n\t\treturn val.value;\n\t}\n\n\t/**\n\t * @param name\n\t * @param maxTime in seconds\n\t */\n\tpublic getTimeout( name: string, maxTime: number ): unknown {\n\n\t\tconst val = this.getStruct( name );\n\t\tif ( !val )\n\t\t\treturn null;\n\n\t\tif ( val.time < Date.now() - maxTime * 1000 ) {\n\t\t\tthis.remove( name );\n\t\t\treturn null;\n\t\t}\n\n\t\treturn val.value;\n\t}\n\n}\n","import { Injectable } from '@angular/core';\nimport { XiriStorageServiceBase } from './storage-base';\n\n\n@Injectable( {\n\t providedIn: 'root'\n } )\nexport class XiriLocalStorageService extends XiriStorageServiceBase {\n\n\tconstructor() {\n\t\tsuper( window.localStorage );\n\t}\n\n}\n","import { inject, Injectable } from '@angular/core';\nimport { XiriLocalStorageService } from '../services/localStorage.service';\nimport { XiriTagChip } from '../formfields/field.interface';\n\n// A single table cell value. Rows are JSON delivered by the Go builder, so cell values are\n// genuinely dynamic (scalars, nested arrays for formats like \"number\"/\"buttons\", or chip objects).\n// The recursive shape keeps deep template accesses (row[col][i], chip.label, …) type-checking\n// under strictTemplates without resorting to `any`.\nexport type XiriTableCellValue =\n\t| string\n\t| number\n\t| boolean\n\t| null\n\t| undefined\n\t| XiriTagChip\n\t| XiriTableCellValue[]\n\t| { [key: string]: XiriTableCellValue };\n\n// A flat table row: arbitrary JSON keyed by column id, plus the tree metadata attached at runtime.\nexport interface XiriTableRow {\n\t[key: string]: XiriTableCellValue | XiriTreeMeta | undefined;\n\tid?: string | number;\n\tselect?: boolean;\n\t_tree?: XiriTreeMeta;\n}\n\n// Identifier of a tree node (the value of the row's id field) — string or number in practice.\nexport type XiriTreeId = string | number;\n\n/**\n * Opt-in tree-mode settings for xiri-table. When present on XiriTableSettings.tree, the\n * table renders rows hierarchically (indent + expand/collapse) based on each flat row's\n * id/parentId values. Without it the table renders as a flat list (unchanged behaviour).\n */\nexport interface XiriTableTreeSettings {\n\tidField: string // row field holding the node ID\n\tparentIdField: string // row field holding the parent ID; null/undefined/0 = root\n\ttreeColumn?: string // column that renders the indentation; default: first column\n\tcollapseAllByDefault?: boolean // default: false → tree starts fully expanded\n\tpersistStateKey?: string // localStorage key; without it no persistence\n\tshowCounts?: boolean // \"(5)\" badge when collapsed; default: true\n\taddSubHandler?: ( parentRow: XiriTableRow ) => void // when set → \"+ sub\" button per row (Angular consumers)\n\taddSubUrl?: string // when set → \"+ sub\" button that navigates here ({id} placeholder)\n\taddSubField?: string // per-row field whose truthy value gates the \"+ sub\" button (xiri-go path)\n\taddSubWhen?: ( row: XiriTableRow ) => boolean // predicate gating the \"+ sub\" button per row (Angular consumers)\n}\n\n/** Per-row tree metadata, attached as row._tree by flatten()/searchProjection(). */\nexport interface XiriTreeMeta {\n\tlevel: number // indentation depth (0 = root)\n\thasChildren: boolean // node has at least one (visible) child\n\texpanded: boolean // node is currently expanded\n\tchildCount: number // number of direct (visible) children\n\tdimmed?: boolean // ancestor-only context node during an active search\n}\n\nexport interface XiriTreeNode {\n\tid: XiriTreeId\n\trow: XiriTableRow\n\tchildren: XiriTreeNode[]\n\tlevel: number\n}\n\nconst STATE_PREFIX = 'xiri-tree-state-';\n\n// ============================================================================\n// Pure functions (no Angular dependencies — directly unit-testable)\n// ============================================================================\n\n/** Normalises a parent reference: null/undefined/0/'' are treated as \"no parent\" (root). */\nexport function normalizeParent( value: unknown ): XiriTreeId | null {\n\tif ( value === null || value === undefined || value === 0 || value === '' )\n\t\treturn null;\n\treturn value as XiriTreeId;\n}\n\n/**\n * Builds a node tree from a flat row list. Rows whose parentId is missing from the dataset\n * become roots. Cycles are detected and the offending node is treated as a root (with a\n * console warning) instead of crashing.\n */\nexport function buildTree( rows: XiriTableRow[], idField: string, parentIdField: string, treeColumn?: string ): XiriTreeNode[] {\n\tconst nodeMap = new Map<XiriTreeId, XiriTreeNode>();\n\tfor ( const row of rows ) {\n\t\tconst id = row[ idField ] as XiriTreeId;\n\t\tnodeMap.set( id, { id, row, children: [], level: 0 } );\n\t}\n\n\tconst roots: XiriTreeNode[] = [];\n\n\tfor ( const row of rows ) {\n\t\tconst node = nodeMap.get( row[ idField ] as XiriTreeId )!;\n\t\tconst pid = normalizeParent( row[ parentIdField ] );\n\t\tconst parent = pid !== null ? nodeMap.get( pid ) : undefined;\n\n\t\tif ( !parent ) {\n\t\t\troots.push( node );\n\t\t} else if ( createsCycle( node.id, parent, nodeMap, idField, parentIdField ) ) {\n\t\t\tconsole.warn( `xiri-table tree: cycle detected for node \"${ node.id }\", treating it as a root` );\n\t\t\troots.push( node );\n\t\t} else {\n\t\t\tparent.children.push( node );\n\t\t}\n\t}\n\n\tassignLevels( roots, 0 );\n\tif ( treeColumn )\n\t\tsortSiblings( roots, treeColumn );\n\n\treturn roots;\n}\n\n/** Walks up from candidateParent; returns true if it reaches nodeId (would create a cycle). */\nfunction createsCycle( nodeId: XiriTreeId, candidateParent: XiriTreeNode, nodeMap: Map<XiriTreeId, XiriTreeNode>,\n idField: string, parentIdField: string ): boolean {\n\tlet current: XiriTreeNode | undefined = candidateParent;\n\tconst seen = new Set<XiriTreeId>();\n\twhile ( current ) {\n\t\tif ( current.id === nodeId )\n\t\t\treturn true;\n\t\tif ( seen.has( current.id ) )\n\t\t\treturn true; // pre-existing cycle further up\n\t\tseen.add( current.id );\n\t\tconst ppid = normalizeParent( current.row[ parentIdField ] );\n\t\tcurrent = ppid !== null ? nodeMap.get( ppid ) : undefined;\n\t}\n\treturn false;\n}\n\nfunction assignLevels( nodes: XiriTreeNode[], level: number ): void {\n\tfor ( const node of nodes ) {\n\t\tnode.level = level;\n\t\tassignLevels( node.children, level + 1 );\n\t}\n}\n\n/** Sorts siblings alphabetically by the tree column at every level. */\nexport function sortSiblings( nodes: XiriTreeNode[], treeColumn: string ): void {\n\tnodes.sort( ( a, b ) =>\n\t\tString( a.row[ treeColumn ] ?? '' ).localeCompare( String( b.row[ treeColumn ] ?? '' ), undefined, { sensitivity: 'base' } ) );\n\tfor ( const node of nodes )\n\t\tsortSiblings( node.children, treeColumn );\n}\n\n/**\n * Projects the tree to the flat, ordered list of currently visible rows, annotating each\n * row with its tree metadata (row._tree). Children are only included when their parent is\n * in expandedIds.\n */\nexport function flatten( roots: XiriTreeNode[], expandedIds: Set<XiriTreeId> ): XiriTableRow[] {\n\tconst out: XiriTableRow[] = [];\n\tconst walk = ( nodes: XiriTreeNode[] ) => {\n\t\tfor ( const node of nodes ) {\n\t\t\tconst hasChildren = node.children.length > 0;\n\t\t\tconst expanded = hasChildren && expandedIds.has( node.id );\n\t\t\tnode.row._tree = {\n\t\t\t\tlevel: node.level,\n\t\t\t\thasChildren,\n\t\t\t\texpanded,\n\t\t\t\tchildCount: node.children.length,\n\t\t\t} as XiriTreeMeta;\n\t\t\tout.push( node.row );\n\t\t\tif ( expanded )\n\t\t\t\twalk( node.children );\n\t\t}\n\t};\n\twalk( roots );\n\treturn out;\n}\n\n/**\n * Search projection: returns each match together with its full subtree (all descendants)\n * plus the ancestor path leading to it; everything else is hidden. Matches and their\n * descendants are shown fully; ancestor-only context nodes are flagged dimmed. Within the\n * filtered result, expand/collapse follows `expandedIds` (same state model as the flat view) —\n * pass an all-expanded set to show everything. The `matches` predicate decides hits.\n */\nexport function searchProjection( roots: XiriTreeNode[], matches: ( row: XiriTableRow ) => boolean,\n expandedIds: Set<XiriTreeId> ): XiriTableRow[] {\n\tconst visible = new Set<XiriTreeNode>();\n\tconst inMatchSubtree = new Set<XiriTreeNode>(); // node matches itself or sits under a match → shown fully\n\n\t// underMatch: an ancestor of this node already matched, so the whole subtree is shown.\n\tconst mark = ( node: XiriTreeNode, underMatch: boolean ): boolean => {\n\t\tconst selfMatch = matches( node.row );\n\t\tconst inSubtree = underMatch || selfMatch;\n\t\tif ( inSubtree )\n\t\t\tinMatchSubtree.add( node );\n\n\t\tlet descendantVisible = false;\n\t\tfor ( const child of node.children )\n\t\t\tdescendantVisible = mark( child, inSubtree ) || descendantVisible;\n\n\t\t// Visible if part of a matched subtree, or an ancestor on the path to a deeper match.\n\t\tif ( inSubtree || descendantVisible ) {\n\t\t\tvisible.add( node );\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\tfor ( const root of roots )\n\t\tmark( root, false );\n\n\tconst out: XiriTableRow[] = [];\n\tconst walk = ( nodes: XiriTreeNode[] ) => {\n\t\tfor ( const node of nodes ) {\n\t\t\tif ( !visible.has( node ) )\n\t\t\t\tcontinue;\n\t\t\tconst visibleChildren = node.children.filter( c => visible.has( c ) );\n\t\t\tconst hasChildren = visibleChildren.length > 0;\n\t\t\tconst expanded = hasChildren && expandedIds.has( node.id );\n\t\t\tnode.row._tree = {\n\t\t\t\tlevel: node.level,\n\t\t\t\thasChildren,\n\t\t\t\texpanded,\n\t\t\t\tchildCount: visibleChildren.length,\n\t\t\t\tdimmed: !inMatchSubtree.has( node ),\n\t\t\t} as XiriTreeMeta;\n\t\t\tout.push( node.row );\n\t\t\tif ( expanded )\n\t\t\t\twalk( node.children );\n\t\t}\n\t};\n\twalk( roots );\n\treturn out;\n}\n\n/** Collects the ids of every node that has at least one child (i.e. is expandable). */\nexport function collectExpandableIds( roots: XiriTreeNode[] ): Set<XiriTreeId> {\n\tconst ids = new Set<XiriTreeId>();\n\tconst walk = ( nodes: XiriTreeNode[] ) => {\n\t\tfor ( const node of nodes ) {\n\t\t\tif ( node.children.length > 0 ) {\n\t\t\t\tids.add( node.id );\n\t\t\t\twalk( node.children );\n\t\t\t}\n\t\t}\n\t};\n\twalk( roots );\n\treturn ids;\n}\n\n// ============================================================================\n// Stateful service (one instance per table, provided in the component)\n// ============================================================================\n\n@Injectable()\nexport class XiriTableTreeService {\n\n\tprivate localStorage = inject( XiriLocalStorageService );\n\n\tprivate config: XiriTableTreeSettings | null = null;\n\tprivate treeColumnId = '';\n\tprivate roots: XiriTreeNode[] = [];\n\tprivate expanded = new Set<XiriTreeId>();\n\tprivate savedExpanded: Set<XiriTreeId> | null = null; // expand-state snapshot taken when a search starts\n\tprivate searchActive = false;\n\n\t/** Whether tree mode is active for this table. */\n\tget enabled(): boolean { return this.config !== null; }\n\tget settings(): XiriTableTreeSettings | null { return this.config; }\n\tget treeColumn(): string { return this.treeColumnId; }\n\tget showCounts(): boolean { return this.config?.showCounts !== false; }\n\tget hasAddSub(): boolean { return !!( this.config?.addSubHandler || this.config?.addSubUrl ); }\n\n\t/** Initialises the service from the table's tree settings. treeColumn falls back to firstColumnId. */\n\tinit( config: XiriTableTreeSettings, firstColumnId: string ): void {\n\t\tthis.config = config;\n\t\tthis.treeColumnId = config.treeColumn || firstColumnId;\n\t}\n\n\t/** Builds the tree from flat rows and initialises the expand-state. */\n\tbuild( rows: XiriTableRow[] ): void {\n\t\tif ( !this.config )\n\t\t\treturn;\n\n\t\tthis.roots = buildTree( rows, this.config.idField, this.config.parentIdField, this.treeColumnId );\n\n\t\tconst persisted = this.loadPersisted();\n\t\tif ( persisted )\n\t\t\tthis.expanded = new Set( persisted ); // persisted state wins\n\t\telse if ( this.config.collapseAllByDefault )\n\t\t\tthis.expanded = new Set(); // opt-in: start collapsed\n\t\telse\n\t\t\tthis.expanded = collectExpandableIds( this.roots ); // default: start fully expanded\n\t}\n\n\t/** Returns the visible rows: search projection when searching, otherwise the expand-state flatten. */\n\tvisibleRows( matches?: ( row: XiriTableRow ) => boolean ): XiriTableRow[] {\n\t\tif ( this.searchActive && matches )\n\t\t\treturn searchProjection( this.roots, matches, this.expanded );\n\t\treturn flatten( this.roots, this.expanded );\n\t}\n\n\t/**\n\t * Applies (or clears) a search. On the empty→active transition the current expand-state is\n\t * snapshotted and the tree is fully expanded (so all matches are visible); during the search\n\t * the same `expanded` state drives expand/collapse, so the arrows work. On active→empty the\n\t * pre-search state is restored (Spec §5). Returns the new visible rows.\n\t */\n\tapplySearch( matches: ( ( row: XiriTableRow ) => boolean ) | null ): XiriTableRow[] {\n\t\tif ( matches ) {\n\t\t\tif ( !this.searchActive ) {\n\t\t\t\tthis.savedExpanded = new Set( this.expanded );\n\t\t\t\tthis.expanded = collectExpandableIds( this.roots ); // start fully expanded\n\t\t\t\tthis.searchActive = true;\n\t\t\t}\n\t\t\treturn searchProjection( this.roots, matches, this.expanded );\n\t\t}\n\n\t\tif ( this.searchActive ) {\n\t\t\tif ( this.savedExpanded )\n\t\t\t\tthis.expanded = new Set( this.savedExpanded );\n\t\t\tthis.savedExpanded = null;\n\t\t\tthis.searchActive = false;\n\t\t}\n\t\treturn flatten( this.roots, this.expanded );\n\t}\n\n\ttoggle( row: XiriTableRow ): void {\n\t\tconst id = row[ this.config!.idField ] as XiriTreeId;\n\t\tif ( this.expanded.has( id ) )\n\t\t\tthis.expanded.delete( id );\n\t\telse\n\t\t\tthis.expanded.add( id );\n\t\t// Don't persist transient expand changes made while searching — savedExpanded holds the\n\t\t// real state and is restored on reset.\n\t\tif ( !this.searchActive )\n\t\t\tthis.persist();\n\t}\n\n\texpandAll(): void {\n\t\tthis.expanded = collectExpandableIds( this.roots );\n\t\tthis.persist();\n\t}\n\n\tcollapseAll(): void {\n\t\tthis.expanded = new Set();\n\t\tthis.persist();\n\t}\n\n\t/**\n\t * Whether the \"+ sub\" button should be shown for a given row. Opt-in: an addSubWhen predicate\n\t * or a truthy addSubField value gates it; without either, the button shows on every row.\n\t */\n\tcanAddSub( row: XiriTableRow ): boolean {\n\t\tif ( !this.config )\n\t\t\treturn false;\n\t\tif ( this.config.addSubWhen )\n\t\t\treturn this.config.addSubWhen( row );\n\t\tif ( this.config.addSubField )\n\t\t\treturn !!row[ this.config.addSubField ];\n\t\treturn true;\n\t}\n\n\t/** Resolves the \"+ sub\" target URL for a row, substituting the {id} placeholder. */\n\taddSubUrlFor( row: XiriTableRow ): string | null {\n\t\tif ( !this.config?.addSubUrl )\n\t\t\treturn null;\n\t\treturn this.config.addSubUrl.replace( '{id}', encodeURIComponent( String( row[ this.config.idField ] ) ) );\n\t}\n\n\tprivate storageKey(): string | null {\n\t\treturn this.config?.persistStateKey ? STATE_PREFIX + this.config.persistStateKey : null;\n\t}\n\n\tprivate loadPersisted(): XiriTreeId[] | null {\n\t\tconst key = this.storageKey();\n\t\tif ( !key )\n\t\t\treturn null;\n\t\tconst value = this.localStorage.get( key );\n\t\treturn Array.isArray( value ) ? value as XiriTreeId[] : null;\n\t}\n\n\tprivate persist(): void {\n\t\tconst key = this.storageKey();\n\t\tif ( key )\n\t\t\tthis.localStorage.set( key, Array.from( this.expanded ) );\n\t}\n}\n","import { Component, input, output } from '@angular/core';\nimport { XiriButton, XiriButtonComponent, XiriButtonResult } from \"../button/button.component\";\n\n\nexport interface XiriButtonlineSettings {\n\tbuttons: XiriButton[]\n\tclass: string\n}\n\n@Component( {\n\t selector: 'xiri-buttonline',\n\t templateUrl: './buttonline.component.html',\n\t styleUrl: './buttonline.component.scss',\n\t imports: [\n\t\t XiriButtonComponent\n\t ],\n } )\nexport class XiriButtonlineComponent {\n\t\n\tsettings = input.required<XiriButtonlineSettings>();\n\tdisabled = input<boolean>( false );\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\t\n\tresult = output<XiriButtonResult>();\n}\n","<div class=\"buttonline\" [class]=\"settings().class\">\n\t@for (button of settings().buttons; track i; let i = $index) {\n\t\t<xiri-button [button]=\"button\" [filterData]=\"filterData()\" [disabled]=\"disabled()\" (result)=\"result.emit( $event )\"></xiri-button>\n\t}\n</div>\n","import { Injectable } from '@angular/core';\nimport { XiriStorageServiceBase } from './storage-base';\n\n\n@Injectable( {\n\t providedIn: 'root'\n } )\nexport class XiriSessionStorageService extends XiriStorageServiceBase {\n\n\tconstructor() {\n\t\tsuper( window.sessionStorage );\n\t}\n\n}\n","import { Component, input, output } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriButton, XiriButtonComponent, XiriButtonResult } from '../button/button.component';\nimport { XiriColor } from '../types/color.type';\n\nexport interface XiriEmptyStateSettings {\n\ticon?: string\n\ticonColor?: XiriColor\n\ttitle?: string\n\tdescription?: string\n\tbutton?: XiriButton\n}\n\n@Component( {\n\t selector: 'xiri-empty-state',\n\t templateUrl: './empty-state.component.html',\n\t styleUrl: './empty-state.component.scss',\n\t imports: [ MatIcon, XiriButtonComponent ]\n } )\nexport class XiriEmptyStateComponent {\n\n\tsettings = input.required<XiriEmptyStateSettings>();\n\tbuttonResult = output<XiriButtonResult>();\n}\n","<div class=\"empty-state\">\n\t@if (settings().icon) {\n\t\t<mat-icon [class]=\"settings().iconColor || 'gray'\">{{ settings().icon }}</mat-icon>\n\t}\n\t<div class=\"title\">{{ settings().title }}</div>\n\t@if (settings().description) {\n\t\t<div class=\"description\">{{ settings().description }}</div>\n\t}\n\t@if (settings().button) {\n\t\t<div class=\"action\">\n\t\t\t<xiri-button [button]=\"settings().button!\" (result)=\"buttonResult.emit($event)\"></xiri-button>\n\t\t</div>\n\t}\n</div>\n","import {\n\tChangeDetectorRef,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\teffect,\n\tinject,\n\tinput,\n\tOnDestroy,\n\tOnInit,\n\toutput,\n\tsignal,\n\tTemplateRef,\n\tviewChild,\n\tViewEncapsulation\n} from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort, MatSortable, MatSortHeader } from '@angular/material/sort';\nimport {\n\tMatCell, MatCellDef,\n\tMatColumnDef, MatFooterCell, MatFooterCellDef, MatFooterRow, MatFooterRowDef,\n\tMatHeaderCell, MatHeaderCellDef,\n\tMatHeaderRow, MatHeaderRowDef,\n\tMatRow, MatRowDef,\n\tMatTable,\n\tMatTableDataSource\n} from '@angular/material/table';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { Router, RouterLink } from '@angular/router';\nimport { Observable, Subject } from \"rxjs\";\nimport { takeUntil } from \"rxjs/operators\";\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { XiriDialogComponent } from \"../dialog/dialog.component\";\nimport { XiriDataService } from '../services/data.service';\nimport { XiriButton, XiriButtonComponent, XiriButtonResult } from \"../button/button.component\";\nimport { XiriSnackbarService } from '../services/snackbar.service';\nimport { XiriResponseHandlerService } from '../services/response-handler.service';\nimport { XiriDownloadService } from '../services/download.service';\nimport { XiriTableInlineEditService } from './inline-edit.service';\nimport { XiriTableCellValue, XiriTableRow, XiriTableTreeService, XiriTableTreeSettings } from './tree.service';\nimport { XiriTagChip } from '../formfields/field.interface';\nimport { XiriButtonlineComponent, XiriButtonlineSettings } from \"../buttonline/buttonline.component\";\nimport { XiriDynData } from \"../dyncomponent/dyndata.interface\";\nimport { XiriTableField } from \"../raw-table/tabefield.interface\";\nimport { XiriSessionStorageService } from \"../services/sessionStorage.service\";\nimport { XiriLocaleService } from '../services/locale.service';\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgxMatSelectSearchModule } from 'ngx-mat-select-search';\nimport { MatInput } from '@angular/material/input';\nimport { MatFormField, MatSuffix } from '@angular/material/form-field';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { XiriButtonstyleComponent } from '../buttonstyle/buttonstyle.component';\nimport { XiriSearchComponent } from '../search/search.component';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatButton, MatIconButton } from '@angular/material/button';\nimport { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';\nimport { MatSelect, MatOption } from '@angular/material/select';\nimport { DatePipe, NgTemplateOutlet } from '@angular/common';\nimport { MatCard } from '@angular/material/card';\nimport { XiriEmptyStateComponent } from '../empty-state/empty-state.component';\nimport { XiriColor } from '../types/color.type';\n\n\n// Minimal shape of an HTTP error as surfaced by the data service (Angular HttpErrorResponse).\ninterface XiriHttpError {\n\terror?: { error?: string } | string;\n\tstatusText?: string;\n}\n\n// Reads a human-readable message out of an unknown error value.\nfunction errorMessage( err: unknown ): string | undefined {\n\tconst e = err as XiriHttpError;\n\tconst inner = e?.error;\n\tif ( inner && typeof inner === 'object' && 'error' in inner )\n\t\treturn inner.error;\n\treturn undefined;\n}\n\n// Shape of a server data response consumed by loadData().\nexport interface XiriTableResponse {\n\tdata?: XiriTableRow[];\n\tfields?: XiriTableField[];\n\tsummary?: XiriDynData[];\n\tcomponents?: XiriDynData[];\n\tfooter?: Record<string, XiriTableCellValue>;\n\ttotalCount?: number;\n\tpoll?: number;\n\t[key: string]: unknown;\n}\n\n// Dialog payload passed to XiriDialogComponent from a table button (copied from the button,\n// with type/url/data overridden per action). `data` carries either the button's own payload\n// or, for selection dialogs, the selected row ids.\ntype XiriTableDialogData = Omit<Partial<XiriButton>, 'data'> & {\n\ttype: string;\n\turl?: string;\n\tdata?: XiriButton['data'] | ( string | number )[];\n};\n\n// Persisted (session-storage) table state restored on first data load.\ninterface XiriTableSavedState {\n\tpageIndex?: number;\n\tpageSize?: number;\n\tfilter?: string;\n\tsort?: string;\n\tsortDirection?: 'asc' | 'desc' | '';\n}\n\nexport interface XiriTableEmptyState {\n\ticon?: string\n\ticonColor?: XiriColor\n\ttitle?: string\n\tdescription?: string\n}\n\nexport interface XiriTableOptions {\n\treload?: boolean\n\tdense?: boolean\n\tdensity?: 'compact' | 'regular' | 'relaxed'\n\tsort?: boolean\n\tsearch?: boolean\n\tclass?: string\n\tpagination?: boolean\n\titemsPerPage?: number\n\tpageSizes?: number[]\n\tselect?: boolean\n\tselectButtons?: XiriButton[]\n\t// UX-007 Bulk-Actions (additiv): when set, a selection column is shown and a sticky\n\t// context bar with these actions appears once at least one row is selected.\n\tbulkActions?: XiriButton[]\n\t// Offer \"select all results\" (whole filter, not just the current page) in the bulk bar.\n\tselectAllResults?: boolean\n\t// Keep the bulk context bar pinned to the top while scrolling.\n\tstickyBulkBar?: boolean\n\ttitle?: string\n\ttextNoData?: string\n\temptyState?: XiriTableEmptyState\n\tbuttons?: XiriButtonlineSettings\n\tminWidth?: string\n\tsaveState?: boolean\n\tsaveStateId?: string\n\tsaveInput?: string\n\tsaveInputUrl?: string\n\tborders?: boolean\n\tbordersHeader?: boolean\n\tfooter?: boolean\n\tserverSide?: boolean\n\tscrollHeight?: string\n\teditUrl?: string\n\ttree?: XiriTableTreeSettings // opt-in tree mode; delivered here by the Go builder (options.tree)\n}\n\nexport interface XiriTableSettings {\n\turl?: string\n\tdata?: XiriTableRow[]\n\tfields?: XiriTableField[]\n\toptions?: XiriTableOptions\n\thasFilter?: boolean\n\ttree?: XiriTableTreeSettings // opt-in tree mode; for direct Angular consumers (Spec §6)\n}\n\nexport type { XiriTableTreeSettings, XiriTableRow, XiriTableCellValue } from './tree.service';\n\n@Component( {\n\t selector: 'xiri-table',\n\t templateUrl: './table.component.html',\n\t styleUrl: './table.component.scss',\n\t encapsulation: ViewEncapsulation.None,\n\t providers: [ XiriTableInlineEditService, XiriTableTreeService ],\n\t imports: [ MatCard,\n\t MatIconButton,\n\t MatIcon,\n\t XiriButtonlineComponent,\n\t XiriSearchComponent,\n\t MatButton,\n\t MatTable,\n\t MatSort,\n\t MatColumnDef,\n\t MatHeaderCell,\n\t MatSortHeader,\n\t MatCell,\n\t RouterLink,\n\t XiriButtonstyleComponent,\n\t MatTooltip,\n\t MatFormField, MatSuffix,\n\t MatInput,\n\t FormsModule,\n\t ReactiveFormsModule,\n\t NgxMatSelectSearchModule,\n\t MatCheckbox,\n\t MatHeaderRow,\n\t MatRow,\n\t MatProgressSpinner,\n\t MatPaginator,\n\t NgTemplateOutlet,\n\t DatePipe,\n\t SafehtmlPipe, XiriUrlPipe, XiriButtonComponent, MatHeaderCellDef, MatCellDef, MatHeaderRowDef, MatRowDef,\n\t MatFooterRow, MatFooterRowDef, MatFooterCell, MatFooterCellDef,\n\t MatMenu, MatMenuItem, MatMenuTrigger,\n\t MatSelect, MatOption,\n\t XiriEmptyStateComponent ]\n } )\nexport class XiriTableComponent implements OnInit, OnDestroy {\n\t\n\tprivate dialog: MatDialog = inject( MatDialog );\n\tprivate dataService: XiriDataService = inject( XiriDataService );\n\tprivate router: Router = inject( Router );\n\tprivate sessionStorageService: XiriSessionStorageService = inject( XiriSessionStorageService );\n\tprivate numberService = inject( XiriLocaleService );\n\tprivate snackbar = inject( XiriSnackbarService );\n\tprivate responseHandler = inject( XiriResponseHandlerService );\n\tprivate downloadService = inject( XiriDownloadService );\n\tinlineEdit = inject( XiriTableInlineEditService );\n\ttree = inject( XiriTableTreeService );\n\tprotected _changeDetectorRef: ChangeDetectorRef = inject( ChangeDetectorRef );\n\tprivate destroyRef = inject( DestroyRef );\n\t\n\tdyncomponent = input<TemplateRef<unknown>>();\n\tsettings = input.required<XiriTableSettings>();\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\tclickedRow = output<XiriTableRow>();\n\n\tpaginator = viewChild.required<MatPaginator>( MatPaginator );\n\tsort = viewChild.required<MatSort>( MatSort );\n\ttable = viewChild.required<MatTable<XiriTableRow>>( MatTable );\n\tloading = signal<boolean>( true );\n\tprivate _totalCount = signal<number>( 0 );\n\n\tdisplayedColumns: XiriTableField[] = [];\n\tcolumnsToDisplay: string[] = [];\n\tcolumnsToSearch: string[] = [];\n\tdataSource = new MatTableDataSource<XiriTableRow>();\n\tprotected _displayeddata: readonly XiriTableRow[] = [];\n\t_alldata = signal<XiriTableRow[] | null>( null );\n\tfooter: Record<string, XiriTableCellValue> = {};\n\n\textraHeaderFields: XiriTableField[] = [];\n\textraHeaders: string[] = [];\n\n\tpublic selection = new SelectionModel<XiriTableRow>( true, [] );\n\t// UX-007: true once the user opted into \"all results\" (whole filter) instead of just the\n\t// selected rows on the current page. Reset whenever the selection is cleared or changed.\n\tpublic bulkAllResults = signal<boolean>( false );\n\tprivate dialogRef?: MatDialogRef<unknown>;\n\tprivate reloadAbort$ = new Subject<void>();\n\n\t// Auto-refresh (backend-driven polling): activated when the table data response\n\t// contains a \"poll\" interval (ms). While active the whole table reloads after that\n\t// interval and a table-wide indicator with countdown is shown. Stops automatically\n\t// when a response no longer contains \"poll\".\n\tprivate autoRefreshTimer?: ReturnType<typeof setTimeout>;\n\tprivate countdownTimer?: ReturnType<typeof setInterval>;\n\tautoRefresh = signal<{ intervalMs: number; nextAt: number } | null>( null );\n\t// Timestamp of the last successful load, shown as \"Stand HH:MM\" so a stale/polled\n\t// view never lets the user act on silently outdated numbers.\n\tlastUpdated = signal<Date | null>( null );\n\tprivate _now = signal<number>( Date.now() );\n\tcountdown = computed<number>( () => {\n\t\tconst ar = this.autoRefresh();\n\t\tif ( !ar )\n\t\t\treturn 0;\n\t\tconst secs = Math.ceil( ( ar.nextAt - this._now() ) / 1000 );\n\t\treturn secs > 0 ? secs : 0;\n\t} );\n\n\tpublic options: XiriTableOptions = {\n\t\treload: false,\n\t\tdense: false,\n\t\tdensity: 'regular',\n\t\tsort: true,\n\t\tsearch: true,\n\t\tpagination: true,\n\t\titemsPerPage: 50,\n\t\tpageSizes: [ 10, 25, 50, 100, 500 ],\n\t\tselect: false,\n\t\ttitle: '',\n\t\ttextNoData: 'no data found',\n\t\tsaveInput: undefined,\n\t\tsaveInputUrl: undefined,\n\t\tsaveState: false,\n\t\tsaveStateId: undefined,\n\t\tborders: false,\n\t\tbordersHeader: false,\n\t\tfooter: false,\n\t\tserverSide: false,\n\t};\n\t\n\tpublic dynData: {\n\t\tdata: XiriDynData[] | null,\n\t\tfilterData: Record<string, unknown> | null | undefined,\n\t} = { data: null, filterData: undefined };\n\tpublic errorMsg = '';\n\tprivate _firstData = true;\n\tpublic searchText = '';\n\tpublic searchTextInit = '';\n\n\t// Resolves the legacy dense:true alias to density:'compact' when density itself is not set explicitly.\n\tpublic mergeOptions( incoming: XiriTableOptions ): XiriTableOptions {\n\t\tconst merged: XiriTableOptions = { ...incoming };\n\t\tif ( merged.density === undefined && merged.dense === true )\n\t\t\tmerged.density = 'compact';\n\t\treturn merged;\n\t}\n\n\t// Density-Klasse reaktiv aus settings() ableiten, damit ein Live-Umschalten des density-Werts\n\t// wirkt (options wird sonst nur einmal in ngOnInit gemergt und würde nicht reagieren).\n\tpublic densityClass = computed( () => 'density-' + ( this.mergeOptions( this.settings().options ?? {} ).density ?? 'regular' ) );\n\n\tprivate tableStateKey(): string | null {\n\t\treturn this.options.saveStateId ? this.options.saveStateId + ':table' : null;\n\t}\n\n\ttrackByRowId = ( index: number, row: XiriTableRow ): string | number => row.id ?? index;\n\n\t// Inline edit signals delegated to inlineEdit service\n\tget editingCell() { return this.inlineEdit.editingCell; }\n\tget editingChipsValues() { return this.inlineEdit.editingChipsValues; }\n\tget editableOptionsLoading() { return this.inlineEdit.editableOptionsLoading; }\n\tget loadedEditableOptions() { return this.inlineEdit.loadedEditableOptions; }\n\tget savingCell() { return this.inlineEdit.savingCell; }\n\tget inlineSearchControl() { return this.inlineEdit.searchControl; }\n\tget inlineSearching() { return this.inlineEdit.searching; }\n\t\n\t_filterData = computed( () => {\n\t\t\n\t\tconst values = this.filterData();\n\t\t\n\t\tif ( values === undefined )\n\t\t\treturn undefined;\n\t\telse if ( values === null )\n\t\t\treturn null;\n\t\t\n\t\treturn values;\n\t} );\n\t\n\tconstructor() {\n\t\t\n\t\teffect( () => {\n\t\t\tconst filterData = this._filterData();\n\n\t\t\tthis.loading.set( true );\n\t\t\tthis.reloadAbort$.next();\n\t\t\tthis.clearAutoRefresh();\n\n\t\t\tif ( filterData === null )\n\t\t\t\treturn;\n\n\t\t\tthis.loadData();\n\t\t} );\n\t\t\n\t\teffect( () => {\n\t\t\tconst all = this._alldata();\n\t\t\tif ( all === null ) {\n\t\t\t\tthis.dataSource.data = [];\n\t\t\t} else if ( this.tree.enabled ) {\n\t\t\t\tthis.tree.build( all );\n\t\t\t\tthis.refreshTree();\n\t\t\t} else {\n\t\t\t\tthis.dataSource.data = all;\n\t\t\t}\n\t\t} );\n\t}\n\t\n\tpublic ngOnInit() {\n\t\t\n\t\tif ( this.settings().options )\n\t\t\tthis.options = { ...this.options, ...this.mergeOptions( this.settings().options as XiriTableOptions ) };\n\t\tconst settingsFields = this.settings().fields;\n\t\tif ( settingsFields )\n\t\t\tthis.loadFields( settingsFields );\n\n\t\t// Tree mode: accept config from top-level settings (Angular consumers) or options (Go builder).\n\t\tconst treeCfg = this.settings().tree ?? this.options.tree;\n\t\tif ( treeCfg && this.displayedColumns.length > 0 )\n\t\t\tthis.tree.init( treeCfg, this.displayedColumns[ 0 ].id );\n\n\t\tthis.inlineEdit.init( {\n\t\t\tgetEditUrl: () => this.options.editUrl ?? '',\n\t\t\tgetDisplayedColumns: () => this.displayedColumns,\n\t\t\tabort$: this.reloadAbort$,\n\t\t\tonSaved: ( row, fieldId ) => this.inlineEdit.flashSaved( row, fieldId, this.dataSource ),\n\t\t\tonDataUpdate: () => this.dataSource._updateChangeSubscription(),\n\t\t\tonCallReturn: ( result ) => this.callReturn( result ),\n\t\t} );\n\n\t\tif ( this.options.pagination )\n\t\t\tthis.paginator().pageSize = this.options.itemsPerPage as number;\n\t\tif ( this.options.pagination && !this.options.serverSide )\n\t\t\tthis.dataSource.paginator = this.paginator();\n\t\t// In tree mode column sorting is disabled (Spec §5); siblings are sorted alphabetically\n\t\t// at build time. Connecting MatSort would re-order rows globally and break tree order.\n\t\tif ( this.options.sort && !this.options.serverSide && !this.tree.enabled ) {\n\t\t\tthis.dataSource.sort = this.sort();\n\t\t\tthis.dataSource.sortingDataAccessor = this.getSortingDataAccessor();\n\t\t\tif ( this.options.pagination )\n\t\t\t\tthis.sort().sortChange.subscribe( () => this.paginator().firstPage() );\n\t\t}\n\n\t\tif ( this.options.serverSide ) {\n\t\t\tthis.paginator().page\n\t\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t\t.subscribe( () => {\n\t\t\t\t\tthis.reload();\n\t\t\t\t} );\n\n\t\t\tif ( this.options.sort ) {\n\t\t\t\tthis.sort().sortChange\n\t\t\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t\t\t.subscribe( () => {\n\t\t\t\t\t\tthis.paginator().firstPage();\n\t\t\t\t\t\tthis.reload();\n\t\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Tree mode uses its own search projection (matches + ancestors), not the flat filter predicate.\n\t\tif ( this.options.search && !this.options.serverSide && !this.tree.enabled ) {\n\t\t\tthis.dataSource.filterPredicate = ( data: XiriTableRow, filter: string ): boolean => {\n\t\t\t\tconst dataStr = this.columnsToSearch.reduce( ( currentTerm: string, key: string ) => {\n\t\t\t\t\treturn currentTerm + data[ key ] + '◬';\n\t\t\t\t}, '' ).toLowerCase();\n\t\t\t\treturn dataStr.indexOf( filter ) !== -1;\n\t\t\t};\n\t\t}\n\t\t\n\t\tif ( this.options.buttons )\n\t\t\tthis.options.buttons.class = 'small';\n\t\t\n\t\tthis.dataSource.connect()\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( data => {\n\t\t\t\t\tthis._displayeddata = data || [];\n\t\t\t\t\t\n\t\t\t\t\tconst stateKey = this.tableStateKey();\n\t\t\t\t\tif ( this.options.saveState && this._firstData === false && stateKey ) {\n\t\t\t\t\t\tthis.sessionStorageService.set( stateKey, {\n\t\t\t\t\t\t\tpageIndex: this.paginator()?.pageIndex,\n\t\t\t\t\t\t\tpageSize: this.paginator()?.pageSize,\n\t\t\t\t\t\t\tfilter: this.searchText,\n\t\t\t\t\t\t\tsort: this.sort()?.active,\n\t\t\t\t\t\t\tsortDirection: this.sort()?.direction,\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ( this.options.footer ) {\n\t\t\t\t\t\tthis.displayedColumns.forEach( ( column: XiriTableField ) => {\n\t\t\t\t\t\t\tif ( column.footer === 'no' )\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif ( column.footer === 'count' ) {\n\t\t\t\t\t\t\t\tthis.footer[ column.id ] = this._displayeddata.length + '#';\n\t\t\t\t\t\t\t} else if ( column.footer === 'sum' ) {\n\t\t\t\t\t\t\t\tlet sum = 0;\n\t\t\t\t\t\t\t\tthis._displayeddata.forEach( ( row: XiriTableRow ) => {\n\t\t\t\t\t\t\t\t\tconst cell = row[ column.id ] as XiriTableCellValue[] | undefined;\n\t\t\t\t\t\t\t\t\tsum += +( cell ? cell[ 1 ] as number : 0 );\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif ( !column.webformat )\n\t\t\t\t\t\t\t\t\tthis.footer[ column.id ] = sum;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tthis.footer[ column.id ] = this.numberService.formatNumber( sum, column.webformat );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t} );\n\n\t\t// if ( !this.settings().hasFilter )\n\t\t//\tthis.loadData();\n\t}\n\t\n\tprivate loadData() {\n\t\t\n\t\tthis.errorMsg = '';\n\t\tthis.selection.clear();\n\t\tthis.bulkAllResults.set( false );\n\t\tthis.dynData.data = null;\n\t\t// Cancel any pending auto-refresh while this load is in flight; the response decides\n\t\t// whether to reschedule (res.poll present) or stop (clearAutoRefresh).\n\t\tthis.cancelAutoRefreshTimers();\n\n\t\tconst inlineData = this.settings().data;\n\t\tif ( inlineData ) {\n\t\t\tthis.options.reload = false;\n\t\t\tthis.clearAutoRefresh();\n\t\t\tthis.setData( inlineData );\n\t\t\tthis.loading.set( false );\n\t\t} else if ( this.settings().url ) {\n\n\t\t\tconst url = this.settings().url ?? '';\n\t\t\tconst payload: Record<string, unknown> = this.settings().hasFilter\n\t\t\t\t? { ...( this._filterData() as Record<string, unknown> ) }\n\t\t\t\t: {};\n\n\t\t\tif ( this.options.serverSide ) {\n\t\t\t\tpayload._page = this.paginator().pageIndex;\n\t\t\t\tpayload._pageSize = this.paginator().pageSize;\n\t\t\t\tif ( this.sort().active ) {\n\t\t\t\t\tpayload._sort = this.sort().active;\n\t\t\t\t\tpayload._sortDir = this.sort().direction;\n\t\t\t\t}\n\t\t\t\tif ( this.searchText ) {\n\t\t\t\t\tpayload._search = this.searchText;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst api: Observable<unknown> = this.dataService.post(\n\t\t\t\turl, Object.keys( payload ).length > 0 ? payload : null );\n\n\t\t\tapi.pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\t\tnext: ( raw: unknown ) => {\n\t\t\t\t\tconst res = raw as XiriTableResponse | null;\n\n\t\t\t\t\tif ( !res || !res.data ) {\n\t\t\t\t\t\tthis.errorMsg = 'ERROR: unknown server response';\n\t\t\t\t\t\tthis._alldata.set( [] );\n\t\t\t\t\t\tthis.clearAutoRefresh();\n\t\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( res.fields )\n\t\t\t\t\t\tthis.loadFields( res.fields );\n\t\t\t\t\tif ( res.summary )\n\t\t\t\t\t\tthis.dynData.data = res.summary;\n\t\t\t\t\telse if ( res.components )\n\t\t\t\t\t\tthis.dynData.data = res.components;\n\n\t\t\t\t\tif ( res.footer )\n\t\t\t\t\t\tthis.setFooter( res.footer );\n\t\t\t\t\tif ( res.totalCount !== undefined && this.options.serverSide ) {\n\t\t\t\t\t\tthis._totalCount.set( res.totalCount );\n\t\t\t\t\t\tthis.paginator().length = res.totalCount;\n\t\t\t\t\t}\n\t\t\t\t\tthis.setData( res.data );\n\t\t\t\t\tthis.lastUpdated.set( new Date() );\n\t\t\t\t\tif ( res.poll )\n\t\t\t\t\t\tthis.scheduleAutoRefresh( res.poll );\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.clearAutoRefresh();\n\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t\t}, error: ( err: unknown ) => {\n\t\t\t\t\tthis.errorMsg = errorMessage( err ) ?? ( err as XiriHttpError )?.statusText ?? '';\n\t\t\t\t\tthis._alldata.set( [] );\n\t\t\t\t\tthis.clearAutoRefresh();\n\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\t\n\tprivate loadFields( fields: XiriTableField[] ) {\n\t\t\n\t\tthis.displayedColumns = [];\n\t\tthis.columnsToDisplay = [];\n\t\tthis.columnsToSearch = [];\n\t\tthis.extraHeaderFields = [];\n\t\tthis.extraHeaders = [];\n\t\t\n\t\tif ( this.showSelectColumn )\n\t\t\tthis.columnsToDisplay.push( 'select' );\n\t\t\n\t\tfor ( let fid = 0; fid != fields.length; fid++ ) {\n\t\t\tconst column = fields[ fid ];\n\t\t\t\n\t\t\tif ( column.format == 'header' ) {\n\t\t\t\tthis.extraHeaderFields.push( column );\n\t\t\t\tthis.extraHeaders.push( column.id );\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif ( column.id === undefined )\n\t\t\t\tcolumn.id = '' + fid;\n\t\t\tif ( column.format == 'id' )\n\t\t\t\tcontinue;\n\t\t\tif ( !column.display )\n\t\t\t\tcolumn.display = '';\n\t\t\tif ( column.format )\n\t\t\t\tcolumn.display = column.format + ' ' + column.display;\n\t\t\tif ( column.align )\n\t\t\t\tcolumn.display += ` align-${ column.align }`;\n\t\t\t\n\t\t\tcolumn.sort = column.sort === undefined ? true : column.sort;\n\t\t\tcolumn.search = column.search === undefined ? true : column.search;\n\t\t\tcolumn.sticky = column.sticky === undefined ? false : column.sticky;\n\t\t\tcolumn.hide = column.hide === undefined ? false : column.hide;\n\t\t\t\n\t\t\tif ( !column.hide ) {\n\t\t\t\tthis.displayedColumns.push( column );\n\t\t\t\tthis.columnsToDisplay.push( column.id );\n\t\t\t}\n\t\t\t\n\t\t\tif ( column.search )\n\t\t\t\tthis.columnsToSearch.push( column.id );\n\t\t}\n\t}\n\t\n\tprivate setData( data: XiriTableRow[] ): void {\n\n\t\tthis._alldata.set( data );\n\n\t\tif ( this._firstData ) {\n\t\t\tthis._firstData = false;\n\n\t\t\tconst stateKey = this.tableStateKey();\n\t\t\tif ( this.options.saveState && stateKey ) {\n\t\t\t\tconst saved = this.sessionStorageService.getTimeout( stateKey, 3600 ) as XiriTableSavedState | null;\n\t\t\t\tif ( !saved )\n\t\t\t\t\treturn;\n\n\t\t\t\tif ( saved.filter !== undefined ) {\n\t\t\t\t\tthis.searchText = saved.filter;\n\t\t\t\t\tthis.searchTextInit = saved.filter;\n\t\t\t\t}\n\t\t\t\tif ( saved.sort !== undefined && saved.sortDirection !== undefined )\n\t\t\t\t\tthis.sort().sort( ( { id: saved.sort, start: saved.sortDirection } ) as MatSortable );\n\t\t\t\tif ( saved.pageSize !== undefined && saved.pageIndex !== undefined ) {\n\t\t\t\t\tthis.paginator().pageIndex = saved.pageIndex;\n\t\t\t\t\tthis.paginator()._changePageSize( saved.pageSize );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setFooter( footer: Record<string, XiriTableCellValue> ): void {\n\t\tthis.footer = footer;\n\n\t\tthis.displayedColumns.forEach( ( column: XiriTableField ) => {\n\t\t\tconst value = this.footer[ column.id ];\n\t\t\tif ( Array.isArray( value ) )\n\t\t\t\tthis.footer[ column.id ] = value[ 0 ];\n\t\t} );\n\t}\n\t\n\treload(): void {\n\t\tif ( this.loading() )\n\t\t\treturn;\n\n\t\tthis.loading.set( true );\n\t\tthis.loadData();\n\t}\n\n\t// Schedules the next auto-refresh reload and (re)starts the 1s countdown ticker.\n\tprivate scheduleAutoRefresh( intervalMs: number ): void {\n\t\tthis.cancelAutoRefreshTimers();\n\t\tconst now = Date.now();\n\t\tthis.autoRefresh.set( { intervalMs, nextAt: now + intervalMs } );\n\t\tthis._now.set( now );\n\t\tthis.autoRefreshTimer = setTimeout( () => {\n\t\t\tthis.autoRefreshTimer = undefined;\n\t\t\tthis.reload();\n\t\t}, intervalMs );\n\t\tthis.countdownTimer = setInterval( () => {\n\t\t\tthis._now.set( Date.now() );\n\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t}, 1000 );\n\t}\n\n\t// Clears pending timers without touching the indicator (used while a load is in flight).\n\tprivate cancelAutoRefreshTimers(): void {\n\t\tif ( this.autoRefreshTimer ) {\n\t\t\tclearTimeout( this.autoRefreshTimer );\n\t\t\tthis.autoRefreshTimer = undefined;\n\t\t}\n\t\tif ( this.countdownTimer ) {\n\t\t\tclearInterval( this.countdownTimer );\n\t\t\tthis.countdownTimer = undefined;\n\t\t}\n\t}\n\n\t// Fully stops auto-refresh and hides the indicator.\n\tprivate clearAutoRefresh(): void {\n\t\tthis.cancelAutoRefreshTimers();\n\t\tthis.autoRefresh.set( null );\n\t}\n\t\n\tsearchDo( $event: string ) {\n\t\tthis.searchText = $event.trim().toLowerCase();\n\n\t\tif ( this.options.serverSide ) {\n\t\t\tthis.paginator().firstPage();\n\t\t\tthis.reload();\n\t\t} else if ( this.tree.enabled ) {\n\t\t\tthis.refreshTree();\n\t\t\tif ( this.dataSource.paginator )\n\t\t\t\tthis.dataSource.paginator.firstPage();\n\t\t} else {\n\t\t\tthis.dataSource.filter = this.searchText;\n\t\t\tif ( this.dataSource.paginator ) {\n\t\t\t\tthis.dataSource.paginator.firstPage();\n\t\t\t}\n\t\t}\n\t}\n\n\t// ============================================================================\n\t// Tree mode (only active when settings.tree / options.tree is set)\n\t// ============================================================================\n\n\tget treeEnabled(): boolean { return this.tree.enabled; }\n\tget treeColumnId(): string { return this.tree.treeColumn; }\n\tget treeShowCounts(): boolean { return this.tree.showCounts; }\n\tget treeHasAddSub(): boolean { return this.tree.hasAddSub; }\n\ttreeCanAddSub( row: XiriTableRow ): boolean { return this.tree.canAddSub( row ); }\n\n\t/** Recomputes the visible rows from the tree (respecting the active search), into the data source. */\n\tprivate refreshTree(): void {\n\t\tconst term = this.searchText;\n\t\tconst matcher = term ? ( row: XiriTableRow ) => this.rowMatches( row, term ) : null;\n\t\tthis.dataSource.data = this.tree.applySearch( matcher );\n\t}\n\n\tprivate rowMatches( row: XiriTableRow, term: string ): boolean {\n\t\tlet dataStr = '';\n\t\tfor ( const key of this.columnsToSearch )\n\t\t\tdataStr += row[ key ] + '◬';\n\t\treturn dataStr.toLowerCase().indexOf( term ) !== -1;\n\t}\n\n\ttoggleNode( event: MouseEvent, row: XiriTableRow ): void {\n\t\tevent.stopPropagation();\n\t\tthis.tree.toggle( row );\n\t\tthis.refreshTree();\n\t}\n\n\texpandAllNodes(): void {\n\t\tthis.tree.expandAll();\n\t\tthis.refreshTree();\n\t}\n\n\tcollapseAllNodes(): void {\n\t\tthis.tree.collapseAll();\n\t\tthis.refreshTree();\n\t}\n\n\taddSub( event: MouseEvent, row: XiriTableRow ): void {\n\t\tevent.stopPropagation();\n\t\tconst cfg = this.tree.settings;\n\t\tif ( cfg?.addSubHandler ) {\n\t\t\tcfg.addSubHandler( row );\n\t\t\treturn;\n\t\t}\n\t\tconst url = this.tree.addSubUrlFor( row );\n\t\tif ( url )\n\t\t\tthis.router.navigateByUrl( url );\n\t}\n\t\n\t// A row is selectable unless the backend opted it out (select: false) or it has no id.\n\t// Every selection payload carries ids only, so an id-less row could never be acted on —\n\t// letting it into the selection would make bulkCount() and the confirmation prompt count\n\t// rows the backend never receives.\n\tisSelectable( row: XiriTableRow ): boolean {\n\t\treturn row.select !== false && row[ 'id' ] !== undefined && row[ 'id' ] !== null;\n\t}\n\n\tisAllSelected() {\n\t\tlet found = 0;\n\t\tthis._displayeddata.forEach( row => {\n\t\t\tif ( this.isSelectable( row ) ) {\n\t\t\t\tif ( !this.selection.isSelected( row ) )\n\t\t\t\t\tfound++;\n\t\t\t}\n\t\t} );\n\t\treturn found === 0;\n\t}\n\n\tmasterToggle() {\n\t\tthis.bulkAllResults.set( false );\n\t\tif ( this.isAllSelected() ) {\n\t\t\tthis.selection.clear();\n\t\t} else {\n\t\t\tthis._displayeddata.forEach( row => {\n\t\t\t\tif ( this.isSelectable( row ) )\n\t\t\t\t\tthis.selection.select( row );\n\t\t\t} );\n\t\t}\n\t}\n\n\t// Toggles a single row and drops the \"all results\" mode: an individual change means the\n\t// user is now working with an explicit per-row selection again, not the whole filter.\n\ttoggleRow( row: XiriTableRow ) {\n\t\tif ( !this.isSelectable( row ) )\n\t\t\treturn;\n\t\tthis.bulkAllResults.set( false );\n\t\tthis.selection.toggle( row );\n\t}\n\n\t// ============================================================================\n\t// UX-007 Bulk actions\n\t// ============================================================================\n\n\tget bulkActionsEnabled(): boolean {\n\t\treturn ( this.options.bulkActions?.length ?? 0 ) > 0;\n\t}\n\n\t// The selection column is shown for legacy select mode OR when bulk actions are configured.\n\tget showSelectColumn(): boolean {\n\t\treturn !!this.options.select || this.bulkActionsEnabled;\n\t}\n\n\t// The sticky context bar is only meaningful in bulk mode and only once something is selected.\n\tget bulkBarActive(): boolean {\n\t\treturn this.bulkActionsEnabled && this.selection.hasValue();\n\t}\n\n\t// Exact total number of results behind the current filter (all pages), NOT just the page:\n\t// the server-side totalCount when known, otherwise every filtered client-side row.\n\tbulkTotalCount(): number {\n\t\treturn this.options.serverSide ? this._totalCount() : this.dataSource.filteredData.length;\n\t}\n\n\t// The count the triggered action operates on: the whole filtered result in \"all results\"\n\t// mode, otherwise the explicitly selected rows on the current page.\n\tbulkCount(): number {\n\t\treturn this.bulkAllResults() ? this.bulkTotalCount() : this.selection.selected.length;\n\t}\n\n\t// Offer \"select all results\" only when the current page is fully selected and there are\n\t// genuinely more results behind the filter than are selected right now.\n\tcanSelectAllResults(): boolean {\n\t\treturn !!this.options.selectAllResults\n\t\t\t&& !this.bulkAllResults()\n\t\t\t&& this.selection.hasValue()\n\t\t\t&& this.isAllSelected()\n\t\t\t&& this.bulkTotalCount() > this.selection.selected.length;\n\t}\n\n\tselectAllResults(): void {\n\t\tthis.bulkAllResults.set( true );\n\t}\n\n\tcancelBulk(): void {\n\t\tthis.selection.clear();\n\t\tthis.bulkAllResults.set( false );\n\t}\n\n\t// Dispatches a bulk action. The payload always carries the selected ids, the selection\n\t// mode (page vs. all results) and the exact count; in \"all results\" mode it additionally\n\t// carries the active filter so the backend acts on the whole result set, never silently\n\t// on just the current page. Destructive actions (color 'warn') confirm with the exact count.\n\tbulkAction( event: MouseEvent, button: XiriButton ): void {\n\t\tevent.stopPropagation();\n\t\tif ( this.selection.isEmpty() )\n\t\t\treturn;\n\n\t\tconst allResults = this.bulkAllResults();\n\t\tconst count = this.bulkCount();\n\n\t\tif ( button.color === 'warn' ) {\n\t\t\tconst label = button.text || 'Aktion ausführen';\n\t\t\tif ( !confirm( `${ label }: ${ count } ${ count === 1 ? 'Eintrag' : 'Einträge' }? Dies kann nicht rückgängig gemacht werden.` ) )\n\t\t\t\treturn;\n\t\t}\n\n\t\tconst payload: Record<string, unknown> = {\n\t\t\tids: this.getSelectionIDs(),\n\t\t\tmode: allResults ? 'allResults' : 'page',\n\t\t\tcount: count,\n\t\t};\n\t\tif ( allResults )\n\t\t\tpayload.filter = this._filterData() ?? null;\n\n\t\tswitch ( button.action ) {\n\t\t\tcase 'dialog': {\n\t\t\t\tconst data: XiriTableDialogData = { ...button, type: 'data', data: payload };\n\t\t\t\tthis.dialogRef = this.dialog.open( XiriDialogComponent, { data } );\n\t\t\t\tthis.dialogRef.afterClosed().subscribe( ( result ) => {\n\t\t\t\t\tthis.clearBulk();\n\t\t\t\t\tthis.callReturn( result );\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'download': {\n\t\t\t\t// Before the request — openTab() needs the click's user activation.\n\t\t\t\tconst tab = button.target === '_blank' ? this.downloadService.openTab() : null;\n\t\t\t\tthis.dataService.postFileResponse( button.url ?? '', payload ).pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\t\t\tnext: ( result ) => this.downloadService.download( result, button.filename || 'download.csv', tab ),\n\t\t\t\t\terror: ( err: unknown ) => {\n\t\t\t\t\t\ttab?.close();\n\t\t\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Download Error' );\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthis.dataService.post( button.url ?? '', payload ).pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\t\t\tnext: ( result: unknown ) => {\n\t\t\t\t\t\tthis.clearBulk();\n\t\t\t\t\t\tthis.callReturn( result );\n\t\t\t\t\t},\n\t\t\t\t\terror: ( err: unknown ) => this.snackbar.error( errorMessage( err ) || 'Unknown Error' ),\n\t\t\t\t} );\n\t\t}\n\t}\n\n\tprivate clearBulk(): void {\n\t\tthis.selection.clear();\n\t\tthis.bulkAllResults.set( false );\n\t}\n\n\tclicked( row: XiriTableRow ) {\n\t\tthis.clickedRow.emit( row );\n\t}\n\n\topenDialog( event: MouseEvent, button: XiriButton, id: string, subid: number, row: XiriTableRow ) {\n\n\t\tevent.stopPropagation();\n\t\tconst data: XiriTableDialogData = { ...button, type: 'load' };\n\t\tdata.url = ( row[ id ] as XiriTableCellValue[] )[ subid ] as string;\n\n\t\tthis.startDialog( data );\n\t}\n\n\topenMenuDialog( event: MouseEvent, item: NonNullable<XiriButton['menuItems']>[number], columnId: string, buttonIndex: number, menuItemIndex: number, row: XiriTableRow ) {\n\t\tevent.stopPropagation();\n\t\tconst data: XiriTableDialogData = { ...item, type: 'load' } as XiriTableDialogData;\n\t\tconst cell = ( ( row[ columnId ] as XiriTableCellValue[] )[ buttonIndex ] as XiriTableCellValue[] )[ menuItemIndex ];\n\t\tdata.url = cell as string;\n\t\tthis.startDialog( data );\n\t}\n\n\topenDialogSelection( event: MouseEvent, button: XiriButton ) {\n\n\t\tevent.stopPropagation();\n\t\tif ( this.selection.isEmpty() )\n\t\t\treturn true;\n\n\t\tconst data: XiriTableDialogData = { ...button, type: 'data' };\n\t\tdata.data = this.getSelectionIDs();\n\n\t\tthis.startDialog( data );\n\t\treturn true;\n\t}\n\n\tprivate startDialog( data: XiriTableDialogData ) {\n\t\t\n\t\tthis.dialogRef = this.dialog.open( XiriDialogComponent, {\n\t\t\tdata: data,\n\t\t} );\n\t\t\n\t\tthis.dialogRef.afterClosed().subscribe( {\n\t\t\t next: ( result ) => this.callReturn( result )\n\t\t } );\n\t}\n\t\n\tapiCall( event: MouseEvent, url: string ) {\n\t\tevent.stopPropagation();\n\t\tthis.makeApiCall( this.dataService.get( url ) );\n\t}\n\t\n\tapiCallSelection( event: MouseEvent, button: XiriButton ) {\n\t\tevent.stopPropagation();\n\t\tif ( this.selection.isEmpty() )\n\t\t\treturn;\n\t\t\n\t\tconst data = { data: this.getSelectionIDs() };\n\t\t\n\t\tthis.makeApiCall( this.dataService.post( button.url ? button.url : '', data ) );\n\t}\n\t\n\tsaveCall( event: MouseEvent, button: XiriButton, row: XiriTableRow, url: string ) {\n\t\tevent.stopPropagation();\n\n\t\tif ( !this.saveCallCheck( button, row ) )\n\t\t\treturn;\n\n\t\tconst data: Record<string, XiriTableCellValue> = {};\n\t\tconst send = button.send ?? [];\n\t\tfor ( let i = 0; i != send.length; i++ ) {\n\t\t\tconst k = send[ i ];\n\t\t\tdata[ k ] = row[ k ] as XiriTableCellValue;\n\t\t}\n\n\t\tthis.dataService.post( url, data ).pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\tnext: ( result: unknown ) => this.callReturn( result ),\n\t\t\terror: ( err: unknown ) => {\n\t\t\t\tconsole.log( \"table save error\", err );\n\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Unknown Error' );\n\t\t\t}\n\t\t} );\n\t}\n\n\tsaveCallCheck( button: XiriButton, row: XiriTableRow ): boolean {\n\n\t\tconst check = button.check ?? [];\n\t\tfor ( let i = 0; i != check.length; i++ ) {\n\t\t\tconst k = check[ i ];\n\n\t\t\tif ( row[ k ] === null || row[ k ] === undefined || row[ k ] === '' ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tdownloadSelection( event: MouseEvent, button: XiriButton ) {\n\t\tevent.stopPropagation();\n\t\tif ( this.selection.isEmpty() )\n\t\t\treturn;\n\n\t\tconst url = button.url ? button.url : '';\n\t\t// Before the request — openTab() needs the click's user activation.\n\t\tconst tab = button.target === '_blank' ? this.downloadService.openTab() : null;\n\t\tthis.dataService.postFileResponse( url, this.getSelectionIDs() ).pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\tnext: ( result ) => {\n\t\t\t\tthis.downloadService.download( result, 'download.csv', tab );\n\t\t\t},\n\t\t\terror: ( err: unknown ) => {\n\t\t\t\ttab?.close();\n\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Download Error' );\n\t\t\t}\n\t\t} );\n\t}\n\n\tprivate makeApiCall( apicall: Observable<unknown> ) {\n\n\t\tapicall.pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\tnext: ( result: unknown ) => this.callReturn( result ),\n\t\t\terror: ( err: unknown ) => {\n\t\t\t\tconsole.log( \"table api error\", err );\n\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Unknown Error' );\n\t\t\t}\n\t\t} );\n\t}\n\t\n\tpublic buttonReturn( event: XiriButtonResult ) {\n\t\t\n\t\tif ( !event.done )\n\t\t\treturn;\n\t\t\n\t\tthis.callReturn( event.result );\n\t}\n\t\n\tprivate callReturn( result: unknown ) {\n\t\tthis.responseHandler.handle( result, {\n\t\t\tonTableRefresh: () => this.reload(),\n\t\t\tonTableUpdate: ( id, field, content ) => {\n\t\t\t\tconst i = this.dataSource.data.findIndex( ( x: XiriTableRow ) => x.id === id );\n\t\t\t\tif ( i == -1 )\n\t\t\t\t\treturn;\n\t\t\t\tthis.dataSource.data[ i ][ field ] = content as XiriTableCellValue;\n\t\t\t\tthis.dataSource._updateChangeSubscription();\n\t\t\t}\n\t\t} );\n\t}\n\n\t// Row ids are backend values (int64 or string) and are passed through untouched.\n\t// Coercing them to number would round anything above 2^53 and turn a non-numeric\n\t// id into NaN; rows without an id are dropped rather than sent as undefined.\n\tprivate getSelectionIDs(): ( string | number )[] {\n\n\t\treturn this.selection.selected\n\t\t .map( ( item ) => item[ 'id' ] as string | number | undefined )\n\t\t .filter( ( id ): id is string | number => id !== undefined && id !== null );\n\t}\n\n\tstartInlineEdit( row: XiriTableRow, column: XiriTableField, skipSavingCheck = false ): void {\n\t\tthis.inlineEdit.start( row, column, skipSavingCheck );\n\t}\n\n\tcancelInlineEdit(): void {\n\t\tthis.inlineEdit.cancel();\n\t}\n\n\tsaveInlineEdit( row: XiriTableRow, column: XiriTableField ): void {\n\t\tthis.inlineEdit.save( row, column );\n\t}\n\n\tisEditing( row: XiriTableRow, fieldId: string ): boolean {\n\t\treturn this.inlineEdit.isEditing( row, fieldId );\n\t}\n\n\tisSaving( row: XiriTableRow, fieldId: string ): boolean {\n\t\treturn this.inlineEdit.isSaving( row, fieldId );\n\t}\n\n\tonInlineEditKeydown( event: KeyboardEvent, row: XiriTableRow, column: XiriTableField ): void {\n\t\tthis.inlineEdit.onKeydown( event, row, column );\n\t}\n\n\tgetEditableOptions( column: XiriTableField ): { value: string; label: string; color?: string }[] {\n\t\treturn this.inlineEdit.getOptions( column );\n\t}\n\n\tonChipsSelectionChange( row: XiriTableRow, column: XiriTableField, selectedValues: string[] ): void {\n\t\tthis.inlineEdit.onChipsChange( row, column, selectedValues );\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.reloadAbort$.next();\n\t\tthis.reloadAbort$.complete();\n\t\tthis.clearAutoRefresh();\n\t\tif ( this.dialogRef )\n\t\t\tthis.dialogRef.close( null );\n\t}\n\t\n\tpublic pasteInput( $event: ClipboardEvent, row: XiriTableRow, column: XiriTableField ) {\n\n\t\tif ( column.inputPaste !== true )\n\t\t\treturn false;\n\n\t\t// Get the clipboard text\n\t\tconst clipboardText = $event.clipboardData!.getData( 'text' );\n\n\t\t// Split into rows, then each row into columns.\n\t\tconst clipRowsArray: string[][] = clipboardText.split( \"\\n\" ).map( line => line.split( \"\\t\" ) );\n\n\t\tif ( clipRowsArray.length < 2 ) {\n\t\t\tif ( clipRowsArray[ 0 ].length < 2 )\n\t\t\t\treturn null;\n\t\t}\n\n\t\tconst startRow = this.dataSource.data.findIndex( ( x: XiriTableRow ) => x.id === row.id );\n\t\tif ( startRow == -1 )\n\t\t\treturn false;\n\t\tconst startCol = this.displayedColumns.findIndex( ( x: XiriTableField ) => x.id === column.id );\n\t\tif ( startCol == -1 )\n\t\t\treturn false;\n\n\t\tfor ( let i = 0; i < clipRowsArray.length; i++ ) {\n\t\t\tconst curRow = i + startRow;\n\t\t\tif ( curRow >= this.dataSource.data.length )\n\t\t\t\tbreak;\n\n\t\t\tconst result = this.dataSource.data[ curRow ];\n\t\t\tfor ( let j = 0; j < clipRowsArray[ i ].length; j++ ) {\n\t\t\t\tconst curCol = j + startCol;\n\t\t\t\tif ( curCol >= this.displayedColumns.length )\n\t\t\t\t\tbreak;\n\n\t\t\t\tconst col = this.displayedColumns[ curCol ];\n\t\t\t\tresult[ col.id ] = clipRowsArray[ i ][ j ];\n\t\t\t}\n\t\t}\n\n\t\tthis.dataSource._updateChangeSubscription();\n\t\treturn false;\n\t}\n\t\n\tpublic saveInputData() {\n\t\t\n\t\t// this.loading.set( true );\n\t\tconst data = this.dataSource.data;\n\t\tif ( this.settings().url ) {\n\t\t\tthis._alldata.set( [] );\n\t\t\t// this.dataSource.data = [];\n\t\t\tthis.dataSource._updateChangeSubscription();\n\t\t}\n\t\tthis._changeDetectorRef.markForCheck();\n\t\t\n\t\tthis.dataService.post( this.options.saveInputUrl ?? '', data ).pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\tnext: ( result: unknown ) => {\n\t\t\t\tthis.callReturn( result );\n\t\t\t},\n\t\t\terror: ( err: unknown ) => {\n\t\t\t\tthis._alldata.set( data );\n\t\t\t\tthis.dataSource._updateChangeSubscription();\n\t\t\t\tconsole.log( \"table save error\", err );\n\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Unknown Error' );\n\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t}\n\t\t} );\n\t}\n\n\tprivate getSortingDataAccessor(): ( data: XiriTableRow, sortHeaderId: string ) => string | number {\n\t\treturn ( data: XiriTableRow, sortHeaderId: string ): string | number => {\n\t\t\tconst column = this.displayedColumns.find( col => col.id === sortHeaderId );\n\t\t\tif ( column && column.format === 'number' )\n\t\t\t\treturn ( data[ sortHeaderId ] as XiriTableCellValue[] )[ 1 ] as number;\n\n\t\t\t// ponytail: sort by the first chip's label — without this MatTable compares the raw object\n\t\t\t// array, which coerces to \"[object Object],...\" and effectively sorts by chip count.\n\t\t\tif ( column && column.format === 'chips' )\n\t\t\t\treturn ( data[ sortHeaderId ] as XiriTagChip[] | null | undefined )?.[ 0 ]?.label ?? '';\n\n\t\t\treturn data[ sortHeaderId ] as string | number;\n\t\t};\n\t}\n}\n","<mat-card class=\"xiritablecard mat-mdc-elevation-specific mat-elevation-z3\">\n\t<div class=\"xiritable\" [class]=\"options.class\">\n\t\t<div class=\"table-full\">\n\t\t\t@if (bulkBarActive) {\n\t\t\t\t<div class=\"xiri-bulk-bar\" [class.sticky]=\"options.stickyBulkBar\" role=\"toolbar\"\n\t\t\t\t aria-label=\"Massenaktionen\" data-testid=\"table-bulk-bar\">\n\t\t\t\t\t<button mat-icon-button (click)=\"cancelBulk()\" matTooltip=\"Auswahl aufheben\"\n\t\t\t\t\t aria-label=\"Auswahl aufheben\">\n\t\t\t\t\t\t<mat-icon>close</mat-icon>\n\t\t\t\t\t</button>\n\t\t\t\t\t<span class=\"xiri-bulk-count\" aria-live=\"polite\" data-testid=\"table-bulk-count\">\n\t\t\t\t\t\t@if (bulkAllResults()) {\n\t\t\t\t\t\t\tAlle {{ bulkTotalCount() }} Ergebnisse ausgewählt\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t{{ selection.selected.length }} ausgewählt\n\t\t\t\t\t\t}\n\t\t\t\t\t</span>\n\t\t\t\t\t@if (canSelectAllResults()) {\n\t\t\t\t\t\t<button mat-button color=\"primary\" (click)=\"selectAllResults()\"\n\t\t\t\t\t\t data-testid=\"table-bulk-selectall\">\n\t\t\t\t\t\t\tAlle {{ bulkTotalCount() }} Ergebnisse auswählen\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t\t<span class=\"xiri-bulk-spacer\"></span>\n\t\t\t\t\t@for (button of options.bulkActions; track button) {\n\t\t\t\t\t\t@if (!button.hide) {\n\t\t\t\t\t\t\t<button mat-button [color]=\"button.color || 'primary'\"\n\t\t\t\t\t\t\t (click)=\"bulkAction($event, button)\"\n\t\t\t\t\t\t\t [matTooltip]=\"button.hint\" [matTooltipDisabled]=\"!button.hint\">\n\t\t\t\t\t\t\t\t@if (button.icon) {\n\t\t\t\t\t\t\t\t\t<mat-icon>{{ button.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t{{ button.text }}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t<div class=\"header\" [hidden]=\"bulkBarActive\">\n\t\t\t\t@if (options.reload) {\n\t\t\t\t\t<div class=\"buttons\">\n\t\t\t\t\t\t<button mat-icon-button (click)=\"reload()\" color=\"primary\" aria-label=\"Tabelle neu laden\">\n\t\t\t\t\t\t\t<mat-icon>autorenew</mat-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (autoRefresh()) {\n\t\t\t\t\t<div class=\"autorefresh-indicator\" role=\"status\" aria-live=\"polite\"\n\t\t\t\t\t matTooltip=\"Tabelle aktualisiert sich automatisch\">\n\t\t\t\t\t\t<mat-icon class=\"spin\">sync</mat-icon>\n\t\t\t\t\t\t<span>Auto-Refresh aktiv · nächste in {{ countdown() }}s</span>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (lastUpdated(); as updated) {\n\t\t\t\t\t<div class=\"lastupdated-indicator\" data-testid=\"table-last-updated\" role=\"status\" aria-live=\"polite\">\n\t\t\t\t\t\tStand {{ updated | date:'HH:mm' }}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (treeEnabled) {\n\t\t\t\t\t<div class=\"buttons xiri-tree-actions\">\n\t\t\t\t\t\t<button mat-icon-button (click)=\"expandAllNodes()\" color=\"primary\"\n\t\t\t\t\t\t matTooltip=\"Alle ausklappen\" aria-label=\"Alle ausklappen\">\n\t\t\t\t\t\t\t<mat-icon>unfold_more</mat-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button mat-icon-button (click)=\"collapseAllNodes()\" color=\"primary\"\n\t\t\t\t\t\t matTooltip=\"Alle einklappen\" aria-label=\"Alle einklappen\">\n\t\t\t\t\t\t\t<mat-icon>unfold_less</mat-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<div class=\"middle\" [class.hasButtons]=\"options.buttons\">{{ options.title }}</div>\n\t\t\t\t@if (options.buttons) {\n\t\t\t\t\t<xiri-buttonline [settings]=\"options.buttons\" (result)=\"buttonReturn($event)\"\n\t\t\t\t\t [filterData]=\"_filterData()\"></xiri-buttonline>\n\t\t\t\t}\n\t\t\t\t@if (options.search) {\n\t\t\t\t\t<xiri-search (changed)=\"searchDo($event)\" [placeholder]=\"''\" [text]=\"searchTextInit\"></xiri-search>\n\t\t\t\t}\n\t\t\t\t@if (options.saveInput) {\n\t\t\t\t\t<div class=\"buttons saveInput\">\n\t\t\t\t\t\t<button mat-raised-button (click)=\"saveInputData()\" color=\"primary\">\n\t\t\t\t\t\t\t{{ options.saveInput }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div class=\"tableout-wrap\">\n\t\t\t<div class=\"tableout\" [class.is-loading]=\"loading()\" [style.max-height]=\"options.scrollHeight || null\">\n\t\t\t\t<table mat-table [dataSource]=\"dataSource\" matSort [style.min-width]=\"options.minWidth ?? '100%'\"\n\t\t\t\t [class]=\"densityClass()\"\n\t\t\t\t [class.borders]=\"options.borders\" [class.bordersHeader]=\"options.bordersHeader\"\n\t\t\t\t [trackBy]=\"trackByRowId\">\n\n\t\t\t\t\t@for (column of displayedColumns; track column.id) {\n\t\t\t\t\t\t<ng-container [matColumnDef]=\"column.id\" [sticky]=\"column.sticky\">\n\t\t\t\t\t\t\t<th mat-header-cell *matHeaderCellDef mat-sort-header=\"{{ column.id }}\" [disabled]=\"!column.sort || !options.sort\" disableClear\n\t\t\t\t\t\t\t [style.width]=\"column.width\" [style.min-width]=\"column.minWidth\"\n\t\t\t\t\t\t\t [class]=\"column.display + ' ' + (column.header || '')\"> {{ column.name }}\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t@switch (column.format) {\n\t\t\t\t\t\t\t\t@case ('buttons') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t@for (button of column.buttons; track button; let i = $index) {\n\t\t\t\t\t\t\t\t\t\t\t@if (row[column.id][i] !== false && !button.hide) {\n\t\t\t\t\t\t\t\t\t\t\t\t@switch (button.action) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('link') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-button [button]=\"button\" [disabled]=\"false\" [url]=\"row[column.id][ i ]\"></xiri-button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('href') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-button [button]=\"button\" [disabled]=\"false\" [url]=\"row[column.id][ i ]\"></xiri-button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('download') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-button [button]=\"button\" [disabled]=\"false\" [url]=\"row[column.id][ i ]\"></xiri-button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('dialog') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-buttonstyle [button]=\"button\" [disabled]=\"false\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t (click)=\"openDialog( $event, button, column.id, i, row)\"></xiri-buttonstyle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('api') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-buttonstyle [button]=\"button\" [disabled]=\"false\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t (click)=\"apiCall( $event, row[column.id][ i ] )\"></xiri-buttonstyle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('save') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-buttonstyle [button]=\"button\" (click)=\"saveCall( $event, button, row, row[column.id][ i ] )\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [disabled]=\"!saveCallCheck( button, row )\"></xiri-buttonstyle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('icon') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"btnicon\" [class]=\"button.color || 'primary'\" [matTooltip]=\"button.hint\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!button.hint\">{{ button.icon }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('menu') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button mat-icon-button [matMenuTriggerFor]=\"menuRef\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [class]=\"button.color || 'primary'\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [matTooltip]=\"button.hint\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!button.hint\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [attr.aria-label]=\"button.hint || button.text\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t (click)=\"$event.stopPropagation()\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon>{{ button.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-menu #menuRef=\"matMenu\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@for (item of button.menuItems; track item; let j = $index) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (row[column.id][i][j] !== false) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@switch (item.action) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('link') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@let menuUrl = row[column.id][i][j] | xiriUrl;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a mat-menu-item [routerLink]=\"menuUrl?.path\" [queryParams]=\"menuUrl?.queryParams\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('href') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a mat-menu-item [href]=\"row[column.id][i][j]\" target=\"_blank\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('dialog') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button mat-menu-item (click)=\"openMenuDialog($event, item, column.id, i, j, row)\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-menu>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('icon') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t@if (column.icons?.[ $any(row[ column.id ]) ]; as icon) {\n\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"icon[ 'color' ] || 'primary'\"\n\t\t\t\t\t\t\t\t\t\t\t [matTooltip]=\"icon[ 'hint' ] || '' \"\n\t\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!icon[ 'hint' ]\">{{ icon['icon'] }}\n\t\t\t\t\t\t\t\t\t\t\t</mat-icon>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('html') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [innerHtml]=\"row[column.id] | safeHtml\" [class]=\"column.display\"></td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('link') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\"\n\t\t\t\t\t\t\t\t\t [class.xiri-tree-td]=\"treeEnabled && column.id === treeColumnId\">\n\t\t\t\t\t\t\t\t\t\t@if (treeEnabled && column.id === treeColumnId) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"treePrefix; context: { $implicit: row }\"></ng-container>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (row[column.id + 'Link']) {\n\t\t\t\t\t\t\t\t\t\t\t@let cellUrl = row[column.id + 'Link'] | xiriUrl;\n\t\t\t\t\t\t\t\t\t\t\t<a [routerLink]=\"cellUrl?.path\" [queryParams]=\"cellUrl?.queryParams\" class=\"tablelink\">{{ row[column.id] }}</a>\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t<span>{{ row[column.id] }}</span>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (treeEnabled && column.id === treeColumnId) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"treeSuffix; context: { $implicit: row }\"></ng-container>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('input') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t<mat-form-field subscriptSizing=\"dynamic\">\n\t\t\t\t\t\t\t\t\t\t\t<input matInput\n\t\t\t\t\t\t\t\t\t\t\t [type]=\"column.inputType || 'text'\"\n\t\t\t\t\t\t\t\t\t\t\t [(ngModel)]=\"row[ column.id ]\"\n\t\t\t\t\t\t\t\t\t\t\t [lang]=\"column.inputLang || ''\"\n\t\t\t\t\t\t\t\t\t\t\t [required]=\"column.inputRequired || true\"\n\t\t\t\t\t\t\t\t\t\t\t (paste)=\"pasteInput( $event, row, column )\">\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('text2') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t<div>{{ row[column.id][0] }}</div>\n\t\t\t\t\t\t\t\t\t\t<div>{{ row[column.id][1] }}</div>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('textn') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t@for (line of row[column.id]; track $index) {\n\t\t\t\t\t\t\t\t\t\t\t<div>{{ line }}</div>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('number') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t{{ column.textPrefix }}{{ row[column.id][0] }}{{ column.textSuffix }}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('chips') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t@if (isSaving(row, column.id)) {\n\t\t\t\t\t\t\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t\t\t\t\t\t} @else if (column.editable && options.editUrl && isEditing(row, column.id)) {\n\t\t\t\t\t\t\t\t\t\t\t@if (editableOptionsLoading()) {\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-form-field class=\"xiri-inline-edit\" subscriptSizing=\"dynamic\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-select multiple\n\t\t\t\t\t\t\t\t\t\t\t\t\t [ngModel]=\"editingChipsValues()\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (selectionChange)=\"onChipsSelectionChange(row, column, $event.value)\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (keydown)=\"onInlineEditKeydown($event, row, column)\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (openedChange)=\"!$event && saveInlineEdit(row, column)\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (column.editableOptionsSearch || column.editableSearchUrl) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ngx-mat-select-search [formControl]=\"inlineSearchControl\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t [searching]=\"inlineSearching()\"></ngx-mat-select-search>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@for (opt of getEditableOptions(column); track opt.value) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t} @else if (column.editable && options.editUrl) {\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"xiri-editable-cell\" role=\"button\" tabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t\t (click)=\"startInlineEdit(row, column); $event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t\t\t (keydown.enter)=\"startInlineEdit(row, column); $event.stopPropagation()\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"xiri-chips-display\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t@for (chip of row[column.id]; track chip.label) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"xiri-chip-display\" [class]=\"chip.color || ''\">{{ chip.label }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"xiri-edit-icon\">edit</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"xiri-chips-display\">\n\t\t\t\t\t\t\t\t\t\t\t\t@for (chip of row[column.id]; track chip.label) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"xiri-chip-display\" [class]=\"chip.color || ''\">{{ chip.label }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@default {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\"\n\t\t\t\t\t\t\t\t\t [class.xiri-tree-td]=\"treeEnabled && column.id === treeColumnId\">\n\t\t\t\t\t\t\t\t\t\t@if (treeEnabled && column.id === treeColumnId) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"treePrefix; context: { $implicit: row }\"></ng-container>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (isSaving(row, column.id)) {\n\t\t\t\t\t\t\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t\t\t\t\t\t} @else if (column.editable && options.editUrl && isEditing(row, column.id)) {\n\t\t\t\t\t\t\t\t\t\t\t@if (column.editableOptions || column.editableOptionsUrl || column.editableSearchUrl) {\n\t\t\t\t\t\t\t\t\t\t\t\t@if (editableOptionsLoading()) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-form-field class=\"xiri-inline-edit\" subscriptSizing=\"dynamic\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-select [(ngModel)]=\"row[column.id]\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t (keydown)=\"onInlineEditKeydown($event, row, column)\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t (openedChange)=\"!$event && saveInlineEdit(row, column)\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (column.editableOptionsSearch || column.editableSearchUrl) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ngx-mat-select-search [formControl]=\"inlineSearchControl\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t [searching]=\"inlineSearching()\"></ngx-mat-select-search>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@for (opt of getEditableOptions(column); track opt.value) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-form-field class=\"xiri-inline-edit\" subscriptSizing=\"dynamic\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input matInput\n\t\t\t\t\t\t\t\t\t\t\t\t\t [(ngModel)]=\"row[column.id]\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (blur)=\"saveInlineEdit(row, column)\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (keydown)=\"onInlineEditKeydown($event, row, column)\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button matSuffix mat-icon-button class=\"xiri-inline-edit-confirm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (mousedown)=\"$event.preventDefault(); saveInlineEdit(row, column)\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t aria-label=\"Änderung speichern\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t tabindex=\"-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon>check</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t} @else if (column.editable && options.editUrl) {\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"xiri-editable-cell\" role=\"button\" tabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t\t (click)=\"startInlineEdit(row, column); $event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t\t\t (keydown.enter)=\"startInlineEdit(row, column); $event.stopPropagation()\">\n\t\t\t\t\t\t\t\t\t\t\t\t{{ column.textPrefix }}{{ row[column.id] }}{{ column.textSuffix }}\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"xiri-edit-icon\">edit</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t{{ column.textPrefix }}{{ row[column.id] }}{{ column.textSuffix }}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (treeEnabled && column.id === treeColumnId) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"treeSuffix; context: { $implicit: row }\"></ng-container>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t<td mat-footer-cell *matFooterCellDef [hidden]=\"!options.footer\"\n\t\t\t\t\t\t\t [style.width]=\"column.width\" [style.min-width]=\"column.minWidth\" class=\"bottomrow\"\n\t\t\t\t\t\t\t [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t@if ( footer[ column.id ] ) {\n\t\t\t\t\t\t\t\t\t\t{{ column.textPrefix }}{{ footer[ column.id ] }}{{ column.textSuffix }}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t\t@if (showSelectColumn) {\n\t\t\t\t\t\t<ng-container matColumnDef=\"select\" [sticky]=\"true\">\n\t\t\t\t\t\t\t<th mat-header-cell *matHeaderCellDef [style.width]=\"'65px'\">\n\t\t\t\t\t\t\t\t<mat-checkbox (change)=\"$event ? masterToggle() : null\"\n\t\t\t\t\t\t\t\t [checked]=\"selection.hasValue() && isAllSelected()\"\n\t\t\t\t\t\t\t\t [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\">\n\t\t\t\t\t\t\t\t@if (isSelectable(row)) {\n\t\t\t\t\t\t\t\t\t<mat-checkbox\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t\t\t(change)=\"$event ? toggleRow(row) : null\"\n\t\t\t\t\t\t\t\t\t\t\t[checked]=\"selection.isSelected(row)\">\n\t\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td mat-footer-cell *matFooterCellDef [style.width]=\"'65px'\" class=\"bottomrow\" [hidden]=\"!options.footer\">\n\t\t\t\t\t\t\t\t<mat-checkbox (change)=\"$event ? masterToggle() : null\"\n\t\t\t\t\t\t\t\t [checked]=\"selection.hasValue() && isAllSelected()\"\n\t\t\t\t\t\t\t\t [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\n\t\t\t\t\t@if (extraHeaderFields.length > 0) {\n\t\t\t\t\t\t@for (column of extraHeaderFields; track column.id) {\n\t\t\t\t\t\t\t<ng-container matColumnDef=\"{{ column.id }}\" [sticky]=\"column.sticky\">\n\t\t\t\t\t\t\t\t<th mat-header-cell *matHeaderCellDef [attr.colspan]=\"column.headerSpan\">{{ column.name }}</th>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<tr mat-header-row *matHeaderRowDef=\"extraHeaders; sticky: true\" [class.dense]=\"options.dense\"></tr>\n\t\t\t\t\t}\n\n\t\t\t\t\t<tr mat-header-row *matHeaderRowDef=\"columnsToDisplay; sticky: true\" [class.dense]=\"options.dense\"></tr>\n\t\t\t\t\t<tr mat-row *matRowDef=\"let row; columns: columnsToDisplay;\" (click)=\"clicked(row)\"\n\t\t\t\t\t [class.xiri-tree-dimmed]=\"treeEnabled && row._tree?.dimmed\"></tr>\n\t\t\t\t\t<tr mat-footer-row *matFooterRowDef=\"columnsToDisplay; sticky: true\" [hidden]=\"!options.footer\"></tr>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t\t<div class=\"loader\" [hidden]=\"!loading()\" [class.has-bottombar]=\"(options.select || options.pagination) && !options.footer\">\n\t\t\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t@if (!loading()) {\n\t\t\t\t@if (!errorMsg && dataSource.filteredData.length === 0) {\n\t\t\t\t\t@if (options.emptyState) {\n\t\t\t\t\t\t<xiri-empty-state [settings]=\"options.emptyState\"></xiri-empty-state>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<div class=\"nodata\">{{ options.textNoData }}</div>\n\t\t\t\t\t}\n\t\t\t\t} @else if (errorMsg) {\n\t\t\t\t\t<div class=\"alert alert-danger\">\n\t\t\t\t\t\t<span>{{ errorMsg }}</span>\n\t\t\t\t\t\t<button mat-button type=\"button\" data-testid=\"table-retry\" (click)=\"reload()\">\n\t\t\t\t\t\t\t<mat-icon>autorenew</mat-icon> Retry\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t<div class=\"xrow xsmall\" [class.bottomrow]=\"(options.select || options.pagination) && !options.footer\">\n\t\t\t\t@if (options.select) {\n\t\t\t\t\t<div class=\"xcol xcol-md-2 select-buttons\">\n\t\t\t\t\t\t@for (button of options.selectButtons; track button) {\n\t\t\t\t\t\t\t@if (!button.hide) {\n\t\t\t\t\t\t\t\t@switch (button.action) {\n\t\t\t\t\t\t\t\t\t@case ('dialog') {\n\t\t\t\t\t\t\t\t\t\t<button mat-icon-button\n\t\t\t\t\t\t\t\t\t\t (click)=\"openDialogSelection( $event, button )\"\n\t\t\t\t\t\t\t\t\t\t [disabled]=\"selection.isEmpty()\"\n\t\t\t\t\t\t\t\t\t\t [color]=\"button.color || 'primary'\"\n\t\t\t\t\t\t\t\t\t\t [matTooltip]=\"button.hint\"\n\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!button.hint\"\n\t\t\t\t\t\t\t\t\t\t [attr.aria-label]=\"button.hint || button.text\">\n\t\t\t\t\t\t\t\t\t\t\t<mat-icon>{{ button.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t@case ('api') {\n\t\t\t\t\t\t\t\t\t\t<button mat-icon-button\n\t\t\t\t\t\t\t\t\t\t (click)=\"apiCallSelection( $event, button )\"\n\t\t\t\t\t\t\t\t\t\t [disabled]=\"selection.isEmpty()\"\n\t\t\t\t\t\t\t\t\t\t [color]=\"button.color || 'primary'\"\n\t\t\t\t\t\t\t\t\t\t [matTooltip]=\"button.hint\"\n\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!button.hint\"\n\t\t\t\t\t\t\t\t\t\t [attr.aria-label]=\"button.hint || button.text\">\n\t\t\t\t\t\t\t\t\t\t\t<mat-icon>{{ button.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t@case ('download') {\n\t\t\t\t\t\t\t\t\t\t<button mat-icon-button\n\t\t\t\t\t\t\t\t\t\t (click)=\"downloadSelection( $event, button )\"\n\t\t\t\t\t\t\t\t\t\t [disabled]=\"selection.isEmpty()\"\n\t\t\t\t\t\t\t\t\t\t [color]=\"button.color || 'primary'\"\n\t\t\t\t\t\t\t\t\t\t [matTooltip]=\"button.hint\"\n\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!button.hint\"\n\t\t\t\t\t\t\t\t\t\t [attr.aria-label]=\"button.hint || button.text\">\n\t\t\t\t\t\t\t\t\t\t\t<mat-icon>{{ button.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<div class=\"xcol xcol-right-md-10\">\n\t\t\t\t\t<mat-paginator [hidden]=\"!options.pagination\" [pageSizeOptions]=\"options.pageSizes || []\" showFirstLastButtons=\"true\"></mat-paginator>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</mat-card>\n\n@if (dynData.data) {\n\t<ng-container *ngTemplateOutlet=\"dyncomponent(); context: { $implicit: dynData }\"></ng-container>\n}\n\n<!-- Tree mode: indent + expand/collapse arrow rendered before the tree column's content -->\n<ng-template #treePrefix let-row>\n\t<span class=\"xiri-tree-prefix\" [style.padding-left.px]=\"(row._tree?.level || 0) * 24\">\n\t\t@if (row._tree?.hasChildren) {\n\t\t\t<button type=\"button\" class=\"xiri-tree-iconbtn xiri-tree-toggle\" (click)=\"toggleNode($event, row)\"\n\t\t\t tabindex=\"-1\" [attr.aria-label]=\"row._tree.expanded ? 'einklappen' : 'ausklappen'\">\n\t\t\t\t<mat-icon color=\"primary\">{{ row._tree.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n\t\t\t</button>\n\t\t} @else {\n\t\t\t<span class=\"xiri-tree-spacer\"></span>\n\t\t}\n\t</span>\n</ng-template>\n\n<!-- Tree mode: child-count badge (when collapsed) + optional \"+ sub\" button after the content -->\n<ng-template #treeSuffix let-row>\n\t@if (treeShowCounts && row._tree && !row._tree.expanded && row._tree.childCount > 0) {\n\t\t<span class=\"xiri-tree-count\">({{ row._tree.childCount }})</span>\n\t}\n\t@if (treeHasAddSub && treeCanAddSub(row)) {\n\t\t<button type=\"button\" class=\"xiri-tree-iconbtn xiri-tree-addsub\" (click)=\"addSub($event, row)\"\n\t\t tabindex=\"-1\" matTooltip=\"Sub-Eintrag hinzufügen\" aria-label=\"Sub-Eintrag hinzufügen\">\n\t\t\t<mat-icon color=\"primary\">add</mat-icon>\n\t\t</button>\n\t}\n</ng-template>\n","import { inject, Injectable } from '@angular/core';\nimport { XiriDataService } from './data.service';\nimport { Router } from \"@angular/router\";\nimport { XiriButton } from \"../button/button.component\";\nimport { XiriFormField } from \"../formfields/field.interface\";\nimport { catchError, map, Observable, throwError, timer } from \"rxjs\";\nimport { HttpErrorResponse } from \"@angular/common/http\";\nimport { XiriSessionStorageService } from \"./sessionStorage.service\";\nimport { parseHttpError } from './error.util';\n\n\nexport interface XiriFormServiceReturn {\n\turl?: string\n\tfields?: XiriFormField[]\n\tbuttons?: XiriButton[]\n\tdone?: boolean\n\tgoto?: string\n\tmodel?: object\n\textra?: object\n\n\t// dialog\n\ttype?: string\n\theader?: string\n\ttime?: number\n}\n\nexport interface XiriFormServiceData {\n\turl: string\n\tfields?: XiriFormField[]\n\tbuttons?: XiriButton[]\n\textra?: object\n\tdone?: Observable<void>\n\n\t// dialog\n\ttype?: string // form, data\n\theader?: string\n\ttime?: number\n}\n\nexport interface XiriFormServiceError {\n\terror: string\n}\n\n@Injectable( {\n\tprovidedIn: 'root',\n} )\nexport class XiriFormService {\n\n\tprivate dataService: XiriDataService = inject( XiriDataService );\n\tprivate router: Router = inject( Router );\n\tprivate sessionStorageService: XiriSessionStorageService = inject( XiriSessionStorageService );\n\t\n\t\n\tpublic get( url: string, data?: object | null, extra?: object ): Observable<XiriFormServiceData> {\n\n\t\tconst req: Observable<XiriFormServiceReturn> = data === null\n\t\t\t? this.dataService.get( url ) as Observable<XiriFormServiceReturn>\n\t\t\t: this.dataService.post( url, { ...data, ...extra } ) as Observable<XiriFormServiceReturn>;\n\n\t\treturn req.pipe(\n\t\t\tmap( res => this.parse( res ) ),\n\t\t\tcatchError( ( err: HttpErrorResponse ): Observable<never> => {\n\t\t\t\treturn throwError( () => ({\n\t\t\t\t\terror: parseHttpError( err )\n\t\t\t\t} as XiriFormServiceError) );\n\t\t\t} )\n\t\t);\n\t}\n\n\tpublic parse( res: XiriFormServiceReturn ): XiriFormServiceData {\n\n\t\tif ( res.buttons ) {\n\t\t\tconst fields: XiriFormField[] = [];\n\t\t\tconst model = ( res.model || {} ) as Record<string, unknown>;\n\t\t\tconst type = res.type ? res.type : 'form';\n\n\t\t\tif ( type == 'form' ) {\n\t\t\t\tres.fields?.forEach( ( field: XiriFormField ) => {\n\t\t\t\t\tif ( field.hide == true )\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif ( model[ field.id ] !== undefined )\n\t\t\t\t\t\tfield.value = model[ field.id ];\n\n\t\t\t\t\tfields.push( field );\n\t\t\t\t} );\n\t\t\t} else if ( type == 'question' ) {\n\t\t\t\tconst obj = res.fields as unknown as XiriFormField;\n\t\t\t\tobj.type = 'question';\n\t\t\t\tfields.push( obj );\n\t\t\t} else if ( type == 'waiting' ) {\n\t\t\t\tconst obj = res.fields as unknown as XiriFormField & { text?: string };\n\t\t\t\tobj.type = 'waiting';\n\t\t\t\tobj.done = false;\n\t\t\t\tobj.value = obj.text;\n\t\t\t\tfields.push( obj );\n\t\t\t} else {\n\t\t\t\tconsole.log( 'XiriFormService unknown form type', type );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\turl: res.url,\n\t\t\t\tbuttons: res.buttons,\n\t\t\t\textra: res.extra || {},\n\t\t\t\tfields: fields,\n\n\t\t\t\ttype: type,\n\t\t\t\ttime: res.time || 2000,\n\t\t\t} as XiriFormServiceData;\n\n\t\t} else if ( res.goto ) {\n\t\t\treturn {\n\t\t\t\tdone: timer( res.done ? 1000 : 0 ).pipe( map( () => {\n\t\t\t\t\tthis.router.navigate( [res.goto] ).then();\n\t\t\t\t} ) )\n\t\t\t} as XiriFormServiceData;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdone: timer( res.done ? 1000 : 0 ).pipe( map( () => {\n\t\t\t\t\t/* intentionally empty */\n\t\t\t\t} ) )\n\t\t\t} as XiriFormServiceData;\n\t\t}\n\t}\n\t\n\tpublic loadState( saveStateId: string|null|undefined, fields: XiriFormField[] ): XiriFormField[] {\n\t\t\n\t\tif ( !saveStateId )\n\t\t\treturn fields;\n\t\t\n\t\tconst data = this.sessionStorageService.getTimeout( saveStateId, 3600 ) as Record<string, unknown> | null;\n\t\tif ( !data )\n\t\t\treturn fields;\n\n\t\tfor ( const field of fields ) {\n\n\t\t\tif ( data[ field.id ] === undefined )\n\t\t\t\tcontinue;\n\n\t\t\tconst value = data[ field.id ];\n\n\t\t\tswitch ( field.type ) {\n\t\t\t\tcase 'bool':\n\t\t\t\t\tfield.value = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'select':\n\t\t\t\tcase 'object':\n\t\t\t\tcase 'model':\n\t\t\t\t\tif ( !field.list )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tfor ( const item of field.list ) {\n\t\t\t\t\t\tif ( item.id == value ) {\n\t\t\t\t\t\t\tfield.value = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'date':\n\t\t\t\t\tif ( field.min && field.min > ( value as number ) )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif ( field.max && field.max < ( value as number ) )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tfield.value = value;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'daterange':\n\t\t\t\tcase 'datetimerange':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn fields;\n\t}\n\t\n\tpublic saveState( saveStateId: string|null|undefined, values: unknown ): void {\n\t\t\n\t\tif ( !saveStateId )\n\t\t\treturn;\n\t\t\n\t\tthis.sessionStorageService.set( saveStateId, values );\n\t}\n}\n","import { Component, DestroyRef, inject, input, OnInit, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subject } from \"rxjs\";\nimport { UntypedFormGroup } from '@angular/forms';\nimport { Location } from '@angular/common';\nimport { XiriButton } from \"../button/button.component\";\nimport { XiriFormService, XiriFormServiceData, XiriFormServiceError } from \"../services/form.service\";\nimport { XiriButtonstyleComponent } from '../buttonstyle/buttonstyle.component';\nimport { XiriDoneComponent } from '../done/done.component';\nimport { XiriErrorComponent } from '../error/error.component';\nimport { XiriFormFieldsComponent } from '../formfields/form-fields.component';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { XiriFormField } from \"../formfields/field.interface\";\n\nexport interface XiriFormSettings {\n\tload?: boolean\n\turl: string\n\tfields?: XiriFormField[]\n\tbuttons?: XiriButton[]\n\theader?: string\n}\n\n@Component( {\n\t selector: 'xiri-form',\n\t templateUrl: './form.component.html',\n\t styleUrl: './form.component.scss',\n\t imports: [ CdkTrapFocus,\n\t MatProgressSpinner,\n\t XiriFormFieldsComponent,\n\t XiriErrorComponent,\n\t XiriDoneComponent,\n\t XiriButtonstyleComponent ]\n } )\nexport class XiriFormComponent implements OnInit {\n\n\tsettings = input.required<XiriFormSettings>();\n\n\tprivate location = inject( Location );\n\tprivate formService = inject( XiriFormService );\n\tprivate destroyRef = inject( DestroyRef );\n\n\tpublic formFields = signal<XiriFormField[] | null>( null );\n\tpublic loading = signal<boolean>( true );\n\tpublic loadingButton = signal<XiriButton | null>( null );\n\tpublic done = signal<boolean>( false );\n\tpublic error = signal<string>( '' );\n\n\tprivate url!: string;\n\tpublic buttons: XiriButton[] = [];\n\tprivate extra = {};\n\tprivate formValues: object | null | undefined = null;\n\tpublic formValid = true;\n\tpublic checkSubject: Subject<void> = new Subject<void>();\n\t\n\t\n\tngOnInit(): void {\n\t\t\n\t\tthis.url = this.settings().url;\n\t\t\n\t\tif ( this.settings().load ) {\n\t\t\tthis.send( null );\n\t\t} else\n\t\t\tthis.loadData( this.formService.parse( this.settings() ) );\n\t}\n\t\n\tprivate send( data: object | null | undefined ) {\n\t\t\n\t\tthis.loading.set( true );\n\t\tthis.error.set( '' );\n\t\t\n\t\tthis.formService.get( this.url, data, this.extra ).pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe(\n\t\t\t{\n\t\t\t\tnext: ( res: XiriFormServiceData ) => {\n\t\t\t\t\tthis.loadData( res );\n\t\t\t\t},\n\t\t\t\terror: ( err: XiriFormServiceError ) => {\n\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\tthis.loadingButton.set( null );\n\t\t\t\t\tthis.error.set( err.error ?? 'Unknown Error' );\n\t\t\t\t\t\n\t\t\t\t\tif ( this.buttons.length == 0 ) {\n\t\t\t\t\t\tthis.buttons = [ {\n\t\t\t\t\t\t\ttext: 'Close',\n\t\t\t\t\t\t\taction: 'close',\n\t\t\t\t\t\t\ttype: 'raised',\n\t\t\t\t\t\t} ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t}\n\n\tprivate loadData( res: XiriFormServiceData ): void {\n\t\t\n\t\tif ( res.buttons ) {\n\t\t\tif ( res.url )\n\t\t\t\tthis.url = res.url;\n\t\t\tthis.buttons = res.buttons;\n\t\t\tthis.extra = res.extra ?? {};\n\t\t\tthis.formFields.set( res.fields ?? null );\n\t\t} else if ( res.done ) {\n\t\t\tthis.done.set( true );\n\t\t\tthis.formFields.set( null );\n\t\t\tthis.buttons = [];\n\t\t\tres.done.pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe();\n\t\t}\n\t\t\n\t\tthis.loading.set( false );\n\t\tthis.loadingButton.set( null );\n\t}\n\t\n\tclickButton( button: XiriButton ): void {\n\n\t\tif ( button.action == 'back' )\n\t\t\tthis.location.back();\n\t\telse if ( button.action == 'get' ) {\n\t\t\tthis.url = button.url as string;\n\t\t\tthis.loadingButton.set( button );\n\t\t\tthis.startSend( null );\n\t\t} else if ( button.action == 'post' ) {\n\t\t\tthis.url = button.url as string;\n\t\t\tthis.loadingButton.set( button );\n\t\t\tthis.startSend( button.data );\n\t\t} else if ( button.action == 'debug' ) {\n\t\t\tthis.checkSubject.next();\n\t\t} else if ( button.action == 'simulate' ) {\n\t\t\tif ( this.formValid ) {\n\t\t\t\tthis.loadingButton.set( button );\n\t\t\t\tthis.loading.set( true );\n\t\t\t\tthis.error.set( '' );\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tthis.loadData( this.formService.parse( {\n\t\t\t\t\t\t done: true,\n\t\t\t\t\t } ) );\n\t\t\t\t}, 5000 );\n\t\t\t} else\n\t\t\t\tthis.checkSubject.next();\n\n\n\t\t} else {\n\t\t\tif ( this.loading() )\n\t\t\t\treturn;\n\n\t\t\tthis.loadingButton.set( button );\n\t\t\tthis.startSend( this.formValues );\n\t\t}\n\t}\n\t\n\tprivate startSend( data: object | null | undefined ): void {\n\t\t\n\t\tsetTimeout( () => {\n\t\t\tif ( this.formValid )\n\t\t\t\tthis.send( data );\n\t\t\telse\n\t\t\t\tthis.checkSubject.next();\n\t\t}, 10 );\n\t}\n\t\n\tpublic formChanged( event: UntypedFormGroup ) {\n\n\t\tthis.formValid = event.valid;\n\t\tthis.formValues = event.value;\n\t\t\n\t\t// data = { ...data, ...this.extra }\n\t\t// this.events.push( '' + this.formValid + ' => ' + JSON.stringify( event.value ) );\n\t}\n\t\n}\n","<div class=\"xrow\" cdkTrapFocus>\n\t<div class=\"xcol\">\n\t\t@if (loading() && formFields() === null) {\n\t\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t\t}\n\t\t@if (formFields() !== null) {\n\t\t\t<xiri-form-fields [form]=\"formFields()\" (formChange)=\"formChanged($event)\" [disabled]=\"loading()\"\n\t\t\t [check]=\"checkSubject.asObservable()\"></xiri-form-fields>\n\t\t}\n\t\t@if (error()) {\n\t\t\t<xiri-error class=\"error\" [text]=\"error()\"></xiri-error>\n\t\t}\n\t</div>\n\t@if (done()) {\n\t\t<div class=\"xcol done\">\n\t\t\t<xiri-done></xiri-done>\n\t\t</div>\n\t} @else {\n\t\t<div class=\"xcol formbtnline\">\n\t\t\t@for (button of buttons; track button) {\n\t\t\t\t@if (button.default) {\n\t\t\t\t\t<xiri-buttonstyle (click)=\"clickButton( button )\" [button]=\"button\" [disabled]=\"!formValid || loading()\" [loading]=\"loadingButton() === button\"></xiri-buttonstyle>\n\t\t\t\t} @else {\n\t\t\t\t\t<xiri-buttonstyle (click)=\"clickButton( button )\" [button]=\"button\" [disabled]=\"loading()\" [loading]=\"loadingButton() === button\"></xiri-buttonstyle>\n\t\t\t\t}\n\t\t\t}\n\t\t</div>\n\t}\n</div>\n","import { Subject, Observable } from 'rxjs';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\nexport class XiriSidepanelRef {\n\tprivate readonly closed$ = new Subject<unknown>();\n\n\tconstructor( private readonly overlayRef?: OverlayRef, private readonly previouslyFocused?: HTMLElement | null ) {\n\t}\n\n\tafterClosed(): Observable<unknown> {\n\t\treturn this.closed$.asObservable();\n\t}\n\n\tclose( result?: unknown ): void {\n\t\tthis.overlayRef?.dispose();\n\t\tthis.previouslyFocused?.focus?.();\n\t\tthis.closed$.next( result );\n\t\tthis.closed$.complete();\n\t}\n}\n","import { Component, computed, input } from '@angular/core';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { XiriColor } from '../types/color.type';\n\nexport interface XiriProgressSettings {\n\tlabel: string\n\tcurrent: number\n\ttotal: number\n\tvalue: number\n\tcolor?: XiriColor\n\tindeterminate?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-progress',\n\t templateUrl: './progress.component.html',\n\t styleUrl: './progress.component.scss',\n\t imports: [ MatProgressBar ]\n } )\nexport class XiriProgressComponent {\n\n\tsettings = input.required<XiriProgressSettings>();\n\n\tmode = computed<'determinate' | 'indeterminate'>(\n\t\t() => this.settings().indeterminate ? 'indeterminate' : 'determinate' );\n}\n","<div class=\"xiri-progress\">\n\t<div class=\"progress-head\">\n\t\t<span class=\"progress-label\">{{ settings().label }}</span>\n\t\t@if (!settings().indeterminate) {\n\t\t\t<span class=\"progress-count\">{{ settings().current }} / {{ settings().total }}</span>\n\t\t}\n\t</div>\n\t<mat-progress-bar [mode]=\"mode()\" [value]=\"settings().value\" [class]=\"settings().color || ''\"></mat-progress-bar>\n</div>\n","import { Component, computed, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatCard, MatCardContent } from '@angular/material/card';\nimport { RouterLink } from '@angular/router';\nimport { XiriColor } from '../types/color.type';\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\n\n\nexport interface XiriInfopointSettings {\n\ttext: string\n\tinfo: string\n\n\turl?: string\n\turlParams?: object\n\n\ticon: string\n\ticonSet?: string;\n\ticonColor: XiriColor\n\n\tdense?: boolean\n\tcompact?: boolean\n\thtml?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-infopoint',\n\t templateUrl: './infopoint.component.html',\n\t styleUrl: './infopoint.component.scss',\n\t imports: [ RouterLink, MatCard, MatCardContent, MatIcon, SafehtmlPipe ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriInfopointComponent {\n\n\tsettings = input.required<XiriInfopointSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n}\n","<div class=\"point\" [class.isLink]=\"settings().url\" [routerLink]=\"settings().url\" [queryParams]=\"settings().urlParams\">\n\t@if (compact()) {\n\t\t<div class=\"card xiri-infopoint-flat\" [class.dense]=\"settings().dense\">\n\t\t\t<div class=\"icon\" [class]=\"settings().iconColor\">\n\t\t\t\t@if (settings().iconSet) {\n\t\t\t\t\t<mat-icon [fontSet]=\"settings().iconSet!\">{{ settings().icon }}</mat-icon>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon>{{ settings().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div class=\"right\">\n\t\t\t\t@if (settings().text) {\n\t\t\t\t\t@if (settings().html) {\n\t\t\t\t\t\t<div class=\"text\" [innerHtml]=\"settings().text | safeHtml\"></div>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<div class=\"text\">{{ settings().text }}</div>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@if (settings().html) {\n\t\t\t\t\t<div class=\"info\" [innerHtml]=\"settings().info | safeHtml\"></div>\n\t\t\t\t} @else {\n\t\t\t\t\t<div class=\"info\">{{ settings().info }}</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t} @else {\n\t\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t\t<mat-card-content [class.dense]=\"settings().dense\">\n\t\t\t\t<div class=\"icon\" [class]=\"settings().iconColor\">\n\t\t\t\t\t@if (settings().iconSet) {\n\t\t\t\t\t\t<mat-icon [fontSet]=\"settings().iconSet!\">{{ settings().icon }}</mat-icon>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<mat-icon>{{ settings().icon }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"right\">\n\t\t\t\t\t@if (settings().text) {\n\t\t\t\t\t\t@if (settings().html) {\n\t\t\t\t\t\t\t<div class=\"text\" [innerHtml]=\"settings().text | safeHtml\"></div>\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t<div class=\"text\">{{ settings().text }}</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t@if (settings().html) {\n\t\t\t\t\t\t<div class=\"info\" [innerHtml]=\"settings().info | safeHtml\"></div>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<div class=\"info\">{{ settings().info }}</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</mat-card-content>\n\t\t</mat-card>\n\t}\n</div>\n","import { Component, DestroyRef, inject, input } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { XiriDataService } from \"../services/data.service\";\nimport { XiriColor } from '../types/color.type';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { RouterLink } from '@angular/router';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\nimport { MatCard, MatCardContent } from '@angular/material/card';\nimport {\n\tMatListItem,\n\tMatListItemIcon,\n\tMatListItemLine,\n\tMatListItemMeta,\n\tMatListItemTitle,\n\tMatListSubheaderCssMatStyler,\n\tMatNavList\n} from '@angular/material/list';\n\nexport interface XiriListSettings {\n\tsections: XiriListSection[];\n}\n\nexport interface XiriListSection {\n\tname: string;\n\tdata: XiriListItem[];\n}\n\nexport interface XiriListItem {\n\tname: string;\n\tinfo: string;\n\ticon: string;\n\ticonSet?: string;\n\ticonColor: XiriColor;\n\turl: string;\n\thasFavorite?: boolean;\n\tisFavorite?: boolean;\n\tfavoriteUrl?: string;\n\tfavoriteHint?: string;\n}\n\n@Component( {\n\t selector: 'xiri-list',\n\t templateUrl: './list.component.html',\n\t styleUrl: './list.component.scss',\n\t imports: [\n\t\t MatListSubheaderCssMatStyler,\n\t\t MatCard,\n\t\t MatCardContent,\n\t\t MatNavList,\n\t\t MatListItem,\n\t\t RouterLink,\n\t\t MatListItemIcon,\n\t\t MatIcon,\n\t\t MatListItemTitle,\n\t\t MatListItemLine,\n\t\t MatListItemMeta,\n\t\t MatIconButton,\n\t\t MatTooltip,\n\t\t XiriUrlPipe,\n\t ],\n } )\nexport class XiriListComponent {\n\n\tsettings = input.required<XiriListSettings>();\n\tprivate dataService = inject( XiriDataService );\n\tprivate destroyRef = inject( DestroyRef );\n\n\tchangeFavorite( item: XiriListItem, event: Event ) {\n\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\n\t\tconst url = item.favoriteUrl + ( item.isFavorite ? '0' : '1' );\n\t\tthis.dataService.get( url ).pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe();\n\t\titem.isFavorite = !item.isFavorite;\n\t}\n}\n","@for (section of settings().sections; track section) {\n\t@if (section.name) {\n\t\t<div mat-subheader>{{ section.name }}</div>\n\t}\n\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<mat-card-content>\n\t\t\t<mat-nav-list>\n\t\t\t\t@for (item of section.data; track item) {\n\t\t\t\t\t@let itemUrl = item.url | xiriUrl;\n\t\t\t\t\t<a mat-list-item [routerLink]=\"itemUrl?.path\" [queryParams]=\"itemUrl?.queryParams\" class=\"linelink\">\n\t\t\t\t\t\t<div matListItemIcon class=\"list-icon\" [class]=\"item.iconColor\">\n\t\t\t\t\t\t\t@if (item.iconSet) {\n\t\t\t\t\t\t\t\t<mat-icon [fontSet]=\"item.iconSet\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<mat-icon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span matListItemTitle>{{ item.name }}</span>\n\t\t\t\t\t\t<span matListItemLine>{{ item.info }}</span>\n\t\t\t\t\t\t@if (item.hasFavorite) {\n\t\t\t\t\t\t\t<div matListItemMeta class=\"list-fav\">\n\t\t\t\t\t\t\t\t<button mat-icon-button (click)=\"changeFavorite(item, $event)\" [matTooltip]=\"item.favoriteHint\"\n\t\t\t\t\t\t\t [attr.aria-label]=\"'Favorit: ' + item.name\"\n\t\t\t\t\t\t\t [attr.aria-pressed]=\"!!item.isFavorite\">\n\t\t\t\t\t\t\t\t\t@if (item.isFavorite) {\n\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"accent\">star</mat-icon>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t@if (!item.isFavorite) {\n\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"gray\">star_outline</mat-icon>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</a>\n\t\t\t\t}\n\t\t\t</mat-nav-list>\n\t\t</mat-card-content>\n\t</mat-card>\n}\n","import { Component, input } from '@angular/core';\n\nexport interface XiriHeaderSettings {\n\ttext: string\n\tcolor: string\n\tsize: string\n}\n\n@Component( {\n\t selector: 'xiri-header',\n\t templateUrl: './header.component.html',\n\t styleUrl: './header.component.scss',\n\t imports: [],\n } )\nexport class XiriHeaderComponent {\n\t\n\tsettings = input.required<XiriHeaderSettings>();\n}\n","<div class=\"name\" [class]=\"settings().color + ' ' + settings().size\">{{ settings().text }}</div>\n","import {\n\tComponent,\n\tDestroyRef,\n\tinject,\n\tinput,\n\tOnInit,\n\tsignal,\n\tviewChild,\n\tWritableSignal\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { XiriButton } from \"../button/button.component\";\nimport { BreakpointObserver, Breakpoints } from \"@angular/cdk/layout\";\nimport { map, Observable, Subscription } from \"rxjs\";\nimport { MatStep, MatStepper } from \"@angular/material/stepper\";\nimport { XiriDataService } from \"../services/data.service\";\nimport { Location } from \"@angular/common\";\nimport { Router } from \"@angular/router\";\nimport { StepperSelectionEvent } from \"@angular/cdk/stepper\";\nimport { XiriFormField } from \"../formfields/field.interface\";\nimport { XiriDoneComponent } from '../done/done.component';\nimport { XiriButtonstyleComponent } from '../buttonstyle/buttonstyle.component';\nimport { XiriErrorComponent } from '../error/error.component';\nimport { XiriFormFieldsComponent } from '../formfields/form-fields.component';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { HttpErrorResponse } from '@angular/common/http';\n\nexport interface XiriStepperSettings {\n\turl?: string\n\tsteps: XiriStepperStep[]\n}\n\nexport interface XiriStepperStep {\n\turl?: string\n\ttitle: string\n\tfields: XiriFormField[]\n\tdata?: Record<string, unknown>\n\textra?: Record<string, unknown>\n\tbuttons: XiriButton[]\n}\n\n// Event emitted by xiri-form-fields (carries the underlying FormGroup, exposing valid/value/pristine).\nexport interface XiriStepperFormChangeEvent {\n\tvalid: boolean\n\tvalue: Record<string, unknown> | null\n\tpristine?: boolean\n}\n\n// Backend response to a step check (next step definition, step jump or final goto).\nexport interface XiriStepperResponse {\n\tstep?: number\n\tfields?: XiriFormField[]\n\tbuttons?: XiriButton[]\n\turl?: string\n\tgoto?: string\n\t[ key: string ]: unknown\n}\n\ninterface StepState {\n\turl?: string\n\ttitle: string\n\tcompleted: WritableSignal<boolean>\n\tcheck: WritableSignal<boolean>\n\tvalid: WritableSignal<boolean>\n\tload: WritableSignal<boolean>\n\tgotonext: WritableSignal<boolean>\n\terrorMsg: WritableSignal<string | null>\n\tfields: WritableSignal<XiriFormField[]>\n\tbuttons: WritableSignal<XiriButton[]>\n\tdata?: Record<string, unknown>\n\textra?: Record<string, unknown>\n}\n\n\n@Component( {\n\t selector: 'xiri-stepper',\n\t templateUrl: './stepper.component.html',\n\t styleUrl: './stepper.component.scss',\n\t imports: [ MatStepper,\n\t MatStep,\n\t MatProgressSpinner,\n\t XiriFormFieldsComponent,\n\t XiriErrorComponent,\n\t XiriButtonstyleComponent,\n\t XiriDoneComponent ]\n } )\nexport class XiriStepperComponent implements OnInit {\n\n\tprivate dataService: XiriDataService = inject( XiriDataService );\n\tprivate location: Location = inject( Location );\n\tprivate router: Router = inject( Router );\n\tprivate destroyRef = inject( DestroyRef );\n\tprivate breakpointObserver = inject( BreakpointObserver );\n\n\tsettings = input.required<XiriStepperSettings>();\n\n\t// Auf Phone (XSmall) vertikal, damit die Schrittbezeichnungen nicht abgeschnitten werden.\n\torientation = toSignal(\n\t\tthis.breakpointObserver.observe( Breakpoints.XSmall ).pipe(\n\t\t\tmap( result => result.matches ? 'vertical' : 'horizontal' as const )\n\t\t),\n\t\t{ initialValue: 'horizontal' as const }\n\t);\n\n\tpublic done = signal( false );\n\tprivate calls: Subscription[] = [];\n\n\tstepper = viewChild.required<MatStepper>( MatStepper );\n\n\tpublic steps = signal<StepState[]>( [] );\n\n\n\tngOnInit(): void {\n\t\tconst steps: StepState[] = [];\n\t\tfor ( let i = 0; i != this.settings().steps.length; i++ ) {\n\t\t\tconst step = this.settings().steps[ i ];\n\n\t\t\tsteps.push( {\n\t\t\t\turl: step.url,\n\t\t\t\ttitle: step.title,\n\t\t\t\tcompleted: signal( false ),\n\t\t\t\tcheck: signal( false ),\n\t\t\t\tvalid: signal( false ),\n\t\t\t\tload: signal( i > 0 ),\n\t\t\t\tgotonext: signal( false ),\n\t\t\t\terrorMsg: signal( null ),\n\t\t\t\tfields: signal<XiriFormField[]>( step.fields ),\n\t\t\t\tbuttons: signal<XiriButton[]>( step.buttons ),\n\t\t\t\tdata: step.data,\n\t\t\t\textra: step.extra\n\t\t\t} );\n\t\t}\n\t\tthis.steps.set( steps );\n\t}\n\n\tstepChanged( $event: StepperSelectionEvent ) {\n\t\tconst step = this.steps()[ $event.selectedIndex ];\n\n\t\tif ( step.gotonext() ) {\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.stepper().next();\n\t\t\t}, 10 );\n\t\t}\n\t}\n\n\tformChanged( step: StepState, event: XiriStepperFormChangeEvent, i: number ) {\n\n\t\tif ( event.valid )\n\t\t\tstep.data = event.value as Record<string, unknown>;\n\t\tif ( !event.pristine ) {\n\t\t\tstep.completed.set( false );\n\t\t\tconst steps = this.steps();\n\t\t\tfor ( let x = i + 1; x < steps.length; x++ ) {\n\t\t\t\tsteps[ x ].completed.set( false );\n\t\t\t\tsteps[ x ].load.set( true );\n\t\t\t\tsteps[ x ].gotonext.set( false );\n\t\t\t}\n\t\t}\n\n\t\tstep.valid.set( event.valid );\n\t}\n\n\tclickButton( button: XiriButton ): void {\n\n\t\tif ( button.action == 'back' )\n\t\t\tthis.location.back();\n\t\telse if ( button.action == 'prev' ) {\n\t\t\tthis.calls.forEach( c => c.unsubscribe() );\n\t\t\tthis.calls = [];\n\n\t\t\tif ( this.stepper().selectedIndex != 0 ) {\n\t\t\t\tfor ( let i = this.stepper().selectedIndex - 1; i != 0; i-- ) {\n\t\t\t\t\tif ( this.steps()[ i ].gotonext() )\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tthis.stepper().selectedIndex = i;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.stepper().selectedIndex = 0;\n\t\t\t} else\n\t\t\t\tthis.location.back();\n\t\t} else if ( button.action == 'next' ) {\n\t\t\tconst step = this.steps()[ this.stepper().selectedIndex ];\n\t\t\tif ( step.valid() && !step.check() )\n\t\t\t\tthis.checkStep( this.stepper().selectedIndex );\n\t\t}\n\t\telse if ( button.action == 'get' ) {\n\t\t\t//\n\t\t} else if ( button.action == 'post' ) {\n\t\t\t//\n\t\t}\n\t}\n\n\tprivate checkStep( current: number ) {\n\t\tconst steps = this.steps();\n\t\tconst stepCurrent = steps[ current ];\n\t\tlet stepNext: StepState | null = null;\n\t\tlet needLoad: boolean;\n\n\t\tif ( current + 1 < steps.length ) {\n\t\t\tstepNext = steps[ current + 1 ];\n\t\t\tneedLoad = stepNext.load();\n\t\t} else {\n\t\t\tneedLoad = true;\n\t\t}\n\n\t\tif ( !needLoad ) {\n\t\t\tthis.stepper().next();\n\t\t\treturn;\n\t\t}\n\n\t\tstepCurrent.check.set( true );\n\t\tstepCurrent.errorMsg.set( null );\n\n\t\tconst x = this.sendStep( current ).pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe(\n\t\t\t{\n\t\t\t\tnext: ( res: XiriStepperResponse | null ) => {\n\n\t\t\t\t\tif ( res == null ) {\n\t\t\t\t\t\tthis.showError( stepCurrent, null );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( res.step && res.step != current + 1 ) {\n\n\t\t\t\t\t\tfor ( let i = current + 1; i != res.step; i++ ) {\n\t\t\t\t\t\t\tsteps[ i ].completed.set( true );\n\t\t\t\t\t\t\tsteps[ i ].gotonext.set( true );\n\t\t\t\t\t\t\tsteps[ i ].load.set( false );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstepNext = steps[ res.step ];\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( stepNext ) {\n\t\t\t\t\t\tif ( res.fields )\n\t\t\t\t\t\t\tstepNext.fields.set( res.fields );\n\t\t\t\t\t\tif ( res.buttons )\n\t\t\t\t\t\t\tstepNext.buttons.set( res.buttons );\n\t\t\t\t\t\tif ( res.url )\n\t\t\t\t\t\t\tstepNext.url = res.url;\n\t\t\t\t\t\tstepNext.load.set( false );\n\t\t\t\t\t\tstepNext.gotonext.set( false );\n\t\t\t\t\t}\n\n\t\t\t\t\tstepCurrent.check.set( false );\n\t\t\t\t\tstepCurrent.completed.set( true );\n\n\t\t\t\t\tif ( res.step && stepNext ) {\n\t\t\t\t\t\tconst nextIndex = res.step;\n\t\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\t\tthis.stepper().selectedIndex = nextIndex;\n\t\t\t\t\t\t}, 0 )\n\t\t\t\t\t} else if ( res.goto ) {\n\t\t\t\t\t\tthis.done.set( true );\n\t\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\t\tthis.router.navigate( [ res.goto ] ).then();\n\t\t\t\t\t\t}, 1000 );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: ( err ) => {\n\t\t\t\t\tthis.showError( stepCurrent, err );\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.calls.push( x );\n\t}\n\n\tprivate showError( stepCurrent: StepState, err: HttpErrorResponse | null ) {\n\n\t\tif ( err == null )\n\t\t\tstepCurrent.errorMsg.set( 'Unknown error' );\n\t\telse if ( err.status == 400 )\n\t\t\tstepCurrent.errorMsg.set( err.error.error || 'Format Error' );\n\t\telse if ( err.status == 403 )\n\t\t\tstepCurrent.errorMsg.set( 'Access denied' );\n\t\telse\n\t\t\tstepCurrent.errorMsg.set( 'Unknown error' );\n\n\t\tstepCurrent.check.set( false );\n\t\tstepCurrent.completed.set( false );\n\t}\n\n\tprivate sendStep( i: number ): Observable<XiriStepperResponse | null> {\n\t\tconst steps = this.steps();\n\t\tlet data: Record<string, unknown> = {};\n\t\tconst step = steps[ i ];\n\n\t\tfor ( let x = 0; x <= i; x++ )\n\t\t\tdata = { ...data, ...steps[ x ].data };\n\n\t\tif ( step.extra )\n\t\t\tdata = { ...data, ...step.extra };\n\n\t\tconst url = step.url ? step.url : ( this.settings().url ?? '' );\n\t\treturn this.dataService.post( url, data ) as Observable<XiriStepperResponse | null>;\n\t}\n\n}\n","<mat-stepper [orientation]=\"orientation()\" [linear]=\"true\" (selectionChange)=\"stepChanged( $event )\" [hidden]=\"done()\">\n\t@for (step of steps(); track i; let i = $index) {\n\t\t<mat-step [label]=\"step.title\" [completed]=\"step.completed()\">\n\t\t\t<div class=\"xrow\">\n\t\t\t\t<div class=\"xcol\">\n\t\t\t\t\t@if (!step.load()) {\n\t\t\t\t\t\t<xiri-form-fields [form]=\"step.fields()\" (formChange)=\"formChanged(step, $event, i)\" [disabled]=\"step.check()\"></xiri-form-fields>\n\t\t\t\t\t}\n\t\t\t\t\t@if (step.errorMsg()) {\n\t\t\t\t\t\t<xiri-error class=\"error\" [text]=\"step.errorMsg()!\"></xiri-error>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t@if (step.check()) {\n\t\t\t\t\t<div class=\"xcol checking\">\n\t\t\t\t\t\t<mat-spinner diameter=\"25\"></mat-spinner>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<div class=\"xcol buttons\">\n\t\t\t\t\t@for (button of step.buttons(); track button) {\n\t\t\t\t\t\t@if (!button.default) {\n\t\t\t\t\t\t\t<xiri-buttonstyle [disabled]=\"false\" (click)=\"clickButton( button )\" [button]=\"button\"></xiri-buttonstyle>\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t<xiri-buttonstyle (click)=\"clickButton( button )\" [button]=\"button\" [disabled]=\"!step.valid() || step.check()\"></xiri-buttonstyle>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</mat-step>\n\t}\n</mat-stepper>\n\n@if (done()) {\n\t<div class=\"xcol done\">\n\t\t<xiri-done></xiri-done>\n\t</div>\n}\n","import {\n\tChangeDetectorRef,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\tinject,\n\tinput,\n\tOnInit,\n\toutput,\n\tsignal,\n\tTemplateRef\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { debounceTime, Subject } from \"rxjs\";\nimport { XiriFormField } from \"../formfields/field.interface\";\nimport { XiriDynData } from \"../dyncomponent/dyndata.interface\";\nimport { NgTemplateOutlet } from '@angular/common';\nimport { XiriFormFieldsComponent } from '../formfields/form-fields.component';\nimport { XiriDataService } from \"../services/data.service\";\nimport { XiriFormService } from \"../services/form.service\";\nimport { XiriButtonlineComponent } from \"../buttonline/buttonline.component\";\nimport { XiriButtonResult } from \"../button/button.component\";\nimport { MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle } from \"@angular/material/expansion\";\nimport { MatIcon } from \"@angular/material/icon\";\nimport { MatButton } from \"@angular/material/button\";\nimport { MatProgressSpinner } from \"@angular/material/progress-spinner\";\nimport { MatChip, MatChipRemove, MatChipSet } from \"@angular/material/chips\";\nimport { HttpErrorResponse } from \"@angular/common/http\";\n\nexport interface XiriQuerySettings {\n\tfields?: XiriFormField[]\n\tdyn?: XiriDynData[]\n\turl?: string\n\tbuttonline?: XiriDynData\n\textra?: Record<string, unknown>\n\tsaveState?: boolean\n\tsaveStateId?: string\n\tcollapsed?: boolean\n\tshowActiveFilters?: boolean\n\tshowResultCount?: boolean\n}\n\n// A single active filter, rendered as a removable chip.\nexport interface XiriQueryActiveFilter {\n\tid: string\n\tlabel: string\n\tvalue: string\n}\n\n// Result count for the query. `total` (unfiltered) is optional.\nexport interface XiriQueryResultCount {\n\tfiltered: number\n\ttotal?: number\n}\n\n// Field types that never carry a filter value (structural/informational).\nconst NON_FILTER_FIELD_TYPES = new Set( [ 'header', 'divider', 'info', 'html', 'question', 'waiting' ] );\n\n// Event emitted by xiri-form-fields (carries the underlying FormGroup, exposing valid/value/pristine).\nexport interface XiriQueryFormChangeEvent {\n\tvalid: boolean\n\tvalue: Record<string, unknown> | null\n\tpristine?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-query',\n\t templateUrl: './query.component.html',\n\t styleUrl: './query.component.scss',\n\t imports: [ XiriFormFieldsComponent, NgTemplateOutlet, XiriButtonlineComponent, MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle, MatIcon, MatButton, MatProgressSpinner, MatChipSet, MatChip, MatChipRemove ],\n } )\nexport class XiriQueryComponent implements OnInit {\n\n\tprivate dataService: XiriDataService = inject( XiriDataService );\n\tprivate formService = inject( XiriFormService );\n\tprivate cdr = inject( ChangeDetectorRef );\n\tprivate destroyRef = inject( DestroyRef );\n\n\tsettings = input.required<XiriQuerySettings>();\n\tdyncomponent = input<TemplateRef<unknown>>();\n\t// Host-provided result count (e.g. client-side filtering). URL loads may override it via the response.\n\tcount = input<XiriQueryResultCount | null>( null );\n\tfilterChange = output<Record<string, unknown> | null>();\n\n\tprivate waiter: Subject<XiriQueryFormChangeEvent> = new Subject<XiriQueryFormChangeEvent>();\n\n\tpublic dynData: {\n\t\tdata: XiriDynData[] | null,\n\t\tfilterData: Record<string, unknown> | null,\n\t} = { data: null, filterData: null };\n\n\tprivate saveState = false;\n\tprivate saveStateId: string | null = null;\n\tprivate extra: Record<string, unknown> | null = null;\n\tprivate _initialChangeDone = false;\n\n\tprivate get effectiveSaveKey(): string | null {\n\t\treturn this.saveStateId ? this.saveStateId + ':filter' : null;\n\t}\n\t\n\tpublic data = signal<XiriDynData[] | null>( null );\n\tpublic error = signal<string | null>( null );\n\tpublic formFields = signal<XiriFormField[] | null>( null );\n\tpublic formValid = signal<boolean>( true );\n\tpublic filterData = signal<Record<string, unknown> | null>( null );\n\tpublic loading = signal<boolean>( false );\n\n\t// Raw (un-merged with `extra`) form value, used to derive the visible active-filter chips.\n\tprivate rawValue = signal<Record<string, unknown> | null>( null );\n\t// Result count picked up from a URL load response (`count`/`total`), overrides the `count` input.\n\tprivate responseCount = signal<XiriQueryResultCount | null>( null );\n\n\tpublic resultCount = computed<XiriQueryResultCount | null>( () => this.responseCount() ?? this.count() );\n\n\tpublic activeFilters = computed<XiriQueryActiveFilter[]>( () => {\n\t\tconst fields = this.formFields();\n\t\tconst value = this.rawValue();\n\t\tif ( !fields || !value )\n\t\t\treturn [];\n\n\t\tconst result: XiriQueryActiveFilter[] = [];\n\t\tfor ( const field of fields ) {\n\t\t\tif ( NON_FILTER_FIELD_TYPES.has( field.type ) )\n\t\t\t\tcontinue;\n\t\t\tconst raw = value[ field.id ];\n\t\t\tif ( isEmptyFilterValue( raw ) )\n\t\t\t\tcontinue;\n\t\t\tresult.push( { id: field.id, label: field.name ?? field.id, value: formatFilterValue( field, raw ) } );\n\t\t}\n\t\treturn result;\n\t} );\n\n\tngOnInit(): void {\n\t\t\n\t\tconst settings = this.settings();\n\t\tif ( settings.dyn !== undefined && settings.dyn !== null && settings.dyn.length != 0 )\n\t\t\tthis.dynData.data = settings.dyn;\n\t\t\n\t\tthis.saveState = settings.saveState === undefined ? false : settings.saveState;\n\t\tthis.saveStateId = settings.saveStateId === undefined ? null : settings.saveStateId;\n\t\tthis.formFields.set( this.formService.loadState( this.effectiveSaveKey, settings.fields ?? [] ) );\n\t\tthis.extra = settings.extra || null;\n\t\t\n\t\tthis.waiter.pipe( debounceTime( 300 ), takeUntilDestroyed( this.destroyRef ) ).subscribe( event => {\n\n\t\t\tif ( event.valid ) {\n\t\t\t\tthis.dynData.filterData = this.filterData();\n\t\t\t\tthis.filterChange.emit( this.filterData() );\n\t\t\t\tif ( this.saveState )\n\t\t\t\t\tthis.formService.saveState( this.effectiveSaveKey, event.value );\n\n\t\t\t\tif ( this.settings().url )\n\t\t\t\t\tthis.load();\n\t\t\t} else {\n\t\t\t\tthis.data.set( null );\n\t\t\t\tthis.dynData.filterData = null;\n\t\t\t\tthis.filterChange.emit( null );\n\t\t\t}\n\t\t\tthis.cdr.markForCheck();\n\t\t} );\n\t}\n\n\tpublic formChanged( event: XiriQueryFormChangeEvent ) {\n\t\tthis.formValid.set( event.valid );\n\t\tthis.rawValue.set( event.value );\n\n\t\tif ( this.extra !== null ) {\n\t\t\tif ( event.value && typeof event.value === 'object' )\n\t\t\t\tthis.filterData.set( { ...this.extra, ...event.value } );\n\t\t\telse\n\t\t\t\tthis.filterData.set( this.extra );\n\t\t} else\n\t\t\tthis.filterData.set( event.value );\n\n\t\t// Emit immediately on first valid change (for initial load), debounce subsequent changes\n\t\tif ( !this._initialChangeDone && event.valid ) {\n\t\t\tthis._initialChangeDone = true;\n\t\t\tthis.dynData.filterData = this.filterData();\n\t\t\tthis.filterChange.emit( this.filterData() );\n\t\t\tif ( this.saveState )\n\t\t\t\tthis.formService.saveState( this.effectiveSaveKey, event.value );\n\t\t\tif ( this.settings().url )\n\t\t\t\tthis.load();\n\t\t} else {\n\t\t\tthis.waiter.next( event );\n\t\t}\n\t}\n\t\n\t// Re-runs the last URL load after an error; filter payload is retained in dynData.filterData.\n\tpublic retry() {\n\t\tif ( this.settings().url )\n\t\t\tthis.load();\n\t}\n\n\tpublic clickedButton( event: XiriButtonResult ) {\n\t\t\n\t\tif ( !event.loading && event.done ) {\n\t\t\tthis.data.set( event.result as XiriDynData[] | null );\n\t\t\tthis.error.set( null );\n\t\t\tthis.filterChange.emit( this.filterData() );\n\t\t} else {\n\t\t\tthis.data.set( null );\n\t\t\tthis.error.set( null );\n\t\t}\n\t\t\n\t\tthis.loading.set( event.loading );\n\t}\n\t\n\t// Clears a single filter. Mutating the control fires the form's valueChanges, which routes back through\n\t// formChanged() — i.e. exactly the same filter flow as editing/applying the form, not just a visual removal.\n\tpublic removeFilter( id: string ) {\n\t\tconst field = this.formFields()?.find( f => f.id === id );\n\t\tfield?.control?.reset( emptyValueForField( field ) );\n\t}\n\n\t// Clears all filters; each reset re-runs the same (debounced) filter flow as apply.\n\tpublic resetFilters() {\n\t\tfor ( const field of this.formFields() ?? [] )\n\t\t\tfield.control?.reset( emptyValueForField( field ) );\n\t}\n\n\tprivate load() {\n\n\t\t// Stale-while-revalidate: keep the previous data() visible (dimmed via loading())\n\t\t// instead of flashing empty on every navigation/filter change.\n\t\tthis.error.set( null );\n\t\tthis.loading.set( true );\n\n\t\tconst call = this.dataService.post( this.settings().url ?? '', this.dynData.filterData );\n\n\t\tcall.pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe(\n\t\t\t{\n\t\t\t\tnext: ( res: unknown ) => {\n\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\tif ( !res ) {\n\t\t\t\t\t\tthis.data.set( null );\n\t\t\t\t\t\tthis.error.set( 'Unknown Error' );\n\t\t\t\t\t\tthis.cdr.markForCheck();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst data = ( res as { data: XiriDynData[] | XiriDynData } ).data;\n\t\t\t\t\t// check if res is an array\n\t\t\t\t\tif ( Array.isArray( data ) )\n\t\t\t\t\t\tthis.data.set( data );\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.data.set( [ data ] );\n\n\t\t\t\t\t// Pick up an optional result count from the response (backend-driven counts).\n\t\t\t\t\tconst counted = res as { count?: number, total?: number };\n\t\t\t\t\tif ( typeof counted.count === 'number' )\n\t\t\t\t\t\tthis.responseCount.set( { filtered: counted.count, total: counted.total } );\n\n\t\t\t\t\tthis.cdr.markForCheck();\n\t\t\t\t},\n\t\t\t\terror: ( err: HttpErrorResponse ) => {\n\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\tthis.data.set( null );\n\t\t\t\t\tif ( err.status === 404 )\n\t\t\t\t\t\tthis.error.set( 'Page not found' );\n\t\t\t\t\telse if ( err.status === 401 )\n\t\t\t\t\t\tthis.error.set( 'No permission to view page' );\n\t\t\t\t\telse if ( err.status === 403 )\n\t\t\t\t\t\tthis.error.set( 'Access denied' );\n\t\t\t\t\telse if ( err.status === 500 )\n\t\t\t\t\t\tthis.error.set( 'Internal Error' );\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.error.set( 'Unknown Error' );\n\n\t\t\t\t\tconsole.log( 'XiriQueryComponent error', err );\n\t\t\t\t\tthis.cdr.markForCheck();\n\t\t\t\t}\n\t\t\t} );\n\t}\n}\n\n// A filter counts as active unless it is null/undefined, an empty string, an empty array,\n// a boolean false, or a range object with no bounds set.\nfunction isEmptyFilterValue( value: unknown ): boolean {\n\tif ( value === null || value === undefined || value === '' || value === false )\n\t\treturn true;\n\tif ( Array.isArray( value ) )\n\t\treturn value.length === 0;\n\tif ( typeof value === 'object' ) {\n\t\tconst vals = Object.values( value as Record<string, unknown> );\n\t\treturn vals.length === 0 || vals.every( v => v === null || v === undefined || v === '' );\n\t}\n\treturn false;\n}\n\n// Renders a readable value for the chip. Scalar and list-backed (select/multiselect) fields map\n// cleanly to their option name(s); anything else (e.g. range objects) falls back to a plain string.\nfunction formatFilterValue( field: XiriFormField, value: unknown ): string {\n\tconst optionName = ( id: unknown ): string => {\n\t\tconst opt = field.list?.find( o => o.id === id );\n\t\treturn opt ? opt.name : String( id );\n\t};\n\n\tif ( Array.isArray( value ) )\n\t\treturn value.map( optionName ).join( ', ' );\n\tif ( field.list && ( typeof value === 'string' || typeof value === 'number' ) )\n\t\treturn optionName( value );\n\tif ( value === true )\n\t\treturn field.name ?? 'Ja';\n\treturn String( value );\n}\n\n// The \"empty\" value used to clear a control, matching the shape the control currently holds.\nfunction emptyValueForField( field: XiriFormField ): unknown {\n\tconst value = field.control?.value;\n\tif ( Array.isArray( value ) )\n\t\treturn [];\n\tif ( typeof value === 'string' )\n\t\treturn '';\n\treturn null;\n}\n","<div class=\"xrow\">\n\t<div class=\"xcol\">\n\t\t@if (settings().collapsed !== undefined) {\n\t\t\t<mat-expansion-panel [expanded]=\"!settings().collapsed\" class=\"query-expansion\">\n\t\t\t\t<mat-expansion-panel-header>\n\t\t\t\t\t<mat-panel-title>\n\t\t\t\t\t\t<mat-icon>filter_list</mat-icon> Filter\n\t\t\t\t\t</mat-panel-title>\n\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t<div class=\"query\">\n\t\t\t\t\t<xiri-form-fields [form]=\"formFields()\" (formChange)=\"formChanged($event)\" display=\"line\"></xiri-form-fields>\n\t\t\t\t\t<ng-container *ngTemplateOutlet=\"filterState\"></ng-container>\n\t\t\t\t\t@if (error()) {\n\t\t\t\t\t\t<div class=\"error\">\n\t\t\t\t\t\t\t<span>{{ error() }}</span>\n\t\t\t\t\t\t\t<button mat-button type=\"button\" data-testid=\"query-retry\" (click)=\"retry()\">\n\t\t\t\t\t\t\t\t<mat-icon>refresh</mat-icon> Retry\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</mat-expansion-panel>\n\t\t} @else {\n\t\t\t<div class=\"query\">\n\t\t\t\t<xiri-form-fields [form]=\"formFields()\" (formChange)=\"formChanged($event)\" display=\"line\"></xiri-form-fields>\n\t\t\t\t<ng-container *ngTemplateOutlet=\"filterState\"></ng-container>\n\t\t\t\t@if (error()) {\n\t\t\t\t\t<div class=\"error\">\n\t\t\t\t\t\t<span>{{ error() }}</span>\n\t\t\t\t\t\t<button mat-button type=\"button\" data-testid=\"query-retry\" (click)=\"retry()\">\n\t\t\t\t\t\t\t<mat-icon>refresh</mat-icon> Retry\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t</div>\n\t@if (settings().buttonline; as buttonline) {\n\t\t<div class=\"xcol formbtnline\" [class]=\"buttonline.display\">\n\t\t\t<xiri-buttonline [settings]=\"$any(buttonline.data)\" [filterData]=\"filterData()\" [disabled]=\"!formValid()\"\n\t\t\t (result)=\"clickedButton($event)\"></xiri-buttonline>\n\t\t</div>\n\t\t@if (loading()) {\n\t\t\t<div class=\"xcol\">\n\t\t\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t\t\t</div>\n\t\t}\n\t}\n\t@if (dynData.data) {\n\t\t<div class=\"xcol\">\n\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent(); context: { $implicit: dynData }\"></ng-container>\n\t\t</div>\n\t}\n\t@if (data()) {\n\t\t<div class=\"xcol\" [class.is-loading]=\"loading()\">\n\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent(); context: { $implicit: data() }\"></ng-container>\n\t\t</div>\n\t}\n</div>\n\n<ng-template #filterState>\n\t@if (settings().showActiveFilters && activeFilters().length) {\n\t\t<div class=\"query-filter-state\">\n\t\t\t<mat-chip-set aria-label=\"Aktive Filter\">\n\t\t\t\t@for (filter of activeFilters(); track filter.id) {\n\t\t\t\t\t<mat-chip data-testid=\"query-filter-chip\" (removed)=\"removeFilter(filter.id)\">\n\t\t\t\t\t\t<span class=\"chip-label\">{{ filter.label }}: {{ filter.value }}</span>\n\t\t\t\t\t\t<button matChipRemove type=\"button\"\n\t\t\t\t\t\t [attr.aria-label]=\"'Filter entfernen: ' + filter.label + ' ' + filter.value\">\n\t\t\t\t\t\t\t<mat-icon>cancel</mat-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</mat-chip>\n\t\t\t\t}\n\t\t\t</mat-chip-set>\n\t\t\t<button mat-button type=\"button\" class=\"reset-filters\" data-testid=\"query-reset-filters\"\n\t\t\t (click)=\"resetFilters()\">\n\t\t\t\t<mat-icon>filter_list_off</mat-icon> Alle zurücksetzen\n\t\t\t</button>\n\t\t</div>\n\t}\n\t@if (settings().showResultCount && resultCount(); as rc) {\n\t\t<div class=\"query-result-count\" data-testid=\"query-result-count\" aria-live=\"polite\">\n\t\t\t@if (rc.total !== undefined) {\n\t\t\t\t<span><strong>{{ rc.filtered }}</strong> von {{ rc.total }} Treffern</span>\n\t\t\t} @else {\n\t\t\t\t<span><strong>{{ rc.filtered }}</strong> Treffer</span>\n\t\t\t}\n\t\t</div>\n\t}\n</ng-template>\n","import { Component, computed, inject, input, OnDestroy } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { XiriButton } from \"../button/button.component\";\nimport { XiriColor } from '../types/color.type';\nimport { XiriDialogComponent } from \"../dialog/dialog.component\";\nimport { MatDialog, MatDialogRef } from \"@angular/material/dialog\";\nimport { Router, RouterLink } from \"@angular/router\";\nimport { XiriUrlPipe } from \"../pipes/url.pipe\";\nimport { MatListItem, MatListItemIcon, MatListItemTitle, MatNavList } from '@angular/material/list';\nimport { MatIcon } from '@angular/material/icon';\nimport {\n\tMatCard,\n\tMatCardAvatar,\n\tMatCardContent,\n\tMatCardHeader,\n\tMatCardSubtitle,\n\tMatCardTitle\n} from '@angular/material/card';\n\nexport interface XiriLinksSettings {\n\tdata: XiriButton[]\n\theaderIcon?: string\n\theaderIconColor?: XiriColor\n\theaderSub?: string\n\theader?: string\n\tcompact?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-links',\n\t templateUrl: './links.component.html',\n\t styleUrl: './links.component.scss',\n\t imports: [ MatCard,\n\t MatCardHeader,\n\t MatCardAvatar,\n\t MatIcon,\n\t MatCardSubtitle,\n\t MatCardTitle,\n\t MatCardContent,\n\t MatNavList,\n\t MatListItem,\n\t MatListItemIcon,\n\t MatListItemTitle,\n\t RouterLink,\n\t NgTemplateOutlet,\n\t XiriUrlPipe ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriLinksComponent implements OnDestroy {\n\n\tsettings = input.required<XiriLinksSettings>();\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\tprivate dialog = inject( MatDialog );\n\tprivate router = inject( Router );\n\t\n\tprivate dialogRef?: MatDialogRef<unknown>;\n\n\tngOnDestroy(): void {\n\t\tif ( this.dialogRef )\n\t\t\tthis.dialogRef.close( null );\n\t}\n\t\n\topenDialog( item: XiriButton ) {\n\t\t\n\t\tconst data = {\n\t\t\ttype: 'load',\n\t\t\turl: item.url,\n\t\t};\n\t\t\n\t\tthis.dialogRef = this.dialog.open( XiriDialogComponent, {\n\t\t\tdata: data,\n\t\t} );\n\t\t\n\t\tthis.dialogRef.afterClosed().subscribe( ( result: { page?: string; refresh?: string } | null ) => {\n\t\t\tif ( !result )\n\t\t\t\treturn;\n\t\t\tif ( result.page == 'refresh' || result.refresh == 'page' )\n\t\t\t\tthis.router.navigate( [ this.router.url ] ).then();\n\t\t} );\n\t\t\n\t\treturn true;\n\t}\n\t\n}\n","@if (compact()) {\n\t<div class=\"card xiri-links-flat\">\n\t\t@if (settings().header || settings().headerIcon) {\n\t\t\t<div class=\"xiri-links-header\">\n\t\t\t\t@if (settings().headerIcon) {\n\t\t\t\t\t<div class=\"header-image\">\n\t\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<div class=\"header-text\">\n\t\t\t\t\t@if (settings().header) {\n\t\t\t\t\t\t<div class=\"header-title\">{{ settings().header }}</div>\n\t\t\t\t\t}\n\t\t\t\t\t@if (settings().headerSub) {\n\t\t\t\t\t\t<div class=\"header-sub\">{{ settings().headerSub }}</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t}\n\t\t<ng-container *ngTemplateOutlet=\"linkList\"></ng-container>\n\t</div>\n} @else {\n\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<mat-card-header>\n\t\t\t@if (settings().headerIcon) {\n\t\t\t\t<div mat-card-avatar class=\"header-image\">\n\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@if (settings().headerSub) {\n\t\t\t\t<mat-card-subtitle>{{ settings().headerSub }}</mat-card-subtitle>\n\t\t\t}\n\t\t\t@if (settings().header) {\n\t\t\t\t<mat-card-title>{{ settings().header }}</mat-card-title>\n\t\t\t}\n\t\t</mat-card-header>\n\t\t<mat-card-content>\n\t\t\t<ng-container *ngTemplateOutlet=\"linkList\"></ng-container>\n\t\t</mat-card-content>\n\t</mat-card>\n}\n\n<ng-template #linkList>\n\t<mat-nav-list>\n\t\t@for (item of settings().data; track item) {\n\t\t\t@if (!item.hide && (!item.action || item.action === 'link')) {\n\t\t\t\t@let itemUrl = item.url | xiriUrl;\n\t\t\t\t<a mat-list-item [routerLink]=\"itemUrl?.path\" [queryParams]=\"itemUrl?.queryParams\">\n\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t<mat-icon matListItemIcon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t<span matListItemTitle>{{ item.text }}</span>\n\t\t\t\t</a>\n\t\t\t} @else if (!item.hide && item.action === 'dialog') {\n\t\t\t\t<mat-list-item (click)=\"openDialog( item ) && $event.stopPropagation()\" (keydown.enter)=\"openDialog( item )\" (keydown.space)=\"openDialog( item ); $event.preventDefault()\">\n\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t<mat-icon matListItemIcon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t<span matListItemTitle>{{ item.text }}</span>\n\t\t\t\t</mat-list-item>\n\t\t\t}\n\t\t}\n\t</mat-nav-list>\n</ng-template>\n","import { Component, computed, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatRipple } from '@angular/material/core';\nimport { MatCard, MatCardHeader, MatCardAvatar, MatCardTitle, MatCardSubtitle } from '@angular/material/card';\nimport { RouterLink } from '@angular/router';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\n\nexport interface XiriCardlinkSettings {\n\tlink: string\n\ticon?: string\n\ticonSet: string\n\ttext?: string\n\tsub?: string\n\tcompact?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-cardlink',\n\t templateUrl: './cardlink.component.html',\n\t styleUrls: [ './cardlink.component.scss' ],\n\t imports: [ RouterLink,\n\t MatCard,\n\t MatRipple,\n\t MatCardHeader,\n\t MatCardAvatar,\n\t MatIcon,\n\t MatCardTitle,\n\t MatCardSubtitle,\n\t XiriUrlPipe ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriCardlinkComponent {\n\n\tsettings = input.required<XiriCardlinkSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n}\n","@let cardUrl = settings().link | xiriUrl;\n<a [routerLink]=\"cardUrl?.path\" [queryParams]=\"cardUrl?.queryParams\">\n\t@if (compact()) {\n\t\t<div class=\"card xiri-cardlink-flat\" matRipple>\n\t\t\t<mat-card-header>\n\t\t\t\t@if (settings().icon) {\n\t\t\t\t\t<div mat-card-avatar>\n\t\t\t\t\t\t<mat-icon [fontSet]=\"settings().iconSet\">{{ settings().icon }}</mat-icon>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (settings().text) {\n\t\t\t\t\t<mat-card-title>{{ settings().text }}</mat-card-title>\n\t\t\t\t}\n\t\t\t\t@if (settings().sub) {\n\t\t\t\t\t<mat-card-subtitle>{{ settings().sub }}</mat-card-subtitle>\n\t\t\t\t}\n\t\t\t</mat-card-header>\n\t\t</div>\n\t} @else {\n\t\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\" matRipple>\n\t\t\t<mat-card-header>\n\t\t\t\t@if (settings().icon) {\n\t\t\t\t\t<div mat-card-avatar>\n\t\t\t\t\t\t<mat-icon [fontSet]=\"settings().iconSet\">{{ settings().icon }}</mat-icon>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (settings().text) {\n\t\t\t\t\t<mat-card-title>{{ settings().text }}</mat-card-title>\n\t\t\t\t}\n\t\t\t\t@if (settings().sub) {\n\t\t\t\t\t<mat-card-subtitle>{{ settings().sub }}</mat-card-subtitle>\n\t\t\t\t}\n\t\t\t</mat-card-header>\n\t\t</mat-card>\n\t}\n</a>\n","import { Component, computed, input } from '@angular/core';\n\nexport type XiriSkeletonType = 'text' | 'circle' | 'rect' | 'table-row';\n\n@Component( {\n\t selector: 'xiri-skeleton',\n\t templateUrl: './skeleton.component.html',\n\t styleUrl: './skeleton.component.scss',\n\t host: { 'role': 'status', 'aria-label': 'Laden...', '[class.fill]': 'fill()' }\n } )\nexport class XiriSkeletonComponent {\n\n\ttype = input<XiriSkeletonType>( 'text' );\n\twidth = input<string>( '100%' );\n\theight = input<string>( '1em' );\n\tlines = input<number>( 1 );\n\tcolumns = input<number>( 4 );\n\tanimate = input<boolean>( true );\n\tfill = input<boolean>( false );\n\n\tlinesArray = computed( () => Array.from( { length: this.lines() } ) );\n\tcolumnsArray = computed( () => Array.from( { length: this.columns() } ) );\n}\n","@switch (type()) {\n\t@case ('text') {\n\t\t<div class=\"skeleton-text\">\n\t\t\t@for (_ of linesArray(); track $index) {\n\t\t\t\t<div class=\"skeleton-line\" [class.animate]=\"animate()\"\n\t\t\t\t [style.width]=\"$last ? '60%' : width()\"\n\t\t\t\t [style.height]=\"height()\"></div>\n\t\t\t}\n\t\t</div>\n\t}\n\t@case ('circle') {\n\t\t<div class=\"skeleton-circle\" [class.animate]=\"animate()\"\n\t\t [style.width]=\"width()\"\n\t\t [style.height]=\"width()\"></div>\n\t}\n\t@case ('rect') {\n\t\t<div class=\"skeleton-rect\" [class.animate]=\"animate()\"\n\t\t [style.width]=\"width()\"\n\t\t [style.height]=\"height()\"></div>\n\t}\n\t@case ('table-row') {\n\t\t<div class=\"skeleton-table\" [class.fill-height]=\"fill()\">\n\t\t\t@for (_ of linesArray(); track $index) {\n\t\t\t\t<div class=\"skeleton-table-row\">\n\t\t\t\t\t@for (_ of columnsArray(); track $index) {\n\t\t\t\t\t\t<div class=\"skeleton-table-cell\">\n\t\t\t\t\t\t\t<div class=\"skeleton-line\" [class.animate]=\"animate()\"></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t}\n}\n","import { Component, computed, forwardRef, inject, input, linkedSignal, Signal } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { XiriButtonlineSettings, XiriButtonlineComponent } from \"../buttonline/buttonline.component\";\nimport { XiriColor } from '../types/color.type';\nimport { XiriRawTableSettings, XiriRawTableComponent } from \"../raw-table/xiri-raw-table.component\";\nimport { XiriTableField } from \"../raw-table/tabefield.interface\";\nimport { XiriDataService } from '../services/data.service';\nimport { XiriSkeletonComponent } from '../skeleton/skeleton.component';\nimport { XiriDynData } from '../dyncomponent/dyndata.interface';\nimport { XiriDynComponentComponent } from '../dyncomponent/dyncomponent.component';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport {\n\tMatCard,\n\tMatCardHeader,\n\tMatCardAvatar,\n\tMatCardTitle,\n\tMatCardSubtitle,\n\tMatCardContent,\n\tMatCardActions\n} from '@angular/material/card';\n\nexport interface XiriCardSettings {\n\turl?: string\n\treload?: boolean\n\tdata?: unknown\n\tfields?: XiriTableField[]\n\tcomponents?: XiriDynData[]\n\theader?: string\n\theaderSub?: string\n\theaderIcon?: string\n\theaderIconColor?: XiriColor\n\tbuttonsTop?: XiriButtonlineSettings\n\tbuttonsBottom?: XiriButtonlineSettings\n\tdense?: number\n\tforceMinWidth?: boolean\n\tshowHeader?: boolean\n\tcollapsible?: boolean\n\tcollapsed?: boolean\n\tmaxHeight?: string\n\tpadding?: string // Token 'xs'|'sm'|'md'|'lg'|'xl' oder freier CSS-Wert ('16px', '1rem', 'var(--…)').\n\t // Wirkt nur im Multi-Component-Modus (settings.components).\n\t // Auf xs-Viewport (<576px) immer 8px.\n}\n\n@Component( {\n\t selector: 'xiri-card',\n\t templateUrl: './card.component.html',\n\t styleUrl: './card.component.scss',\n\t imports: [ MatCard,\n\t MatCardHeader,\n\t MatCardAvatar,\n\t MatIcon,\n\t MatIconButton,\n\t MatCardTitle,\n\t MatCardSubtitle,\n\t XiriButtonlineComponent,\n\t MatCardContent,\n\t XiriRawTableComponent,\n\t XiriSkeletonComponent,\n\t MatCardActions,\n\t forwardRef( () => XiriDynComponentComponent ) ],\n } )\nexport class XiriCardComponent {\n\n\tprivate dataService = inject( XiriDataService );\n\n\tsettings = input.required<XiriCardSettings>();\n\n\tisCollapsed = linkedSignal<boolean | undefined, boolean>( {\n\t\tsource: () => this.settings().collapsed,\n\t\tcomputation: ( collapsed, previous ) => collapsed ?? previous?.value ?? false,\n\t} );\n\n\tprivate cardResource = rxResource( {\n\t\tparams: () => this.settings().url,\n\t\tstream: ( { params } ) => this.dataService.post( params, null ),\n\t} );\n\n\tloading = this.cardResource.isLoading;\n\n\terrorMsg = computed( () => {\n\t\tconst e = this.cardResource.error() as { cause?: unknown } | undefined;\n\t\tif ( !e ) return '';\n\t\tconst http = ( e.cause ?? e ) as { error?: { error?: string } };\n\t\treturn http.error?.error || 'Fehler beim Laden';\n\t} );\n\n\tprivate _loaded = computed( () => {\n\t\tconst res = this.cardResource.value();\n\t\tif ( res == null ) return res;\n\t\treturn ( res as { data?: unknown } ).data ?? res;\n\t} );\n\n\tcardData = computed( () => this._loaded() ?? this.settings().data );\n\n\thasComponents = computed( () => ( this.settings().components?.length ?? 0 ) > 0 );\n\n\t/** Resolves padding setting (token or free CSS value) into a CSS length string. */\n\tcomponentsPadding = computed<string>( () => {\n\t\tconst v = this.settings().padding;\n\t\tif ( !v ) return 'var(--xiri-spacing-md, 16px)';\n\t\tswitch ( v ) {\n\t\t\tcase 'xs': return 'var(--xiri-spacing-xs, 4px)';\n\t\t\tcase 'sm': return 'var(--xiri-spacing-sm, 8px)';\n\t\t\tcase 'md': return 'var(--xiri-spacing-md, 16px)';\n\t\t\tcase 'lg': return 'var(--xiri-spacing-lg, 24px)';\n\t\t\tcase 'xl': return 'var(--xiri-spacing-xl, 32px)';\n\t\t\tdefault: return v; // freier CSS-Wert\n\t\t}\n\t} );\n\n\trawTable: Signal<XiriRawTableSettings | null> = computed( () => {\n\n\t\tconst data = this.cardData();\n\t\tif ( data == null ) return null;\n\n\t\tconst rt: XiriRawTableSettings = {\n\t\t\tdata: data,\n\t\t\tfields: this.settings().fields,\n\t\t\tdense: this.settings().dense,\n\t\t\tforceMinWidth: this.settings().forceMinWidth,\n\t\t\tshowHeader: this.settings().showHeader,\n\t\t};\n\n\t\tif ( !this.settings().fields && ( data as { length?: number } ).length !== 0 ) {\n\n\t\t\tconst fields: XiriTableField[] = [];\n\t\t\tif ( Array.isArray( data ) ) {\n\t\t\t\tfields.push( {\n\t\t\t\t\t id: '0',\n\t\t\t\t\t name: '0',\n\t\t\t\t\t format: 'text',\n\t\t\t\t\t display: 'info',\n\t\t\t\t\t minWidth: '30px',\n\t\t\t\t } );\n\t\t\t\tfields.push( {\n\t\t\t\t\t id: '1',\n\t\t\t\t\t name: '1',\n\t\t\t\t\t format: 'html',\n\t\t\t\t\t display: 'right',\n\t\t\t\t\t minWidth: '30px',\n\t\t\t\t } );\n\t\t\t} else {\n\n\t\t\t\tfields.push( {\n\t\t\t\t\t id: 'f0',\n\t\t\t\t\t name: 'f0',\n\t\t\t\t\t format: 'text',\n\t\t\t\t\t display: 'info',\n\t\t\t\t\t minWidth: '30px',\n\t\t\t\t } );\n\t\t\t\tfields.push( {\n\t\t\t\t\t id: 'f1',\n\t\t\t\t\t name: 'f1',\n\t\t\t\t\t format: 'html',\n\t\t\t\t\t display: 'right',\n\t\t\t\t\t minWidth: '30px',\n\t\t\t\t } );\n\n\t\t\t\tconst transformedData = [];\n\t\t\t\tconst record = data as Record<string, unknown>;\n\t\t\t\tfor ( const key in record ) {\n\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( record, key ) ) {\n\t\t\t\t\t\ttransformedData.push( {\n\t\t\t\t\t\t\t 'f0': key,\n\t\t\t\t\t\t\t 'f1': record[ key ],\n\t\t\t\t\t\t } );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trt.data = transformedData;\n\t\t\t}\n\n\t\t\trt.fields = fields;\n\t\t}\n\n\t\treturn rt;\n\t} );\n\n\ttoggleCollapse(): void {\n\t\tthis.isCollapsed.update( v => !v );\n\t}\n\n\treload() {\n\t\tif ( this.loading() ) return;\n\t\tthis.cardResource.reload();\n\t}\n\n}\n","<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t<mat-card-header>\n\t\t@if (settings().headerIcon) {\n\t\t\t<div mat-card-avatar class=\"header-image\">\n\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t</div>\n\t\t}\n\t\t@if (settings().header) {\n\t\t\t<mat-card-title [class]=\"{hasHeaderSub: settings().headerSub}\">{{ settings().header }}</mat-card-title>\n\t\t}\n\t\t@if (settings().headerSub) {\n\t\t\t<mat-card-subtitle>{{ settings().headerSub }}</mat-card-subtitle>\n\t\t}\n\t\t@if (settings().buttonsTop) {\n\t\t\t<xiri-buttonline [settings]=\"settings().buttonsTop!\"></xiri-buttonline>\n\t\t}\n\t\t@if (settings().collapsible) {\n\t\t\t<button mat-icon-button (click)=\"toggleCollapse()\" class=\"collapse-btn\" aria-label=\"Auf-/Zuklappen\">\n\t\t\t\t<mat-icon>{{ isCollapsed() ? 'expand_more' : 'expand_less' }}</mat-icon>\n\t\t\t</button>\n\t\t}\n\t\t@if (settings().reload && settings().url) {\n\t\t\t<button mat-icon-button (click)=\"reload()\" [disabled]=\"loading()\" class=\"reload-btn\" aria-label=\"Neu laden\">\n\t\t\t\t<mat-icon [class.spinning]=\"loading()\">autorenew</mat-icon>\n\t\t\t</button>\n\t\t}\n\t</mat-card-header>\n\t<div class=\"collapse-wrapper\" [class.collapsed]=\"isCollapsed()\">\n\t\t<div class=\"collapse-inner\">\n\t\t\t@if (loading() && !cardData()) {\n\t\t\t\t<mat-card-content>\n\t\t\t\t\t<xiri-skeleton type=\"table-row\" [columns]=\"2\" [lines]=\"3\"></xiri-skeleton>\n\t\t\t\t</mat-card-content>\n\t\t\t} @else if (errorMsg()) {\n\t\t\t\t<mat-card-content>\n\t\t\t\t\t<div class=\"load-error\">{{ errorMsg() }}</div>\n\t\t\t\t</mat-card-content>\n\t\t\t} @else if (hasComponents()) {\n\t\t\t\t<mat-card-content class=\"hasComponents\" [style.--xiri-card-padding]=\"componentsPadding()\">\n\t\t\t\t\t<xiri-dyncomponent [data]=\"settings().components!\" class=\"xrow\"></xiri-dyncomponent>\n\t\t\t\t</mat-card-content>\n\t\t\t} @else {\n\t\t\t\t<mat-card-content class=\"hasTable\" [style.max-height]=\"settings().maxHeight || '50vh'\">\n\t\t\t\t\t@if (rawTable()) {\n\t\t\t\t\t\t<xiri-raw-table [settings]=\"rawTable()!\"></xiri-raw-table>\n\t\t\t\t\t}\n\t\t\t\t</mat-card-content>\n\t\t\t}\n\t\t\t@if (settings().buttonsBottom) {\n\t\t\t\t<mat-card-actions align=\"end\">\n\t\t\t\t\t<xiri-buttonline [settings]=\"settings().buttonsBottom!\"></xiri-buttonline>\n\t\t\t\t</mat-card-actions>\n\t\t\t}\n\t\t</div>\n\t</div>\n</mat-card>\n","import { Component, effect, input, signal, TemplateRef } from '@angular/core';\nimport { MatTabGroup, MatTab, MatTabLabel } from '@angular/material/tabs';\nimport { MatIcon } from '@angular/material/icon';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { XiriDynData } from '../dyncomponent/dyndata.interface';\n\nexport interface XiriTabSettings {\n\tlabel: string\n\ticon?: string\n\tdisabled?: boolean\n\tdata: XiriDynData[]\n\tlazy?: boolean\n\tunload?: boolean\n}\n\nexport interface XiriTabsSettings {\n\ttabs: XiriTabSettings[]\n\tselectedIndex?: number\n\tdynamicHeight?: boolean\n\tanimationDuration?: string\n\tlazy?: boolean\n\tunload?: boolean\n\theaderPosition?: 'above' | 'below'\n\talignTabs?: 'start' | 'center' | 'end'\n\tstretchTabs?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-tabs',\n\t templateUrl: './tabs.component.html',\n\t styleUrl: './tabs.component.scss',\n\t imports: [\n\t\t MatTabGroup,\n\t\t MatTab,\n\t\t MatTabLabel,\n\t\t MatIcon,\n\t\t NgTemplateOutlet\n\t ]\n } )\nexport class XiriTabsComponent {\n\t\n\tsettings = input.required<XiriTabsSettings>();\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\tdyncomponent = input<TemplateRef<unknown>>();\n\t\n\tselectedIndex = signal( 0 );\n\tvisitedTabs = signal<Set<number>>( new Set( [ 0 ] ) );\n\t\n\tconstructor() {\n\t\teffect( () => {\n\t\t\tconst idx = this.settings().selectedIndex ?? 0;\n\t\t\tthis.selectedIndex.set( idx );\n\t\t\tthis.visitedTabs.update( set => {\n\t\t\t\tconst newSet = new Set( set );\n\t\t\t\tnewSet.add( idx );\n\t\t\t\treturn newSet;\n\t\t\t} );\n\t\t} );\n\t}\n\t\n\tonTabChange( index: number ): void {\n\t\tthis.selectedIndex.set( index );\n\t\tthis.visitedTabs.update( set => {\n\t\t\tconst newSet = new Set( set );\n\t\t\tnewSet.add( index );\n\t\t\treturn newSet;\n\t\t} );\n\t}\n\t\n\tshouldRenderContent( index: number, tab: XiriTabSettings ): boolean {\n\t\tconst globalUnload = this.settings().unload ?? false;\n\t\tconst tabUnload = tab.unload ?? globalUnload;\n\n\t\tif ( tabUnload )\n\t\t\treturn this.selectedIndex() === index;\n\n\t\tconst globalLazy = this.settings().lazy ?? false;\n\t\tconst tabLazy = tab.lazy ?? globalLazy;\n\n\t\tif ( !tabLazy ) return true;\n\t\treturn this.visitedTabs().has( index );\n\t}\n}\n","<mat-tab-group\n\t[selectedIndex]=\"selectedIndex()\"\n\t[dynamicHeight]=\"settings().dynamicHeight ?? false\"\n\t[animationDuration]=\"settings().animationDuration ?? '225ms'\"\n\t[headerPosition]=\"settings().headerPosition ?? 'above'\"\n\t[mat-align-tabs]=\"settings().alignTabs ?? 'start'\"\n\t[mat-stretch-tabs]=\"settings().stretchTabs ?? false\"\n\t(selectedIndexChange)=\"onTabChange($event)\">\n\n\t@for (tab of settings().tabs; track tab.label; let i = $index) {\n\t\t<mat-tab [disabled]=\"tab.disabled ?? false\">\n\t\t\t<ng-template mat-tab-label>\n\t\t\t\t@if (tab.icon) {\n\t\t\t\t\t<mat-icon>{{ tab.icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t{{ tab.label }}\n\t\t\t</ng-template>\n\n\t\t\t@if (shouldRenderContent(i, tab)) {\n\t\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent(); context: { $implicit: { data: tab.data, filterData: filterData() } }\"></ng-container>\n\t\t\t}\n\t\t</mat-tab>\n\t}\n</mat-tab-group>\n","import { Component, input, signal, TemplateRef } from '@angular/core';\nimport { MatAccordion, MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle, MatExpansionPanelDescription } from '@angular/material/expansion';\nimport { MatIcon } from '@angular/material/icon';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { XiriDynData } from '../dyncomponent/dyndata.interface';\n\nexport interface XiriExpansionPanelSettings {\n\ttitle: string\n\tdescription?: string\n\ticon?: string\n\tdisabled?: boolean\n\texpanded?: boolean\n\tdata: XiriDynData[]\n\tlazy?: boolean\n\tunload?: boolean\n}\n\nexport interface XiriExpansionSettings {\n\tpanels: XiriExpansionPanelSettings[]\n\tmulti?: boolean\n\tdisplayMode?: 'default' | 'flat'\n\ttogglePosition?: 'before' | 'after'\n\thideToggle?: boolean\n\tlazy?: boolean\n\tunload?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-expansion',\n\t templateUrl: './expansion.component.html',\n\t styleUrl: './expansion.component.scss',\n\t imports: [\n\t\t MatAccordion,\n\t\t MatExpansionPanel,\n\t\t MatExpansionPanelHeader,\n\t\t MatExpansionPanelTitle,\n\t\t MatExpansionPanelDescription,\n\t\t MatIcon,\n\t\t NgTemplateOutlet\n\t ]\n } )\nexport class XiriExpansionComponent {\n\n\tsettings = input.required<XiriExpansionSettings>();\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\tdyncomponent = input<TemplateRef<unknown>>();\n\n\topenedPanels = signal<Set<number>>( new Set() );\n\tvisitedPanels = signal<Set<number>>( new Set() );\n\n\tonPanelOpened( index: number ): void {\n\t\tthis.openedPanels.update( set => {\n\t\t\tconst newSet = new Set( set );\n\t\t\tnewSet.add( index );\n\t\t\treturn newSet;\n\t\t} );\n\t\tthis.visitedPanels.update( set => {\n\t\t\tconst newSet = new Set( set );\n\t\t\tnewSet.add( index );\n\t\t\treturn newSet;\n\t\t} );\n\t}\n\n\tonPanelClosed( index: number ): void {\n\t\tthis.openedPanels.update( set => {\n\t\t\tconst newSet = new Set( set );\n\t\t\tnewSet.delete( index );\n\t\t\treturn newSet;\n\t\t} );\n\t}\n\n\tshouldRenderContent( index: number, panel: XiriExpansionPanelSettings ): boolean {\n\t\tconst globalUnload = this.settings().unload ?? false;\n\t\tconst panelUnload = panel.unload ?? globalUnload;\n\n\t\tif ( panelUnload )\n\t\t\treturn this.openedPanels().has( index );\n\n\t\tconst globalLazy = this.settings().lazy ?? false;\n\t\tconst panelLazy = panel.lazy ?? globalLazy;\n\n\t\tif ( !panelLazy ) return true;\n\t\treturn this.visitedPanels().has( index );\n\t}\n}\n","<mat-accordion\n\t[multi]=\"settings().multi ?? false\"\n\t[displayMode]=\"settings().displayMode ?? 'default'\"\n\t[hideToggle]=\"settings().hideToggle ?? false\"\n\t[togglePosition]=\"settings().togglePosition ?? 'after'\">\n\n\t@for (panel of settings().panels; track panel.title; let i = $index) {\n\t\t<mat-expansion-panel\n\t\t\t[disabled]=\"panel.disabled ?? false\"\n\t\t\t[expanded]=\"panel.expanded ?? false\"\n\t\t\t(opened)=\"onPanelOpened(i)\"\n\t\t\t(closed)=\"onPanelClosed(i)\">\n\n\t\t\t<mat-expansion-panel-header>\n\t\t\t\t@if (panel.icon) {\n\t\t\t\t\t<mat-icon>{{ panel.icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<mat-panel-title>{{ panel.title }}</mat-panel-title>\n\t\t\t\t@if (panel.description) {\n\t\t\t\t\t<mat-panel-description>{{ panel.description }}</mat-panel-description>\n\t\t\t\t}\n\t\t\t</mat-expansion-panel-header>\n\n\t\t\t@if (shouldRenderContent(i, panel)) {\n\t\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent(); context: { $implicit: { data: panel.data, filterData: filterData() } }\"></ng-container>\n\t\t\t}\n\t\t</mat-expansion-panel>\n\t}\n</mat-accordion>\n","import { Component, computed, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatCard, MatCardContent } from '@angular/material/card';\nimport { XiriColor } from '../types/color.type';\n\nexport interface XiriStatTrend {\n\tvalue: number\n\tdirection: 'up' | 'down' | 'neutral'\n}\n\nexport interface XiriStatSettings {\n\tvalue: string | number\n\tlabel: string\n\ticon?: string\n\ticonColor?: XiriColor\n\ttrend?: XiriStatTrend\n\tprefix?: string\n\tsuffix?: string\n\tcolor?: XiriColor\n\treference?: string\n\tcompact?: boolean\n\tlink?: string\n}\n\n@Component( {\n\t selector: 'xiri-stat',\n\t templateUrl: './stat.component.html',\n\t styleUrl: './stat.component.scss',\n\t imports: [ MatIcon, MatCard, MatCardContent, NgTemplateOutlet ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriStatComponent {\n\n\tsettings = input.required<XiriStatSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n}\n","@if (compact()) {\n\t<div class=\"stat-flat\">\n\t\t<ng-container *ngTemplateOutlet=\"statBody\"></ng-container>\n\t</div>\n} @else {\n\t<mat-card class=\"stat-card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<mat-card-content>\n\t\t\t<ng-container *ngTemplateOutlet=\"statBody\"></ng-container>\n\t\t</mat-card-content>\n\t</mat-card>\n}\n\n<ng-template #statBody>\n\t<div class=\"stat-content\">\n\t\t@if (settings().icon) {\n\t\t\t<div class=\"stat-icon\">\n\t\t\t\t<mat-icon [class]=\"settings().iconColor || 'primary'\">{{ settings().icon }}</mat-icon>\n\t\t\t</div>\n\t\t}\n\t\t<div class=\"stat-data\">\n\t\t\t<div class=\"stat-value\" [class]=\"settings().color || ''\">\n\t\t\t\t@if (settings().prefix) {\n\t\t\t\t\t<span class=\"prefix\">{{ settings().prefix }}</span>\n\t\t\t\t}\n\t\t\t\t{{ settings().value }}\n\t\t\t\t@if (settings().suffix) {\n\t\t\t\t\t<span class=\"suffix\">{{ settings().suffix }}</span>\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div class=\"stat-label\">{{ settings().label }}</div>\n\t\t\t@if (settings().reference; as reference) {\n\t\t\t\t<div class=\"stat-reference\">{{ reference }}</div>\n\t\t\t}\n\t\t</div>\n\t\t@if (settings().trend; as trend) {\n\t\t\t<div class=\"stat-trend\" [class]=\"trend.direction\">\n\t\t\t\t<mat-icon>\n\t\t\t\t\t@switch (trend.direction) {\n\t\t\t\t\t\t@case ('up') { trending_up }\n\t\t\t\t\t\t@case ('down') { trending_down }\n\t\t\t\t\t\t@default { trending_flat }\n\t\t\t\t\t}\n\t\t\t\t</mat-icon>\n\t\t\t\t<span>{{ trend.value > 0 ? '+' : '' }}{{ trend.value }}%</span>\n\t\t\t</div>\n\t\t}\n\t</div>\n</ng-template>\n","import { Component, forwardRef, input, signal, TemplateRef, OnInit } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatDivider } from '@angular/material/divider';\nimport { XiriButtonlineComponent, XiriButtonlineSettings } from '../buttonline/buttonline.component';\nimport { XiriDynComponentComponent } from '../dyncomponent/dyncomponent.component';\nimport { XiriDynData } from '../dyncomponent/dyndata.interface';\n\nexport interface XiriSectionSettings {\n\ttitle?: string\n\tsubtitle?: string\n\ticon?: string\n\ticonColor?: string\n\tcollapsible?: boolean\n\tcollapsed?: boolean\n\tbuttons?: XiriButtonlineSettings\n\tcomponents?: XiriDynData[]\n}\n\n@Component( {\n\t selector: 'xiri-section',\n\t templateUrl: './section.component.html',\n\t styleUrl: './section.component.scss',\n\t imports: [ MatIcon, MatDivider, XiriButtonlineComponent, forwardRef( () => XiriDynComponentComponent ) ]\n } )\nexport class XiriSectionComponent implements OnInit {\n\n\tsettings = input.required<XiriSectionSettings>();\n\tdyncomponent = input<TemplateRef<unknown>>();\n\n\tcollapsed = signal<boolean>( false );\n\n\tngOnInit() {\n\t\tif ( this.settings().collapsed ) {\n\t\t\tthis.collapsed.set( true );\n\t\t}\n\t}\n\n\ttoggle() {\n\t\tthis.collapsed.update( v => !v );\n\t}\n}\n","<section class=\"xiri-section\">\n\t@if (settings().title) {\n\t\t<div class=\"section-header\"\n\t\t [class.collapsible]=\"settings().collapsible\"\n\t\t [attr.role]=\"settings().collapsible ? 'button' : null\"\n\t\t [attr.tabindex]=\"settings().collapsible ? 0 : null\"\n\t\t (click)=\"settings().collapsible && toggle()\"\n\t\t (keydown.enter)=\"settings().collapsible && toggle()\"\n\t\t (keydown.space)=\"settings().collapsible && toggle(); settings().collapsible && $event.preventDefault()\">\n\t\t\t<div class=\"section-header-left\">\n\t\t\t\t@if (settings().icon) {\n\t\t\t\t\t<mat-icon [class]=\"settings().iconColor || ''\">{{ settings().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<div>\n\t\t\t\t\t<h2>{{ settings().title }}</h2>\n\t\t\t\t\t@if (settings().subtitle) {\n\t\t\t\t\t\t<span class=\"section-subtitle\">{{ settings().subtitle }}</span>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"section-header-right\">\n\t\t\t\t@if (settings().buttons) {\n\t\t\t\t\t<xiri-buttonline [settings]=\"settings().buttons!\"></xiri-buttonline>\n\t\t\t\t}\n\t\t\t\t@if (settings().collapsible) {\n\t\t\t\t\t<mat-icon class=\"collapse-icon\" [class.collapsed]=\"collapsed()\">expand_more</mat-icon>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t\t<mat-divider></mat-divider>\n\t}\n\t<div class=\"collapse-wrapper\" [class.collapsed]=\"collapsed()\">\n\t\t<div class=\"collapse-inner\">\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<ng-content></ng-content>\n\t\t\t\t@if (settings().components) {\n\t\t\t\t\t<xiri-dyncomponent [data]=\"settings().components!\" [dyncomponent]=\"dyncomponent()\" class=\"xrow\"></xiri-dyncomponent>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</section>\n","import { Component, computed, inject, input } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatCard, MatCardContent } from '@angular/material/card';\nimport { XiriStatSettings } from '../stat/stat.component';\nimport { XiriColor } from '../types/color.type';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\nimport { XiriDataService } from '../services/data.service';\nimport { XiriSkeletonComponent } from '../skeleton/skeleton.component';\n\nexport interface XiriMultiStatSettings {\n\ttitle?: string\n\ticon?: string\n\ticonColor?: XiriColor\n\titems?: XiriStatSettings[]\n\turl?: string\n\treload?: boolean\n\tverticalItems?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-multi-stat',\n\t templateUrl: './multi-stat.component.html',\n\t styleUrl: './multi-stat.component.scss',\n\t imports: [ MatIcon, MatIconButton, MatCard, MatCardContent, RouterLink, NgTemplateOutlet, XiriUrlPipe, XiriSkeletonComponent ]\n } )\nexport class XiriMultiStatComponent {\n\n\tprivate dataService = inject( XiriDataService );\n\n\tsettings = input.required<XiriMultiStatSettings>();\n\n\t// AJAX-Modus: lädt die Items von settings().url (Card-Muster). Bleibt idle,\n\t// solange keine url gesetzt ist (rxResource ruft stream nur bei definierten params).\n\tprivate resource = rxResource( {\n\t\tparams: () => this.settings().url,\n\t\tstream: ( { params } ) => this.dataService.post( params, null ),\n\t} );\n\n\tloading = this.resource.isLoading;\n\n\terrorMsg = computed<string>( () => {\n\t\tconst e = this.resource.error() as { cause?: unknown } | undefined;\n\t\tif ( !e ) return '';\n\t\tconst http = ( e.cause ?? e ) as { error?: { error?: string } };\n\t\treturn http.error?.error || 'Fehler beim Laden';\n\t} );\n\n\t// Antwort auspacken ({ data: ... } → data), sonst inline settings.items.\n\tprivate loaded = computed<XiriMultiStatSettings | null | undefined>( () => {\n\t\tconst res = this.resource.value();\n\t\tif ( res == null ) return res;\n\t\treturn ( ( res as { data?: unknown } ).data ?? res ) as XiriMultiStatSettings;\n\t} );\n\n\titems = computed<XiriStatSettings[]>( () => this.loaded()?.items ?? this.settings().items ?? [] );\n\n\treload(): void {\n\t\tif ( this.loading() ) return;\n\t\tthis.resource.reload();\n\t}\n}\n","<mat-card class=\"multi-stat-card mat-mdc-elevation-specific mat-elevation-z2\">\n\t<mat-card-content>\n\t\t@if (settings().title || settings().icon || (settings().reload && settings().url)) {\n\t\t\t<div class=\"multi-stat-header\">\n\t\t\t\t@if (settings().icon) {\n\t\t\t\t\t<mat-icon [class]=\"settings().iconColor || 'primary'\">{{ settings().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t@if (settings().title) {\n\t\t\t\t\t<h3 class=\"multi-stat-title\">{{ settings().title }}</h3>\n\t\t\t\t}\n\t\t\t\t@if (settings().reload && settings().url) {\n\t\t\t\t\t<button mat-icon-button (click)=\"reload()\" [disabled]=\"loading()\" class=\"reload-btn\" aria-label=\"Neu laden\">\n\t\t\t\t\t\t<mat-icon [class.spinning]=\"loading()\">autorenew</mat-icon>\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\n\t\t@if (loading() && !items().length) {\n\t\t\t<xiri-skeleton type=\"rect\" height=\"72px\"></xiri-skeleton>\n\t\t} @else if (errorMsg()) {\n\t\t\t<div class=\"load-error\">{{ errorMsg() }}</div>\n\t\t} @else {\n\t\t\t<div class=\"multi-stat-items\" [class.vertical]=\"settings().verticalItems\">\n\t\t\t\t@for (item of items(); track $index) {\n\t\t\t\t\t<div class=\"multi-stat-item\">\n\t\t\t\t\t\t@if (item.link) {\n\t\t\t\t\t\t\t@let itemUrl = item.link | xiriUrl;\n\t\t\t\t\t\t\t<a class=\"multi-stat-link\" [routerLink]=\"itemUrl?.path\" [queryParams]=\"itemUrl?.queryParams\">\n\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"itemBody; context: { $implicit: item }\"></ng-container>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"itemBody; context: { $implicit: item }\"></ng-container>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t</mat-card-content>\n</mat-card>\n\n<ng-template #itemBody let-item>\n\t@if (item.icon) {\n\t\t<div class=\"stat-icon\">\n\t\t\t<mat-icon [class]=\"item.iconColor || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t</div>\n\t}\n\t<div class=\"stat-data\">\n\t\t<div class=\"stat-value\" [class]=\"item.color || ''\">\n\t\t\t@if (item.prefix) {\n\t\t\t\t<span class=\"prefix\">{{ item.prefix }}</span>\n\t\t\t}\n\t\t\t{{ item.value }}\n\t\t\t@if (item.suffix) {\n\t\t\t\t<span class=\"suffix\">{{ item.suffix }}</span>\n\t\t\t}\n\t\t</div>\n\t\t<div class=\"stat-label\">{{ item.label }}</div>\n\t</div>\n\t@if (item.trend; as trend) {\n\t\t<!-- Trend als Geschwister von .stat-data: horizontal daneben, vertikal darunter.\n\t\t ponytail: Trend-Mapping dupliziert stat.component.html; teilen wenn ein 3. Nutzer kommt -->\n\t\t<div class=\"stat-trend\" [class]=\"trend.direction\">\n\t\t\t<mat-icon>\n\t\t\t\t@switch (trend.direction) {\n\t\t\t\t\t@case ('up') { trending_up }\n\t\t\t\t\t@case ('down') { trending_down }\n\t\t\t\t\t@default { trending_flat }\n\t\t\t\t}\n\t\t\t</mat-icon>\n\t\t\t<span>{{ trend.value > 0 ? '+' : '' }}{{ trend.value }}%</span>\n\t\t</div>\n\t}\n</ng-template>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\n\n// Farbstufe des Status. Trägt nie allein die Bedeutung — das Label ist immer sichtbar.\nexport type XiriStatusTone = 'neutral' | 'info' | 'success' | 'warning' | 'error';\n\n// Darstellungsform: gefüllte Pille, farbiger Punkt neben dem Label oder reiner Text.\nexport type XiriStatusVariant = 'badge' | 'dot' | 'text';\n\nexport interface XiriStatusSettings {\n\tlabel: string // immer sichtbar, nie nur über Farbe transportiert\n\ttone?: XiriStatusTone // default 'neutral'\n\tvariant?: XiriStatusVariant // default 'badge'\n\ticon?: string // Material-Icon-Name, optional und rein redundant zum Label\n\thint?: string // optionaler Tooltip/Zusatz\n\tariaLabel?: string // überschreibt den zugänglichen Namen\n}\n\n@Component( {\n\t selector: 'xiri-status',\n\t templateUrl: './status.component.html',\n\t styleUrl: './status.component.scss',\n\t changeDetection: ChangeDetectionStrategy.OnPush,\n\t imports: [ MatIcon ],\n\t host: {\n\t\t '[class]': 'hostClass()',\n\t\t '[attr.role]': \"'status'\",\n\t\t '[attr.aria-label]': 'settings().ariaLabel ?? null',\n\t\t '[attr.title]': 'settings().hint ?? null'\n\t }\n } )\nexport class XiriStatusComponent {\n\n\tsettings = input.required<XiriStatusSettings>();\n\n\ttone = computed<XiriStatusTone>( () => this.settings().tone ?? 'neutral' );\n\tvariant = computed<XiriStatusVariant>( () => this.settings().variant ?? 'badge' );\n\n\t// Tone und Variant werden als Host-Klassen abgebildet; das SCSS mappt sie auf Tokens.\n\thostClass = computed<string>( () => `xiri-status tone-${ this.tone() } variant-${ this.variant() }` );\n}\n","@if (variant() === 'dot') {\n\t<span class=\"status-dot\" aria-hidden=\"true\"></span>\n}\n@if (settings().icon; as icon) {\n\t<mat-icon class=\"status-icon\" aria-hidden=\"true\">{{ icon }}</mat-icon>\n}\n<span class=\"status-label\">{{ settings().label }}</span>\n","import { ChangeDetectionStrategy, Component, computed, input, output, signal } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { XiriButton, XiriButtonComponent, XiriButtonResult } from '../button/button.component';\n\nexport type XiriCalloutTone = 'info' | 'success' | 'warning' | 'error';\n\nexport interface XiriCalloutSettings {\n\ttone: XiriCalloutTone\n\ttext: string\n\n\ttitle?: string\n\ticon?: string\n\tactions?: XiriButton[]\n\tdismissible?: boolean\n\tcompact?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-callout',\n\t templateUrl: './callout.component.html',\n\t styleUrl: './callout.component.scss',\n\t changeDetection: ChangeDetectionStrategy.OnPush,\n\t imports: [ MatIcon, MatIconButton, XiriButtonComponent ]\n\t } )\nexport class XiriCalloutComponent {\n\n\tsettings = input.required<XiriCalloutSettings>();\n\tbuttonResult = output<XiriButtonResult>();\n\n\t// Dismiss ist rein lokaler Component-State — der Hinweis verschwindet nur clientseitig.\n\tdismissed = signal<boolean>( false );\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\t// Nur ein dynamisch als Fehler eingesetzter Hinweis ist eine aggressive Live-Region.\n\t// Statische Hinweise sind ein semantisches \"note\" ohne Live-Ansage.\n\trole = computed<string>( () => this.settings().tone === 'error' ? 'alert' : 'note' );\n\n\tdismiss(): void {\n\t\tthis.dismissed.set( true );\n\t}\n}\n","@if (!dismissed()) {\n\t<div class=\"callout\" [class]=\"'tone-' + settings().tone\" [class.compact]=\"compact()\" [attr.role]=\"role()\">\n\t\t@if (settings().icon) {\n\t\t\t<div class=\"icon\">\n\t\t\t\t<mat-icon>{{ settings().icon }}</mat-icon>\n\t\t\t</div>\n\t\t}\n\t\t<div class=\"body\">\n\t\t\t@if (settings().title) {\n\t\t\t\t<div class=\"title\">{{ settings().title }}</div>\n\t\t\t}\n\t\t\t<div class=\"text\">{{ settings().text }}</div>\n\t\t\t@if (settings().actions?.length) {\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t@for (button of settings().actions!; track button) {\n\t\t\t\t\t\t<xiri-button [button]=\"button\" (result)=\"buttonResult.emit( $event )\"></xiri-button>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t\t@if (settings().dismissible) {\n\t\t\t<button mat-icon-button class=\"dismiss\" (click)=\"dismiss()\" aria-label=\"Hinweis schließen\">\n\t\t\t\t<mat-icon>close</mat-icon>\n\t\t\t</button>\n\t\t}\n\t</div>\n}\n","import { Component, computed, forwardRef, input, TemplateRef } from '@angular/core';\nimport { XiriDynData } from \"./dyndata.interface\";\nimport { colsToClasses } from '../layout/cols.directive';\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\nimport { XiriImagetextComponent } from '../imagetext/imagetext.component';\nimport { XiriMultiprogressComponent } from '../multiprogress/multiprogress.component';\nimport { XiriProgressComponent } from '../progress/progress.component';\nimport { XiriInfopointComponent } from '../infopoint/infopoint.component';\nimport { XiriListComponent } from '../list/list.component';\nimport { XiriHeaderComponent } from '../header/header.component';\nimport { XiriStepperComponent } from '../stepper/stepper.component';\nimport { XiriQueryComponent } from '../query/query.component';\nimport { XiriFormComponent } from '../form/form.component';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MatCard, MatCardContent, MatCardHeader, MatCardTitle } from '@angular/material/card';\nimport { XiriLinksComponent } from '../links/links.component';\nimport { XiriCardlinkComponent } from '../cardlink/cardlink.component';\nimport { XiriTableComponent } from '../table/table.component';\nimport { XiriButtonlineComponent } from '../buttonline/buttonline.component';\nimport { XiriCardComponent } from '../card/card.component';\nimport { XiriTabsComponent } from '../tabs/tabs.component';\nimport { XiriExpansionComponent } from '../expansion/expansion.component';\nimport { XiriStatComponent } from '../stat/stat.component';\nimport { XiriEmptyStateComponent } from '../empty-state/empty-state.component';\nimport { XiriTimelineComponent } from '../timeline/timeline.component';\nimport { XiriPageHeaderComponent } from '../page-header/page-header.component';\nimport { XiriSectionComponent } from '../section/section.component';\nimport { XiriDividerComponent } from '../divider/divider.component';\nimport { XiriStatGridComponent } from '../stat-grid/stat-grid.component';\nimport { XiriMultiStatComponent } from '../multi-stat/multi-stat.component';\nimport { XiriToolbarComponent } from '../toolbar/toolbar.component';\nimport { XiriDescriptionListComponent } from '../description-list/description-list.component';\nimport { XiriBarChartComponent } from '../barchart/barchart.component';\nimport { XiriLineChartComponent } from '../linechart/linechart.component';\nimport { XiriPieChartComponent } from '../piechart/piechart.component';\nimport { XiriGaugeChartComponent } from '../gaugechart/gaugechart.component';\nimport { XiriBulletChartComponent } from '../bulletchart/bulletchart.component';\nimport { XiriHeatmapComponent } from '../heatmap/heatmap.component';\nimport { XiriCalendarComponent } from '../calendar/calendar.component';\nimport { XiriTreeComponent } from '../tree/tree.component';\nimport { XiriSankeyComponent } from '../sankey/sankey.component';\nimport { XiriGanttComponent } from '../gantt/gantt.component';\nimport { XiriSkeletonComponent } from '../skeleton/skeleton.component';\nimport { XiriStatusComponent } from '../status/status.component';\nimport { XiriCalloutComponent } from '../callout/callout.component';\n\n\n@Component( {\n\t selector: 'xiri-dyncomponent',\n\t templateUrl: './dyncomponent.component.html',\n\t styleUrl: './dyncomponent.component.scss',\n\t imports: [ forwardRef( () => XiriCardComponent ),\n\t XiriButtonlineComponent,\n\t XiriTableComponent,\n\t XiriCardlinkComponent,\n\t XiriLinksComponent,\n\t MatCard,\n\t MatCardHeader,\n\t MatCardTitle,\n\t MatCardContent,\n\t XiriFormComponent,\n\t XiriQueryComponent,\n\t XiriStepperComponent,\n\t XiriHeaderComponent,\n\t XiriListComponent,\n\t XiriInfopointComponent,\n\t XiriMultiprogressComponent,\n\t XiriProgressComponent,\n\t XiriImagetextComponent,\n\t NgTemplateOutlet,\n\t SafehtmlPipe,\n\t XiriTabsComponent,\n\t XiriExpansionComponent,\n\t XiriStatComponent,\n\t XiriEmptyStateComponent,\n\t XiriStatusComponent,\n\t XiriCalloutComponent,\n\t XiriTimelineComponent,\n\t XiriPageHeaderComponent,\n\t XiriSectionComponent,\n\t XiriDividerComponent,\n\t XiriSkeletonComponent,\n\t XiriStatGridComponent,\n\t XiriMultiStatComponent,\n\t XiriToolbarComponent,\n\t XiriDescriptionListComponent,\n\t XiriBarChartComponent,\n\t XiriLineChartComponent,\n\t XiriPieChartComponent,\n\t XiriGaugeChartComponent,\n\t XiriBulletChartComponent,\n\t XiriHeatmapComponent,\n\t XiriCalendarComponent,\n\t XiriTreeComponent,\n\t XiriSankeyComponent,\n\t XiriGanttComponent ]\n } )\nexport class XiriDynComponentComponent {\n\t\n\tdata = input.required<XiriDynData[]>();\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\tdyncomponent = input<TemplateRef<unknown>>();\n\t\n\tdataInt = computed( () => {\n\t\t\n\t\tlet data = this.data();\n\t\t\n\t\tif ( data === undefined || data === null )\n\t\t\treturn [];\n\t\tif ( !Array.isArray( data ) )\n\t\t\tdata = [ data ];\n\t\t\n\t\treturn data.map( ( d: XiriDynData ) => {\n\t\t\t\n\t\t\tif ( d.id === undefined )\n\t\t\t\td.id = Math.floor( Math.random() * 1000000 );\n\t\t\t\n\t\t\treturn d;\n\t\t} );\n\t} );\n\n\tresolveClass( obj: XiriDynData, fallback = 'xcol' ): string {\n\t\tif ( obj.display )\n\t\t\treturn obj.display;\n\t\tif ( obj.cols !== undefined )\n\t\t\treturn colsToClasses( obj.cols );\n\t\treturn fallback;\n\t}\n}\n","@for (obj of dataInt(); track obj.id) {\n\n\t@switch (obj.type) {\n\t\t@case ('card') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-4')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-card [settings]=\"$any(obj.data)\"></xiri-card>\n\t\t\t</div>\n\t\t}\n\t\t@case ('buttonline') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-buttonline [settings]=\"$any(obj.data)\" [filterData]=\"filterData()\"></xiri-buttonline>\n\t\t\t</div>\n\t\t}\n\t\t@case ('table') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-table [settings]=\"$any(obj.data)\" [filterData]=\"filterData()\" [dyncomponent]=\"selfdyncomponent\"></xiri-table>\n\t\t\t</div>\n\t\t}\n\t\t@case ('cardlink') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-4 xcol-lg-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-cardlink [settings]=\"$any(obj.data)\"></xiri-cardlink>\n\t\t\t</div>\n\t\t}\n\t\t@case ('links') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-4 xcol-lg-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-links [settings]=\"$any(obj.data)\"></xiri-links>\n\t\t\t</div>\n\t\t}\n\t\t@case ('form') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol form')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<mat-card class=\"mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t\t\t\t@if ($any(obj.data).header) {\n\t\t\t\t\t\t<mat-card-header>\n\t\t\t\t\t\t\t<mat-card-title>{{ $any(obj.data).header }}</mat-card-title>\n\t\t\t\t\t\t</mat-card-header>\n\t\t\t\t\t}\n\t\t\t\t\t<mat-card-content>\n\t\t\t\t\t\t<xiri-form [settings]=\"$any(obj.data)\"></xiri-form>\n\t\t\t\t\t</mat-card-content>\n\t\t\t\t</mat-card>\n\t\t\t</div>\n\t\t}\n\t\t@case ('query') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-query [settings]=\"$any(obj.data)\" [dyncomponent]=\"selfdyncomponent\"></xiri-query>\n\t\t\t</div>\n\t\t}\n\t\t@case ('stepper') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-stepper [settings]=\"$any(obj.data)\"></xiri-stepper>\n\t\t\t</div>\n\t\t}\n\t\t@case ('header') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-header [settings]=\"$any(obj.data)\"></xiri-header>\n\t\t\t</div>\n\t\t}\n\t\t@case ('list') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-list [settings]=\"$any(obj.data)\"></xiri-list>\n\t\t\t</div>\n\t\t}\n\t\t@case ('spacer') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<div class=\"spacer\"> </div>\n\t\t\t</div>\n\t\t}\n\t\t@case ('container') {\n\t\t\t@if (obj.data) {\n\t\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t\t<xiri-dyncomponent [data]=\"$any(obj.data).components\" [dyncomponent]=\"dyncomponent()\" class=\"xrow\"></xiri-dyncomponent>\n\t\t\t\t</div>\n\t\t\t}\n\t\t}\n\t\t@case ('infopoint') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-infopoint [settings]=\"$any(obj.data)\"></xiri-infopoint>\n\t\t\t</div>\n\t\t}\n\t\t@case ('multiprogress') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-4')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer (on viewport) { <xiri-multiprogress [settings]=\"$any(obj.data)\"></xiri-multiprogress> } @placeholder { <xiri-skeleton type=\"rect\" height=\"48px\" /> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('progress') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-4')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-progress [settings]=\"$any(obj.data)\"></xiri-progress>\n\t\t\t</div>\n\t\t}\n\t\t@case ('imagetext') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-4')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer (on viewport) { <xiri-imagetext [settings]=\"$any(obj.data)\"></xiri-imagetext> } @placeholder { <xiri-skeleton type=\"rect\" height=\"120px\" /> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('tabs') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-tabs [settings]=\"$any(obj.data)\" [filterData]=\"filterData()\" [dyncomponent]=\"selfdyncomponent\"></xiri-tabs>\n\t\t\t</div>\n\t\t}\n\t\t@case ('expansion') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-expansion [settings]=\"$any(obj.data)\" [filterData]=\"filterData()\" [dyncomponent]=\"selfdyncomponent\"></xiri-expansion>\n\t\t\t</div>\n\t\t}\n\t\t@case ('infotext') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@if ($any(obj.data).html) {\n\t\t\t\t\t<div class=\"infotext\" [innerHtml]=\"$any(obj.data).text | safeHtml\"></div>\n\t\t\t\t} @else {\n\t\t\t\t\t<div class=\"infotext\">{{ $any(obj.data).text }}</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t\t@case ('html') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<div class=\"html\" [innerHtml]=\"$any(obj.data).html | safeHtml\"></div>\n\t\t\t</div>\n\t\t}\n\t\t@case ('stat') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-4')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-stat [settings]=\"$any(obj.data)\"></xiri-stat>\n\t\t\t</div>\n\t\t}\n\t\t@case ('empty-state') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-empty-state [settings]=\"$any(obj.data)\"></xiri-empty-state>\n\t\t\t</div>\n\t\t}\n\t\t@case ('status') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-status [settings]=\"$any(obj.data)\"></xiri-status>\n\t\t\t</div>\n\t\t}\n\t\t@case ('callout') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-callout [settings]=\"$any(obj.data)\"></xiri-callout>\n\t\t\t</div>\n\t\t}\n\t\t@case ('timeline') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer (on viewport) { <xiri-timeline [settings]=\"$any(obj.data)\"></xiri-timeline> } @placeholder { <xiri-skeleton type=\"rect\" height=\"96px\" /> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('page-header') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer (on viewport) { <xiri-page-header [settings]=\"$any(obj.data)\"></xiri-page-header> } @placeholder { <xiri-skeleton type=\"rect\" height=\"64px\" /> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('section') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-section [settings]=\"$any(obj.data)\" [dyncomponent]=\"dyncomponent()\"></xiri-section>\n\t\t\t</div>\n\t\t}\n\t\t@case ('divider') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer (on viewport) { <xiri-divider [settings]=\"$any(obj.data)\"></xiri-divider> } @placeholder { <xiri-skeleton type=\"rect\" height=\"16px\" /> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('stat-grid') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-stat-grid [settings]=\"$any(obj.data)\"></xiri-stat-grid> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('multi-stat') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-multi-stat [settings]=\"$any(obj.data)\"></xiri-multi-stat>\n\t\t\t</div>\n\t\t}\n\t\t@case ('toolbar') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-toolbar [settings]=\"$any(obj.data)\" [filterData]=\"filterData()\"></xiri-toolbar> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('description-list') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-description-list [settings]=\"$any(obj.data)\"></xiri-description-list> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('barchart') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-barchart [mode]=\"obj.mode ?? 'simple'\" [settings]=\"$any(obj.data)\"></xiri-barchart> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('linechart') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-linechart [settings]=\"$any(obj.data)\"></xiri-linechart> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('piechart') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-piechart [settings]=\"$any(obj.data)\"></xiri-piechart> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('gaugechart') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-gaugechart [settings]=\"$any(obj.data)\"></xiri-gaugechart> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('bulletchart') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-bulletchart [settings]=\"$any(obj.data)\"></xiri-bulletchart> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('heatmap') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-heatmap [settings]=\"$any(obj.data)\"></xiri-heatmap> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('calendar') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-calendar [settings]=\"$any(obj.data)\"></xiri-calendar> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('tree') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-tree [settings]=\"$any(obj.data)\"></xiri-tree> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('sankey') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-sankey [settings]=\"$any(obj.data)\"></xiri-sankey> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('gantt') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-gantt [settings]=\"$any(obj.data)\"></xiri-gantt> }\n\t\t\t</div>\n\t\t}\n\t\t@default {\n\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent() || defaultComponentUnknown; context: { $implicit: obj, filterData: filterData() }\"></ng-container>\n\t\t}\n\t}\n}\n\n<ng-template #selfdyncomponent let-obj>\n\t<xiri-dyncomponent [data]=\"$any(obj).data\" [filterData]=\"$any(obj).filterData\" [dyncomponent]=\"dyncomponent()\" class=\"xrow\"></xiri-dyncomponent>\n</ng-template>\n<ng-template #defaultComponentUnknown let-obj>\n\t<div class=\"xcol\">unknown type: {{ $any(obj).type }}</div>\n</ng-template>\n","import { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriDynComponentComponent } from '../dyncomponent/dyncomponent.component';\nimport { XiriSidepanelConfig } from './sidepanel.service';\nimport { XiriSidepanelRef } from './sidepanel-ref';\n\n@Component( {\n\tselector: 'xiri-sidepanel',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstyleUrl: './sidepanel.component.scss',\n\timports: [ MatIconButton, MatIcon, XiriDynComponentComponent ],\n\thost: {\n\t\trole: 'dialog',\n\t\t'aria-modal': 'true',\n\t\t'[attr.aria-labelledby]': 'titleId()'\n\t},\n\ttemplate: `\n\t\t<div class=\"sidepanel-header\">\n\t\t\t<span class=\"sidepanel-title\" [id]=\"titleId()\">{{ config().title }}</span>\n\t\t\t<button mat-icon-button (click)=\"ref().close()\" aria-label=\"Schließen\"><mat-icon>close</mat-icon></button>\n\t\t</div>\n\t\t<div class=\"sidepanel-content\">\n\t\t\t@if (config().data) {\n\t\t\t\t<xiri-dyncomponent [data]=\"$any(config().data)\"></xiri-dyncomponent>\n\t\t\t}\n\t\t</div>\n\t`\n} )\nexport class XiriSidepanelComponent {\n\tconfig = input.required<XiriSidepanelConfig>();\n\tref = input.required<XiriSidepanelRef>();\n\n\tprotected readonly titleId = computed( () => this.config().title ? 'xiri-sidepanel-title' : null );\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';\nimport { ESCAPE } from '@angular/cdk/keycodes';\nimport { filter } from 'rxjs/operators';\nimport { XiriSidepanelComponent } from './sidepanel.component';\nimport { XiriSidepanelRef } from './sidepanel-ref';\n\nexport interface XiriSidepanelConfig {\n\ttitle?: string;\n\twidth?: string;\n\tdata?: unknown;\n}\n\n@Injectable( { providedIn: 'root' } )\nexport class XiriSidepanelService {\n\tprivate readonly overlay = inject( Overlay );\n\tprivate readonly focusTrapFactory = inject( ConfigurableFocusTrapFactory );\n\n\topen( config: XiriSidepanelConfig ): XiriSidepanelRef {\n\n\t\t// Element merken, das das Panel geöffnet hat, um den Fokus beim Schließen zurückzugeben.\n\t\tconst previouslyFocused = document.activeElement as HTMLElement | null;\n\n\t\tconst overlayRef = this.overlay.create( {\n\t\t\tpositionStrategy: this.overlay.position().global().right( '0' ).top( '0' ),\n\t\t\theight: '100%',\n\t\t\twidth: config.width ?? '420px',\n\t\t\thasBackdrop: true,\n\t\t\tpanelClass: 'xiri-sidepanel-overlay'\n\t\t} );\n\n\t\tconst ref = new XiriSidepanelRef( overlayRef, previouslyFocused );\n\n\t\tconst portal = new ComponentPortal( XiriSidepanelComponent );\n\t\tconst cmp = overlayRef.attach( portal );\n\t\tcmp.setInput( 'config', config );\n\t\tcmp.setInput( 'ref', ref );\n\n\t\t// Fokus im Panel halten (CDK Overlay macht das nicht automatisch, anders als MatDialog).\n\t\tconst focusTrap = this.focusTrapFactory.create( overlayRef.overlayElement );\n\t\tfocusTrap.focusInitialElementWhenReady();\n\t\toverlayRef.detachments().subscribe( () => focusTrap.destroy() );\n\n\t\toverlayRef.backdropClick().subscribe( () => ref.close() );\n\t\toverlayRef.keydownEvents().pipe( filter( e => e.keyCode === ESCAPE ) ).subscribe( () => ref.close() );\n\n\t\treturn ref;\n\t}\n}\n","import { Component, DestroyRef, OnInit, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n\tMAT_DIALOG_DATA,\n\tMatDialogRef,\n\tMatDialogTitle,\n\tMatDialogContent,\n\tMatDialogActions\n} from '@angular/material/dialog';\nimport { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';\nimport { XiriButton } from \"../button/button.component\";\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\nimport { XiriButtonstyleComponent } from '../buttonstyle/buttonstyle.component';\nimport { MatDivider } from '@angular/material/divider';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\n\n\nexport interface XiriAlertConfig {\n\theader: string\n\ttext: string\n\ticon: string\n\tbuttons: XiriButton[]\n}\n\n@Component( {\n\t selector: 'xiri-alert',\n\t templateUrl: './alert.component.html',\n\t styleUrls: [ './alert.component.scss' ],\n\t imports: [ MatDialogTitle,\n\t CdkScrollable,\n\t MatDialogContent,\n\t MatProgressSpinner,\n\t MatIcon,\n\t MatDivider,\n\t MatDialogActions,\n\t XiriButtonstyleComponent,\n\t SafehtmlPipe ]\n } )\nexport class XiriAlertComponent implements OnInit {\n\tdialogRef = inject<MatDialogRef<XiriAlertComponent>>( MatDialogRef );\n\tinitData = inject( MAT_DIALOG_DATA );\n\tprivate breakpointObserver = inject( BreakpointObserver );\n\tprivate destroyRef = inject( DestroyRef );\n\n\n\tloading = signal(true);\n\theader = signal('');\n\tbuttons = signal<XiriButton[]>([]);\n\ttext = signal('');\n\ticon = signal('warning');\n\n\tngOnInit() {\n\n\t\tthis.breakpointObserver\n\t\t\t.observe( [ Breakpoints.XSmall, Breakpoints.Small ] )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( ( state: BreakpointState ) => {\n\t\t\t\tif ( state.matches )\n\t\t\t\t\tthis.dialogRef.updateSize( '80vw' );\n\t\t\t\telse\n\t\t\t\t\tthis.dialogRef.updateSize( '600px' );\n\t\t\t} );\n\n\t\tthis.loadData( this.initData );\n\t}\n\t\n\tprivate loadData( res: XiriAlertConfig ): void {\n\n\t\tif ( res.buttons ) {\n\t\t\tthis.header.set( res.header );\n\t\t\tthis.buttons.set( res.buttons );\n\t\t\tthis.text.set( res.text );\n\t\t\tthis.icon.set( res.icon ? res.icon : 'warning' );\n\t\t} else {\n\t\t\tthis.dialogRef.close( res );\n\t\t}\n\n\t\tthis.loading.set( false );\n\t}\n\t\n\tclickButton( button: XiriButton ): void {\n\n\t\tthis.dialogRef.close( button );\n\t}\n}\n","@if (!loading()) {\n\t<h1 mat-dialog-title>{{ header() }}</h1>\n}\n<mat-dialog-content>\n\t@if (loading()) {\n\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t} @else {\n\t\t<div class=\"content\">\n\t\t\t<div class=\"icon\">\n\t\t\t\t<mat-icon class=\"warn\" inline=\"true\">{{ icon() }}</mat-icon>\n\t\t\t</div>\n\t\t\t<div class=\"text\" [innerHtml]=\"text() | safeHtml\"></div>\n\t\t</div>\n\t}\n</mat-dialog-content>\n@if (!loading()) {\n\t<mat-divider></mat-divider>\n\t<mat-dialog-actions>\n\t\t@for (button of buttons(); track button) {\n\t\t\t<xiri-buttonstyle [button]=\"button\" [disabled]=\"false\" (click)=\"clickButton( button )\"></xiri-buttonstyle>\n\t\t}\n\t</mat-dialog-actions>\n}\n","import { Component, computed, input, signal } from '@angular/core';\nimport { SlicePipe } from '@angular/common';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatCard, MatCardAvatar, MatCardContent } from '@angular/material/card';\nimport { XiriColor } from '../types/color.type';\n\n\nexport interface XiriMultiprogressSettings {\n\tdata: XiriMultiprogressItem[]\n\theaderIcon?: string\n\theaderIconColor?: XiriColor\n\theader?: string\n\tshow?: number\n\tcompact?: boolean\n}\n\nexport interface XiriMultiprogressItem {\n\ttext: string\n\tvalue: string\n\tprogress: number\n\tcolor?: XiriColor\n}\n\n@Component( {\n\t selector: 'xiri-multiprogress',\n\t templateUrl: './multiprogress.component.html',\n\t styleUrls: [ './multiprogress.component.scss' ],\n\t imports: [ MatCard, MatCardAvatar, MatIcon, MatIconButton, MatCardContent, MatProgressBar, SlicePipe ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriMultiprogressComponent {\n\tpublic isOpen = signal<boolean>(false);\n\n\tsettings = input.required<XiriMultiprogressSettings>();\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n}\n","@if (compact()) {\n\t<div class=\"card xiri-multiprogress-flat\">\n\t\t<div class=\"header align-items-center\">\n\t\t\t@if (settings().headerIcon) {\n\t\t\t\t<div class=\"header-image\">\n\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t<span class=\"title\">{{ settings().header }}</span>\n\t\t\t@if (settings().show && settings().data.length > settings().show!) {\n\t\t\t\t<span class=\"open\">\n\t\t\t\t\t<button mat-icon-button class=\"d-btn\" (click)=\"isOpen.set(!isOpen())\" [attr.aria-label]=\"isOpen() ? 'Weniger anzeigen' : 'Mehr anzeigen'\" [attr.aria-expanded]=\"isOpen()\">\n\t\t\t\t\t\t@if (isOpen()) { <mat-icon>expand_less</mat-icon> } @else { <mat-icon>expand_more</mat-icon> }\n\t\t\t\t\t</button>\n\t\t\t\t</span>\n\t\t\t}\n\t\t</div>\n\t\t<div class=\"xiri-multiprogress-content\">\n\t\t\t@for (item of settings().data | slice:0:(isOpen() ? 999 : settings().show); track item) {\n\t\t\t\t<div class=\"item\">\n\t\t\t\t\t<div class=\"line\">\n\t\t\t\t\t\t<span class=\"text\">{{ item.text }}</span>\n\t\t\t\t\t\t<span class=\"value\">{{ item.value }}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<mat-progress-bar mode=\"determinate\" [class]=\"item.color\" [value]=\"item.progress\" class=\"bar\"></mat-progress-bar>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t</div>\n} @else {\n\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<div class=\"header align-items-center\">\n\t\t\t@if (settings().headerIcon) {\n\t\t\t\t<div mat-card-avatar class=\"header-image\">\n\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t<span class=\"title\">{{ settings().header }}</span>\n\t\t\t@if (settings().show && settings().data.length > settings().show!) {\n\t\t\t\t<span class=\"open\">\n\t\t\t\t\t<button mat-icon-button class=\"d-btn\" (click)=\"isOpen.set(!isOpen())\" [attr.aria-label]=\"isOpen() ? 'Weniger anzeigen' : 'Mehr anzeigen'\" [attr.aria-expanded]=\"isOpen()\">\n\t\t\t\t\t\t@if (isOpen()) { <mat-icon>expand_less</mat-icon> } @else { <mat-icon>expand_more</mat-icon> }\n\t\t\t\t\t</button>\n\t\t\t\t</span>\n\t\t\t}\n\t\t</div>\n\t\t<mat-card-content>\n\t\t\t@for (item of settings().data | slice:0:(isOpen() ? 999 : settings().show); track item) {\n\t\t\t\t<div class=\"item\">\n\t\t\t\t\t<div class=\"line\">\n\t\t\t\t\t\t<span class=\"text\">{{ item.text }}</span>\n\t\t\t\t\t\t<span class=\"value\">{{ item.value }}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<mat-progress-bar mode=\"determinate\" [class]=\"item.color\" [value]=\"item.progress\" class=\"bar\"></mat-progress-bar>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</mat-card-content>\n\t</mat-card>\n}\n","import { Component, computed, input, signal } from '@angular/core';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { XiriColor } from '../types/color.type';\nimport { MatIcon } from '@angular/material/icon';\nimport {\n\tMatCard,\n\tMatCardAvatar,\n\tMatCardContent,\n\tMatCardHeader,\n\tMatCardSubtitle,\n\tMatCardTitle\n} from '@angular/material/card';\n\nexport interface XiriImagetextSettings {\n\turl: string;\n\tinfo: string;\n\n\theaderIcon?: string\n\theaderIconColor?: XiriColor\n\theaderSub?: string\n\theader?: string\n\tcompact?: boolean\n}\n\n\n@Component( {\n\t selector: 'xiri-imagetext',\n\t templateUrl: './imagetext.component.html',\n\t styleUrl: './imagetext.component.scss',\n\t imports: [ MatCard,\n\t MatCardHeader,\n\t MatCardAvatar,\n\t MatIcon,\n\t MatCardTitle,\n\t MatCardSubtitle,\n\t MatCardContent,\n\t MatProgressSpinner ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriImagetextComponent {\n\n\tsettings = input.required<XiriImagetextSettings>();\n\tloading = signal<boolean>( true )\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n}\n","@if (compact()) {\n\t<div class=\"card xiri-imagetext-flat\">\n\t\t@if (settings().header || settings().headerIcon) {\n\t\t\t<div class=\"xiri-imagetext-header align-items-center\">\n\t\t\t\t@if (settings().headerIcon) {\n\t\t\t\t\t<div class=\"header-image\">\n\t\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<div class=\"header-text\">\n\t\t\t\t\t@if (settings().header) {\n\t\t\t\t\t\t<div class=\"header-title\">{{ settings().header }}</div>\n\t\t\t\t\t}\n\t\t\t\t\t@if (settings().headerSub) {\n\t\t\t\t\t\t<div class=\"header-sub\">{{ settings().headerSub }}</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t}\n\t\t<div class=\"xiri-imagetext-content\">\n\t\t\t<mat-spinner [hidden]=\"!loading()\" diameter=\"30\"></mat-spinner>\n\t\t\t<img [hidden]=\"loading()\" (load)=\"loading.set(false)\" [src]=\"settings().url\" [alt]=\"settings().info\" id=\"ximg\"/>\n\t\t</div>\n\t</div>\n} @else {\n\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<mat-card-header class=\"align-items-center\">\n\t\t\t@if (settings().headerIcon) {\n\t\t\t\t<div mat-card-avatar class=\"header-image\">\n\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@if (settings().header) {\n\t\t\t\t<mat-card-title>{{ settings().header }}</mat-card-title>\n\t\t\t}\n\t\t\t@if (settings().headerSub) {\n\t\t\t\t<mat-card-subtitle>{{ settings().headerSub }}</mat-card-subtitle>\n\t\t\t}\n\t\t</mat-card-header>\n\t\t<mat-card-content>\n\t\t\t<mat-spinner [hidden]=\"!loading()\" diameter=\"30\"></mat-spinner>\n\t\t\t<img [hidden]=\"loading()\" (load)=\"loading.set(false)\" [src]=\"settings().url\" [alt]=\"settings().info\" id=\"ximg\"/>\n\t\t</mat-card-content>\n\t</mat-card>\n}\n","import { ChangeDetectorRef, Component, effect, inject, input } from '@angular/core';\nimport { filter } from \"rxjs\";\nimport { Event, NavigationEnd, Router, RouterLink } from \"@angular/router\";\nimport { XiriUrlPipe } from \"../pipes/url.pipe\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatListItem, MatListItemIcon, MatListItemMeta, MatListItemTitle } from '@angular/material/list';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\n\nexport interface XiriSidebarSettings {\n\t\n\tprefix: string\n\tfields: XiriNavigationField[]\n}\n\nexport interface XiriNavigationField {\n\tname: string\n\tlink?: string\n\ticon: string\n\ticonSet?: string\n\textern?: string\n\tactive?: boolean\n\tpath?: string\n\tregex?: RegExp\n\t\n\t// Leaves the entry out entirely — it never reaches the DOM, so no routerLink\n\t// stays behind. Meant for a backend that omits routes a user cannot open;\n\t// client-side filtering is not authorization, the routes must be gated anyway.\n\thide?: boolean\n\n\tmenu?: boolean\n\tshowSubmenu?: boolean\n\tsub?: XiriNavigationField[]\n}\n\n@Component( {\n\t selector: 'xiri-sidenav',\n\t templateUrl: './sidenav.component.html',\n\t styleUrls: [ './sidenav.component.scss' ],\n\t imports: [\n\t\t MatProgressSpinner,\n\t\t MatListItem,\n\t\t RouterLink,\n\t\t MatIcon,\n\t\t MatListItemIcon,\n\t\t MatListItemTitle,\n\t\t MatListItemMeta,\n\t\t XiriUrlPipe,\n\t ],\n } )\nexport class XiriSidenavComponent {\n\t\n\tprivate router: Router = inject( Router );\n\tprivate cdr: ChangeDetectorRef = inject( ChangeDetectorRef );\n\t\n\tsettings = input<XiriSidebarSettings>();\n\tloading = true;\n\tfields: XiriNavigationField[] = [];\n\tprivate prefix = '';\n\t\n\tconstructor() {\n\n\t\tthis.router.events.pipe(\n\t\t\tfilter( ( event: Event ) => event instanceof NavigationEnd ),\n\t\t\ttakeUntilDestroyed()\n\t\t).subscribe( ( route: NavigationEnd ) => {\n\t\t\tthis.checkUrl( route.urlAfterRedirects );\n\t\t} );\n\n\t\teffect( () => {\n\t\t\tconst value = this.settings();\n\n\t\t\tthis.loading = value == null || value.fields == null;\n\n\t\t\tif ( !this.loading && value != null ) {\n\t\t\t\tthis.fields = value.fields;\n\t\t\t\tthis.prefix = value.prefix;\n\n\t\t\t\tthis.compileRegex( this.fields );\n\n\t\t\t\tthis.checkUrl( this.router.url );\n\t\t\t} else {\n\t\t\t\tthis.fields = [];\n\t\t\t}\n\t\t} );\n\t}\n\t\n\tprivate compileRegex( fields: XiriNavigationField[] ): void {\n\n\t\tif ( !fields )\n\t\t\treturn;\n\n\t\tfor ( let i = 0; i != fields.length; i++ ) {\n\t\t\tconst field = fields[ i ];\n\n\t\t\tif ( field.path )\n\t\t\t\tfield.regex = new RegExp( '^' + field.path );\n\n\t\t\tif ( field.sub )\n\t\t\t\tthis.compileRegex( field.sub );\n\t\t}\n\t}\n\n\tprivate checkUrl( url: string ): void {\n\n\t\tif ( !this.fields )\n\t\t\treturn;\n\n\t\tif ( this.prefix ) {\n\t\t\tif ( url.startsWith( this.prefix ) )\n\t\t\t\turl = url.substring( this.prefix.length );\n\t\t}\n\n\t\tfor ( let i = 0; i != this.fields.length; i++ )\n\t\t\tthis.checkField( this.fields[ i ], url );\n\n\t\tthis.cdr.markForCheck();\n\t}\n\n\tprivate checkField( field: XiriNavigationField, url: string ): boolean {\n\n\t\t// A hidden entry is not rendered, so it must not activate or expand its parent either.\n\t\tif ( field.hide ) {\n\t\t\tfield.active = false;\n\t\t\treturn false;\n\t\t}\n\n\t\tconst matchesSelf = ( field.link != null && field.link == url ) || ( field.regex != null && field.regex.test( url ) );\n\n\t\tif ( field.menu ) {\n\n\t\t\tlet found = false;\n\t\t\tif ( field.sub ) {\n\t\t\t\tfor ( let i = 0; i != field.sub.length; i++ ) {\n\t\t\t\t\tif ( this.checkField( field.sub[ i ], url ) )\n\t\t\t\t\t\tfound = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfield.active = found || matchesSelf;\n\t\t\tfield.showSubmenu = field.active;\n\t\t\treturn field.active;\n\t\t}\n\n\t\tfield.active = matchesSelf;\n\t\treturn field.active;\n\t}\n\n}\n","@if (loading) {\n\t<div class=\"loading\">\n\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t</div>\n}\n\n@for (nav of fields; track nav) {\n\n\t<!-- One guard per level, not per branch: a hidden entry can never slip through\n\t link/menu/extern. Structural, so no routerLink is left in the DOM. -->\n\t@if (!nav.hide) {\n\t\t@if ( nav.link ) {\n\t\t\t@let navUrl = nav.link | xiriUrl;\n\t\t\t<a mat-list-item [routerLink]=\"navUrl?.path\" [queryParams]=\"navUrl?.queryParams\" [class.active]=\"nav.active\">\n\t\t\t\t@if (nav.iconSet) {\n\t\t\t\t\t<mat-icon matListItemIcon [fontSet]=\"nav.iconSet\" [class]=\"nav.active ? 'primary' : 'accent'\">{{ nav.icon }}</mat-icon>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon matListItemIcon [class]=\"nav.active ? 'primary' : 'accent'\">{{ nav.icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<span matListItemTitle>{{ nav.name }}</span>\n\t\t\t</a>\n\t\t} @else if (nav.menu) {\n\t\t\t<mat-list-item (click)=\"nav.showSubmenu = !nav.showSubmenu\" (keydown.enter)=\"nav.showSubmenu = !nav.showSubmenu\" (keydown.space)=\"nav.showSubmenu = !nav.showSubmenu; $event.preventDefault()\" [attr.aria-expanded]=\"nav.showSubmenu\" class=\"parent\">\n\t\t\t\t@if (nav.iconSet) {\n\t\t\t\t\t<mat-icon matListItemIcon [fontSet]=\"nav.iconSet\" [class]=\"nav.active ? 'primary' : 'accent'\">{{ nav.icon }}</mat-icon>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon matListItemIcon [class]=\"nav.active ? 'primary' : 'accent'\">{{ nav.icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<span matListItemTitle>{{ nav.name }}</span>\n\t\t\t\t<span matListItemMeta>\n\t\t\t\t\t<mat-icon class=\"menu-button\" [class.rotated]=\"nav.showSubmenu\">expand_more</mat-icon>\n\t\t\t\t</span>\n\t\t\t</mat-list-item>\n\t\t\t<div class=\"submenu\" [class.expanded]=\"nav.showSubmenu\">\n\t\t\t\t@for (subnav of nav.sub; track subnav) {\n\t\t\t\t\t@if (!subnav.hide) {\n\t\t\t\t\t\t@if (subnav.link) {\n\t\t\t\t\t\t\t@let subnavUrl = subnav.link | xiriUrl;\n\t\t\t\t\t\t\t<a mat-list-item [routerLink]=\"subnavUrl?.path\" [queryParams]=\"subnavUrl?.queryParams\" [class.active]=\"subnav.active\">{{ subnav.name }}</a>\n\t\t\t\t\t\t} @else if (subnav.menu) {\n\t\t\t\t\t\t\t<mat-list-item (click)=\"subnav.showSubmenu = !subnav.showSubmenu\" (keydown.enter)=\"subnav.showSubmenu = !subnav.showSubmenu\" (keydown.space)=\"subnav.showSubmenu = !subnav.showSubmenu; $event.preventDefault()\" [attr.aria-expanded]=\"subnav.showSubmenu\" class=\"parent\">\n\t\t\t\t\t\t\t\t<span matListItemTitle>{{ subnav.name }}</span>\n\t\t\t\t\t\t\t\t<span matListItemMeta>\n\t\t\t\t\t\t\t\t\t<mat-icon class=\"menu-button\" [class.rotated]=\"subnav.showSubmenu\">expand_more</mat-icon>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</mat-list-item>\n\t\t\t\t\t\t\t<div class=\"submenu submenu-nested\" [class.expanded]=\"subnav.showSubmenu\">\n\t\t\t\t\t\t\t\t@for (subsubnav of subnav.sub; track subsubnav) {\n\t\t\t\t\t\t\t\t\t@if (!subsubnav.hide) {\n\t\t\t\t\t\t\t\t\t\t@if (subsubnav.link) {\n\t\t\t\t\t\t\t\t\t\t\t@let subsubnavUrl = subsubnav.link | xiriUrl;\n\t\t\t\t\t\t\t\t\t\t\t<a mat-list-item [routerLink]=\"subsubnavUrl?.path\" [queryParams]=\"subsubnavUrl?.queryParams\" [class.active]=\"subsubnav.active\">{{ subsubnav.name }}</a>\n\t\t\t\t\t\t\t\t\t\t} @else if (subsubnav.extern) {\n\t\t\t\t\t\t\t\t\t\t\t<a mat-list-item [href]=\"subsubnav.extern\">{{ subsubnav.name }}</a>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t} @else if (subnav.extern) {\n\t\t\t\t\t\t\t<a mat-list-item [href]=\"subnav.extern\">{{ subnav.name }}</a>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</div>\n\t\t} @else if (nav.extern) {\n\t\t\t<a mat-list-item [href]=\"nav.extern\">\n\t\t\t\t@if (nav.iconSet) {\n\t\t\t\t\t<mat-icon matListItemIcon [fontSet]=\"nav.iconSet\" class=\"accent\">{{ nav.icon }}</mat-icon>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon matListItemIcon class=\"accent\">{{ nav.icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<span matListItemTitle>{{ nav.name }}</span>\n\t\t\t</a>\n\t\t}\n\t}\n}\n","import { Component, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { RouterLink } from '@angular/router';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\n\nexport interface XiriBreadcrumbItem {\n\tlabel: string;\n\tlink?: string;\n\ticon?: string;\n\textern?: boolean;\n}\n\n@Component( {\n\t selector: 'xiri-breadcrumb',\n\t templateUrl: './breadcrumb.component.html',\n\t styleUrl: './breadcrumb.component.scss',\n\t imports: [ MatIcon, RouterLink, XiriUrlPipe ]\n } )\nexport class XiriBreadcrumbComponent {\n\n\tsettings = input.required<XiriBreadcrumbItem[]>();\n}\n","<nav class=\"breadcrumb\" aria-label=\"Breadcrumb\">\n\t<ol>\n\t\t@for (item of settings(); track $index; let last = $last) {\n\t\t\t<li [class.active]=\"last\">\n\t\t\t\t@if (item.link) {\n\t\t\t\t\t@if (item.extern) {\n\t\t\t\t\t\t<a [href]=\"item.link\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t<mat-icon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t@let itemUrl = item.link | xiriUrl;\n\t\t\t\t\t\t<a [routerLink]=\"itemUrl?.path\" [queryParams]=\"itemUrl?.queryParams\">\n\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t<mat-icon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t}\n\t\t\t\t} @else {\n\t\t\t\t\t<span>\n\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t<mat-icon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t</span>\n\t\t\t\t}\n\t\t\t\t@if (!last) {\n\t\t\t\t\t<mat-icon class=\"separator\">chevron_right</mat-icon>\n\t\t\t\t}\n\t\t\t</li>\n\t\t}\n\t</ol>\n</nav>\n","import { Component, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriColor } from '../types/color.type';\n\nexport interface XiriTimelineItem {\n\ttitle: string;\n\tdescription?: string;\n\tdatetime?: string;\n\ticon?: string;\n\ticonColor?: XiriColor;\n}\n\nexport interface XiriTimelineSettings {\n\titems: XiriTimelineItem[];\n\torientation?: 'horizontal' | 'vertical';\n}\n\n@Component( {\n\t selector: 'xiri-timeline',\n\t templateUrl: './timeline.component.html',\n\t styleUrl: './timeline.component.scss',\n\t imports: [ MatIcon ]\n } )\nexport class XiriTimelineComponent {\n\n\tsettings = input.required<XiriTimelineSettings>();\n}\n","<div class=\"timeline\" [class.horizontal]=\"settings().orientation === 'horizontal'\">\n\t@for (item of settings().items; track $index; let last = $last; let first = $first) {\n\t\t<div class=\"timeline-item\" [class.last]=\"last\" [class.first]=\"first\">\n\t\t\t<div class=\"timeline-marker\">\n\t\t\t\t<div class=\"timeline-line line-before\"></div>\n\t\t\t\t<div class=\"timeline-dot\" [class]=\"item.iconColor || 'primary'\">\n\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t<mat-icon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"timeline-line line-after\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"timeline-content\">\n\t\t\t\t<div class=\"timeline-header\">\n\t\t\t\t\t<span class=\"timeline-title\">{{ item.title }}</span>\n\t\t\t\t\t@if (item.datetime) {\n\t\t\t\t\t\t<span class=\"timeline-datetime\">{{ item.datetime }}</span>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t@if (item.description && settings().orientation !== 'horizontal') {\n\t\t\t\t\t<div class=\"timeline-description\">{{ item.description }}</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t}\n</div>\n","import {\n\tAfterViewInit,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tNgZone,\n\tOnDestroy,\n\toutput,\n\tsignal,\n\tviewChild,\n\tViewEncapsulation\n} from '@angular/core';\nimport { MatCard, MatCardContent } from '@angular/material/card';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsCallbackParams } from './params';\n\n/** Payload emitted when a chart data item (bar, slice, point, …) is clicked. */\nexport interface XiriEchartsClick {\n\tcomponentType: string; // 'series' for a data-point click\n\tseriesType: string;\n\tseriesIndex: number;\n\tdataIndex: number;\n\tname: string;\n\tvalue: unknown;\n}\n\n/** Minimal structural view of the echarts instance methods the host uses. */\ninterface XiriEchartsInstance {\n\ton( event: string, handler: ( params: XiriEchartsCallbackParams ) => void ): void;\n\tsetOption( option: unknown, notMerge?: boolean ): void;\n\tresize(): void;\n\tdispose(): void;\n}\n\n/** Minimal structural view of the lazily-imported echarts module. */\ninterface XiriEchartsModule {\n\tinit( el: HTMLElement ): XiriEchartsInstance;\n}\n\n/**\n * `xiri-echarts-host` — shared echarts plumbing for all chart components.\n *\n * Handles lazy `import('echarts')`, init / setOption / dispose, ResizeObserver,\n * the optional mat-card surface (with header + compact mode), and a flat\n * variant when nested inside another card.\n *\n * Specialized chart components (`xiri-barchart`, `xiri-linechart`, …) build\n * a typed echarts option from their settings and feed it via the `option`\n * input. Each re-emit of `option` re-renders the chart with `setOption(option, true)`.\n *\n * Compact-Mode strips the outer mat-card so the chart sits flat inside an\n * outer xiri-card without card-in-card visuals.\n */\n@Component( {\n\tselector: 'xiri-echarts-host',\n\ttemplateUrl: './echarts-host.component.html',\n\tstyleUrl: './echarts-host.component.scss',\n\tencapsulation: ViewEncapsulation.None,\n\timports: [ MatCard, MatCardContent, MatIcon ],\n\thost: { '[class.compact]': 'compact()' }\n} )\nexport class XiriEchartsHostComponent implements AfterViewInit, OnDestroy {\n\n\toption = input.required<unknown>();\n\tcompact = input<boolean>( false );\n\ttitle = input<string | undefined>( undefined );\n\theaderIcon = input<string | undefined>( undefined );\n\theaderIconColor = input<XiriColor | undefined>( undefined );\n\tchartHeight = input<string>( '200px' );\n\n\t// Emitted when a data item (bar, slice, point, …) is clicked.\n\titemClick = output<XiriEchartsClick>();\n\n\tchartHostRef = viewChild.required<ElementRef<HTMLDivElement>>( 'chartHost' );\n\n\tprivate zone = inject( NgZone );\n\tprivate destroyRef = inject( DestroyRef );\n\n\tprivate chart: XiriEchartsInstance | null = null;\n\tprivate echarts: XiriEchartsModule | null = null;\n\tprivate resizeObserver: ResizeObserver | null = null;\n\tprivate loadError = signal<string | null>( null );\n\n\treadonly error = this.loadError.asReadonly();\n\treadonly hasHeader = computed( () => !!( this.title() || this.headerIcon() ) );\n\n\tconstructor() {\n\t\teffect( () => {\n\t\t\t// Re-render whenever the option changes.\n\t\t\tthis.option();\n\t\t\tif ( this.chart ) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t} );\n\t}\n\n\tasync ngAfterViewInit(): Promise<void> {\n\t\ttry {\n\t\t\tthis.echarts = await import( 'echarts' ) as unknown as XiriEchartsModule;\n\t\t} catch {\n\t\t\tthis.loadError.set( 'echarts is not installed. Add `npm install echarts` to your app.' );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.zone.runOutsideAngular( () => {\n\t\t\tthis.chart = this.echarts!.init( this.chartHostRef().nativeElement );\n\n\t\t\tthis.chart.on( 'click', ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\tif ( p.componentType !== 'series' )\n\t\t\t\t\treturn;\n\t\t\t\tthis.zone.run( () => this.itemClick.emit( {\n\t\t\t\t\tcomponentType: p.componentType ?? '',\n\t\t\t\t\tseriesType: p.seriesType ?? '',\n\t\t\t\t\tseriesIndex: p.seriesIndex ?? 0,\n\t\t\t\t\tdataIndex: p.dataIndex,\n\t\t\t\t\tname: p.name ?? '',\n\t\t\t\t\tvalue: p.value,\n\t\t\t\t} ) );\n\t\t\t} );\n\n\t\t\tthis.render();\n\n\t\t\tthis.resizeObserver = new ResizeObserver( () => this.chart?.resize() );\n\t\t\tthis.resizeObserver.observe( this.chartHostRef().nativeElement );\n\t\t} );\n\n\t\tthis.destroyRef.onDestroy( () => this.dispose() );\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.dispose();\n\t}\n\n\tprivate dispose(): void {\n\t\tthis.resizeObserver?.disconnect();\n\t\tthis.resizeObserver = null;\n\t\tthis.chart?.dispose();\n\t\tthis.chart = null;\n\t}\n\n\tprivate render(): void {\n\t\tif ( !this.chart ) return;\n\t\tconst opt = this.option();\n\t\tif ( !opt ) return;\n\t\tthis.chart.setOption( opt, true );\n\t}\n}\n","@if (compact()) {\n\t<div class=\"xiri-echarts xiri-echarts-flat\">\n\t\t@if (hasHeader()) {\n\t\t\t<div class=\"xiri-echarts-header\">\n\t\t\t\t@if (headerIcon()) {\n\t\t\t\t\t<mat-icon [class]=\"headerIconColor() || 'primary'\">{{ headerIcon() }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t@if (title()) {\n\t\t\t\t\t<div class=\"xiri-echarts-title\">{{ title() }}</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t\t<div #chartHost class=\"xiri-echarts-host\" [style.height]=\"chartHeight()\"></div>\n\t\t@if (error()) {\n\t\t\t<div class=\"xiri-echarts-error\">{{ error() }}</div>\n\t\t}\n\t</div>\n} @else {\n\t<mat-card class=\"xiri-echarts mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<mat-card-content>\n\t\t\t@if (hasHeader()) {\n\t\t\t\t<div class=\"xiri-echarts-header\">\n\t\t\t\t\t@if (headerIcon()) {\n\t\t\t\t\t\t<mat-icon [class]=\"headerIconColor() || 'primary'\">{{ headerIcon() }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (title()) {\n\t\t\t\t\t\t<div class=\"xiri-echarts-title\">{{ title() }}</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t<div #chartHost class=\"xiri-echarts-host\" [style.height]=\"chartHeight()\"></div>\n\t\t\t@if (error()) {\n\t\t\t\t<div class=\"xiri-echarts-error\">{{ error() }}</div>\n\t\t\t}\n\t\t</mat-card-content>\n\t</mat-card>\n}\n","import { signal } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\n\n/**\n * Maps semantic XiriColor names to CSS color values.\n *\n * Theme tokens reference the theme variables written by `xirimat.theming()`;\n * extended tokens are fixed brand colors that work in light and dark alike.\n * Anything referencing a variable is resolved by `resolveColor()` before it\n * reaches echarts — see there for why.\n */\nexport const COLOR_CSS_VAR: Record<string, string> = {\n\tprimary: 'var(--primary)',\n\tsecondary: 'var(--secondary)',\n\ttertiary: 'var(--tertiary)',\n\taccent: 'var(--tertiary)',\n\twarn: '#f5a623',\n\terror: 'var(--error)',\n\tsuccess: '#2e7d32',\n\temerald: '#10b981',\n\tred: '#e53935',\n\tyellow: '#fbc02d',\n\tgreen: '#43a047',\n\tblue: '#1e88e5',\n\tpurple: '#8b5cf6',\n\torange: '#fb8c00',\n\tgray: '#9e9e9e',\n\tlightgray: '#cfcfcf',\n\tdarkgray: '#616161',\n\twhite: '#ffffff',\n\tblack: '#000000',\n\tinherit: 'currentColor'\n};\n\n/**\n * Bumped whenever the active theme changes. `resolveColor()` reads it, so the\n * `computed()` that builds a chart option re-evaluates on a theme switch and\n * the chart is re-rendered with the new colors — without every chart component\n * having to know about the theme.\n */\nconst themeEpoch = signal( 0 );\n\n/** Called by XiriThemeService after it applied a theme class. */\nexport function notifyThemeChanged(): void {\n\tthemeEpoch.update( v => v + 1 );\n}\n\n/**\n * Reads a `var(--x)` / `var(--x, y)` expression off the document root.\n * Returns undefined when there is no document (SSR) or the variable is unset.\n */\nfunction readCssVar( expression: string ): string | undefined {\n\tif ( typeof document === 'undefined' ) return undefined;\n\n\tconst name = expression.slice( 4, -1 ).split( ',' )[ 0 ].trim();\n\tconst value = getComputedStyle( document.documentElement ).getPropertyValue( name ).trim();\n\treturn value || undefined;\n}\n\n/**\n * Resolves a XiriColor token to a concrete CSS color usable in echarts options.\n *\n * echarts draws on a canvas, where neither `var(--x)` nor `currentColor` is a\n * valid color — both have to be resolved to a literal first, or the series ends\n * up with no color at all. Unknown tokens fall back to the given fallback.\n */\nexport function resolveColor( color: XiriColor | string | undefined, fallback = '#8b5cf6' ): string {\n\tthemeEpoch(); // track theme changes, see notifyThemeChanged()\n\n\tif ( !color ) return fallback;\n\n\tconst mapped = COLOR_CSS_VAR[ color ];\n\tif ( mapped === undefined ) return fallback;\n\n\tif ( mapped.startsWith( 'var(' ) )\n\t\treturn readCssVar( mapped ) ?? fallback;\n\n\t// \"inherit\" means the surrounding text color, which a canvas cannot inherit.\n\tif ( mapped === 'currentColor' ) {\n\t\tif ( typeof document === 'undefined' ) return fallback;\n\t\treturn getComputedStyle( document.documentElement ).color || fallback;\n\t}\n\n\treturn mapped;\n}\n\n/**\n * Default categorical palette used by charts (line/pie/sankey) to color series\n * when no explicit color is provided. Indexed via `FALLBACK_COLORS[i % length]`.\n */\nexport const FALLBACK_COLORS = [ '#8b5cf6', '#10b981', '#1e88e5', '#fb8c00', '#e53935', '#fbc02d', '#43a047', '#616161' ];\n","/** Escapes characters that would otherwise be interpreted as HTML in echarts tooltip strings. */\nexport function escapeHtml( s: string ): string {\n\treturn String( s ?? '' )\n\t\t.replace( /&/g, '&' )\n\t\t.replace( /</g, '<' )\n\t\t.replace( />/g, '>' )\n\t\t.replace( /\"/g, '"' );\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsClick, XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor } from '../echarts/color';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsCallbackParams, XiriEchartsTooltipParams } from '../echarts/params';\n\nexport type XiriBarChartMode = 'simple' | 'stacked' | 'heatmap';\n\nexport interface XiriBarChartSegment {\n\tvalue: number;\n\tcolor?: XiriColor;\n\tname?: string;\n}\n\nexport interface XiriBarChartBar {\n\tlabel: string;\n\tvalue?: number;\n\tsegments?: XiriBarChartSegment[];\n\tname?: string;\n\turl?: string;\n\ttext?: string; // overrides the on-bar label (when showValues is on)\n}\n\nexport interface XiriBarChartPoint {\n\ttime: number;\n\tvalue: number;\n\tname?: string;\n\turl?: string;\n}\n\nexport interface XiriBarChartSettings {\n\ttitle?: string;\n\tyMin?: number;\n\tyMax?: number;\n\tcolor?: XiriColor;\n\tbars?: XiriBarChartBar[];\n\tpoints?: XiriBarChartPoint[];\n\tcompact?: boolean;\n\tshowValues?: boolean; // show value/text labels on bars\n\tlabelPosition?: 'top' | 'inside'; // default 'top'\n\txLabelRotate?: number; // rotate x-axis labels by degrees (-90..90), 90 = vertical\n}\n\n@Component( {\n\tselector: 'xiri-barchart',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[chartHeight]=\"chartHeight()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t(itemClick)=\"onItemClick($event)\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriBarChartComponent {\n\n\tmode = input<XiriBarChartMode | string>( 'simple' );\n\tsettings = input.required<XiriBarChartSettings>();\n\n\tprivate router = inject( Router );\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\t// Rotierte X-Achsen-Labels brauchen vertikalen Platz. Bei fixer 200px-Höhe würden\n\t// lange, schräg/vertikal gestellte Labels sonst unten abgeschnitten.\n\tchartHeight = computed<string>( () => {\n\t\tif ( this.compact() ) return '200px';\n\t\tconst rot = Math.abs( this.settings().xLabelRotate ?? 0 );\n\t\tif ( rot >= 60 ) return '280px';\n\t\tif ( rot >= 30 ) return '250px';\n\t\treturn '200px';\n\t} );\n\n\tonItemClick( e: XiriEchartsClick ): void {\n\t\tconst s = this.settings();\n\t\tconst coll = this.mode() === 'heatmap' ? s.points : s.bars;\n\t\tconst url = coll?.[ e.dataIndex ]?.url;\n\t\tif ( !url )\n\t\t\treturn;\n\t\tif ( /^https?:\\/\\//.test( url ) )\n\t\t\twindow.open( url, '_blank' );\n\t\telse\n\t\t\tthis.router.navigateByUrl( url );\n\t}\n\n\toption = computed( () => {\n\t\tconst m = this.mode();\n\t\tswitch ( m ) {\n\t\t\tcase 'stacked': return this.stackedOption();\n\t\t\tcase 'heatmap': return this.heatmapOption();\n\t\t\tdefault: return this.simpleOption();\n\t\t}\n\t} );\n\n\t// X-axis labels. Always return a config object — `axisLabel: undefined` suppresses\n\t// the category labels entirely in echarts. interval: 0 forces all labels when rotated\n\t// (they fit at an angle); otherwise echarts thins them automatically to avoid overlap.\n\tprivate xLabelConfig() {\n\t\tconst r = this.settings().xLabelRotate;\n\t\treturn r != null ? { rotate: r, interval: 0 } : { rotate: 0 };\n\t}\n\n\tprivate baseGrid() {\n\t\t// Compact mode: outer card already provides padding — shrink the\n\t\t// echarts grid so we don't get a \"double margin\".\n\t\tif ( this.compact() ) {\n\t\t\treturn { left: 0, right: 0, top: 4, bottom: 0, containLabel: true };\n\t\t}\n\t\t// Wert-Labels stehen über den Balken (position 'top') und fallen NICHT unter\n\t\t// containLabel — ohne zusätzlichen Rand oben werden sie am Canvas-Rand gekappt.\n\t\tconst s = this.settings();\n\t\tconst topLabels = !!s.showValues && s.labelPosition !== 'inside';\n\t\treturn { left: 32, right: 16, top: topLabels ? 34 : 24, bottom: 24, containLabel: true };\n\t}\n\n\tprivate simpleOption() {\n\t\tconst s = this.settings();\n\t\tconst bars = s.bars ?? [];\n\t\tconst color = resolveColor( s.color, '#8b5cf6' );\n\t\treturn {\n\t\t\tgrid: this.baseGrid(),\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'axis',\n\t\t\t\tformatter: ( params: XiriEchartsTooltipParams ) => {\n\t\t\t\t\tconst arr = Array.isArray( params ) ? params : [ params ];\n\t\t\t\t\tif ( !arr.length ) return '';\n\t\t\t\t\tconst p = arr[ 0 ];\n\t\t\t\t\tconst bar = bars[ p.dataIndex ];\n\t\t\t\t\tconst header = bar?.name ?? bar?.label ?? p.axisValueLabel ?? '';\n\t\t\t\t\treturn `<b>${ escapeHtml( header ) }</b><br/>${ p.marker }${ p.value }`;\n\t\t\t\t}\n\t\t\t},\n\t\t\txAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: bars.map( b => b.label ),\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false },\n\t\t\t\taxisLabel: this.xLabelConfig()\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'value',\n\t\t\t\tmin: s.yMin,\n\t\t\t\tmax: s.yMax,\n\t\t\t\tsplitLine: { lineStyle: { color: '#eee' } }\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'bar',\n\t\t\t\tdata: bars.map( b => ( {\n\t\t\t\t\tvalue: b.value ?? 0,\n\t\t\t\t\titemStyle: { cursor: b.url ? 'pointer' : 'default' }\n\t\t\t\t} ) ),\n\t\t\t\titemStyle: { color, borderRadius: [ 3, 3, 0, 0 ] },\n\t\t\t\tbarCategoryGap: '40%',\n\t\t\t\tlabel: {\n\t\t\t\t\tshow: !!s.showValues,\n\t\t\t\t\tposition: s.labelPosition === 'inside' ? 'inside' : 'top',\n\t\t\t\t\tcolor: s.labelPosition === 'inside' ? '#fff' : undefined,\n\t\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => bars[ p.dataIndex ]?.text ?? String( p.value )\n\t\t\t\t}\n\t\t\t} ]\n\t\t};\n\t}\n\n\tprivate stackedOption() {\n\t\tconst s = this.settings();\n\t\tconst bars = s.bars ?? [];\n\t\tconst segCount = Math.max( 0, ...bars.map( b => b.segments?.length ?? 0 ) );\n\n\t\t// Derive a default series name per segment-position from the first bar that has it.\n\t\tconst seriesNames: string[] = [];\n\t\tfor ( let i = 0; i < segCount; i++ ) {\n\t\t\tconst found = bars.find( b => b.segments?.[ i ]?.name )?.segments?.[ i ]?.name;\n\t\t\tseriesNames.push( found ?? '' );\n\t\t}\n\n\t\tconst series: unknown[] = [];\n\t\tfor ( let i = 0; i < segCount; i++ ) {\n\t\t\tseries.push( {\n\t\t\t\ttype: 'bar',\n\t\t\t\tstack: 'total',\n\t\t\t\tname: seriesNames[ i ] || `Segment ${ i + 1 }`,\n\t\t\t\tbarCategoryGap: '40%',\n\t\t\t\tlabel: {\n\t\t\t\t\tshow: !!s.showValues,\n\t\t\t\t\tposition: 'inside',\n\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => ( p.value === 0 ? '' : String( p.value ) )\n\t\t\t\t},\n\t\t\t\tdata: bars.map( b => {\n\t\t\t\t\tconst seg = b.segments?.[ i ];\n\t\t\t\t\tif ( !seg ) return { value: 0, itemStyle: { color: 'transparent' } };\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalue: seg.value,\n\t\t\t\t\t\tname: seg.name ?? seriesNames[ i ] ?? '',\n\t\t\t\t\t\titemStyle: { color: resolveColor( seg.color, '#9e9e9e' ), cursor: b.url ? 'pointer' : 'default' }\n\t\t\t\t\t};\n\t\t\t\t} )\n\t\t\t} );\n\t\t}\n\n\t\treturn {\n\t\t\tgrid: this.baseGrid(),\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'axis',\n\t\t\t\tformatter: ( params: XiriEchartsTooltipParams ) => {\n\t\t\t\t\tconst arr = Array.isArray( params ) ? params : [ params ];\n\t\t\t\t\tif ( !arr.length ) return '';\n\t\t\t\t\tconst idx = arr[ 0 ].dataIndex;\n\t\t\t\t\tconst bar = bars[ idx ];\n\t\t\t\t\tconst header = bar?.name ?? bar?.label ?? '';\n\t\t\t\t\tlet body = '';\n\t\t\t\t\tfor ( const p of arr ) {\n\t\t\t\t\t\tif ( !p.value && p.value !== 0 ) continue;\n\t\t\t\t\t\tif ( p.value === 0 ) continue;\n\t\t\t\t\t\tconst seg = bar?.segments?.[ p.seriesIndex ?? 0 ];\n\t\t\t\t\t\tconst label = seg?.name ?? p.seriesName ?? '';\n\t\t\t\t\t\tbody += `<br/>${ p.marker }${ escapeHtml( label ) }: <b>${ p.value }</b>`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `<b>${ escapeHtml( header ) }</b>${ body }`;\n\t\t\t\t}\n\t\t\t},\n\t\t\txAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: bars.map( b => b.label ),\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false },\n\t\t\t\taxisLabel: this.xLabelConfig()\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'value',\n\t\t\t\tmin: s.yMin,\n\t\t\t\tmax: s.yMax,\n\t\t\t\tsplitLine: { lineStyle: { color: '#eee' } }\n\t\t\t},\n\t\t\tseries\n\t\t};\n\t}\n\n\tprivate heatmapOption() {\n\t\tconst s = this.settings();\n\t\tconst points = s.points ?? [];\n\t\tconst color = resolveColor( s.color, '#8b5cf6' );\n\t\treturn {\n\t\t\tgrid: { ...this.baseGrid(), left: 8, right: 8 },\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'axis',\n\t\t\t\tformatter: ( params: XiriEchartsTooltipParams ) => {\n\t\t\t\t\tconst arr = Array.isArray( params ) ? params : [ params ];\n\t\t\t\t\tif ( !arr.length ) return '';\n\t\t\t\t\tconst p = arr[ 0 ];\n\t\t\t\t\tconst point = points[ p.dataIndex ];\n\t\t\t\t\tconst val = p.value as number[];\n\t\t\t\t\tconst date = new Date( val[ 0 ] ).toLocaleString();\n\t\t\t\t\tconst head = point?.name ? `<b>${ escapeHtml( point.name ) }</b><br/>` : '';\n\t\t\t\t\treturn `${ head }${ escapeHtml( date ) }<br/>${ p.marker }<b>${ val[ 1 ] }</b>`;\n\t\t\t\t}\n\t\t\t},\n\t\t\txAxis: {\n\t\t\t\ttype: 'time',\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false },\n\t\t\t\tsplitLine: { show: false }\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'value',\n\t\t\t\tmin: s.yMin ?? 0,\n\t\t\t\tmax: s.yMax,\n\t\t\t\tshow: false\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'bar',\n\t\t\t\tbarMinWidth: 1,\n\t\t\t\tbarMaxWidth: 3,\n\t\t\t\tdata: points.map( p => ( {\n\t\t\t\t\tvalue: [ p.time, p.value ],\n\t\t\t\t\titemStyle: { cursor: p.url ? 'pointer' : 'default' }\n\t\t\t\t} ) ),\n\t\t\t\titemStyle: { color }\n\t\t\t} ]\n\t\t};\n\t}\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor, FALLBACK_COLORS } from '../echarts/color';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsTooltipParams } from '../echarts/params';\n\nexport interface XiriLineChartLine {\n\tname: string;\n\tvalues: number[];\n\tcolor?: XiriColor;\n\tdashed?: boolean;\n\tarea?: boolean; // fill area below the line\n}\n\nexport interface XiriLineChartSettings {\n\ttitle?: string;\n\txLabels: string[];\n\tlines: XiriLineChartLine[];\n\tyMin?: number;\n\tyMax?: number;\n\tsmooth?: boolean;\n\tcompact?: boolean;\n\txLabelRotate?: number; // rotate x-axis labels by degrees (-90..90), 90 = vertical\n}\n\n@Component( {\n\tselector: 'xiri-linechart',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[chartHeight]=\"chartHeight()\"\n\t\t\t[title]=\"settings().title\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriLineChartComponent {\n\n\tsettings = input.required<XiriLineChartSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\t// Rotierte X-Achsen-Labels brauchen vertikalen Platz — sonst unten abgeschnitten.\n\tchartHeight = computed<string>( () => {\n\t\tif ( this.compact() ) return '200px';\n\t\tconst rot = Math.abs( this.settings().xLabelRotate ?? 0 );\n\t\tif ( rot >= 60 ) return '280px';\n\t\tif ( rot >= 30 ) return '250px';\n\t\treturn '200px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst lines = s.lines ?? [];\n\t\tconst labels = s.xLabels ?? [];\n\n\t\tconst series = lines.map( ( line, i ) => {\n\t\t\tconst color = resolveColor( line.color, FALLBACK_COLORS[ i % FALLBACK_COLORS.length ] );\n\t\t\treturn {\n\t\t\t\ttype: 'line',\n\t\t\t\tname: line.name,\n\t\t\t\tsmooth: !!s.smooth,\n\t\t\t\tsymbol: 'circle',\n\t\t\t\tsymbolSize: 6,\n\t\t\t\tlineStyle: {\n\t\t\t\t\twidth: 2,\n\t\t\t\t\ttype: line.dashed ? 'dashed' : 'solid',\n\t\t\t\t\tcolor,\n\t\t\t\t},\n\t\t\t\titemStyle: { color },\n\t\t\t\tareaStyle: line.area ? { color, opacity: 0.15 } : undefined,\n\t\t\t\tdata: line.values,\n\t\t\t};\n\t\t} );\n\n\t\treturn {\n\t\t\tgrid: this.compact()\n\t\t\t\t? { left: 0, right: 0, top: 4, bottom: 0, containLabel: true }\n\t\t\t\t: { left: 32, right: 16, top: 24, bottom: 24, containLabel: true },\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'axis',\n\t\t\t\tformatter: ( params: XiriEchartsTooltipParams ) => {\n\t\t\t\t\tconst arr = Array.isArray( params ) ? params : [ params ];\n\t\t\t\t\tif ( !arr.length ) return '';\n\t\t\t\t\tconst header = escapeHtml( String( arr[ 0 ].axisValueLabel ?? arr[ 0 ].name ?? '' ) );\n\t\t\t\t\tlet body = '';\n\t\t\t\t\tfor ( const p of arr ) {\n\t\t\t\t\t\tbody += `<br/>${ p.marker }${ escapeHtml( String( p.seriesName ?? '' ) ) }: <b>${ p.value }</b>`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `<b>${ header }</b>${ body }`;\n\t\t\t\t}\n\t\t\t},\n\t\t\tlegend: lines.length > 1 ? { top: 0, right: 0, type: 'scroll' } : undefined,\n\t\t\txAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: labels,\n\t\t\t\tboundaryGap: false,\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false },\n\t\t\t\taxisLabel: s.xLabelRotate != null ? { rotate: s.xLabelRotate, interval: 0 } : { rotate: 0 }\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'value',\n\t\t\t\tmin: s.yMin,\n\t\t\t\tmax: s.yMax,\n\t\t\t\tsplitLine: { lineStyle: { color: '#eee' } }\n\t\t\t},\n\t\t\tseries,\n\t\t};\n\t} );\n}\n\n/** Fallback color rotation when a line has no explicit color. */","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor, FALLBACK_COLORS } from '../echarts/color';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsCallbackParams } from '../echarts/params';\n\nexport interface XiriPieChartSlice {\n\tname: string;\n\tvalue: number;\n\tcolor?: XiriColor;\n}\n\nexport interface XiriPieChartSettings {\n\ttitle?: string;\n\tslices: XiriPieChartSlice[];\n\tdonut?: boolean; // ring instead of full pie\n\tnightingale?: boolean; // rose/nightingale: slice radius scales with value\n\tnightingaleType?: 'radius' | 'area'; // 'radius' (default) or 'area'\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-piechart',\n\ttemplate: `\n\t\t@if (warn()) {\n\t\t\t<div class=\"chart-hint\">Mehr als 4 Segmente erschweren den Vergleich — Balken- oder Tabellendarstellung erwägen.</div>\n\t\t}\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriPieChartComponent {\n\n\tsettings = input.required<XiriPieChartSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\twarn = computed<boolean>( () => ( this.settings().slices ?? [] ).length > 4 );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst slices = s.slices ?? [];\n\t\t// nightingale: smaller inner radius even on full pie so the rose has a visible center\n\t\tconst radius: [ string, string ] = s.donut\n\t\t\t? [ '55%', '78%' ]\n\t\t\t: ( s.nightingale ? [ '20%', '78%' ] : [ '0', '78%' ] );\n\n\t\tconst series: Record<string, unknown> = {\n\t\t\ttype: 'pie',\n\t\t\tradius,\n\t\t\tcenter: [ '50%', '45%' ],\n\t\t\tavoidLabelOverlap: true,\n\t\t\tlabel: {\n\t\t\t\tshow: !s.donut && !this.compact(),\n\t\t\t\tformatter: '{b}\\n{d}%',\n\t\t\t},\n\t\t\tlabelLine: { show: !s.donut && !this.compact() },\n\t\t\tdata: slices.map( ( slice, i ) => ( {\n\t\t\t\tname: slice.name,\n\t\t\t\tvalue: slice.value,\n\t\t\t\titemStyle: { color: resolveColor( slice.color, FALLBACK_COLORS[ i % FALLBACK_COLORS.length ] ) }\n\t\t\t} ) )\n\t\t};\n\t\tif ( s.nightingale ) {\n\t\t\tseries.roseType = s.nightingaleType ?? 'radius';\n\t\t}\n\n\t\treturn {\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'item',\n\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\t\tconst name = escapeHtml( String( p.name ?? '' ) );\n\t\t\t\t\treturn `<b>${ name }</b><br/>${ p.marker }<b>${ p.value }</b> (${ p.percent }%)`;\n\t\t\t\t}\n\t\t\t},\n\t\t\tlegend: { bottom: 0, type: 'scroll' },\n\t\t\tseries: [ series ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor } from '../echarts/color';\n\nexport interface XiriGaugeChartSettings {\n\ttitle?: string;\n\tvalue: number;\n\tmin?: number; // default 0\n\tmax?: number; // default 100\n\tcolor?: XiriColor;\n\tlabel?: string; // detail label below the value (e.g. \"%\", \"MB/s\")\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-gaugechart',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriGaugeChartComponent {\n\n\tsettings = input.required<XiriGaugeChartSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst min = s.min ?? 0;\n\t\tconst max = s.max ?? 100;\n\t\tconst color = resolveColor( s.color, '#8b5cf6' );\n\n\t\treturn {\n\t\t\tseries: [ {\n\t\t\t\ttype: 'gauge',\n\t\t\t\tmin,\n\t\t\t\tmax,\n\t\t\t\tcenter: [ '50%', '60%' ],\n\t\t\t\tradius: this.compact() ? '90%' : '80%',\n\t\t\t\tprogress: {\n\t\t\t\t\tshow: true,\n\t\t\t\t\twidth: 12,\n\t\t\t\t\titemStyle: { color }\n\t\t\t\t},\n\t\t\t\taxisLine: {\n\t\t\t\t\tlineStyle: { width: 12, color: [ [ 1, '#eee' ] ] }\n\t\t\t\t},\n\t\t\t\tpointer: { show: false },\n\t\t\t\taxisTick: { show: !this.compact() },\n\t\t\t\tsplitLine: { show: !this.compact() },\n\t\t\t\taxisLabel: { show: !this.compact(), distance: 18, fontSize: 11 },\n\t\t\t\tanchor: { show: false },\n\t\t\t\ttitle: { show: false },\n\t\t\t\tdetail: {\n\t\t\t\t\tvalueAnimation: true,\n\t\t\t\t\toffsetCenter: [ 0, '15%' ],\n\t\t\t\t\tfontSize: this.compact() ? 18 : 24,\n\t\t\t\t\tfontWeight: 'bold',\n\t\t\t\t\tformatter: s.label ? `{value}\\n{label|${ s.label }}` : '{value}',\n\t\t\t\t\trich: { label: { fontSize: 11, fontWeight: 'normal', color: '#888' } },\n\t\t\t\t\tcolor\n\t\t\t\t},\n\t\t\t\tdata: [ { value: s.value } ]\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor } from '../echarts/color';\n\nexport interface XiriBulletChartSettings {\n\ttitle?: string;\n\tvalue: number;\n\ttarget?: number;\n\tmax?: number; // default: max(value, target) * 1.2\n\tlabel?: string;\n\tcolor?: XiriColor;\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-bulletchart',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriBulletChartComponent {\n\n\tsettings = input.required<XiriBulletChartSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst color = resolveColor( s.color, '#8b5cf6' );\n\t\tconst max = s.max ?? Math.max( s.value, s.target ?? 0 ) * 1.2;\n\t\tconst compact = this.compact();\n\t\tconst valueText = s.label ? `${ s.value } ${ s.label }` : `${ s.value }`;\n\n\t\treturn {\n\t\t\t// right: Platz für das Value-Label; top: Platz für das Ziel-Label über der Linie.\n\t\t\tgrid: { left: 8, right: 56, top: 22, bottom: 8, containLabel: false },\n\t\t\txAxis: { type: 'value', min: 0, max, show: false },\n\t\t\tyAxis: { type: 'category', data: [ '' ], show: false },\n\t\t\tseries: [ {\n\t\t\t\ttype: 'bar',\n\t\t\t\tdata: [ s.value ],\n\t\t\t\tbarWidth: compact ? 14 : 20,\n\t\t\t\titemStyle: { color, borderRadius: 4 },\n\t\t\t\tlabel: {\n\t\t\t\t\tshow: true,\n\t\t\t\t\tposition: 'right',\n\t\t\t\t\tformatter: valueText,\n\t\t\t\t\tfontWeight: 'bold',\n\t\t\t\t\tcolor: '#333'\n\t\t\t\t},\n\t\t\t\tmarkLine: s.target !== undefined ? {\n\t\t\t\t\tsymbol: 'none',\n\t\t\t\t\tprecision: 0,\n\t\t\t\t\tlabel: {\n\t\t\t\t\t\tshow: true,\n\t\t\t\t\t\tposition: 'end',\n\t\t\t\t\t\tformatter: `Ziel ${ s.target }`,\n\t\t\t\t\t\tcolor: '#666',\n\t\t\t\t\t\tfontSize: 11\n\t\t\t\t\t},\n\t\t\t\t\tdata: [ { xAxis: s.target, lineStyle: { color: '#333', width: 2, type: 'solid' } } ]\n\t\t\t\t} : undefined\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsCallbackParams } from '../echarts/params';\n\nexport interface XiriHeatmapCell {\n\tx: number; // index into xLabels\n\ty: number; // index into yLabels\n\tvalue: number;\n\tlabel?: string; // optional override for the cell's display value\n}\n\nexport interface XiriHeatmapSettings {\n\ttitle?: string;\n\txLabels: string[];\n\tyLabels: string[];\n\tcells: XiriHeatmapCell[];\n\tmin?: number;\n\tmax?: number;\n\tcolorRange?: [ string, string ]; // CSS colors for low/high; default light → purple\n\tshowValues?: boolean; // print values inside cells (only readable for small grids)\n\tcompact?: boolean;\n\txLabelRotate?: number; // rotate x-axis labels by degrees (-90..90), 90 = vertical\n}\n\n@Component( {\n\tselector: 'xiri-heatmap',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t[chartHeight]=\"height()\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriHeatmapComponent {\n\n\tsettings = input.required<XiriHeatmapSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\theight = computed<string>( () => {\n\t\tconst s = this.settings();\n\t\tconst rows = s.yLabels.length || 1;\n\t\t// Rotierte X-Labels brauchen zusätzlichen vertikalen Platz unter der Matrix.\n\t\tconst rot = Math.abs( s.xLabelRotate ?? 0 );\n\t\tconst rotExtra = rot >= 60 ? 70 : rot >= 30 ? 50 : 0;\n\t\t// rows*32 für die Zellen + 76 für Titel, X-Achsen-Labels und Rand.\n\t\tconst px = Math.max( 220, rows * 32 + 76 + rotExtra );\n\t\treturn px + 'px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst cells = s.cells ?? [];\n\t\tconst values = cells.map( c => c.value );\n\t\tconst min = s.min ?? Math.min( 0, ...values );\n\t\tconst max = s.max ?? Math.max( 0, ...values );\n\t\tconst [ lowColor, highColor ] = s.colorRange ?? [ '#ede9fe', '#7c3aed' ];\n\n\t\treturn {\n\t\t\tgrid: this.compact()\n\t\t\t\t? { left: 0, right: 0, top: 4, bottom: 0, containLabel: true }\n\t\t\t\t: { left: 32, right: 64, top: 24, bottom: 24, containLabel: true },\n\t\t\ttooltip: {\n\t\t\t\tposition: 'top',\n\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\t\tconst val = p.value as number[];\n\t\t\t\t\tconst x = s.xLabels[ val[ 0 ] ] ?? '';\n\t\t\t\t\tconst y = s.yLabels[ val[ 1 ] ] ?? '';\n\t\t\t\t\treturn `<b>${ escapeHtml( y ) }</b> / <b>${ escapeHtml( x ) }</b><br/>${ p.marker }<b>${ val[ 2 ] }</b>`;\n\t\t\t\t}\n\t\t\t},\n\t\t\txAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: s.xLabels,\n\t\t\t\tsplitArea: { show: true },\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false },\n\t\t\t\taxisLabel: { interval: 0, rotate: s.xLabelRotate ?? 0 }\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: s.yLabels,\n\t\t\t\tsplitArea: { show: true },\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false }\n\t\t\t},\n\t\t\tvisualMap: {\n\t\t\t\tmin,\n\t\t\t\tmax,\n\t\t\t\tcalculable: true,\n\t\t\t\torient: 'vertical',\n\t\t\t\tright: 8,\n\t\t\t\ttop: 'middle',\n\t\t\t\tinRange: { color: [ lowColor, highColor ] },\n\t\t\t\tshow: !this.compact()\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'heatmap',\n\t\t\t\tdata: cells.map( c => [ c.x, c.y, c.value ] ),\n\t\t\t\tlabel: { show: !!s.showValues, formatter: ( p: XiriEchartsCallbackParams ) => String( ( p.value as number[] )[ 2 ] ) },\n\t\t\t\temphasis: { itemStyle: { shadowBlur: 6, shadowColor: 'rgba(0, 0, 0, 0.3)' } }\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsCallbackParams } from '../echarts/params';\n\nexport interface XiriCalendarCell {\n\tdate: string; // 'YYYY-MM-DD'\n\tvalue: number;\n}\n\nexport interface XiriCalendarSettings {\n\ttitle?: string;\n\trange: string | [ string, string ]; // year 'YYYY' | ['YYYY-MM-DD', 'YYYY-MM-DD']\n\tcells: XiriCalendarCell[];\n\tmin?: number;\n\tmax?: number;\n\tcolorRange?: [ string, string ]; // CSS colors for low/high; default light green → dark green (GitHub-like)\n\tcellSize?: number; // cell size in px (default 16, compact 12)\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-calendar',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t[chartHeight]=\"height()\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriCalendarComponent {\n\n\tsettings = input.required<XiriCalendarSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\tprivate cellSize = computed<number>( () => this.settings().cellSize ?? ( this.compact() ? 12 : 16 ) );\n\n\theight = computed<string>( () => {\n\t\t// 7 weekday rows + label space\n\t\tconst px = this.cellSize() * 7 + 60;\n\t\treturn px + 'px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst cells = s.cells ?? [];\n\t\tconst values = cells.map( c => c.value );\n\t\tconst min = s.min ?? Math.min( 0, ...values );\n\t\tconst max = s.max ?? Math.max( 0, ...values );\n\t\tconst [ lowColor, highColor ] = s.colorRange ?? [ '#e6f4ea', '#2e7d32' ];\n\t\tconst sz = this.cellSize();\n\n\t\treturn {\n\t\t\ttooltip: {\n\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\t\tconst val = p.value as [ string, number ];\n\t\t\t\t\tconst date = String( val[ 0 ] );\n\t\t\t\t\tconst v = val[ 1 ];\n\t\t\t\t\treturn `<b>${ escapeHtml( date ) }</b><br/>${ p.marker }<b>${ v }</b>`;\n\t\t\t\t}\n\t\t\t},\n\t\t\tvisualMap: {\n\t\t\t\tmin,\n\t\t\t\tmax,\n\t\t\t\torient: 'horizontal',\n\t\t\t\tleft: 'center',\n\t\t\t\tbottom: 0,\n\t\t\t\tshow: !this.compact(),\n\t\t\t\tinRange: { color: [ lowColor, highColor ] }\n\t\t\t},\n\t\t\tcalendar: {\n\t\t\t\trange: s.range,\n\t\t\t\tcellSize: [ sz, sz ],\n\t\t\t\tsplitLine: { show: false },\n\t\t\t\titemStyle: { borderColor: '#fff', borderWidth: 2 },\n\t\t\t\tyearLabel: { show: false },\n\t\t\t\tdayLabel: { fontSize: 10 },\n\t\t\t\tmonthLabel: { fontSize: 11 },\n\t\t\t\ttop: 24,\n\t\t\t\tleft: 32,\n\t\t\t\tright: 16,\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'heatmap',\n\t\t\t\tcoordinateSystem: 'calendar',\n\t\t\t\tdata: cells.map( c => [ c.date, c.value ] )\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { XiriEchartsCallbackParams } from '../echarts/params';\n\nexport interface XiriTreeNode {\n\tname: string;\n\tvalue?: number;\n\tchildren?: XiriTreeNode[];\n\tcollapsed?: boolean;\n}\n\nexport interface XiriTreeSettings {\n\ttitle?: string;\n\troot: XiriTreeNode;\n\torient?: 'LR' | 'RL' | 'TB' | 'BT'; // default 'LR'\n\tlayout?: 'orthogonal' | 'radial'; // default 'orthogonal'\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-tree',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t[chartHeight]=\"height()\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriTreeComponent {\n\n\tsettings = input.required<XiriTreeSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\theight = computed<string>( () => {\n\t\t// Estimate based on leaf count\n\t\tconst leaves = countLeaves( this.settings().root );\n\t\tconst px = Math.max( 240, leaves * 24 + 80 );\n\t\treturn px + 'px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst orient = s.orient ?? 'LR';\n\t\tconst layout = s.layout ?? 'orthogonal';\n\n\t\treturn {\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'item',\n\t\t\t\ttriggerOn: 'mousemove',\n\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\t\tconst v = p.data?.value;\n\t\t\t\t\tconst head = `<b>${ escapeText( p.name ?? '' ) }</b>`;\n\t\t\t\t\treturn v != null ? `${ head }<br/>${ p.marker }<b>${ v }</b>` : head;\n\t\t\t\t}\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'tree',\n\t\t\t\tdata: [ s.root ],\n\t\t\t\ttop: 16,\n\t\t\t\tbottom: 16,\n\t\t\t\t// Reserve enough space for leaf labels so they don't get truncated by echarts.\n\t\t\t\tleft: layout === 'radial' ? '5%' : ( orient === 'LR' ? 96 : ( orient === 'RL' ? 16 : 16 ) ),\n\t\t\t\tright: layout === 'radial' ? '5%' : ( orient === 'RL' ? 96 : ( orient === 'LR' ? 96 : 16 ) ),\n\t\t\t\tlayout,\n\t\t\t\torient,\n\t\t\t\tsymbol: 'emptyCircle',\n\t\t\t\tsymbolSize: 7,\n\t\t\t\tinitialTreeDepth: 3,\n\t\t\t\tlabel: {\n\t\t\t\t\tposition: orient === 'TB' ? 'top' : 'left',\n\t\t\t\t\talign: orient === 'LR' ? 'right' : 'center',\n\t\t\t\t\tverticalAlign: 'middle',\n\t\t\t\t\tfontSize: 12,\n\t\t\t\t\toverflow: 'none'\n\t\t\t\t},\n\t\t\t\tleaves: {\n\t\t\t\t\tlabel: {\n\t\t\t\t\t\tposition: orient === 'TB' ? 'bottom' : 'right',\n\t\t\t\t\t\talign: orient === 'LR' ? 'left' : 'center',\n\t\t\t\t\t\toverflow: 'none'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\texpandAndCollapse: true,\n\t\t\t\tanimationDuration: 250,\n\t\t\t\tanimationDurationUpdate: 250\n\t\t\t} ]\n\t\t};\n\t} );\n}\n\nfunction countLeaves( n: XiriTreeNode ): number {\n\tif ( !n.children?.length ) return 1;\n\treturn n.children.reduce( ( sum, c ) => sum + countLeaves( c ), 0 );\n}\n\nfunction escapeText( s: string ): string {\n\treturn String( s ?? '' ).replace( /</g, '<' ).replace( />/g, '>' );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor, FALLBACK_COLORS } from '../echarts/color';\n\nexport interface XiriSankeyNode {\n\tname: string;\n\tcolor?: XiriColor;\n}\n\nexport interface XiriSankeyLink {\n\tsource: string;\n\ttarget: string;\n\tvalue: number;\n}\n\nexport interface XiriSankeySettings {\n\ttitle?: string;\n\tnodes: XiriSankeyNode[];\n\tlinks: XiriSankeyLink[];\n\torient?: 'horizontal' | 'vertical'; // default 'horizontal'\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-sankey',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t[chartHeight]=\"height()\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriSankeyComponent {\n\n\tsettings = input.required<XiriSankeySettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\theight = computed<string>( () => {\n\t\tconst n = this.settings().nodes.length || 1;\n\t\tconst px = Math.max( 280, n * 20 + 80 );\n\t\treturn px + 'px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\treturn {\n\t\t\ttooltip: { trigger: 'item', triggerOn: 'mousemove' },\n\t\t\tseries: [ {\n\t\t\t\ttype: 'sankey',\n\t\t\t\torient: s.orient ?? 'horizontal',\n\t\t\t\ttop: 16,\n\t\t\t\tbottom: 16,\n\t\t\t\tleft: 16,\n\t\t\t\tright: 80,\n\t\t\t\temphasis: { focus: 'adjacency' },\n\t\t\t\tlineStyle: { color: 'gradient', curveness: 0.5 },\n\t\t\t\tlabel: { fontSize: 12 },\n\t\t\t\tdata: s.nodes.map( ( n, i ) => ( {\n\t\t\t\t\tname: n.name,\n\t\t\t\t\titemStyle: { color: resolveColor( n.color, FALLBACK_COLORS[ i % FALLBACK_COLORS.length ] ) }\n\t\t\t\t} ) ),\n\t\t\t\tlinks: s.links\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor } from '../echarts/color';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsCallbackParams, XiriEchartsRenderItemApi } from '../echarts/params';\n\nexport interface XiriGanttTask {\n\trow: number; // index into rows[]\n\tname: string;\n\tstart: number; // unix milliseconds\n\tend: number; // unix milliseconds\n\tcolor?: XiriColor;\n}\n\nexport interface XiriGanttSettings {\n\ttitle?: string;\n\trows: string[]; // y-axis categories (top to bottom in render order)\n\ttasks: XiriGanttTask[];\n\trangeStart?: number; // optional x-axis start (ms)\n\trangeEnd?: number; // optional x-axis end (ms)\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-gantt',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t[chartHeight]=\"height()\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriGanttComponent {\n\n\tsettings = input.required<XiriGanttSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\theight = computed<string>( () => {\n\t\tconst rows = this.settings().rows.length || 1;\n\t\tconst px = Math.max( 220, rows * 36 + 80 );\n\t\treturn px + 'px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst rows = s.rows ?? [];\n\n\t\t// Each datum: [rowIndex, start, end, name, color]\n\t\tconst data = ( s.tasks ?? [] ).map( t => [\n\t\t\tt.row,\n\t\t\tt.start,\n\t\t\tt.end,\n\t\t\tt.name,\n\t\t\tresolveColor( t.color, '#8b5cf6' )\n\t\t] );\n\n\t\tconst renderItem = ( _params: unknown, api: XiriEchartsRenderItemApi ) => {\n\t\t\tconst rowIdx = api.value( 0 );\n\t\t\tconst start = api.coord( [ api.value( 1 ), rowIdx ] );\n\t\t\tconst end = api.coord( [ api.value( 2 ), rowIdx ] );\n\t\t\tconst cellH = api.size( [ 0, 1 ] )[ 1 ];\n\t\t\tconst height = Math.max( 4, cellH * 0.6 );\n\t\t\treturn {\n\t\t\t\ttype: 'rect',\n\t\t\t\ttransition: [ 'shape' ],\n\t\t\t\tshape: {\n\t\t\t\t\tx: start[ 0 ],\n\t\t\t\t\ty: start[ 1 ] - height / 2,\n\t\t\t\t\twidth: Math.max( 1, end[ 0 ] - start[ 0 ] ),\n\t\t\t\t\theight,\n\t\t\t\t\tr: 4\n\t\t\t\t},\n\t\t\t\tstyle: { fill: api.value( 4 ) }\n\t\t\t};\n\t\t};\n\n\t\treturn {\n\t\t\ttooltip: {\n\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\t\tconst v = p.value as [ number, number, number, string, string ];\n\t\t\t\t\tconst fmt = ( ms: number ) => new Date( ms ).toLocaleString();\n\t\t\t\t\tconst row = rows[ v[ 0 ] ] ?? '';\n\t\t\t\t\treturn `<b>${ escapeHtml( v[ 3 ] ) }</b><br/>${ escapeHtml( row ) }<br/>${ escapeHtml( fmt( v[ 1 ] ) ) } → ${ escapeHtml( fmt( v[ 2 ] ) ) }`;\n\t\t\t\t}\n\t\t\t},\n\t\t\tgrid: { left: 8, right: 16, top: 16, bottom: 24, containLabel: true },\n\t\t\txAxis: {\n\t\t\t\ttype: 'time',\n\t\t\t\tmin: s.rangeStart,\n\t\t\t\tmax: s.rangeEnd,\n\t\t\t\tsplitLine: { lineStyle: { color: '#eee' } }\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: rows,\n\t\t\t\tinverse: true,\n\t\t\t\tsplitLine: { show: false },\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false }\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'custom',\n\t\t\t\tencode: { x: [ 1, 2 ], y: 0 },\n\t\t\t\tclip: true,\n\t\t\t\trenderItem,\n\t\t\t\tdata\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","/**\n * Minimal structural types for the echarts callback params that the xiri chart\n * components read inside tooltip / label / renderItem formatters.\n *\n * echarts is an optional peer dependency and is loaded lazily, so we avoid a\n * static import of its (large) option/param types here and describe only the\n * fields the chart components actually access. The shapes intentionally mirror\n * echarts' `CallbackDataParams` / `CustomSeriesRenderItem*` surfaces.\n */\n\n/** Params object passed to a single-series tooltip / label formatter callback. */\nexport interface XiriEchartsCallbackParams {\n\tcomponentType?: string;\n\tseriesType?: string;\n\tseriesIndex?: number;\n\tseriesName?: string;\n\tdataIndex: number;\n\tname?: string;\n\taxisValueLabel?: string;\n\tmarker?: string;\n\tpercent?: number;\n\tvalue?: unknown;\n\tdata?: { value?: unknown };\n}\n\n/** Params for an 'axis'-trigger tooltip: either a single params object or an array of them. */\nexport type XiriEchartsTooltipParams = XiriEchartsCallbackParams | XiriEchartsCallbackParams[];\n\n/** The `api` object handed to a custom-series `renderItem` callback. */\nexport interface XiriEchartsRenderItemApi {\n\tvalue( dimension: number ): number;\n\tcoord( point: number[] ): number[];\n\tsize( dataSize: number[] ): number[];\n}\n","import { Component, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriButtonlineComponent, XiriButtonlineSettings } from '../buttonline/buttonline.component';\n\nexport interface XiriPageHeaderSettings {\n\ttitle: string\n\tsubtitle?: string\n\ticon?: string\n\ticonColor?: string\n\tbuttons?: XiriButtonlineSettings\n}\n\n@Component( {\n\t selector: 'xiri-page-header',\n\t templateUrl: './page-header.component.html',\n\t styleUrl: './page-header.component.scss',\n\t imports: [ MatIcon, XiriButtonlineComponent ]\n } )\nexport class XiriPageHeaderComponent {\n\n\tsettings = input.required<XiriPageHeaderSettings>();\n}\n","<div class=\"page-header\">\n\t<div class=\"page-header-content\">\n\t\t@if (settings().icon) {\n\t\t\t<div class=\"page-header-icon\" [class]=\"settings().iconColor || 'primary'\">\n\t\t\t\t<mat-icon>{{ settings().icon }}</mat-icon>\n\t\t\t</div>\n\t\t}\n\t\t<div class=\"page-header-text\">\n\t\t\t<h1>{{ settings().title }}</h1>\n\t\t\t@if (settings().subtitle) {\n\t\t\t\t<p>{{ settings().subtitle }}</p>\n\t\t\t}\n\t\t</div>\n\t</div>\n\t@if (settings().buttons) {\n\t\t<xiri-buttonline [settings]=\"settings().buttons!\"></xiri-buttonline>\n\t}\n</div>\n","import { Component, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatDivider } from '@angular/material/divider';\n\nexport interface XiriDividerSettings {\n\ttext?: string\n\ticon?: string\n\tspacing?: 'compact' | 'normal' | 'large'\n}\n\n@Component( {\n\t selector: 'xiri-divider',\n\t templateUrl: './divider.component.html',\n\t styleUrl: './divider.component.scss',\n\t imports: [ MatIcon, MatDivider ]\n } )\nexport class XiriDividerComponent {\n\n\tsettings = input.required<XiriDividerSettings>();\n}\n","<div class=\"xiri-divider\" [class]=\"settings().spacing || 'normal'\">\n\t@if (settings().text || settings().icon) {\n\t\t<mat-divider></mat-divider>\n\t\t<span class=\"divider-label\">\n\t\t\t@if (settings().icon) { <mat-icon>{{ settings().icon }}</mat-icon> }\n\t\t\t@if (settings().text) { {{ settings().text }} }\n\t\t</span>\n\t\t<mat-divider></mat-divider>\n\t} @else {\n\t\t<mat-divider></mat-divider>\n\t}\n</div>\n","import { Component, input } from '@angular/core';\nimport { XiriStatComponent, XiriStatSettings } from '../stat/stat.component';\n\nexport interface XiriStatGridSettings {\n\tstats: XiriStatSettings[]\n\tcolumns?: number\n\ttitle?: string\n}\n\n@Component( {\n\t selector: 'xiri-stat-grid',\n\t templateUrl: './stat-grid.component.html',\n\t styleUrl: './stat-grid.component.scss',\n\t imports: [ XiriStatComponent ]\n } )\nexport class XiriStatGridComponent {\n\n\tsettings = input.required<XiriStatGridSettings>();\n}\n","@if (settings().title) {\n\t<h3 class=\"stat-grid-title\">{{ settings().title }}</h3>\n}\n<div class=\"stat-grid\" [style.--stat-cols]=\"settings().columns || 4\">\n\t@for (stat of settings().stats; track $index) {\n\t\t<xiri-stat [settings]=\"stat\"></xiri-stat>\n\t}\n</div>\n","import { Component, computed, input, output } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriButtonlineComponent, XiriButtonlineSettings } from '../buttonline/buttonline.component';\nimport { XiriSearchComponent } from '../search/search.component';\n\nexport interface XiriToolbarSearchConfig {\n\tplaceholder?: string\n}\n\nexport interface XiriToolbarSettings {\n\ttitle?: string\n\ticon?: string\n\tsearch?: boolean | XiriToolbarSearchConfig\n\tbuttons?: XiriButtonlineSettings\n}\n\n@Component( {\n\t selector: 'xiri-toolbar',\n\t templateUrl: './toolbar.component.html',\n\t styleUrl: './toolbar.component.scss',\n\t imports: [ MatIcon, XiriButtonlineComponent, XiriSearchComponent ]\n } )\nexport class XiriToolbarComponent {\n\n\tsettings = input.required<XiriToolbarSettings>();\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\n\tsearchChanged = output<string>();\n\n\tsearchPlaceholder = computed( () => {\n\t\tconst search = this.settings().search;\n\t\tif ( typeof search === 'object' && search?.placeholder ) {\n\t\t\treturn search.placeholder;\n\t\t}\n\t\treturn '';\n\t} );\n}\n","<div class=\"xiri-toolbar\">\n\t@if (settings().icon) {\n\t\t<mat-icon>{{ settings().icon }}</mat-icon>\n\t}\n\t@if (settings().title) {\n\t\t<span class=\"toolbar-title\">{{ settings().title }}</span>\n\t}\n\t<div class=\"toolbar-spacer\"></div>\n\t@if (settings().search) {\n\t\t<xiri-search [placeholder]=\"searchPlaceholder()\" [open]=\"true\" (changed)=\"searchChanged.emit($event)\"></xiri-search>\n\t}\n\t@if (settings().buttons) {\n\t\t<xiri-buttonline [settings]=\"settings().buttons!\" [filterData]=\"filterData()\"></xiri-buttonline>\n\t}\n</div>\n","import { Component, computed, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\n\nexport interface XiriDescriptionListItem {\n\tlabel: string\n\tvalue: string\n\ticon?: string\n\tcolor?: string\n\ttype?: 'text' | 'link' | 'html' | 'badge'\n}\n\nexport interface XiriDescriptionListSettings {\n\titems: XiriDescriptionListItem[]\n\tcolumns?: 1 | 2 | 3\n\tlayout?: 'horizontal' | 'stacked'\n}\n\n@Component( {\n\t selector: 'xiri-description-list',\n\t templateUrl: './description-list.component.html',\n\t styleUrl: './description-list.component.scss',\n\t imports: [ MatIcon, SafehtmlPipe ]\n } )\nexport class XiriDescriptionListComponent {\n\n\tsettings = input.required<XiriDescriptionListSettings>();\n\n\tlayoutClass = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst layout = s.layout || 'stacked';\n\t\treturn `${ layout } cols-${ s.columns || 2 }`;\n\t} );\n}\n","<dl class=\"description-list\" [class]=\"layoutClass()\" [style.--dl-cols]=\"settings().columns || 2\">\n\t@for (item of settings().items; track $index) {\n\t\t<div class=\"dl-item\">\n\t\t\t<dt>\n\t\t\t\t@if (item.icon) { <mat-icon [class]=\"item.color || ''\">{{ item.icon }}</mat-icon> }\n\t\t\t\t{{ item.label }}\n\t\t\t</dt>\n\t\t\t<dd>\n\t\t\t\t@switch (item.type) {\n\t\t\t\t\t@case ('link') { <a [href]=\"item.value\" target=\"_blank\" rel=\"noopener\">{{ item.value }}</a> }\n\t\t\t\t\t@case ('html') { <span [innerHTML]=\"item.value | safeHtml\"></span> }\n\t\t\t\t\t@case ('badge') { <span class=\"dl-badge\" [class]=\"item.color || 'primary'\">{{ item.value }}</span> }\n\t\t\t\t\t@default { {{ item.value || '\\u2014' }} }\n\t\t\t\t}\n\t\t\t</dd>\n\t\t</div>\n\t}\n</dl>\n","import { Service, signal, computed, effect, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { notifyThemeChanged } from '../echarts/color';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto';\n\n@Service()\nexport class ThemeService {\n\tprivate readonly platformId = inject(PLATFORM_ID);\n\tprivate readonly isBrowser = isPlatformBrowser(this.platformId);\n\n\t/** Current theme mode setting */\n\tprivate readonly _mode = signal<ThemeMode>('auto');\n\n\t/** Observable theme mode */\n\treadonly mode = this._mode.asReadonly();\n\n\t/** Whether dark mode is currently active (considering auto mode) */\n\treadonly isDark = computed(() => {\n\t\tconst mode = this._mode();\n\t\tif (mode === 'auto') {\n\t\t\treturn this.isBrowser ? this.getSystemPreference() : false;\n\t\t}\n\t\treturn mode === 'dark';\n\t});\n\n\t/** Whether light mode is currently active */\n\treadonly isLight = computed(() => !this.isDark());\n\n\tconstructor() {\n\t\tif (this.isBrowser) {\n\t\t\t// Load saved preference\n\t\t\tconst saved = localStorage.getItem('theme') as ThemeMode | null;\n\t\t\tif (saved && ['light', 'dark', 'auto'].includes(saved)) {\n\t\t\t\tthis._mode.set(saved);\n\t\t\t}\n\n\t\t\t// Apply initial theme\n\t\t\tthis.applyTheme();\n\n\t\t\t// React to mode changes\n\t\t\teffect(() => {\n\t\t\t\tthis.applyTheme();\n\t\t\t});\n\n\t\t\t// Listen for system preference changes\n\t\t\tconst mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\t\t\tmediaQuery.addEventListener('change', () => {\n\t\t\t\tif (this._mode() === 'auto') {\n\t\t\t\t\tthis.applyTheme();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Set the theme mode\n\t * @param mode - 'light', 'dark', or 'auto' (follow system preference)\n\t */\n\tsetTheme(mode: ThemeMode): void {\n\t\tthis._mode.set(mode);\n\t\tif (this.isBrowser) {\n\t\t\tlocalStorage.setItem('theme', mode);\n\t\t}\n\t}\n\n\t/**\n\t * Toggle between light and dark mode\n\t * If currently auto, switches to opposite of current system preference\n\t */\n\ttoggle(): void {\n\t\tconst current = this._mode();\n\t\tif (current === 'auto') {\n\t\t\t// Switch to opposite of current system preference\n\t\t\tthis.setTheme(this.getSystemPreference() ? 'light' : 'dark');\n\t\t} else {\n\t\t\tthis.setTheme(current === 'light' ? 'dark' : 'light');\n\t\t}\n\t}\n\n\t/**\n\t * Reset to auto (system preference)\n\t */\n\tresetToAuto(): void {\n\t\tthis.setTheme('auto');\n\t}\n\n\tprivate getSystemPreference(): boolean {\n\t\tif (!this.isBrowser) return false;\n\t\treturn window.matchMedia('(prefers-color-scheme: dark)').matches;\n\t}\n\n\tprivate applyTheme(): void {\n\t\tif (!this.isBrowser) return;\n\n\t\tconst mode = this._mode();\n\t\tconst root = document.documentElement;\n\n\t\t// Remove existing theme classes\n\t\troot.classList.remove('light-theme', 'dark-theme');\n\n\t\t// Apply theme class based on mode\n\t\tif (mode === 'light') {\n\t\t\troot.classList.add('light-theme');\n\t\t} else if (mode === 'dark') {\n\t\t\troot.classList.add('dark-theme');\n\t\t}\n\t\t// 'auto' mode: no class needed, CSS media query handles it\n\n\t\t// Charts resolve theme colors to literals (a canvas cannot read CSS\n\t\t// variables), so they have to be told to re-resolve.\n\t\tnotifyThemeChanged();\n\t}\n}\n","import { defaultXiriDataServiceConfig, XiriDataServiceConfig } from \"./services/data.service\";\nimport { EnvironmentProviders, makeEnvironmentProviders } from \"@angular/core\";\n\nexport function provideXiriServices(\n\tconfig: Partial<XiriDataServiceConfig>\n): EnvironmentProviders {\n\tconst merged = { ...defaultXiriDataServiceConfig, ...config };\n\t\n\treturn makeEnvironmentProviders( [\n\t\t {\n\t\t\t provide: XiriDataServiceConfig,\n\t\t\t useValue: merged,\n\t\t }\n\t ] );\n}","/*\n * Public API Surface of xiri-ng\n */\n\nexport * from './lib/types/color.type';\nexport { SafehtmlPipe } from \"./lib/pipes/safehtml.pipe\";\nexport { XiriUrlPipe, type XiriUrl } from \"./lib/pipes/url.pipe\";\n\nexport * from \"./lib/formfields/field.interface\";\nexport * from \"./lib/formfields/form-fields.component\";\nexport * from \"./lib/formfields/select/select.directive\";\n\nexport * from \"./lib/raw-table/tabefield.interface\";\nexport * from \"./lib/raw-table/xiri-raw-table.component\";\nexport * from \"./lib/table/table.component\";\n\nexport * from \"./lib/form/form.component\";\nexport * from \"./lib/dialog/dialog.component\";\nexport * from './lib/sidepanel/sidepanel-ref';\nexport * from './lib/sidepanel/sidepanel.component';\nexport * from './lib/sidepanel/sidepanel.service';\nexport * from './lib/query/query.component';\n\nexport * from \"./lib/card/card.component\";\nexport * from './lib/buttonstyle/buttonstyle.component';\nexport * from './lib/button/button.component';\nexport * from \"./lib/buttonline/buttonline.component\";\nexport * from \"./lib/dyncomponent/dyndata.interface\";\nexport * from \"./lib/dyncomponent/dyncomponent.component\";\nexport * from \"./lib/cardlink/cardlink.component\";\nexport * from './lib/links/links.component';\nexport * from \"./lib/alert/alert.component\";\nexport * from './lib/stepper/stepper.component';\nexport * from './lib/done/done.component';\nexport * from './lib/error/error.component';\nexport * from \"./lib/header/header.component\";\nexport * from './lib/list/list.component';\nexport * from './lib/infopoint/infopoint.component';\nexport * from './lib/multiprogress/multiprogress.component';\nexport * from './lib/progress/progress.component';\nexport * from './lib/imagetext/imagetext.component';\nexport * from './lib/search/search.component';\nexport * from './lib/sidenav/sidenav.component';\nexport * from './lib/tabs/tabs.component';\nexport * from './lib/expansion/expansion.component';\n\nexport * from './lib/breadcrumb/breadcrumb.component';\nexport * from './lib/skeleton/skeleton.component';\nexport * from './lib/empty-state/empty-state.component';\nexport * from './lib/status/status.component';\nexport * from './lib/callout/callout.component';\nexport * from './lib/stat/stat.component';\nexport * from './lib/timeline/timeline.component';\nexport * from './lib/barchart/barchart.component';\nexport * from './lib/linechart/linechart.component';\nexport * from './lib/piechart/piechart.component';\nexport * from './lib/gaugechart/gaugechart.component';\nexport * from './lib/bulletchart/bulletchart.component';\nexport * from './lib/heatmap/heatmap.component';\nexport * from './lib/calendar/calendar.component';\nexport * from './lib/tree/tree.component';\nexport * from './lib/sankey/sankey.component';\nexport * from './lib/gantt/gantt.component';\nexport * from './lib/echarts';\n\nexport * from './lib/page-header/page-header.component';\nexport * from './lib/section/section.component';\nexport * from './lib/divider/divider.component';\nexport * from './lib/stat-grid/stat-grid.component';\nexport * from './lib/multi-stat/multi-stat.component';\nexport * from './lib/toolbar/toolbar.component';\nexport * from './lib/description-list/description-list.component';\n\nexport * from './lib/layout/cols.directive';\n\nexport * from './lib/services/data.service';\nexport * from './lib/services/form.service';\nexport * from './lib/services/localStorage.service';\nexport * from './lib/services/sessionStorage.service';\nexport * from './lib/services/theme.service';\nexport * from './lib/services/locale.service';\nexport * from './lib/services/snackbar.service';\nexport * from './lib/services/response-handler.service';\nexport * from './lib/services/download.service';\n\nexport * from './lib/provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["errorMessage","debounceTime","MatOption","filter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"xiriframework-xiri-ng.mjs","sources":["../../../projects/xiri-ng/src/lib/pipes/safehtml.pipe.ts","../../../projects/xiri-ng/src/lib/pipes/url.pipe.ts","../../../projects/xiri-ng/src/lib/layout/cols.directive.ts","../../../projects/xiri-ng/src/lib/services/snackbar.service.ts","../../../projects/xiri-ng/src/lib/services/data.service.ts","../../../projects/xiri-ng/src/lib/services/error.util.ts","../../../projects/xiri-ng/src/lib/formfields/helper/empty-value.ts","../../../projects/xiri-ng/src/lib/formfields/file/file.component.ts","../../../projects/xiri-ng/src/lib/formfields/file/file.component.html","../../../projects/xiri-ng/src/lib/formfields/timelimit/timelimit.component.ts","../../../projects/xiri-ng/src/lib/formfields/timelimit/timelimit.component.html","../../../projects/xiri-ng/src/lib/formfields/volume/volume.component.ts","../../../projects/xiri-ng/src/lib/formfields/volume/volume.component.html","../../../projects/xiri-ng/src/lib/services/locale.service.ts","../../../projects/xiri-ng/src/lib/formfields/helper/fieldmain.ts","../../../projects/xiri-ng/src/lib/formfields/datetimerange/datetimerange.component.ts","../../../projects/xiri-ng/src/lib/formfields/datetimerange/datetimerange.component.html","../../../projects/xiri-ng/src/lib/formfields/daterange/daterange.component.ts","../../../projects/xiri-ng/src/lib/formfields/daterange/daterange.component.html","../../../projects/xiri-ng/src/lib/formfields/date/date.component.ts","../../../projects/xiri-ng/src/lib/formfields/date/date.component.html","../../../projects/xiri-ng/src/lib/formfields/yearmonth/yearmonth.component.ts","../../../projects/xiri-ng/src/lib/formfields/yearmonth/yearmonth.component.html","../../../projects/xiri-ng/src/lib/search/search.component.ts","../../../projects/xiri-ng/src/lib/search/search.component.html","../../../projects/xiri-ng/src/lib/formfields/treeselect/treeselect.component.ts","../../../projects/xiri-ng/src/lib/formfields/treeselect/treeselect.component.html","../../../projects/xiri-ng/src/lib/formfields/select/select.directive.ts","../../../projects/xiri-ng/src/lib/formfields/chips/chips.component.ts","../../../projects/xiri-ng/src/lib/formfields/chips/chips.component.html","../../../projects/xiri-ng/src/lib/formfields/form-fields.component.ts","../../../projects/xiri-ng/src/lib/formfields/form-fields.component.html","../../../projects/xiri-ng/src/lib/raw-table/xiri-raw-table.component.ts","../../../projects/xiri-ng/src/lib/raw-table/xiri-raw-table.component.html","../../../projects/xiri-ng/src/lib/buttonstyle/buttonstyle.component.ts","../../../projects/xiri-ng/src/lib/buttonstyle/buttonstyle.component.html","../../../projects/xiri-ng/src/lib/done/done.component.ts","../../../projects/xiri-ng/src/lib/done/done.component.html","../../../projects/xiri-ng/src/lib/error/error.component.ts","../../../projects/xiri-ng/src/lib/error/error.component.html","../../../projects/xiri-ng/src/lib/services/download.service.ts","../../../projects/xiri-ng/src/lib/dialog/dialog.component.ts","../../../projects/xiri-ng/src/lib/dialog/dialog.component.html","../../../projects/xiri-ng/src/lib/services/response-handler.service.ts","../../../projects/xiri-ng/src/lib/button/button.component.ts","../../../projects/xiri-ng/src/lib/button/button.component.html","../../../projects/xiri-ng/src/lib/table/inline-edit.service.ts","../../../projects/xiri-ng/src/lib/services/storage-base.ts","../../../projects/xiri-ng/src/lib/services/localStorage.service.ts","../../../projects/xiri-ng/src/lib/table/tree.service.ts","../../../projects/xiri-ng/src/lib/buttonline/buttonline.component.ts","../../../projects/xiri-ng/src/lib/buttonline/buttonline.component.html","../../../projects/xiri-ng/src/lib/services/sessionStorage.service.ts","../../../projects/xiri-ng/src/lib/empty-state/empty-state.component.ts","../../../projects/xiri-ng/src/lib/empty-state/empty-state.component.html","../../../projects/xiri-ng/src/lib/table/table.component.ts","../../../projects/xiri-ng/src/lib/table/table.component.html","../../../projects/xiri-ng/src/lib/services/form.service.ts","../../../projects/xiri-ng/src/lib/form/form.component.ts","../../../projects/xiri-ng/src/lib/form/form.component.html","../../../projects/xiri-ng/src/lib/sidepanel/sidepanel-ref.ts","../../../projects/xiri-ng/src/lib/progress/progress.component.ts","../../../projects/xiri-ng/src/lib/progress/progress.component.html","../../../projects/xiri-ng/src/lib/infopoint/infopoint.component.ts","../../../projects/xiri-ng/src/lib/infopoint/infopoint.component.html","../../../projects/xiri-ng/src/lib/list/list.component.ts","../../../projects/xiri-ng/src/lib/list/list.component.html","../../../projects/xiri-ng/src/lib/header/header.component.ts","../../../projects/xiri-ng/src/lib/header/header.component.html","../../../projects/xiri-ng/src/lib/stepper/stepper.component.ts","../../../projects/xiri-ng/src/lib/stepper/stepper.component.html","../../../projects/xiri-ng/src/lib/query/query.component.ts","../../../projects/xiri-ng/src/lib/query/query.component.html","../../../projects/xiri-ng/src/lib/links/links.component.ts","../../../projects/xiri-ng/src/lib/links/links.component.html","../../../projects/xiri-ng/src/lib/cardlink/cardlink.component.ts","../../../projects/xiri-ng/src/lib/cardlink/cardlink.component.html","../../../projects/xiri-ng/src/lib/skeleton/skeleton.component.ts","../../../projects/xiri-ng/src/lib/skeleton/skeleton.component.html","../../../projects/xiri-ng/src/lib/card/card.component.ts","../../../projects/xiri-ng/src/lib/card/card.component.html","../../../projects/xiri-ng/src/lib/tabs/tabs.component.ts","../../../projects/xiri-ng/src/lib/tabs/tabs.component.html","../../../projects/xiri-ng/src/lib/expansion/expansion.component.ts","../../../projects/xiri-ng/src/lib/expansion/expansion.component.html","../../../projects/xiri-ng/src/lib/stat/stat.component.ts","../../../projects/xiri-ng/src/lib/stat/stat.component.html","../../../projects/xiri-ng/src/lib/section/section.component.ts","../../../projects/xiri-ng/src/lib/section/section.component.html","../../../projects/xiri-ng/src/lib/multi-stat/multi-stat.component.ts","../../../projects/xiri-ng/src/lib/multi-stat/multi-stat.component.html","../../../projects/xiri-ng/src/lib/status/status.component.ts","../../../projects/xiri-ng/src/lib/status/status.component.html","../../../projects/xiri-ng/src/lib/callout/callout.component.ts","../../../projects/xiri-ng/src/lib/callout/callout.component.html","../../../projects/xiri-ng/src/lib/dyncomponent/dyncomponent.component.ts","../../../projects/xiri-ng/src/lib/dyncomponent/dyncomponent.component.html","../../../projects/xiri-ng/src/lib/sidepanel/sidepanel.component.ts","../../../projects/xiri-ng/src/lib/sidepanel/sidepanel.service.ts","../../../projects/xiri-ng/src/lib/alert/alert.component.ts","../../../projects/xiri-ng/src/lib/alert/alert.component.html","../../../projects/xiri-ng/src/lib/multiprogress/multiprogress.component.ts","../../../projects/xiri-ng/src/lib/multiprogress/multiprogress.component.html","../../../projects/xiri-ng/src/lib/imagetext/imagetext.component.ts","../../../projects/xiri-ng/src/lib/imagetext/imagetext.component.html","../../../projects/xiri-ng/src/lib/sidenav/sidenav.component.ts","../../../projects/xiri-ng/src/lib/sidenav/sidenav.component.html","../../../projects/xiri-ng/src/lib/breadcrumb/breadcrumb.component.ts","../../../projects/xiri-ng/src/lib/breadcrumb/breadcrumb.component.html","../../../projects/xiri-ng/src/lib/timeline/timeline.component.ts","../../../projects/xiri-ng/src/lib/timeline/timeline.component.html","../../../projects/xiri-ng/src/lib/echarts/echarts-host.component.ts","../../../projects/xiri-ng/src/lib/echarts/echarts-host.component.html","../../../projects/xiri-ng/src/lib/echarts/color.ts","../../../projects/xiri-ng/src/lib/echarts/tooltip.ts","../../../projects/xiri-ng/src/lib/barchart/barchart.component.ts","../../../projects/xiri-ng/src/lib/linechart/linechart.component.ts","../../../projects/xiri-ng/src/lib/piechart/piechart.component.ts","../../../projects/xiri-ng/src/lib/gaugechart/gaugechart.component.ts","../../../projects/xiri-ng/src/lib/bulletchart/bulletchart.component.ts","../../../projects/xiri-ng/src/lib/heatmap/heatmap.component.ts","../../../projects/xiri-ng/src/lib/calendar/calendar.component.ts","../../../projects/xiri-ng/src/lib/tree/tree.component.ts","../../../projects/xiri-ng/src/lib/sankey/sankey.component.ts","../../../projects/xiri-ng/src/lib/gantt/gantt.component.ts","../../../projects/xiri-ng/src/lib/echarts/params.ts","../../../projects/xiri-ng/src/lib/page-header/page-header.component.ts","../../../projects/xiri-ng/src/lib/page-header/page-header.component.html","../../../projects/xiri-ng/src/lib/divider/divider.component.ts","../../../projects/xiri-ng/src/lib/divider/divider.component.html","../../../projects/xiri-ng/src/lib/stat-grid/stat-grid.component.ts","../../../projects/xiri-ng/src/lib/stat-grid/stat-grid.component.html","../../../projects/xiri-ng/src/lib/toolbar/toolbar.component.ts","../../../projects/xiri-ng/src/lib/toolbar/toolbar.component.html","../../../projects/xiri-ng/src/lib/description-list/description-list.component.ts","../../../projects/xiri-ng/src/lib/description-list/description-list.component.html","../../../projects/xiri-ng/src/lib/services/theme.service.ts","../../../projects/xiri-ng/src/lib/provider.ts","../../../projects/xiri-ng/src/public-api.ts","../../../projects/xiri-ng/src/xiriframework-xiri-ng.ts"],"sourcesContent":["import { DomSanitizer } from '@angular/platform-browser';\nimport { inject, Pipe, PipeTransform } from '@angular/core';\n\n\n@Pipe( {\n\t name: 'safeHtml'\n } )\nexport class SafehtmlPipe implements PipeTransform {\n\t\n\tprivate sanitizer: DomSanitizer = inject( DomSanitizer );\n\t\n\ttransform( style: string ): string {\n\t\treturn this.sanitizer.bypassSecurityTrustHtml( style ) as string;\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DefaultUrlSerializer, Params } from '@angular/router';\n\nexport interface XiriUrl {\n\tpath: string;\n\tqueryParams: Params;\n}\n\n// Trennt einen URL-String in Pfad und Query-Params. Der Pfad wird als String an\n// [routerLink] gebunden, damit RouterLink relative Links (z. B. \"Test/Query/Page\")\n// weiterhin relativ zur ActivatedRoute auflöst (Prefix bleibt erhalten). Ein an\n// [routerLink] gebundener UrlTree würde dagegen IMMER absolut navigieren und den\n// Prefix verlieren. Die Query kommt separat über [queryParams] rein — sonst würde\n// ein \"?\" im Pfad-String von createUrlTree als Segment percent-encodiert → 404.\nconst serializer = new DefaultUrlSerializer();\n\n@Pipe( { name: 'xiriUrl' } )\nexport class XiriUrlPipe implements PipeTransform {\n\n\ttransform( url: string | null | undefined ): XiriUrl | null {\n\t\tif ( !url )\n\t\t\treturn null;\n\t\tconst tree = serializer.parse( url );\n\t\treturn { path: url.split( /[?#]/ )[ 0 ], queryParams: tree.queryParams };\n\t}\n}\n","import { Directive, computed, input } from '@angular/core';\n\nexport type XiriCols = number | { sm?: number; md?: number; lg?: number; xl?: number };\n\nexport function colsToClasses(cols: XiriCols | undefined): string {\n\tif (cols === undefined) return 'xcol';\n\tif (typeof cols === 'number') return `xcol xcol-md-${ cols }`;\n\tconst parts = ['xcol'];\n\tfor (const bp of ['sm', 'md', 'lg', 'xl'] as const)\n\t\tif (cols[bp] !== undefined) parts.push(`xcol-${ bp }-${ cols[bp] }`);\n\treturn parts.join(' ');\n}\n\n@Directive({\n\tselector: '[xiriCols]',\n\thost: { '[class]': 'classes()' }\n})\nexport class XiriColsDirective {\n\txiriCols = input<XiriCols>();\n\tclasses = computed(() => colsToClasses(this.xiriCols()));\n}\n","import { inject, Injectable } from '@angular/core';\nimport { MatSnackBar, MatSnackBarConfig, MatSnackBarRef, TextOnlySnackBar } from '@angular/material/snack-bar';\n\nexport type XiriSnackbarType = 'success' | 'error' | 'info' | 'warning';\n\n@Injectable( {\n\t providedIn: 'root',\n } )\nexport class XiriSnackbarService {\n\n\tprivate snackbar = inject( MatSnackBar );\n\n\tsuccess( message: string, duration = 3000, action?: string ): MatSnackBarRef<TextOnlySnackBar> {\n\t\treturn this.show( message, 'success', duration, action );\n\t}\n\n\terror( message: string, duration = 5000, action?: string ): MatSnackBarRef<TextOnlySnackBar> {\n\t\treturn this.show( message, 'error', duration, action );\n\t}\n\n\tinfo( message: string, duration = 3000, action?: string ): MatSnackBarRef<TextOnlySnackBar> {\n\t\treturn this.show( message, 'info', duration, action );\n\t}\n\n\twarning( message: string, duration = 4000, action?: string ): MatSnackBarRef<TextOnlySnackBar> {\n\t\treturn this.show( message, 'warning', duration, action );\n\t}\n\n\thandleResponse( response: unknown ): boolean {\n\t\tconst res = response as { message?: string; messageType?: string } | null | undefined;\n\t\tif ( !res?.message || !res?.messageType ) return false;\n\t\tswitch ( res.messageType as XiriSnackbarType ) {\n\t\t\tcase 'success': this.success( res.message ); break;\n\t\t\tcase 'error': this.error( res.message ); break;\n\t\t\tcase 'info': this.info( res.message ); break;\n\t\t\tcase 'warning': this.warning( res.message ); break;\n\t\t\tdefault: this.info( res.message );\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate show( message: string, type: XiriSnackbarType, duration: number, action?: string ): MatSnackBarRef<TextOnlySnackBar> {\n\t\tconst config: MatSnackBarConfig = {\n\t\t\tduration: duration,\n\t\t\thorizontalPosition: 'center',\n\t\t\tverticalPosition: 'bottom',\n\t\t\tpanelClass: [ `xiri-snackbar-${ type }` ],\n\t\t\tpoliteness: type === 'error' ? 'assertive' : 'polite',\n\t\t};\n\n\t\treturn this.snackbar.open( message, action || undefined, config );\n\t}\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Observable, tap } from 'rxjs';\nimport { XiriSnackbarService } from './snackbar.service';\n\n// providedIn 'root' so the class doubles as its own default: an app that never calls\n// provideXiriServices() gets the documented '/api/' base instead of a NullInjector error.\n// provideXiriServices() still overrides it with a useValue provider.\n@Injectable( { providedIn: 'root' } )\nexport class XiriDataServiceConfig {\n\tapi = '/api/';\n}\n\nexport const defaultXiriDataServiceConfig: XiriDataServiceConfig = {\n\tapi: '/api/',\n};\n\n@Injectable( {\n\t providedIn: 'root',\n } )\nexport class XiriDataService {\n\t\n\tprivate http: HttpClient = inject( HttpClient );\n\tprivate config: XiriDataServiceConfig = inject( XiriDataServiceConfig );\n\tprivate snackbar = inject( XiriSnackbarService );\n\n\tpublic get( url: string ): Observable<object> {\n\t\treturn this.http.get( this.config.api + url ).pipe(\n\t\t\ttap( ( res: object ) => this.snackbar.handleResponse( res ) )\n\t\t);\n\t}\n\n\tpublic post( url: string, data: unknown ): Observable<unknown> {\n\t\treturn this.http.post( this.config.api + url, data ).pipe(\n\t\t\ttap( ( res: unknown ) => this.snackbar.handleResponse( res ) )\n\t\t);\n\t}\n\n\tpublic postFile( url: string, data: unknown ): Observable<Blob> {\n\t\treturn this.http.post( this.config.api + url, data, { responseType: 'blob' } );\n\t}\n\n\tpublic postFileResponse( url: string, data: unknown ): Observable<HttpResponse<Blob>> {\n\t\treturn this.http.post( this.config.api + url, data, { observe: 'response', responseType: 'blob' } );\n\t}\n\n\t/** @deprecated Use postFileResponse() + XiriDownloadService.download() instead */\n\tpublic postDownload( url: string, data: unknown ) {\n\t\tconsole.warn( 'XiriDataService.postDownload() is deprecated. Use postFileResponse() + XiriDownloadService.download() instead.' );\n\t\tconst downForm = document.createElement( 'form' );\n\t\tdownForm.target = '_blank';\n\t\tdownForm.method = 'POST';\n\t\tdownForm.action = url;\n\t\t\n\t\tconst input = document.createElement( 'input' );\n\t\tinput.type = 'hidden';\n\t\tinput.name = 'data';\n\t\tinput.setAttribute( 'value', JSON.stringify( data ) );\n\t\tdownForm.appendChild( input );\n\t\t\n\t\tdocument.body.appendChild( downForm );\n\t\tdownForm.submit();\n\t}\n\t\n\tpublic getConfigApi(): string {\n\t\treturn this.config.api;\n\t}\n}\n","import { HttpErrorResponse } from '@angular/common/http';\n\nexport function parseHttpError( err: HttpErrorResponse ): string {\n\tif ( err.status === 400 || err.status === 424 )\n\t\treturn err.error?.error || 'Format Error';\n\tif ( err.status === 403 )\n\t\treturn err.error?.error || 'Access denied';\n\tif ( err.status === 404 )\n\t\treturn 'Not found';\n\tif ( err.status === 0 )\n\t\treturn 'Connection error';\n\treturn 'Unknown error';\n}\n","import { XiriFormField } from '../field.interface';\n\n// The \"empty\" value used to clear a control, matching the shape the control currently holds.\nexport function emptyValueForField( field: XiriFormField ): unknown {\n\tconst value = field.control?.value;\n\tif ( Array.isArray( value ) )\n\t\treturn [];\n\tif ( typeof value === 'string' )\n\t\treturn '';\n\treturn null;\n}\n","import { ChangeDetectorRef, Component, ElementRef, inject, Input, OnDestroy } from '@angular/core';\nimport {\n\tMatError,\n\tMatFormField,\n\tMatFormFieldControl,\n\tMatHint,\n\tMatLabel,\n\tMatSuffix\n} from \"@angular/material/form-field\";\nimport {\n\tControlValueAccessor,\n\tFormControl,\n\tFormGroup,\n\tFormsModule,\n\tNgControl,\n\tReactiveFormsModule\n} from \"@angular/forms\";\nimport { Subject } from \"rxjs\";\nimport { FocusMonitor } from \"@angular/cdk/a11y\";\nimport { XiriFormField } from \"../field.interface\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatInput } from '@angular/material/input';\n\ninterface FileForm {\n\tfiles: FormControl<File[] | null>\n\ttext: FormControl<string | null>\n}\n\ninterface FileData {\n\tfile: File\n\tname: string;\n\tdata: string;\n}\n\ninterface FileValue {\n\tname: string;\n\tdata: string;\n}\n\n@Component( {\n\t selector: 'xiri-file',\n\t templateUrl: './file.component.html',\n\t styleUrls: [ './file.component.scss' ],\n\t host: {\n\t\t '[id]': 'id',\n\t\t '[attr.aria-describedby]': 'describedBy'\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriFileComponent\n\t } ],\n\t imports: [\n\t\t MatFormField,\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatLabel,\n\t\t MatInput,\n\t\t MatIconButton,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatHint,\n\t\t MatError,\n\t ]\n } )\nexport class XiriFileComponent implements ControlValueAccessor, MatFormFieldControl<FileValue[] | null | undefined>, OnDestroy {\n\tprivate focusMonitor = inject( FocusMonitor );\n\tngControl = inject( NgControl, { optional: true, self: true } );\n\tprivate _elementRef = inject<ElementRef<HTMLElement>>( ElementRef );\n\tprivate cdr = inject( ChangeDetectorRef );\n\t\n\t\n\tstatic nextId = 0;\n\tid = `xiri-file-${ XiriFileComponent.nextId++ }`;\n\tdescribedBy = '';\n\t\n\tparts: FormGroup<FileForm>;\n\tstateChanges = new Subject<void>();\n\tfocused = false;\n\tcontrolType = 'xiri-file';\n\t\n\treadonly placeholder!: string;\n\tpublic required = false;\n\tpublic disabled = false;\n\tshouldLabelFloat = true;\n\n\tprivate _field!: XiriFormField;\n\tcurrentFiles: FileData[] = [];\n\t\n\tconstructor() {\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\t\t\n\t\tthis.parts = new FormGroup<FileForm>( {\n\t\t\t files: new FormControl<File[] | null>( null ),\n\t\t\t text: new FormControl<string | null>( null )\n\t\t } );\n\t\t\n\t\tthis.focusMonitor.monitor( this._elementRef, true ).subscribe( origin => {\n\t\t\tthis.ngControl?.control?.markAsTouched();\n\t\t\tthis.focused = !!origin;\n\t\t\tthis.cdr.markForCheck();\n\t\t} );\n\t}\n\t\n\tonChange: ( value: FileValue[] | null | undefined ) => void = () => { /* intentionally empty */ };\n\tonTouched = () => { /* intentionally empty */ };\n\t\n\tngOnDestroy() {\n\t\tthis.stateChanges.complete();\n\t\tthis.focusMonitor.stopMonitoring( this._elementRef );\n\t}\n\t\n\t@Input()\n\tget value(): FileValue[] | null | undefined {\n\n\t\tif ( this.errorState )\n\t\t\treturn undefined;\n\t\tif ( this.currentFiles.length == 0 )\n\t\t\treturn null;\n\n\t\treturn this.currentFiles.map( ( file ) => {\n\t\t\treturn {\n\t\t\t\tname: file.name,\n\t\t\t\tdata: file.data\n\t\t\t};\n\t\t} );\n\t}\n\n\tset value( input: FileValue[] | null | undefined ) {\n\n\t\tif ( input === null || input === undefined )\n\t\t\treturn;\n\n\t\t// console.log( 'xiriFile input', input );\n\t\t// this.onChange( this.value );\n\t\t// this.stateChanges.next();\n\t}\n\t\n\t\n\t@Input()\n\tget field(): XiriFormField {\n\t\treturn this._field;\n\t}\n\t\n\tset field( value: XiriFormField ) {\n\t\t\n\t\tthis._field = value;\n\n\t\tthis.required = value.required ?? false;\n\t\tthis.disabled = value.disabled ?? false;\n\t\tif ( this.disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\t\n\tget errorState(): boolean {\n\t\treturn this.parts.invalid && !!this.ngControl?.touched;\n\t}\n\t\n\tget empty() {\n\t\treturn this.value === null;\n\t}\n\t\n\twriteValue( value: FileValue[] | null | undefined ): void {\n\t\tthis.value = value;\n\t}\n\n\tregisterOnChange( fn: ( value: FileValue[] | null | undefined ) => void ): void {\n\t\tthis.onChange = fn;\n\t}\n\n\tregisterOnTouched( fn: () => void ): void {\n\t\tthis.onTouched = fn;\n\t}\n\n\tsetDisabledState( isDisabled: boolean ): void {\n\t\tthis.disabled = isDisabled;\n\t}\n\n\tsetDescribedByIds( ids: string[] ) {\n\t\tthis.describedBy = ids.join( ' ' );\n\t}\n\n\tonContainerClick(): void { /* intentionally empty */ }\n\t\n\tfileChange( event: Event ) {\n\t\t\n\t\tconst element = event.currentTarget as HTMLInputElement;\n\t\tconst fileList: FileList | null = element.files;\n\t\t\n\t\tif ( fileList === null || fileList.length === 0 || fileList.length > 100 )\n\t\t\treturn;\n\t\t\n\t\tconst fieldFiles = this.parts.get( 'files' );\n\t\tconst fieldText = this.parts.get( 'text' );\n\t\tconst files = [];\n\n\t\tfor ( let i = 0; i < fileList.length; i++ ) {\n\t\t\tconst file = fileList.item( i );\n\t\t\tif ( file === null || file.size > ( this._field.max ?? Infinity ) ) {\n\t\t\t\tconsole.log( 'file too large or null', file, this._field );\n\t\t\t\tthis.currentFiles = [];\n\t\t\t\tfieldFiles?.setValue( null );\n\t\t\t\tfieldText?.setValue( null );\n\t\t\t\t\n\t\t\t\tthis.onChange( this.value );\n\t\t\t\tthis.stateChanges.next();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tconst reader = new FileReader();\n\t\t\t\n\t\t\treader.addEventListener( \"load\", () => {\n\t\t\t\tthis.currentFiles.push( {\n\t\t\t\t\t file: file,\n\t\t\t\t\t name: file.name,\n\t\t\t\t\t data: reader.result as string\n\t\t\t\t } );\n\n\t\t\t\tthis.onChange( this.value );\n\t\t\t\tthis.stateChanges.next();\n\t\t\t\tthis.cdr.markForCheck();\n\t\t\t}, false );\n\t\t\t\n\t\t\treader.readAsDataURL( file );\n\t\t\tfiles.push( file );\n\t\t}\n\t\t\n\t\tfieldFiles?.setValue( files );\n\t\tfieldText?.setValue( files.map( ( file ) => file.name ).join( ', ' ) );\n\t}\n\t\n\tpublic getErrorMessage(): string {\n\t\t\n\t\tconst errors = this.parts.get( 'text' )?.errors;\n\n\t\tif ( errors?.required )\n\t\t\treturn 'required';\n\t\t\n\t\tconsole.log( 'unknown error file', errors );\n\t\t\n\t\treturn 'error';\n\t}\n\t\n}\n","<mat-form-field [formGroup]=\"parts\" floatLabel=\"auto\" class=\"fileselect\" (click)=\"fileInput.click()\">\n\t<mat-label>{{ field.name }}</mat-label>\n\n\t<input matInput formControlName=\"text\" type=\"text\" [required]=\"required\" readonly>\n\t<button mat-icon-button matSuffix class=\"form-field-button\" aria-label=\"Datei auswählen\">\n\t\t<mat-icon>file_upload</mat-icon>\n\t</button>\n\n\t<input hidden type=\"file\" [accept]=\"field.accept\" [multiple]=\"field.multiple\" (change)=\"fileChange($event)\" #fileInput>\n\n\t@if (field.hint) {\n\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t}\n\t@if (errorState) {\n\t\t<mat-error>{{ getErrorMessage() }}</mat-error>\n\t}\n</mat-form-field>","import { ChangeDetectorRef, Component, ElementRef, inject, Input, OnDestroy, OnInit } from '@angular/core';\nimport { MatFormField, MatFormFieldControl, MatLabel } from \"@angular/material/form-field\";\nimport {\n\tAbstractControl,\n\tControlValueAccessor,\n\tFormControl,\n\tFormGroup,\n\tFormsModule,\n\tNgControl,\n\tReactiveFormsModule,\n\tValidationErrors\n} from \"@angular/forms\";\nimport { Subject } from \"rxjs\";\nimport { FocusMonitor } from \"@angular/cdk/a11y\";\nimport { coerceBooleanProperty } from \"@angular/cdk/coercion\";\nimport { KeyValuePipe } from '@angular/common';\nimport { MatOption } from '@angular/material/core';\nimport { MatSelect } from '@angular/material/select';\nimport { MatCheckbox } from '@angular/material/checkbox';\n\ninterface TimelimitForm {\n\tcheck: FormControl<boolean>\n\twd0: FormControl<boolean>\n\twd1: FormControl<boolean>\n\twd2: FormControl<boolean>\n\twd3: FormControl<boolean>\n\twd4: FormControl<boolean>\n\twd5: FormControl<boolean>\n\twd6: FormControl<boolean>\n\tfromhour: FormControl<number>\n\tfrommin: FormControl<number>\n\ttohour: FormControl<number>\n\ttomin: FormControl<number>\n\tinout: FormControl<boolean>\n}\n\ninterface TimelimitValue {\n\tcheck: boolean;\n\twd: boolean[];\n\tfromhour: number;\n\tfrommin: number;\n\ttohour: number;\n\ttomin: number;\n\tin: boolean;\n}\n\n\n@Component( {\n\t selector: 'xiri-timelimit',\n\t templateUrl: './timelimit.component.html',\n\t styleUrls: [ './timelimit.component.scss' ],\n\t host: {\n\t\t '[id]': 'id',\n\t\t '[attr.aria-describedby]': 'describedBy'\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriTimelimitComponent\n\t } ],\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatCheckbox,\n\t\t MatLabel,\n\t\t MatFormField,\n\t\t MatSelect,\n\t\t MatOption,\n\t\t KeyValuePipe,\n\t ]\n } )\nexport class XiriTimelimitComponent implements ControlValueAccessor, MatFormFieldControl<TimelimitValue>, OnInit, OnDestroy {\n\tprivate focusMonitor = inject( FocusMonitor );\n\tngControl = inject( NgControl, { optional: true, self: true } );\n\tprivate _elementRef = inject<ElementRef<HTMLElement>>( ElementRef );\n\tprivate cdr = inject( ChangeDetectorRef );\n\t\n\t\n\tstatic nextId = 0;\n\tid = `xiri-timelimit-${ XiriTimelimitComponent.nextId++ }`;\n\tdescribedBy = '';\n\t\n\treadonly autofilled: boolean = false;\n\t\n\terrorState = false;\n\tparts: FormGroup<TimelimitForm>;\n\tstateChanges = new Subject<void>();\n\tfocused = false;\n\tcontrolType = 'xiri-timelimit';\n\t\n\tprivate _placeholder = '';\n\tprivate _required = true;\n\tprivate _disabled = false;\n\tshouldLabelFloat = true;\n\t\n\thours = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09',\n\t '10', '11', '12', '13', '14', '15', '16', '17', '18', '19',\n\t '20', '21', '22', '23', '24' ];\n\tminutes = {\n\t\t0: '00',\n\t\t5: '05',\n\t\t10: '10',\n\t\t15: '15',\n\t\t20: '20',\n\t\t25: '25',\n\t\t30: '30',\n\t\t35: '35',\n\t\t40: '40',\n\t\t45: '45',\n\t\t50: '50',\n\t\t55: '55'\n\t};\n\t\n\tconstructor() {\n\t\tif ( this.ngControl != null ) {\n\t\t\tthis.ngControl.valueAccessor = this;\n\t\t}\n\t\t\n\t\tthis.parts = new FormGroup<TimelimitForm>( {\n\t\t\t check: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd0: new FormControl( true, { nonNullable: true } ),\n\t\t\t wd1: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd2: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd3: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd4: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd5: new FormControl( false, { nonNullable: true } ),\n\t\t\t wd6: new FormControl( false, { nonNullable: true } ),\n\t\t\t fromhour: new FormControl( 0, { nonNullable: true } ),\n\t\t\t frommin: new FormControl( 0, { nonNullable: true } ),\n\t\t\t tohour: new FormControl( 24, { nonNullable: true } ),\n\t\t\t tomin: new FormControl( 0, { nonNullable: true } ),\n\t\t\t inout: new FormControl( true, { nonNullable: true } ),\n\t\t } );\n\t\t\n\t\tthis.focusMonitor.monitor( this._elementRef.nativeElement, true ).subscribe( origin => {\n\n\t\t\tif ( this.focused && !origin ) {\n\t\t\t\tthis.onTouched();\n\t\t\t}\n\t\t\tthis.focused = !!origin;\n\t\t\tif ( this.focused )\n\t\t\t\tthis.ngControl?.control?.markAllAsTouched();\n\n\t\t\tthis.onChange( this.value );\n\t\t\tthis.stateChanges.next();\n\t\t\tthis.cdr.markForCheck();\n\t\t} );\n\t}\n\t\n\tonChange: ( value: TimelimitValue ) => void = () => { /* intentionally empty */ };\n\tonTouched = () => { /* intentionally empty */ };\n\t\n\tngOnInit() {\n\t\t\n\t\tthis.ngControl?.control?.setValidators( [ this.validate.bind( this ) ] );\n\t\tthis.ngControl?.control?.updateValueAndValidity();\n\t}\n\t\n\tvalidate( { value }: AbstractControl ): ValidationErrors | null {\n\n\t\tconst limit = value as TimelimitValue | null;\n\t\tlet isNotValid = false;\n\n\t\tif ( limit === null )\n\t\t\tisNotValid = true;\n\t\telse if ( limit.check ) {\n\t\t\tif ( limit.tohour == 24 && limit.tomin != 0 )\n\t\t\t\tisNotValid = true;\n\t\t\tif ( limit.fromhour == 24 )\n\t\t\t\tisNotValid = true;\n\t\t\tif ( limit.fromhour > limit.tohour )\n\t\t\t\tisNotValid = true;\n\t\t\tif ( limit.fromhour == limit.tohour && limit.frommin >= limit.tomin )\n\t\t\t\tisNotValid = true;\n\t\t\tif ( ( ( limit.wd[ 0 ] &&\n\t\t\t limit.wd[ 1 ] &&\n\t\t\t limit.wd[ 2 ] &&\n\t\t\t limit.wd[ 3 ] &&\n\t\t\t limit.wd[ 4 ] &&\n\t\t\t limit.wd[ 5 ] &&\n\t\t\t limit.wd[ 6 ] ) ||\n\t\t\t ( !limit.wd[ 0 ] &&\n\t\t\t !limit.wd[ 1 ] &&\n\t\t\t !limit.wd[ 2 ] &&\n\t\t\t !limit.wd[ 3 ] &&\n\t\t\t !limit.wd[ 4 ] &&\n\t\t\t !limit.wd[ 5 ] &&\n\t\t\t !limit.wd[ 6 ] ) ) &&\n\t\t\t limit.fromhour == 0 && limit.frommin == 0 && limit.tohour == 24 && limit.frommin == 0 ) {\n\t\t\t\tisNotValid = true;\n\t\t\t}\n\t\t}\n\n\t\treturn isNotValid ? { invalid: isNotValid } : null;\n\t}\n\t\n\tngOnDestroy() {\n\t\tthis.stateChanges.complete();\n\t\tthis.focusMonitor.stopMonitoring( this._elementRef.nativeElement );\n\t}\n\t\n\tpublic changed() {\n\t\tthis.onChange( this.value );\n\t}\n\t\n\t@Input()\n\tget placeholder(): string {\n\t\treturn this._placeholder;\n\t}\n\t\n\tset placeholder( value: string ) {\n\t\tthis._placeholder = value;\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget required(): boolean {\n\t\treturn this._required;\n\t}\n\t\n\tset required( value: boolean ) {\n\t\tthis._required = coerceBooleanProperty( value );\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget disabled(): boolean {\n\t\treturn this._disabled;\n\t}\n\t\n\tset disabled( value: boolean ) {\n\t\tthis._disabled = coerceBooleanProperty( value );\n\t\tif ( this._disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget value(): TimelimitValue {\n\n\t\tconst value = this.parts.getRawValue();\n\t\treturn {\n\t\t\tcheck: value.check,\n\t\t\twd: [ value.wd0, value.wd1, value.wd2, value.wd3, value.wd4, value.wd5, value.wd6 ],\n\t\t\tfromhour: value.fromhour,\n\t\t\tfrommin: value.frommin,\n\t\t\ttohour: value.tohour,\n\t\t\ttomin: value.tomin,\n\t\t\tin: value.inout\n\t\t};\n\t}\n\n\tset value( input: TimelimitValue | null | undefined ) {\n\n\t\tif ( input === null || input === undefined )\n\t\t\treturn;\n\n\t\tthis.parts.setValue( {\n\t\t\t check: input.check,\n\t\t\t wd0: input.wd[ 0 ],\n\t\t\t wd1: input.wd[ 1 ],\n\t\t\t wd2: input.wd[ 2 ],\n\t\t\t wd3: input.wd[ 3 ],\n\t\t\t wd4: input.wd[ 4 ],\n\t\t\t wd5: input.wd[ 5 ],\n\t\t\t wd6: input.wd[ 6 ],\n\t\t\t fromhour: parseInt( String( input.fromhour ) ),\n\t\t\t frommin: parseInt( String( input.frommin ) ),\n\t\t\t tohour: parseInt( String( input.tohour ) ),\n\t\t\t tomin: parseInt( String( input.tomin ) ),\n\t\t\t inout: input.in\n\t\t } );\n\n\t\tthis.onChange( this.value );\n\t\tthis.stateChanges.next();\n\t}\n\n\tget empty() {\n\t\treturn this.value === null;\n\t}\n\n\twriteValue( value: TimelimitValue | null | undefined ): void {\n\t\tthis.value = value;\n\t}\n\n\tregisterOnChange( fn: ( value: TimelimitValue ) => void ): void {\n\t\tthis.onChange = fn;\n\t}\n\n\tregisterOnTouched( fn: () => void ): void {\n\t\tthis.onTouched = fn;\n\t}\n\n\tsetDisabledState( isDisabled: boolean ): void {\n\t\tthis.disabled = isDisabled;\n\t}\n\n\tsetDescribedByIds( ids: string[] ) {\n\t\tthis.describedBy = ids.join( ' ' );\n\t}\n\n\tonContainerClick(): void { /* intentionally empty */ }\n\n\tpublic _texts: Record<string, string> = {};\n\n\t@Input()\n\tget texts(): Record<string, string> {\n\n\t\treturn this._texts;\n\t}\n\n\tset texts( input: Record<string, string> ) {\n\n\t\tif ( input === null || input === undefined )\n\t\t\treturn;\n\t\tthis._texts = input;\n\t}\n\n\tonCompare(): number {\n\t\treturn -1;\n\t}\n\t\n}\n","<div class=\"timelimit\" [formGroup]=\"parts\">\n\n\t<mat-checkbox id=\"check\" formControlName=\"check\" (change)=\"changed()\">{{ _texts.check }}</mat-checkbox>\n\n\t<div [hidden]=\"!parts.value.check\" class=\"space\">\n\t\t<div class=\"xrow xsmall\">\n\t\t\t<div class=\"xcol-12\">\n\t\t\t\t<mat-label>{{ _texts.weekdays }}</mat-label>\n\t\t\t\t<div class=\"form-group timelimit-weekdays\">\n\t\t\t\t\t<mat-checkbox id=\"wd0\" formControlName=\"wd0\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd0 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd1\" formControlName=\"wd1\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd1 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd2\" formControlName=\"wd2\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd2 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd3\" formControlName=\"wd3\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd3 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd4\" formControlName=\"wd4\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd4 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd5\" formControlName=\"wd5\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd5 }}</mat-checkbox>\n\t\t\t\t\t<mat-checkbox id=\"wd6\" formControlName=\"wd6\" class=\"wd\" (change)=\"changed()\">{{ _texts.wd6 }}</mat-checkbox>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"xcol-md-6\">\n\t\t\t\t<mat-label>{{ _texts.from }}</mat-label>\n\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t<mat-form-field class=\"time\">\n\t\t\t\t\t\t<mat-select formControlName=\"fromhour\" panelWidth=\"auto\">\n\t\t\t\t\t\t\t@for (h of hours; track h; let i = $index) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"i\">{{ h }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t<mat-form-field class=\"time\">\n\t\t\t\t\t\t<mat-select formControlName=\"frommin\" panelWidth=\"auto\">\n\t\t\t\t\t\t\t@for (m of minutes | keyvalue:onCompare; track m; let i = $index) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"i\">{{ m.value }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t</mat-form-field>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"xcol-md-6\">\n\t\t\t\t<mat-label>{{ _texts.to }}</mat-label>\n\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t<mat-form-field class=\"time\">\n\t\t\t\t\t\t<mat-select formControlName=\"tohour\" panelWidth=\"auto\">\n\t\t\t\t\t\t\t@for (h of hours; track h; let i = $index) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"i\">{{ h }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t<mat-form-field class=\"time\">\n\t\t\t\t\t\t<mat-select formControlName=\"tomin\" panelWidth=\"auto\">\n\t\t\t\t\t\t\t@for (m of minutes | keyvalue; track m; let i = $index) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"i\">{{ m.value }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t</mat-form-field>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"xcol-12\">\n\t\t\t\t<mat-checkbox id=\"inout\" formControlName=\"inout\" (change)=\"changed()\">{{ _texts.inout }}</mat-checkbox>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>","import {\n\tChangeDetectorRef,\n\tComponent,\n\tDoCheck,\n\tElementRef,\n\tinject,\n\tInput,\n\tOnDestroy\n} from '@angular/core';\nimport {\n\tControlValueAccessor,\n\tFormControl,\n\tFormGroup,\n\tFormsModule,\n\tNgControl,\n\tReactiveFormsModule\n} from '@angular/forms';\nimport { MatError, MatFormField, MatFormFieldControl, MatHint, MatLabel } from '@angular/material/form-field';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Subject } from 'rxjs';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { XiriFormField } from \"../field.interface\";\nimport { MatInput } from '@angular/material/input';\n\ninterface VolumeForm {\n\tvoll: FormControl<number>\n\tvolw: FormControl<number>\n\tvolh: FormControl<number>\n}\n\ntype VolumeValue = [ number, number, number ] | null | undefined;\n\n@Component( {\n\t selector: 'xiri-volume',\n\t templateUrl: './volume.component.html',\n\t styleUrls: [ './volume.component.scss' ],\n\t host: {\n\t\t '[id]': 'id',\n\t\t '[attr.aria-describedby]': 'describedBy'\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriVolumeComponent\n\t } ],\n\t imports: [\n\t\t MatFormField,\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatLabel,\n\t\t MatInput,\n\t\t MatHint,\n\t\t MatError,\n\t ]\n } )\nexport class XiriVolumeComponent implements ControlValueAccessor, MatFormFieldControl<VolumeValue>, DoCheck, OnDestroy {\n\tprivate focusMonitor = inject( FocusMonitor );\n\tngControl = inject( NgControl, { optional: true, self: true } );\n\tprivate _elementRef = inject<ElementRef<HTMLElement>>( ElementRef );\n\tprivate cdr = inject( ChangeDetectorRef );\n\t\n\t\n\tstatic nextId = 0;\n\tid = `xiri-volume-${ XiriVolumeComponent.nextId++ }`;\n\tdescribedBy = '';\n\t\n\tpublic min: number | null = null;\n\tpublic max: number | null = null;\n\t\n\treadonly autofilled!: boolean;\n\n\tparts: FormGroup<VolumeForm>;\n\tstateChanges = new Subject<void>();\n\tfocused = false;\n\tcontrolType = 'xiri-volume';\n\t\n\treadonly placeholder!: string;\n\tpublic required = false;\n\tpublic disabled = false;\n\tshouldLabelFloat = true;\n\tprivate _lastValue: [ number, number, number ] | null = null;\n\tprivate _field!: XiriFormField;\n\t\n\tconstructor() {\n\t\t\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\t\t\n\t\tthis.parts = new FormGroup<VolumeForm>( {\n\t\t\t voll: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t volw: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t volh: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t } );\n\t\t\n\t\tthis.focusMonitor.monitor( this._elementRef, true ).subscribe( origin => {\n\t\t\tthis.ngControl?.control?.markAsTouched();\n\t\t\tthis.focused = !!origin;\n\t\t\tthis.runCheck();\n\t\t\tthis.cdr.markForCheck();\n\t\t} );\n\t}\n\t\n\tonChange: ( value: VolumeValue ) => void = () => { /* intentionally empty */ };\n\tonTouched = () => { /* intentionally empty */ };\n\t\n\tngDoCheck(): void {\n\t\tthis.runCheck();\n\t}\n\t\n\tngOnDestroy() {\n\t\tif ( this.changeTO )\n\t\t\tclearTimeout( this.changeTO );\n\t\t\n\t\tthis.stateChanges.complete();\n\t\tthis.focusMonitor.stopMonitoring( this._elementRef );\n\t}\n\t\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\tthis._field = value;\n\t\t\n\t\tif ( value.min )\n\t\t\tthis.min = value.min;\n\t\tif ( value.max )\n\t\t\tthis.max = value.max;\n\t\t\n\t\tthis.required = coerceBooleanProperty( value.required );\n\t\tthis.disabled = coerceBooleanProperty( value.disabled );\n\t\tif ( this.disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\t\n\tget field(): XiriFormField {\n\t\treturn this._field;\n\t}\n\t\n\t@Input()\n\tget value(): VolumeValue {\n\n\t\tconst { value: { voll, volw, volh } } = this.parts;\n\n\t\tif ( this.errorState )\n\t\t\treturn undefined;\n\t\tif ( voll == null || volw == null || volh == null )\n\t\t\treturn null;\n\n\t\treturn [ voll, volw, volh ];\n\t}\n\n\tset value( input: VolumeValue ) {\n\t\t\n\t\tif ( input === null || input === undefined )\n\t\t\treturn;\n\t\t\n\t\tthis.parts.setValue( {\n\t\t\t voll: input[ 0 ],\n\t\t\t volw: input[ 1 ],\n\t\t\t volh: input[ 2 ],\n\t\t } );\n\t\t\n\t\tthis.changeValue( this.value );\n\t}\n\t\n\tprivate runCheck(): void {\n\t\t\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\t\t\n\t\tconst val = this.value;\n\t\tif ( val === undefined || val === null || this._lastValue === null || this._lastValue === undefined ) {\n\t\t\tif ( this._lastValue === val )\n\t\t\t\tthis.stateChanges.next();\n\t\t\telse\n\t\t\t\tthis.changeValue( val );\n\t\t} else if ( val[ 0 ] ==\n\t\t this._lastValue[ 0 ] &&\n\t\t val[ 1 ] ==\n\t\t this._lastValue[ 1 ] &&\n\t\t val[ 2 ] ==\n\t\t this._lastValue[ 2 ] )\n\t\t\tthis.stateChanges.next();\n\t\telse\n\t\t\tthis.changeValue( val );\n\t}\n\t\n\tprivate changeTO: ReturnType<typeof setTimeout> | null = null;\n\n\tprivate changeValue( val: VolumeValue ) {\n\n\t\tthis._lastValue = val ?? null;\n\t\tif ( this.changeTO )\n\t\t\tclearTimeout( this.changeTO );\n\t\t\n\t\tthis.changeTO = setTimeout( () => {\n\t\t\tthis.onChange( val );\n\t\t\tthis.stateChanges.next();\n\t\t\tthis.cdr.markForCheck();\n\t\t}, 0 );\n\t}\n\t\n\tget errorState(): boolean {\n\t\treturn this.parts.invalid && !!this.ngControl?.touched;\n\t}\n\t\n\tpublic getErrorMessage(): string {\n\t\treturn 'error';\n\t}\n\t\n\tget empty() {\n\t\treturn this.value === null;\n\t}\n\t\n\twriteValue( value: VolumeValue ): void {\n\t\tthis.value = value;\n\t}\n\n\tregisterOnChange( fn: ( value: VolumeValue ) => void ): void {\n\t\tthis.onChange = fn;\n\t}\n\n\tregisterOnTouched( fn: () => void ): void {\n\t\tthis.onTouched = fn;\n\t}\n\n\tsetDisabledState( isDisabled: boolean ): void {\n\t\tthis.disabled = isDisabled;\n\t}\n\n\tsetDescribedByIds( ids: string[] ) {\n\t\tthis.describedBy = ids.join( ' ' );\n\t}\n\n\tonContainerClick(): void { /* intentionally empty */ }\n}\n","<mat-form-field [formGroup]=\"parts\" floatLabel=\"auto\">\n\t<mat-label>{{ field.name }}</mat-label>\n\t<div role=\"group\" [formGroup]=\"parts\">\n\t\t<input matInput id=\"voll\" formControlName=\"voll\" type=\"number\" [attr.min]=\"min\" [attr.max]=\"max\" [required]=\"required\">\n\t\t<input matInput id=\"volw\" formControlName=\"volw\" type=\"number\" [attr.min]=\"min\" [attr.max]=\"max\" [required]=\"required\">\n\t\t<input matInput id=\"volh\" formControlName=\"volh\" type=\"number\" [attr.min]=\"min\" [attr.max]=\"max\" [required]=\"required\">\n\t</div>\n\n\t@if (field.hint) {\n\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t}\n\t@if (parts.invalid) {\n\t\t<mat-error>{{ getErrorMessage() }}</mat-error>\n\t}\n</mat-form-field>","import { Service, signal, computed, effect, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { DateAdapter } from '@angular/material/core';\nimport { Locale, format, fromUnixTime, transpose } from 'date-fns';\nimport { tz } from '@date-fns/tz';\nimport { de } from 'date-fns/locale/de';\nimport { enGB } from 'date-fns/locale/en-GB';\n\n// `string & {}` lässt jeden String zu, behält aber die Autocomplete für die eingebauten Sprachen.\nexport type XiriLanguage = 'de' | 'en' | ( string & {} );\n\nexport interface XiriValidationMessages {\n\trequired: string;\n\tinvalidFormat: string;\n\tinvalidEmail: string;\n\tvalueRequired: string;\n\tminLength: ( min: number ) => string;\n\tmaxLength: ( max: number ) => string;\n\tminNumber: ( min: number ) => string;\n\tmaxNumber: ( max: number ) => string;\n\tminDate: ( date: string ) => string;\n\tmaxDate: ( date: string ) => string;\n\tminDateRange: ( date: string ) => string;\n\tmaxDateRange: ( date: string ) => string;\n\tminSelection: ( min: number ) => string;\n\tmaxSelection: ( max: number ) => string;\n}\n\nexport interface XiriLanguageDefinition {\n\t// BCP-47-Locale für Intl (Zahlen/Datumsformatierung), z. B. 'de-DE', 'fr-FR'.\n\tlocaleString: string;\n\t// date-fns-Locale für Material-Datepicker + Monatsnamen. Weglassen bei Text-only-Apps ohne Datepicker.\n\tdateFnsLocale?: Locale;\n\tvalidationMessages: XiriValidationMessages;\n}\n\nconst deValidationMessages: XiriValidationMessages = {\n\trequired: 'Pflichtfeld – bitte ausfüllen',\n\tinvalidFormat: 'Bitte ein gültiges Format eingeben',\n\tinvalidEmail: 'Bitte eine gültige E-Mail-Adresse eingeben',\n\tvalueRequired: 'Bitte einen Wert angeben',\n\tminLength: min => `Mindestens ${ min } Zeichen erforderlich`,\n\tmaxLength: max => `Maximal ${ max } Zeichen erlaubt`,\n\tminNumber: min => `Mindestens ${ min } erforderlich`,\n\tmaxNumber: max => `Maximal ${ max } erlaubt`,\n\tminDate: date => `Datum darf nicht vor ${ date } liegen`,\n\tmaxDate: date => `Datum darf nicht nach ${ date } liegen`,\n\tminDateRange: date => `Startdatum muss nach ${ date } liegen`,\n\tmaxDateRange: date => `Enddatum muss vor ${ date } liegen`,\n\tminSelection: min => `Mindestens ${ min } Einträge auswählen`,\n\tmaxSelection: max => `Maximal ${ max } Einträge auswählen`,\n};\n\nconst enValidationMessages: XiriValidationMessages = {\n\trequired: 'Required field',\n\tinvalidFormat: 'Please enter a valid format',\n\tinvalidEmail: 'Please enter a valid email address',\n\tvalueRequired: 'Please provide a value',\n\tminLength: min => `At least ${ min } characters required`,\n\tmaxLength: max => `Maximum ${ max } characters allowed`,\n\tminNumber: min => `Minimum value is ${ min }`,\n\tmaxNumber: max => `Maximum value is ${ max }`,\n\tminDate: date => `Date must not be before ${ date }`,\n\tmaxDate: date => `Date must not be after ${ date }`,\n\tminDateRange: date => `Start date must be after ${ date }`,\n\tmaxDateRange: date => `End date must be before ${ date }`,\n\tminSelection: min => `Select at least ${ min } items`,\n\tmaxSelection: max => `Select at most ${ max } items`,\n};\n\n@Service()\nexport class XiriLocaleService {\n\tprivate readonly platformId = inject( PLATFORM_ID );\n\tprivate readonly isBrowser = isPlatformBrowser( this.platformId );\n\tprivate readonly dateAdapter = inject<DateAdapter<unknown>>( DateAdapter, { optional: true } );\n\n\t// Registry aller bekannten Sprachen — de/en eingebaut, weitere per registerLanguage().\n\tprivate readonly registry = new Map<XiriLanguage, XiriLanguageDefinition>( [\n\t\t[ 'de', { localeString: 'de-DE', dateFnsLocale: de, validationMessages: deValidationMessages } ],\n\t\t[ 'en', { localeString: 'en-GB', dateFnsLocale: enGB, validationMessages: enValidationMessages } ],\n\t] );\n\n\tprivate readonly _language = signal<XiriLanguage>( 'de' );\n\treadonly language = this._language.asReadonly();\n\treadonly localeString = computed( () => this.registry.get( this._language() )?.localeString ?? 'de-DE' );\n\t// Aktives date-fns-Locale (für Datums-Formatierung + Datepicker). Undefined bei Text-only-Sprache.\n\treadonly dateFnsLocale = computed( () => this.registry.get( this._language() )?.dateFnsLocale );\n\n\t// Zeitzone für alle Unix<->Local-Umrechnungen (locale-nahe Präsentations-Info, analog Go-uicontext).\n\tprivate currentTimezone = 'Europe/Vienna';\n\n\tconstructor() {\n\t\tconst stored = this.readStoredLanguage();\n\t\t// Nur wiederherstellen, wenn die Sprache bekannt ist (de/en oder bereits registriert).\n\t\tif ( stored && this.registry.has( stored ) )\n\t\t\tthis._language.set( stored );\n\t\t// Material-Datepicker-Locale (Picker-UI) an die Sprache angleichen — reine Frontend-Interaktion.\n\t\t// Ohne bereitgestellten DateAdapter (Text-only-Formular) oder ohne date-fns-Locale wird übersprungen.\n\t\teffect( () => {\n\t\t\tconst locale = this.dateFnsLocale();\n\t\t\tif ( locale )\n\t\t\t\tthis.dateAdapter?.setLocale( locale );\n\t\t} );\n\t}\n\n\t// Sprache registrieren/überschreiben. Vor setLanguage() bzw. dem ersten Formular-Render aufrufen (App-Init).\n\tregisterLanguage( code: XiriLanguage, def: XiriLanguageDefinition ): void {\n\t\tthis.registry.set( code, def );\n\t\t// Über Reload persistierte Custom-Sprache einklinken, sobald sie (nach)registriert wird —\n\t\t// der Konstruktor kennt beim Restore nur de/en.\n\t\tif ( this.readStoredLanguage() === code )\n\t\t\tthis._language.set( code );\n\t}\n\n\tsetLanguage( lang: XiriLanguage ): void {\n\t\tif ( !this.registry.has( lang ) ) {\n\t\t\tconsole.warn( `XiriLocaleService: unbekannte Sprache '${ lang }' – zuerst registerLanguage() aufrufen.` );\n\t\t\treturn;\n\t\t}\n\t\tthis._language.set( lang );\n\t\tthis.storeLanguage( lang );\n\t}\n\n\t// Validierungs-Fehlertexte der aktiven Sprache; Fallback de, falls (unerwartet) nicht vorhanden.\n\tvalidationMessagesFor(): XiriValidationMessages {\n\t\treturn this.registry.get( this._language() )?.validationMessages\n\t\t\t?? this.registry.get( 'de' )!.validationMessages;\n\t}\n\n\t// ── Zeitzone + Datums-/Zahlen-Formatierung (locale-abhängig) ─────────────────────────────\n\n\tsetTimezone( timezone: string ): void {\n\t\tthis.currentTimezone = timezone;\n\t}\n\n\tunixToLocal( stime: number ): Date | null {\n\t\tif ( stime === null || stime === undefined )\n\t\t\treturn null;\n\t\treturn fromUnixTime( stime, { in: tz( this.currentTimezone ) } );\n\t}\n\n\tunixToStringDateTime( stime: number ): string {\n\t\tconst date = this.unixToLocal( stime );\n\t\treturn date === null ? '' : format( date, 'yyyy-MM-dd HH:mm', { locale: this.dateFnsLocale() } );\n\t}\n\n\tunixToStringDate( stime: number ): string {\n\t\tconst date = this.unixToLocal( stime );\n\t\t// Kein Punkt hinter LLL: die Interpunktion des Monatskürzels bringt das jeweilige Locale\n\t\t// selbst mit (de/fr: 'Mär.'/'juil.', en: 'Jul' ohne) — ein fixer Punkt gäbe sonst '18. Mär..'.\n\t\treturn date === null ? '' : format( date, 'd. LLL', { locale: this.dateFnsLocale() } );\n\t}\n\n\tunixToStringDateYear( stime: number ): string {\n\t\tconst date = this.unixToLocal( stime );\n\t\treturn date === null ? '' : format( date, 'd. LLL yy', { locale: this.dateFnsLocale() } );\n\t}\n\n\tdateToUnix( date: Date ): number {\n\t\treturn Math.floor( transpose( date, tz( this.currentTimezone ) ).getTime() / 1000 );\n\t}\n\n\tformatNumber( value: number, webformat?: string ): string {\n\t\tif ( value === null || value === undefined )\n\t\t\treturn '';\n\n\t\tconst digits = webformat === 'integer'\n\t\t\t? 0\n\t\t\t: /^float\\d+$/.test( webformat ?? '' )\n\t\t\t\t? Number( webformat!.slice( 5 ) )\n\t\t\t\t: undefined;\n\n\t\tconst options: Intl.NumberFormatOptions = { style: 'decimal' };\n\t\tif ( digits !== undefined ) {\n\t\t\toptions.minimumFractionDigits = digits;\n\t\t\toptions.maximumFractionDigits = digits;\n\t\t}\n\n\t\treturn new Intl.NumberFormat( this.localeString(), options ).format( value );\n\t}\n\n\t// localStorage-Zugriff abgesichert: im SSR nicht vorhanden, in jsdom-Tests ggf. undefined,\n\t// im Private-Mode wirft es SecurityError. In all diesen Fällen still ohne Persistenz weiterlaufen.\n\tprivate readStoredLanguage(): string | null {\n\t\tif ( !this.isBrowser )\n\t\t\treturn null;\n\t\ttry {\n\t\t\treturn localStorage.getItem( 'xiri-language' );\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate storeLanguage( lang: XiriLanguage ): void {\n\t\tif ( !this.isBrowser )\n\t\t\treturn;\n\t\ttry {\n\t\t\tlocalStorage.setItem( 'xiri-language', lang );\n\t\t} catch {\n\t\t\t// Persistenz nicht verfügbar (Private-Mode o. Ä.) — Sprachwechsel gilt trotzdem für die Session.\n\t\t}\n\t}\n}\n","import {\n\tafterRenderEffect,\n\tbooleanAttribute,\n\tChangeDetectorRef,\n\tComponent,\n\tElementRef,\n\tinject,\n\tInput,\n\tnumberAttribute,\n\tOnDestroy,\n\tOnInit,\n\toutput,\n\tsignal,\n\tinput\n} from \"@angular/core\";\nimport {\n\tAbstractControl,\n\tControlValueAccessor,\n\tFormGroupDirective,\n\tNgControl,\n\tNgForm,\n\tValidators\n} from \"@angular/forms\";\nimport { MatFormFieldControl } from \"@angular/material/form-field\";\nimport { Subject, Subscription } from \"rxjs\";\nimport { _ErrorStateTracker, ErrorStateMatcher } from \"@angular/material/core\";\nimport { FocusMonitor } from \"@angular/cdk/a11y\";\n\n\n@Component( {\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriFieldMain\n\t } ],\n\t imports: [],\n\t template: ``\n } )\nexport abstract class XiriFieldMain<T = unknown>\n\timplements ControlValueAccessor,\n\t MatFormFieldControl<T>,\n\t OnInit,\n\t OnDestroy {\n\n\tprotected _elementRef = inject<ElementRef<HTMLElement>>( ElementRef );\n\tprotected _changeDetectorRef = inject( ChangeDetectorRef );\n\tprotected _focusMonitor = inject( FocusMonitor );\n\tpublic _defaultErrorStateMatcher = inject( ErrorStateMatcher );\n\tpublic ngControl = inject( NgControl, { self: true, optional: true } );\n\tprivate _parentForm = inject( NgForm, { optional: true } );\n\tprivate _parentFormGroup = inject( FormGroupDirective, { optional: true } );\n\n\treadonly stateChanges: Subject<void> = new Subject<void>();\n\treadonly autofilled: boolean = false;\n\treadonly valueChange = output<T>();\n\n\t_onChange: ( value: T ) => void = () => { /* intentionally empty */ };\n\t_onTouched = () => { /* intentionally empty */ };\n\n\tprotected touched = false;\n\tprotected _errorStateTracker: _ErrorStateTracker;\n\tprotected _previousControl: AbstractControl | null | undefined;\n\tprotected subs: Subscription = new Subscription();\n\n\tdisableAutomaticLabeling?: boolean;\n\tcontrolType = 'xiri-form-field';\n\n\tprotected constructor() {\n\t\tthis._errorStateTracker = new _ErrorStateTracker(\n\t\t\tthis._defaultErrorStateMatcher,\n\t\t\tthis.ngControl,\n\t\t\tthis._parentFormGroup,\n\t\t\tthis._parentForm,\n\t\t\tthis.stateChanges,\n\t\t);\n\n\t\tafterRenderEffect( () => {\n\t\t\tthis.doCheckLogic();\n\t\t} );\n\t}\n\n\tngOnInit() {\n\t\tthis.subs.add( this._focusMonitor.monitor( this._elementRef, true ).subscribe( origin => {\n\t\t\tthis.focused = !!origin;\n\t\t\tif ( !this.focused ) {\n\t\t\t\tif ( !this.touched ) {\n\t\t\t\t\tthis.ngControl?.control?.markAsTouched();\n\t\t\t\t\tthis.touched = true;\n\t\t\t\t}\n\t\t\t\tthis.startChangeValue();\n\t\t\t}\n\t\t} ) );\n\n\t\tthis.stateChanges.next();\n\t}\n\n\tngOnDestroy() {\n\t\tthis._focusMonitor.stopMonitoring( this._elementRef );\n\t\tthis.subs.unsubscribe();\n\t\tthis.stateChanges.complete();\n\t}\n\n\tprivate doCheckLogic(): void {\n\t\tconst ngControl = this.ngControl;\n\n\t\tif ( ngControl ) {\n\t\t\tif ( this._previousControl !== ngControl.control ) {\n\t\t\t\tif (\n\t\t\t\t\tthis._previousControl !== undefined &&\n\t\t\t\t\tngControl.disabled !== null &&\n\t\t\t\t\tngControl.disabled !== this.disabled\n\t\t\t\t) {\n\t\t\t\t\tthis.disabled = ngControl.disabled;\n\t\t\t\t}\n\n\t\t\t\tthis._previousControl = ngControl.control;\n\t\t\t}\n\n\t\t\tthis.updateErrorState();\n\n\t\t\tif ( ngControl.touched != this.touched ) {\n\t\t\t\tthis.touched = true;\n\t\t\t\tthis.startChangeValue();\n\t\t\t}\n\t\t}\n\t}\n\n\n\t@Input()\n\tget id(): string {\n\t\treturn this._id;\n\t}\n\n\tset id( value: string ) {\n\t\tthis._id = value;\n\t}\n\n\tprotected _id!: string;\n\n\n\treadonly tabIndex = input(0, { transform: (value: unknown) => (value == null ? 0 : numberAttribute(value)) });\n\n\n\t@Input()\n\tget value(): T {\n\t\treturn this._value;\n\t}\n\n\tset value( value: T ) {\n\t\tthis._value = value;\n\t}\n\n\tprotected abstract startChangeValue(): void;\n\n\tprotected runChangeValue( val: T ) {\n\t\tthis._onTouched();\n\t\tthis._onChange( val );\n\t\tthis.valueChange.emit( val );\n\t\tthis.stateChanges.next();\n\t\tthis._changeDetectorRef.markForCheck();\n\t}\n\n\tprotected _value: T = null as T;\n\n\tget empty() {\n\t\treturn this._value === null;\n\t}\n\n\t@Input( { transform: booleanAttribute } )\n\tget disabled(): boolean {\n\t\treturn this._disabled();\n\t}\n\n\tset disabled( value: boolean ) {\n\t\tthis._disabled.set( value );\n\t\tthis._changeDetectorRef.markForCheck();\n\t\tthis.stateChanges.next();\n\t}\n\n\tprotected _disabled = signal<boolean>( false );\n\n\tsetDisabledState(): void { /* intentionally empty */ }\n\n\n\t@Input( { transform: booleanAttribute } )\n\tget required(): boolean {\n\t\treturn this._required ?? this.ngControl?.control?.hasValidator( Validators.required ) ?? false;\n\t}\n\n\tset required( value: boolean ) {\n\t\tthis._required = value;\n\t\tthis.stateChanges.next();\n\t}\n\n\tprotected _required: boolean | undefined;\n\n\n\t@Input()\n\tget placeholder(): string {\n\t\treturn this._placeholder;\n\t}\n\n\tset placeholder( value: string ) {\n\t\tthis._placeholder = value;\n\t\tthis.stateChanges.next();\n\t}\n\n\tprotected _placeholder!: string;\n\n\tpublic focused = false;\n\n\twriteValue( value: T ): void {\n\t\tthis._value = value;\n\t}\n\n\tregisterOnChange( fn: ( value: T ) => void ): void {\n\t\tthis._onChange = fn;\n\t}\n\n\tregisterOnTouched( fn: () => void ): void {\n\t\tthis._onTouched = fn;\n\t}\n\n\n\tsetDescribedByIds( ids: string[] ) {\n\t\tif ( ids.length ) {\n\t\t\tthis._elementRef.nativeElement.setAttribute( 'aria-describedby', ids.join( ' ' ) );\n\t\t} else {\n\t\t\tthis._elementRef.nativeElement.removeAttribute( 'aria-describedby' );\n\t\t}\n\t}\n\n\tget shouldLabelFloat(): boolean {\n\t\treturn !this.empty || this.focused;\n\t}\n\n\tonContainerClick() {\n\t\tif ( !this.focused ) {\n\t\t\tthis.focus();\n\t\t}\n\t}\n\n\tfocus( options?: FocusOptions ): void {\n\t\tthis._elementRef.nativeElement.focus( options );\n\t}\n\n\t@Input()\n\tget errorStateMatcher() {\n\t\treturn this._errorStateTracker.matcher;\n\t}\n\n\tset errorStateMatcher( value: ErrorStateMatcher ) {\n\t\tthis._errorStateTracker.matcher = value;\n\t}\n\n\tget errorState() {\n\t\treturn this._errorStateTracker.errorState;\n\t}\n\n\tset errorState( value: boolean ) {\n\t\tthis._errorStateTracker.errorState = value;\n\t}\n\n\tupdateErrorState() {\n\t\tthis._errorStateTracker.updateErrorState();\n\t}\n\n\tprotected _markAsTouched() {\n\t\tthis._onTouched();\n\t\tthis._changeDetectorRef.markForCheck();\n\t\tthis.stateChanges.next();\n\t}\n\n\treadonly ariaDescribedby = input<string>(undefined, { alias: \"aria-describedby\" });\n\n\tget userAriaDescribedBy(): string {\n\t\treturn this.ariaDescribedby() ?? '';\n\t}\n\n}\n","import {\n\tComponent,\n\tinject,\n\tInput, OnInit,\n} from '@angular/core';\nimport {\n\tControlValueAccessor,\n\tFormBuilder,\n\tFormControl,\n\tFormGroup,\n\tFormsModule,\n\tReactiveFormsModule\n} from '@angular/forms';\nimport { MatFormFieldControl, MatSuffix } from '@angular/material/form-field';\nimport { XiriLocaleService } from '../../services/locale.service';\nimport { XiriFormField } from \"../field.interface\";\nimport { MatOption } from \"@angular/material/core\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatSelect } from '@angular/material/select';\nimport {\n\tMatDatepicker,\n\tMatDatepickerInput,\n\tMatDatepickerToggle,\n\tMatDatepickerToggleIcon\n} from '@angular/material/datepicker';\nimport { MatInput } from '@angular/material/input';\nimport { XiriFieldMain } from \"../helper/fieldmain\";\n\n\ninterface DateTimeRangeForm {\n\tdate: FormControl<Date | null>\n\tfhour: FormControl<number>\n\tfminute: FormControl<number>\n\tthour: FormControl<number>\n\ttminute: FormControl<number>\n}\n\nlet nextUniqueIdXiriDateTimeRange = 0;\n\nclass DateTimeRange {\n\tconstructor( public start: number, public end: number ) {\n\t}\n}\n\n\n@Component( {\n\t selector: 'xiri-date-time-range',\n\t templateUrl: './datetimerange.component.html',\n\t styleUrl: './datetimerange.component.scss',\n\t host: {\n\t\t '[id]': 'id',\n\t\t '(focus)': 'focus()',\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriDateTimeRangeComponent\n\t } ],\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatInput,\n\t\t MatDatepickerInput,\n\t\t MatSelect,\n\t\t MatOption,\n\t\t MatDatepickerToggle,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatDatepickerToggleIcon,\n\t\t MatDatepicker,\n\t ]\n } )\nexport class XiriDateTimeRangeComponent extends XiriFieldMain<DateTimeRange | null | undefined> implements ControlValueAccessor,\n MatFormFieldControl<DateTimeRange | null | undefined>, OnInit {\n\t\n\tprotected _uid = `xiri-date-${ nextUniqueIdXiriDateTimeRange++ }`;\n\t\n\tpublic minDate: Date | null = null;\n\tpublic maxDate: Date | null = null;\n\t\n\tparts: FormGroup<DateTimeRangeForm>;\n\t\n\tprivate _lastValue: DateTimeRange | null = null;\n\t\n\thours = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09',\n\t '10', '11', '12', '13', '14', '15', '16', '17', '18', '19',\n\t '20', '21', '22', '23' ];\n\tminutes = [ '00', '05', '10', '15',\n\t '20', '25', '30', '35',\n\t '40', '45', '50', '55', ];\n\t\n\tprivate dateService = inject( XiriLocaleService );\n\tprivate fb = inject( FormBuilder );\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis._id = this._uid;\n\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\n\t\tthis.parts = this.fb.group<DateTimeRangeForm>( {\n\t\t\t date: new FormControl<Date | null>( null ),\n\t\t\t fhour: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t fminute: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t thour: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t tminute: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t } );\n\t}\n\t\n\tngOnInit() {\n\t\tthis.subs.add( this.parts.valueChanges.subscribe( () => {\n\t\t\tthis.runCheck();\n\t\t} ) );\n\t\t\n\t\tsuper.ngOnInit();\n\t}\n\t\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\t\n\t\tif ( value.min )\n\t\t\tthis.minDate = this.dateService.unixToLocal( value.min );\n\t\tif ( value.max )\n\t\t\tthis.maxDate = this.dateService.unixToLocal( value.max );\n\t\t\n\t\tthis.required = !!value.required;\n\t\tthis.disabled = !!value.disabled;\n\t\tif ( this.disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget value(): DateTimeRange | null | undefined {\n\t\t\n\t\tconst { date, fhour, fminute, thour, tminute } = this.parts.value;\n\t\t\n\t\tif ( !date && !this.required && !this.parts.valid )\n\t\t\treturn this._disabled() ? null : undefined;\n\t\tif ( !date || fhour === undefined || fminute === undefined || thour === undefined || tminute === undefined )\n\t\t\treturn null;\n\t\t\n\t\tconst to = new Date( date.getTime() );\n\t\t\n\t\tdate.setHours( fhour );\n\t\tdate.setMinutes( fminute );\n\t\t\n\t\tto.setHours( thour );\n\t\tto.setMinutes( tminute );\n\t\t\n\t\tconst unixFrom = this.dateService.dateToUnix( date );\n\t\tconst unixTo = this.dateService.dateToUnix( to );\n\t\t\n\t\tif ( unixFrom > unixTo )\n\t\t\treturn new DateTimeRange( unixTo, unixFrom );\n\t\telse\n\t\t\treturn new DateTimeRange( unixFrom, unixTo );\n\t}\n\t\n\tset value( input: DateTimeRange | null | undefined ) {\n\t\t\n\t\tif ( input === null || input === undefined ) {\n\t\t\tif ( !this.required ) {\n\t\t\t\tthis.parts.setValue( {\n\t\t\t\t\t date: null,\n\t\t\t\t\t fhour: 0,\n\t\t\t\t\t fminute: 0,\n\t\t\t\t\t thour: 0,\n\t\t\t\t\t tminute: 0,\n\t\t\t\t } );\n\n\t\t\t\tthis.startChangeValue();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst fromDate = this.dateService.unixToLocal( input.start );\n\t\tconst toDate = this.dateService.unixToLocal( input.end );\n\n\t\tif ( fromDate === null || toDate === null )\n\t\t\treturn;\n\n\t\tconst fromHour = fromDate.getHours() ?? 0;\n\t\tconst fromMinute = fromDate.getMinutes() ?? 0;\n\t\tconst toHour = toDate.getHours() ?? 0;\n\t\tconst toMinute = toDate.getMinutes() ?? 0;\n\t\t\n\t\tthis.parts.setValue( {\n\t\t\t date: fromDate,\n\t\t\t fhour: fromHour,\n\t\t\t fminute: fromMinute,\n\t\t\t thour: toHour,\n\t\t\t tminute: toMinute,\n\t\t } );\n\t\t\n\t\tthis.startChangeValue();\n\t}\n\t\n\tprivate runCheck(): void {\n\t\t\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\t\t\n\t\tconst val = this.value;\n\t\tif ( val === this._lastValue )\n\t\t\tthis.stateChanges.next();\n\t\telse if ( val === null || val === undefined || this._lastValue === null || this._lastValue === undefined )\n\t\t\tthis.changeValue( val );\n\t\telse if ( val.start == this._lastValue.start && val.end == this._lastValue.end )\n\t\t\tthis.stateChanges.next();\n\t\telse\n\t\t\tthis.changeValue( val );\n\t}\n\t\n\tprotected startChangeValue(): void {\n\t\tthis.runChangeValue( this.value );\n\t}\n\t\n\tprivate changeValue( val: DateTimeRange | null | undefined ) {\n\n\t\tthis._lastValue = val ?? null;\n\t\tthis.runChangeValue( val );\n\t}\n\t\n\tget empty() {\n\t\tconst inputElement = this._elementRef.nativeElement.childNodes[ 0 ] as HTMLInputElement;\n\t\treturn this.value === null && inputElement.value === '';\n\t}\n\t\n\twriteValue( value: DateTimeRange | null ): void {\n\t\tthis.value = value;\n\t}\n\t\n\tgetInt( num: string ): number {\n\t\t\n\t\treturn parseInt( num );\n\t}\n}\n","<ng-container [formGroup]=\"parts\">\n\t<input matInput formControlName=\"date\" [matDatepicker]=\"picker\" [required]=\"required\" [min]=\"minDate\" [max]=\"maxDate\">\n\n\t<mat-select formControlName=\"fhour\" class=\"time\" [required]=\"required\">\n\t\t@for (h of hours; track h; let i = $index) {\n\t\t\t<mat-option [value]=\"getInt(h)\">{{ h }}</mat-option>\n\t\t}\n\t</mat-select>\n\t<span class=\"spacert\">:</span>\n\t<mat-select formControlName=\"fminute\" class=\"time\" [required]=\"required\">\n\t\t@for (m of minutes; track m; let i = $index) {\n\t\t\t<mat-option [value]=\"getInt(m)\">{{ m }}</mat-option>\n\t\t}\n\t</mat-select>\n\n\t<span class=\"spacer\">-</span>\n\n\t<mat-select formControlName=\"thour\" class=\"time\" [required]=\"required\">\n\t\t@for (h of hours; track h; let i = $index) {\n\t\t\t<mat-option [value]=\"getInt(h)\">{{ h }}</mat-option>\n\t\t}\n\t</mat-select>\n\t<span class=\"spacert\">:</span>\n\t<mat-select formControlName=\"tminute\" class=\"time\" [required]=\"required\">\n\t\t@for (m of minutes; track m; let i = $index) {\n\t\t\t<mat-option [value]=\"getInt(m)\">{{ m }}</mat-option>\n\t\t}\n\t</mat-select>\n\n\t<mat-datepicker-toggle matIconSuffix [for]=\"picker\">\n\t\t<mat-icon matDatepickerToggleIcon>today</mat-icon>\n\t</mat-datepicker-toggle>\n\t<mat-datepicker #picker></mat-datepicker>\n</ng-container>","import {\n\tComponent,\n\tinject,\n\tInput,\n\tOnInit,\n} from '@angular/core';\nimport {\n\tControlValueAccessor,\n\tFormBuilder,\n\tFormControl,\n\tFormGroup,\n\tFormsModule,\n\tReactiveFormsModule\n} from '@angular/forms';\nimport { MatFormFieldControl, MatSuffix } from '@angular/material/form-field';\nimport { XiriLocaleService } from '../../services/locale.service';\nimport { XiriFormField } from \"../field.interface\";\nimport { MatIcon } from '@angular/material/icon';\nimport {\n\tMatDatepickerToggle,\n\tMatDatepickerToggleIcon,\n\tMatDateRangeInput,\n\tMatDateRangePicker,\n\tMatEndDate,\n\tMatStartDate\n} from '@angular/material/datepicker';\nimport { XiriFieldMain } from \"../helper/fieldmain\";\n\n\ninterface DateRangeForm {\n\tstart: FormControl<Date | null>\n\tend: FormControl<Date | null>\n}\n\nlet nextUniqueIdXiriDateRange = 0;\n\nclass DateRange {\n\tconstructor( public start: number, public end: number ) {\n\t}\n}\n\n@Component( {\n\t selector: 'xiri-date-range',\n\t templateUrl: './daterange.component.html',\n\t styleUrl: './daterange.component.scss',\n\t host: {\n\t\t '[id]': 'id',\n\t\t '(focus)': 'focus()',\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriDateRangeComponent\n\t } ],\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatDateRangeInput,\n\t\t MatStartDate,\n\t\t MatEndDate,\n\t\t MatDatepickerToggle,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatDatepickerToggleIcon,\n\t\t MatDateRangePicker,\n\t ]\n } )\nexport class XiriDateRangeComponent extends XiriFieldMain<DateRange | null | undefined> implements OnInit,\n ControlValueAccessor,\n MatFormFieldControl<DateRange | null | undefined> {\n\t\n\tprotected _uid = `xiri-date-${ nextUniqueIdXiriDateRange++ }`;\n\t\n\tpublic minDate: Date | null = null;\n\tpublic maxDate: Date | null = null;\n\t\n\tparts: FormGroup<DateRangeForm>;\n\t\n\tprivate _lastValue: DateRange | null = null;\n\t\n\tprivate dateService = inject( XiriLocaleService );\n\tprivate fb = inject( FormBuilder );\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis._id = this._uid;\n\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\n\t\tthis.parts = this.fb.group<DateRangeForm>( {\n\t\t\t start: new FormControl<Date | null>( null ),\n\t\t\t end: new FormControl<Date | null>( null ),\n\t\t } );\n\t}\n\t\n\tngOnInit() {\n\t\t\n\t\tthis.subs.add( this.parts.valueChanges.subscribe( () => {\n\t\t\tthis.runCheck();\n\t\t} ) );\n\t\t\n\t\tsuper.ngOnInit();\n\t}\n\t\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\t\n\t\tif ( value.min )\n\t\t\tthis.minDate = this.dateService.unixToLocal( value.min );\n\t\tif ( value.max )\n\t\t\tthis.maxDate = this.dateService.unixToLocal( value.max );\n\t\t\n\t\tthis.required = !!value.required;\n\t\tthis.disabled = !!value.disabled;\n\t\tif ( this.disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget value(): DateRange | null | undefined {\n\t\t\n\t\tconst { start, end } = this.parts.value;\n\n\t\tif ( start == null || end == null ) {\n\t\t\tif ( this.required ) {\n\t\t\t\treturn this.parts.valid ? null : this._disabled() ? null : undefined;\n\t\t\t} else {\n\t\t\t\tif ( start === end )\n\t\t\t\t\treturn this.parts.valid ? null : this._disabled() ? null : undefined;\n\t\t\t\telse\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t\t\n\t\tconst unixFrom = this.dateService.dateToUnix( start );\n\t\tconst unixTo = this.dateService.dateToUnix( end );\n\t\t\n\t\tif ( unixFrom > unixTo )\n\t\t\treturn new DateRange( unixTo, unixFrom );\n\t\telse\n\t\t\treturn new DateRange( unixFrom, unixTo );\n\t}\n\t\n\tset value( input: DateRange | null | undefined ) {\n\t\t\n\t\tif ( input === null || input === undefined ) {\n\t\t\tthis.parts.setValue( {\n\t\t\t\t start: null,\n\t\t\t\t end: null,\n\t\t\t } );\n\n\t\t\tthis.startChangeValue();\n\t\t\treturn;\n\t\t}\n\n\t\tconst start = this.dateService.unixToLocal( input.start );\n\t\tconst end = this.dateService.unixToLocal( input.end );\n\n\t\tthis.parts.setValue( {\n\t\t\t start: start,\n\t\t\t end: end,\n\t\t } );\n\n\t\tthis.startChangeValue();\n\t}\n\t\n\tprivate runCheck(): void {\n\t\t\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\t\t\n\t\tconst val = this.value;\n\t\tif ( val === this._lastValue )\n\t\t\tthis.stateChanges.next();\n\t\telse if ( val === null || val === undefined || this._lastValue === null || this._lastValue === undefined )\n\t\t\tthis.changeValue( val );\n\t\telse if ( val.start == this._lastValue.start && val.end == this._lastValue.end )\n\t\t\tthis.stateChanges.next();\n\t\telse\n\t\t\tthis.changeValue( val );\n\t}\n\t\n\tprotected startChangeValue(): void {\n\t\tthis.runChangeValue( this.value );\n\t}\n\t\n\tprivate changeValue( val: DateRange | null | undefined ) {\n\n\t\tthis._lastValue = val ?? null;\n\t\tthis.runChangeValue( val );\n\t}\n\t\n\tget empty() {\n\t\tconst inputElement1 = this._elementRef.nativeElement.childNodes[ 0 ].childNodes[ 0 ] as HTMLInputElement;\n\t\tconst inputElement2 = this._elementRef.nativeElement.childNodes[ 0 ].childNodes[ 1 ] as HTMLInputElement;\n\t\treturn this.value === null && inputElement1.value === '' && inputElement2.value === '';\n\t}\n\t\n\twriteValue( value: DateRange | null ): void {\n\t\tthis.value = value;\n\t}\n}\n","<ng-container [formGroup]=\"parts\">\n\t<mat-date-range-input [rangePicker]=\"picker\" [required]=\"required\" [min]=\"minDate\" [max]=\"maxDate\">\n\t\t<input matStartDate formControlName=\"start\" placeholder=\"Start date\" [required]=\"required\">\n\t\t<input matEndDate formControlName=\"end\" placeholder=\"End date\" [required]=\"required\">\n\t</mat-date-range-input>\n\n\t<mat-datepicker-toggle matIconSuffix [for]=\"picker\">\n\t\t<mat-icon matDatepickerToggleIcon>today</mat-icon>\n\t</mat-datepicker-toggle>\n\t<mat-date-range-picker #picker></mat-date-range-picker>\n</ng-container>","import {\n\tComponent,\n\tinject,\n\tInput,\n\tOnInit,\n} from '@angular/core';\nimport {\n\tControlValueAccessor,\n\tFormControl,\n\tFormGroup,\n\tFormBuilder,\n\tFormsModule,\n\tReactiveFormsModule\n} from '@angular/forms';\nimport { MatFormFieldControl, MatSuffix } from '@angular/material/form-field';\nimport { XiriLocaleService } from '../../services/locale.service';\nimport { XiriFormField } from \"../field.interface\";\nimport { MatOption } from \"@angular/material/core\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatSelect } from '@angular/material/select';\nimport {\n\tMatDatepickerInput,\n\tMatDatepickerToggle,\n\tMatDatepickerToggleIcon,\n\tMatDatepicker\n} from '@angular/material/datepicker';\nimport { MatInput } from '@angular/material/input';\nimport { XiriFieldMain } from \"../helper/fieldmain\";\n\ninterface DateForm {\n\tdate: FormControl<Date | null>\n\thour: FormControl<number>\n\tminute: FormControl<number>\n}\n\nlet nextUniqueIdXiriDate = 0;\n\n\n@Component( {\n\t selector: 'xiri-date',\n\t templateUrl: './date.component.html',\n\t styleUrl: './date.component.scss',\n\t host: {\n\t\t '[id]': 'id',\n\t\t '(focus)': 'focus()',\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriDateComponent\n\t } ],\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatInput,\n\t\t MatDatepickerInput,\n\t\t MatSelect,\n\t\t MatOption,\n\t\t MatDatepickerToggle,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatDatepickerToggleIcon,\n\t\t MatDatepicker,\n\t ]\n } )\nexport class XiriDateComponent extends XiriFieldMain<number | null | undefined> implements OnInit,\n ControlValueAccessor,\n MatFormFieldControl<number | null | undefined> {\n\t\n\tprotected _uid = `xiri-date-${ nextUniqueIdXiriDate++ }`;\n\n\tpublic minDate: Date | null = null;\n\tpublic maxDate: Date | null = null;\n\n\tparts: FormGroup<DateForm>;\n\n\tprivate _lastValue: number | null = null;\n\tpublic type = 'date';\n\t\n\t\n\thours = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09',\n\t '10', '11', '12', '13', '14', '15', '16', '17', '18', '19',\n\t '20', '21', '22', '23' ];\n\tminutes = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09',\n\t '10', '11', '12', '13', '14', '15', '16', '17', '18', '19',\n\t '20', '21', '22', '23', '24', '25', '26', '27', '28', '29',\n\t '30', '31', '32', '33', '34', '35', '36', '37', '38', '39',\n\t '40', '41', '42', '43', '44', '45', '46', '47', '48', '49',\n\t '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', ];\n\t\n\tprivate dateService = inject( XiriLocaleService );\n\tprivate fb = inject( FormBuilder );\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis._id = this._uid;\n\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\n\t\tthis.parts = this.fb.group<DateForm>( {\n\t\t\t date: new FormControl<Date | null>( null ),\n\t\t\t hour: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t\t minute: new FormControl<number>( 0, { nonNullable: true } ),\n\t\t } );\n\t}\n\t\n\tngOnInit() {\n\t\t\n\t\tthis.subs.add( this.parts.valueChanges.subscribe( () => {\n\t\t\tthis.runCheck();\n\t\t} ) );\n\t\t\n\t\tsuper.ngOnInit();\n\t}\n\t\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\t\n\t\tthis.type = value.subtype ? value.subtype : 'date';\n\t\t\n\t\tif ( value.min )\n\t\t\tthis.minDate = this.dateService.unixToLocal( value.min );\n\t\tif ( value.max )\n\t\t\tthis.maxDate = this.dateService.unixToLocal( value.max );\n\t\t\n\t\tthis.required = !!value.required;\n\t\tthis.disabled = !!value.disabled;\n\t\tif ( this.disabled )\n\t\t\tthis.parts.disable();\n\t\telse\n\t\t\tthis.parts.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\t\n\t@Input()\n\tget value(): number | null | undefined {\n\t\t\n\t\tconst { date, hour, minute } = this.parts.value;\n\t\t\n\t\tif ( !date && !this.required && !this.parts.valid )\n\t\t\treturn this._disabled() ? null : undefined;\n\t\tif ( !date || hour === undefined || minute === undefined )\n\t\t\treturn null;\n\t\t\n\t\tdate.setHours( hour );\n\t\tdate.setMinutes( minute );\n\t\t\n\t\treturn this.dateService.dateToUnix( date );\n\t}\n\t\n\tset value( input: number | null | undefined ) {\n\n\t\tif ( input === null || input === undefined ) {\n\t\t\tthis.parts.setValue( {\n\t\t\t\t date: null,\n\t\t\t\t hour: 0,\n\t\t\t\t minute: 0,\n\t\t\t } );\n\n\t\t\tthis.startChangeValue();\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = this.dateService.unixToLocal( input );\n\t\tconst hour = current?.getHours() ?? 0;\n\t\tconst minute = current?.getMinutes() ?? 0;\n\n\t\tthis.parts.setValue( {\n\t\t\t date: current,\n\t\t\t hour: hour,\n\t\t\t minute: minute,\n\t\t } );\n\n\t\tthis.startChangeValue();\n\t}\n\t\n\tprivate runCheck(): void {\n\t\t\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\t\t\n\t\tconst val = this.value;\n\t\tif ( val === this._lastValue )\n\t\t\tthis.stateChanges.next();\n\t\telse\n\t\t\tthis.changeValue( val );\n\t}\n\t\n\tprotected startChangeValue(): void {\n\t\tthis.runChangeValue( this.value );\n\t}\n\t\n\tprivate changeValue( val: number | null | undefined ) {\n\n\t\tthis._lastValue = val ?? null;\n\t\tthis.runChangeValue( val );\n\t}\n\t\n\toverride get empty() {\n\t\tconst inputElement = this._elementRef.nativeElement.childNodes[ 0 ] as HTMLInputElement;\n\t\treturn this.value === null && inputElement.value === '';\n\t}\n\t\n\toverride writeValue( value: number | null ): void {\n\t\tthis.value = value;\n\t}\n}\n","<ng-container [formGroup]=\"parts\">\n\t<input matInput formControlName=\"date\" class=\"date\" [required]=\"required\" [min]=\"minDate\" [max]=\"maxDate\" [matDatepicker]=\"picker\">\n\n\t@if (type === 'datetime') {\n\t\t<mat-select formControlName=\"hour\" class=\"time\" [required]=\"required\">\n\t\t\t@for (h of hours; track h; let i = $index) {\n\t\t\t\t<mat-option [value]=\"i\">{{ h }}</mat-option>\n\t\t\t}\n\t\t</mat-select>\n\t\t<span class=\"spacer\">:</span>\n\t\t<mat-select formControlName=\"minute\" class=\"time\" [required]=\"required\">\n\t\t\t@for (m of minutes; track m; let i = $index) {\n\t\t\t\t<mat-option [value]=\"i\">{{ m }}</mat-option>\n\t\t\t}\n\t\t</mat-select>\n\t}\n\n\t<mat-datepicker-toggle matIconSuffix [for]=\"picker\">\n\t\t<mat-icon matDatepickerToggleIcon>today</mat-icon>\n\t</mat-datepicker-toggle>\n\t<mat-datepicker #picker></mat-datepicker>\n</ng-container>","import {\n\tComponent,\n\tinject,\n\tInput,\n\tOnInit,\n\tviewChild\n} from '@angular/core';\nimport {\n\tControlValueAccessor,\n\tFormControl,\n\tFormsModule,\n\tReactiveFormsModule\n} from '@angular/forms';\nimport { MatFormFieldControl, MatSuffix } from '@angular/material/form-field';\nimport { MAT_DATE_FORMATS } from '@angular/material/core';\nimport { MatIcon } from '@angular/material/icon';\nimport {\n\tMatDatepicker,\n\tMatDatepickerInput,\n\tMatDatepickerToggle,\n\tMatDatepickerToggleIcon\n} from '@angular/material/datepicker';\nimport { MatInput } from '@angular/material/input';\nimport { XiriLocaleService } from '../../services/locale.service';\nimport { XiriFormField } from '../field.interface';\nimport { XiriFieldMain } from '../helper/fieldmain';\n\nlet nextUniqueIdXiriYearMonth = 0;\n\nexport const XIRI_YEAR_MONTH_FORMATS = {\n\tparse: { dateInput: 'MM.yyyy' },\n\tdisplay: {\n\t\tdateInput: 'MM.yyyy',\n\t\tmonthYearLabel: 'MMM yyyy',\n\t\tdateA11yLabel: 'LL',\n\t\tmonthYearA11yLabel: 'MMMM yyyy',\n\t},\n};\n\n@Component( {\n\t selector: 'xiri-yearmonth',\n\t templateUrl: './yearmonth.component.html',\n\t styleUrl: './yearmonth.component.scss',\n\t host: {\n\t\t '[id]': 'id',\n\t\t '(focus)': 'focus()',\n\t },\n\t providers: [\n\t\t { provide: MatFormFieldControl, useExisting: XiriYearMonthComponent },\n\t\t { provide: MAT_DATE_FORMATS, useValue: XIRI_YEAR_MONTH_FORMATS },\n\t ],\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatInput,\n\t\t MatDatepickerInput,\n\t\t MatDatepickerToggle,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatDatepickerToggleIcon,\n\t\t MatDatepicker,\n\t ]\n } )\nexport class XiriYearMonthComponent extends XiriFieldMain<number | null | undefined> implements OnInit,\n ControlValueAccessor,\n MatFormFieldControl<number | null | undefined> {\n\n\tprotected _uid = `xiri-yearmonth-${ nextUniqueIdXiriYearMonth++ }`;\n\n\tpublic minDate: Date | null = null;\n\tpublic maxDate: Date | null = null;\n\n\tdateControl = new FormControl<Date | null>( null );\n\n\treadonly picker = viewChild<MatDatepicker<Date>>('picker');\n\n\tprivate _lastValue: number | null = null;\n\tpublic type = 'yearmonth';\n\n\tprivate dateService = inject( XiriLocaleService );\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis._id = this._uid;\n\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\t}\n\n\tngOnInit() {\n\t\tthis.subs.add( this.dateControl.valueChanges.subscribe( () => {\n\t\t\tthis.runCheck();\n\t\t} ) );\n\n\t\tsuper.ngOnInit();\n\t}\n\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\tif ( value.min )\n\t\t\tthis.minDate = this.dateService.unixToLocal( value.min );\n\t\tif ( value.max )\n\t\t\tthis.maxDate = this.dateService.unixToLocal( value.max );\n\n\t\tthis.required = !!value.required;\n\t\tthis.disabled = !!value.disabled;\n\t\tif ( this.disabled )\n\t\t\tthis.dateControl.disable();\n\t\telse\n\t\t\tthis.dateControl.enable();\n\n\t\tthis.stateChanges.next();\n\t}\n\n\t@Input()\n\tget value(): number | null | undefined {\n\t\tconst date = this.dateControl.value;\n\n\t\tif ( !date && !this.required && !this.dateControl.valid )\n\t\t\treturn this._disabled() ? null : undefined;\n\t\tif ( !date )\n\t\t\treturn null;\n\n\t\treturn this.dateService.dateToUnix( date );\n\t}\n\n\tset value( input: number | null | undefined ) {\n\t\tif ( input === null || input === undefined ) {\n\t\t\tthis.dateControl.setValue( null );\n\t\t\tthis.startChangeValue();\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = this.dateService.unixToLocal( input );\n\n\t\tif ( current ) {\n\t\t\tcurrent.setDate( 1 );\n\t\t\tcurrent.setHours( 0, 0, 0, 0 );\n\t\t}\n\n\t\tthis.dateControl.setValue( current );\n\t\tthis.startChangeValue();\n\t}\n\n\tonYearMonthSelected( date: Date ): void {\n\t\tconst normalized = new Date( date.getFullYear(), date.getMonth(), 1, 0, 0, 0, 0 );\n\t\tthis.dateControl.setValue( normalized );\n\t\tthis.picker()?.close();\n\t}\n\n\tprivate runCheck(): void {\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\n\t\tconst val = this.value;\n\t\tif ( val === this._lastValue )\n\t\t\tthis.stateChanges.next();\n\t\telse\n\t\t\tthis.changeValue( val );\n\t}\n\n\tprotected startChangeValue(): void {\n\t\tthis.runChangeValue( this.value );\n\t}\n\n\tprivate changeValue( val: number | null | undefined ) {\n\t\tthis._lastValue = val ?? null;\n\t\tthis.runChangeValue( val );\n\t}\n\n\toverride get empty() {\n\t\treturn this.dateControl.value === null;\n\t}\n\n\toverride writeValue( value: number | null ): void {\n\t\tthis.value = value;\n\t}\n}\n","<input matInput [formControl]=\"dateControl\" class=\"date\" [required]=\"required\"\n [min]=\"minDate\" [max]=\"maxDate\" [matDatepicker]=\"picker\">\n\n<mat-datepicker-toggle matIconSuffix [for]=\"picker\">\n\t<mat-icon matDatepickerToggleIcon>today</mat-icon>\n</mat-datepicker-toggle>\n<mat-datepicker #picker startView=\"multi-year\" (monthSelected)=\"onYearMonthSelected($event)\"></mat-datepicker>\n","import {\n\tComponent,\n\tDestroyRef,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tOnInit,\n\toutput,\n\tviewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { debounceTime, distinctUntilChanged, Subject } from \"rxjs\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { FormsModule } from '@angular/forms';\n\n@Component( {\n\t selector: 'xiri-search',\n\t templateUrl: './search.component.html',\n\t styleUrls: [ './search.component.scss' ],\n\t host: {\n\t\t '(document:keydown.escape)': 'onKeydownHandler()'\n\t },\n\t imports: [\n\t\t FormsModule,\n\t\t CdkTrapFocus,\n\t\t MatIconButton,\n\t\t MatIcon,\n\t ],\n } )\nexport class XiriSearchComponent implements OnInit {\n\n\tchanged = output<string>();\n\tplaceholder = input<string>( '' );\n\n\topen = input<boolean>( false );\n\treset = input<number>( -1 );\n\tescape = input<boolean>( true );\n\tfocus = input<number>( -1 );\n\n\tprivate _search = viewChild<ElementRef>( 'search' );\n\tprivate destroyRef = inject( DestroyRef );\n\tprivate filter: Subject<string> = new Subject<string>();\n\t\n\tpublic _text = '';\n\tpublic show = false;\n\t\n\tconstructor() {\n\t\t\n\t\teffect( () => {\n\t\t\tconst num = this.reset();\n\t\t\tif ( num != -1 ) {\n\t\t\t\tthis.show = this.open();\n\t\t\t\tthis._text = '';\n\t\t\t\tthis.filter.next( this._text );\n\t\t\t}\n\t\t} );\n\t\teffect( () => {\n\t\t\tconst num = this.focus();\n\t\t\tif ( num != -1 ) {\n\t\t\t\tthis.show = true;\n\t\t\t\tthis._search()?.nativeElement.focus();\n\t\t\t}\n\t\t} );\n\t\teffect( () => {\n\t\t\tconst value = this.text();\n\t\t\tif ( value ) {\n\t\t\t\tthis._text = value;\n\t\t\t\tthis.show = true;\n\t\t\t}\n\t\t} );\n\t}\n\t\n\tngOnInit(): void {\n\t\tthis.filter.pipe( debounceTime( 200 ), distinctUntilChanged(), takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( value => {\n\t\t\t\tthis.changed.emit( value );\n\t\t\t} );\n\t\t\n\t\tif ( this.open() )\n\t\t\tthis.show = true;\n\t}\n\t\n\tonKeydownHandler() {\n\t\t\n\t\tif ( this.escape() && this.show ) {\n\t\t\tthis.show = this.open() ? true : !this.show;\n\t\t\tthis._text = '';\n\t\t\tthis.filter.next( this._text );\n\t\t}\n\t}\n\t\n\ttext = input<string>( '' );\n\t\n\tsearchDo() {\n\t\tthis.filter.next( this._text );\n\t}\n\n\tclick(): void {\n\t\tthis.show = this.open() ? true : !this.show;\n\t\tthis._text = '';\n\t\t\n\t\tthis.filter.next( this._text );\n\t}\n\t\n}\n","<div class=\"search\" [class.open]=\"show\">\n\t@if (show) {\n\t\t<input type=\"text\" name=\"input\" class=\"input lens\" autocomplete=\"off\"\n\t\t [cdkTrapFocusAutoCapture]=\"show\" [cdkTrapFocus]=\"show\"\n\t\t [placeholder]=\"placeholder()\"\n\t\t [class.open]=\"show\"\n\t\t (keyup)=\"searchDo()\" [value]=\"_text\" [(ngModel)]=\"_text\">\n\t}\n\t<button mat-icon-button color=\"primary\" (click)=\"click()\" [attr.aria-label]=\"show ? 'Suche schließen' : 'Suche öffnen'\">\n\t\t<mat-icon>{{ show ? 'close' : 'search' }}</mat-icon>\n\t</button>\n</div>","import {\n\tAfterViewInit,\n\tComponent,\n\tinject,\n\tInput,\n\tsignal,\n\tviewChild\n} from '@angular/core';\nimport { MatFormFieldControl } from \"@angular/material/form-field\";\nimport { ControlValueAccessor } from \"@angular/forms\";\nimport { BehaviorSubject } from \"rxjs\";\nimport {\n\tMatTree,\n\tMatTreeNestedDataSource,\n\tMatTreeNode, MatTreeNodeDef,\n\tMatTreeNodePadding,\n\tMatTreeNodeToggle\n} from \"@angular/material/tree\";\nimport { SelectionModel } from \"@angular/cdk/collections\";\nimport { XiriDataService } from \"../../services/data.service\";\nimport { XiriSnackbarService } from '../../services/snackbar.service';\nimport { XiriFormField } from \"../field.interface\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { XiriSearchComponent } from '../../search/search.component';\nimport { XiriFieldMain } from \"../helper/fieldmain\";\n\n\n// Node ids are backend values passed through untouched — an int64 row id or a string\n// key. Coercing them to number would round anything above 2^53 and make a non-numeric\n// key NaN.\nexport type XiriTreeselectId = string | number;\n\nclass XiriTreeselectTreeNode {\n\tchildren!: XiriTreeselectTreeNode[];\n\tid!: XiriTreeselectId;\n\tname!: string;\n\thidden!: boolean;\n\tstate!: number;\n\tparent!: XiriTreeselectTreeNode | null;\n}\n\nlet nextUniqueIdXiriTreeselect = 0;\n\n@Component( {\n\t selector: 'xiri-treeselect',\n\t templateUrl: './treeselect.component.html',\n\t styleUrl: './treeselect.component.scss',\n\t host: {\n\t\t '[id]': 'id',\n\t\t '(focus)': 'focus()',\n\t },\n\t providers: [ {\n\t\t provide: MatFormFieldControl,\n\t\t useExisting: XiriTreeselectComponent\n\t } ],\n\t imports: [\n\t\t XiriSearchComponent,\n\t\t MatProgressSpinner,\n\t\t MatTree,\n\t\t MatTreeNode,\n\t\t MatTreeNodeToggle,\n\t\t MatTreeNodePadding,\n\t\t MatIconButton,\n\t\t MatCheckbox,\n\t\t MatIcon,\n\t\t MatTreeNodeDef,\n\t ]\n } )\nexport class XiriTreeselectComponent extends XiriFieldMain<XiriTreeselectId[] | undefined> implements ControlValueAccessor,\n MatFormFieldControl<XiriTreeselectId[] | undefined>,\n AfterViewInit {\n\t\n\tprivate dataService = inject( XiriDataService );\n\tprivate snackbar = inject( XiriSnackbarService );\n\t\n\tprotected _uid = `xiri-treeselect-${ nextUniqueIdXiriTreeselect++ }`;\n\t\n\tpublic loading = signal<boolean>( true );\n\tprivate _field!: XiriFormField;\n\t\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis._id = this._uid;\n\n\t\tif ( this.ngControl != null )\n\t\t\tthis.ngControl.valueAccessor = this;\n\n\t\tthis.dataSource = new MatTreeNestedDataSource();\n\t\tthis.dataSource.data = [];\n\t}\n\t\n\tpublic ngAfterViewInit(): void {\n\t\t\n\t\tthis.subs.add( this.dataChange.subscribe( data => {\n\t\t\t\n\t\t\tif ( data === null )\n\t\t\t\treturn;\n\t\t\t\n\t\t\tthis.dataSource.data = data;\n\t\t\t// this.tree().expandAll();\n\n\t\t\t// Nicht direkt togglen: ein Options-Reload ersetzt das Feld-Objekt und baut den Baum\n\t\t\t// neu auf, wobei die alten Node-Objekte im SelectionModel selektiert bleiben würden\n\t\t\t// (doppelte IDs) und das Zurückschreiben ans FormControl emittieren würde.\n\t\t\tthis.applyInputSelection();\n\n\t\t\tthis.loading.set( false );\n\t\t} ) );\n\t}\n\t\n\t@Input()\n\tset field( value: XiriFormField ) {\n\t\t\n\t\tthis._field = value;\n\t\t\n\t\tthis.required = !!value.required;\n\t\tthis.disabled = !!value.disabled;\n\t\t\n\t\tif ( value.url ) {\n\t\t\tthis.dataService.get( value.url ).subscribe(\n\t\t\t\t{\n\t\t\t\t\tnext: ( response: unknown ) => {\n\t\t\t\t\t\tconst data = ( response as { data?: ( XiriTreeselectTreeNode & { length?: number } ) | null } ).data;\n\t\t\t\t\t\tlet groups: XiriTreeselectTreeNode[];\n\t\t\t\t\t\tif ( data === undefined || data === null || data.length === 0 )\n\t\t\t\t\t\t\tgroups = [];\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tgroups = [ data ];\n\t\t\t\t\t\tthis.buildTree( groups, null );\n\t\t\t\t\t\tthis.dataChange.next( groups );\n\t\t\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t\t\t},\n\t\t\t\t\terror: ( err ) => {\n\t\t\t\t\t\tconsole.log( 'error database-tree', err );\n\t\t\t\t\t\tthis.snackbar.error( 'Unknown Error! Please try again later' );\n\t\t\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t} else {\n\t\t\tlet groups = ( value.list ?? [] ) as unknown as XiriTreeselectTreeNode[];\n\t\t\tif ( !groups || groups.length === 0 )\n\t\t\t\tgroups = [];\n\n\t\t\tthis.buildTree( groups, null );\n\t\t\tthis.dataChange.next( groups );\n\t\t}\n\n\t\tthis.stateChanges.next();\n\t}\n\n\tget field(): XiriFormField {\n\t\treturn this._field;\n\t}\n\n\tprivate buildTree( input: XiriTreeselectTreeNode[], parent: XiriTreeselectTreeNode | null ) {\n\t\tfor ( let i = 0; i != input.length; i++ ) {\n\t\t\tinput[ i ].parent = parent;\n\t\t\tinput[ i ].state = 0;\n\t\t\tif ( input[ i ].children ) {\n\t\t\t\tthis.buildTree( input[ i ].children, input[ i ] );\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate _input: XiriTreeselectId[] = [];\n\t// Unterdrückt das Zurückschreiben an das FormControl, während writeValue die Auswahl aus dem\n\t// Modell in den Baum spiegelt (CVA-Vertrag: writeValue darf onChange nicht auslösen).\n\tprivate _suppressEmit = false;\n\n\t@Input()\n\tget value(): XiriTreeselectId[] | undefined {\n\n\t\tconst result = this.checklistSelection.selected.filter( x => x.state === 1 && !x.children ).map( x => x.id );\n\t\tif ( this.required && result.length == 0 )\n\t\t\treturn undefined;\n\n\t\treturn result;\n\t}\n\n\tset value( input: XiriTreeselectId[] | undefined ) {\n\n\t\tif ( input === null || input === undefined )\n\t\t\tinput = [];\n\n\t\tthis._input = input;\n\t\tthis.startChangeValue();\n\t}\n\t\n\tprivate runCheck(): void {\n\n\t\tif ( !this.ngControl )\n\t\t\treturn;\n\n\t\tif ( this._suppressEmit )\n\t\t\treturn;\n\n\t\tconst val = this.value;\n\t\tthis.runChangeValue( val );\n\t}\n\t\n\tprotected startChangeValue(): void {\n\t\tthis.runChangeValue( this.value );\n\t}\n\t\n\tget empty() {\n\t\treturn this.value === undefined || this.value.length === 0;\n\t}\n\t\n\twriteValue( value: XiriTreeselectId[] ): void {\n\t\tthis._input = value ?? [];\n\t\tthis.applyInputSelection();\n\t}\n\n\t// Spiegelt this._input in die sichtbare Baum-Auswahl (checklistSelection + node.state), ohne\n\t// an das FormControl zurückzuschreiben. Dadurch räumt ein programmatisches reset()/setValue()\n\t// (z. B. Query-Filter-Chip entfernen oder „Alle zurücksetzen\") die Auswahl wirklich ab, statt\n\t// den alten Stand über den value-Getter erneut zu emittieren.\n\tprivate applyInputSelection(): void {\n\t\tconst data = this.dataSource?.data ?? [];\n\t\tif ( data.length === 0 )\n\t\t\treturn; // Baumdaten noch nicht geladen – ngAfterViewInit wendet _input später an\n\n\t\tthis._suppressEmit = true;\n\t\ttry {\n\t\t\tthis.checklistSelection.clear();\n\t\t\tdata.forEach( root => this.resetNodeState( root ) );\n\t\t\tfor ( const id of this._input ) {\n\t\t\t\tfor ( const d of data ) {\n\t\t\t\t\tconst node = this.findNodeById( id, d );\n\t\t\t\t\tif ( node )\n\t\t\t\t\t\tthis.treeItemSelectionToggle( node );\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._suppressEmit = false;\n\t\t}\n\t\tthis._changeDetectorRef.markForCheck();\n\t}\n\n\tprivate resetNodeState( node: XiriTreeselectTreeNode ): void {\n\t\tnode.state = 0;\n\t\tif ( node.children )\n\t\t\tnode.children.forEach( child => this.resetNodeState( child ) );\n\t}\n\t\n\t/**\n\t * Tree\n\t */\n\tpublic tree = viewChild.required<MatTree<XiriTreeselectTreeNode>>( MatTree );\n\tprivate dataChange = new BehaviorSubject<XiriTreeselectTreeNode[] | null>( null );\n\tpublic dataSource: MatTreeNestedDataSource<XiriTreeselectTreeNode>;\n\tprivate checklistSelection = new SelectionModel<XiriTreeselectTreeNode>( true /* multiple */ );\n\t\n\tgetChildren = ( node: XiriTreeselectTreeNode ): XiriTreeselectTreeNode[] => node.children;\n\t\n\thasChild = ( _: number, node: XiriTreeselectTreeNode ) => !!node.children && node.children.length != 0;\n\t\n\ttreeItemSelectionToggle( node: XiriTreeselectTreeNode ): void {\n\t\t\n\t\tthis.checklistSelection.toggle( node );\n\t\tconst state = this.checklistSelection.isSelected( node );\n\t\t\n\t\tnode.state = state ? 1 : 0;\n\t\tif ( node.children ) {\n\t\t\tfor ( let i = 0; i != node.children.length; i++ ) {\n\t\t\t\tthis.treeItemSelectionChildren( node.children[ i ], state );\n\t\t\t}\n\t\t}\n\t\t\n\t\tif ( node.parent )\n\t\t\tthis.treeItemSelectionParent( node.parent );\n\t\t\n\t\tthis.runCheck();\n\t}\n\t\n\tprivate treeItemSelectionParent( node: XiriTreeselectTreeNode ): void {\n\t\t\n\t\tconst result0 = node.children.filter( child => child.state === 0 );\n\t\tconst result1 = node.children.filter( child => child.state === 1 );\n\t\t\n\t\tif ( result1.length === node.children.length ) {\n\t\t\tthis.checklistSelection.select( node );\n\t\t\tnode.state = 1;\n\t\t} else if ( result0.length === node.children.length ) {\n\t\t\tthis.checklistSelection.deselect( node );\n\t\t\tnode.state = 0;\n\t\t} else {\n\t\t\tthis.checklistSelection.deselect( node );\n\t\t\tnode.state = 2;\n\t\t}\n\t\t\n\t\tif ( node.parent )\n\t\t\tthis.treeItemSelectionParent( node.parent );\n\t}\n\t\n\tprivate treeItemSelectionChildren( node: XiriTreeselectTreeNode, state: boolean ): void {\n\t\t\n\t\tif ( state )\n\t\t\tthis.checklistSelection.select( node );\n\t\telse\n\t\t\tthis.checklistSelection.deselect( node );\n\t\t\n\t\tnode.state = state ? 1 : 0;\n\t\t\n\t\tif ( node.children ) {\n\t\t\tfor ( let i = 0; i != node.children.length; i++ ) {\n\t\t\t\tthis.treeItemSelectionChildren( node.children[ i ], state );\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic searchDo( value: string ) {\n\t\t\n\t\tif ( value && value.length )\n\t\t\tthis.dataSource.data.forEach( x => this.filterByName( x, value.toLowerCase(), false ) );\n\t\telse\n\t\t\tthis.dataSource.data.forEach( x => this.filterClear( x ) );\n\t}\n\t\n\tprivate filterByName( node: XiriTreeselectTreeNode, search: string, value: boolean ): boolean {\n\t\t\n\t\tif ( value ) {\n\t\t\tnode.hidden = false;\n\t\t\tif ( node.children ) {\n\t\t\t\tnode.children.forEach( x => this.filterByName( x, search, true ) );\n\t\t\t\t\n\t\t\t\tif ( search.length > 3 )\n\t\t\t\t\tthis.tree().expand( node );\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tif ( node.name.toLowerCase().indexOf( search ) === -1 ) {\n\t\t\tnode.hidden = true;\n\t\t\tif ( node.children ) {\n\t\t\t\tconst ret = node.children.filter( x => this.filterByName( x, search, false ) );\n\t\t\t\tif ( ret.length ) {\n\t\t\t\t\tthis.tree().expand( node );\n\t\t\t\t\tnode.hidden = false\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn !node.hidden;\n\t\t} else {\n\t\t\tnode.hidden = false;\n\t\t\tif ( node.children ) {\n\t\t\t\tnode.children.forEach( x => this.filterByName( x, search, true ) );\n\t\t\t\t\n\t\t\t\tif ( search.length > 3 )\n\t\t\t\t\tthis.tree().expand( node );\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\t\n\tprivate filterClear( node: XiriTreeselectTreeNode ): void {\n\t\t\n\t\tnode.hidden = false;\n\t\tif ( node.children ) {\n\t\t\tnode.children.forEach( x => this.filterClear( x ) );\n\t\t}\n\t}\n\t\n\tprivate findNodeById( id: XiriTreeselectId, node: XiriTreeselectTreeNode ): XiriTreeselectTreeNode | null {\n\n\t\tif ( node.id == id )\n\t\t\treturn node;\n\t\t\n\t\tif ( node.children ) {\n\t\t\tfor ( let i = 0; i != node.children.length; i++ ) {\n\t\t\t\tconst result = this.findNodeById( id, node.children[ i ] );\n\t\t\t\tif ( result )\n\t\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n}\n","<div class=\"main\">\n\t<div class=\"line\">\n\t\t<div class=\"xrow xsmall\">\n\t\t\t<div class=\"xcol xcol-md-6 header\"><span>{{ field.name }}</span></div>\n\t\t\t<div class=\"xcol xcol-md-6 search\">\n\t\t\t\t@if (field.search !== false) {\n\t\t\t\t\t<xiri-search (changed)=\"searchDo($event)\"></xiri-search>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"tree\">\n\t\t@if (loading()) {\n\t\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t\t}\n\t\t<mat-tree [dataSource]=\"dataSource\" [childrenAccessor]=\"getChildren\">\n\t\t\t<mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding=\"\" matTreeNodePaddingIndent=\"20px\" [hidden]=\"node.hidden\"\n\t\t\t [class.notree]=\"!field.tree\">\n\t\t\t\t<button mat-icon-button disabled aria-hidden=\"true\">\n\t\t\t\t\t<mat-icon style=\"visibility: hidden\">chevron_right</mat-icon>\n\t\t\t\t</button>\n\t\t\t\t<mat-checkbox class=\"checklist-leaf-node\" [checked]=\"node.state === 1\"\n\t\t\t\t (change)=\"treeItemSelectionToggle(node)\">{{ node.name }}\n\t\t\t\t</mat-checkbox>\n\t\t\t</mat-tree-node>\n\t\t\t<mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding=\"\" matTreeNodePaddingIndent=\"20px\" [hidden]=\"node.hidden\">\n\t\t\t\t<button mat-icon-button matTreeNodeToggle [attr.aria-label]=\"tree().isExpanded(node) ? 'Zuklappen' : 'Aufklappen'\">\n\t\t\t\t\t<mat-icon class=\"mat-icon-rtl-mirror\">\n\t\t\t\t\t\t{{ tree().isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n\t\t\t\t\t</mat-icon>\n\t\t\t\t</button>\n\t\t\t\t<mat-checkbox class=\"group\"\n\t\t\t\t [checked]=\"node.state === 1\"\n\t\t\t\t [indeterminate]=\"node.state === 2\"\n\t\t\t\t (change)=\"treeItemSelectionToggle(node)\">{{ node.name }}\n\t\t\t\t</mat-checkbox>\n\t\t\t</mat-tree-node>\n\t\t</mat-tree>\n\t</div>\n</div>","import { ChangeDetectorRef, Directive, effect, inject, input, OnInit, OnDestroy } from \"@angular/core\";\nimport { UntypedFormControl } from \"@angular/forms\";\nimport {\n\tcatchError,\n\tdebounceTime,\n\tof,\n\tReplaySubject,\n\tSubject,\n\tswitchMap,\n\ttap\n} from \"rxjs\";\nimport { filter, takeUntil } from \"rxjs/operators\";\nimport { XiriFormFieldSelectOption } from \"../field.interface\";\nimport { XiriDataService } from \"../../services/data.service\";\n\nexport type XiriSelectPredicate = ( filter: string, element: XiriFormFieldSelectOption ) => boolean;\nexport const DEFAULT_PREDICATE: XiriSelectPredicate = ( filter: string,\n el: XiriFormFieldSelectOption ): boolean => el.name.toLowerCase()\n\t .indexOf(\n\t\t filter ) >\n -1;\n\nexport type XiriSelectCompare = ( a: XiriFormFieldSelectOption, b: XiriFormFieldSelectOption ) => boolean;\nexport const DEFAULT_COMPARE: XiriSelectCompare = ( a: XiriFormFieldSelectOption,\n b: XiriFormFieldSelectOption ) => a && b && a.id === b.id;\n\n@Directive( {\n\t selector: \"[xiriSelect]\",\n\t exportAs: \"xiriSelect\"\n } )\nexport class XiriSelectDirective implements OnInit, OnDestroy {\n\tprivate dataService = inject( XiriDataService );\n\tprivate cdr = inject( ChangeDetectorRef );\n\t\n\tget formControl() {\n\t\treturn this._filterFormControl;\n\t}\n\t\n\tget filter() {\n\t\treturn this._filteredValuesSubject.asObservable();\n\t}\n\t\n\t/** control for the MatSelect filter keyword multi-selection */\n\tprivate _filterFormControl: UntypedFormControl = new UntypedFormControl();\n\t\n\t/** list of _allValues filtered by search keyword */\n\tprivate _filteredValuesSubject: ReplaySubject<XiriFormFieldSelectOption[]> = new ReplaySubject<XiriFormFieldSelectOption[]>(\n\t\t1\n\t);\n\t\n\t/** indicate search operation is in progress */\n\tpublic searching = false;\n\t\n\t// @ViewChild('multiSelect', { static: true }) multiSelect: MatSelect;\n\t\n\t/** Subject that emits when the component has been destroyed. */\n\tprotected _onDestroy = new Subject<void>();\n\t\n\t\n\tpredicate = input<XiriSelectPredicate>(DEFAULT_PREDICATE);\n\n\tcompare = input<XiriSelectCompare>(DEFAULT_COMPARE);\n\n\tserverSideSearch = input<boolean>(false);\n\n\tserverUrl = input<string>('');\n\n\tserverParams = input<Record<string, unknown>>({});\n\n\t/** list of _allValues */\n\tprivate _allValues: XiriFormFieldSelectOption[] = [] as XiriFormFieldSelectOption[];\n\tvalues = input<XiriFormFieldSelectOption[]>([]);\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tlet value = this.values();\n\t\t\tif ( value === undefined )\n\t\t\t\tvalue = [];\n\n\t\t\tthis._allValues = value;\n\t\t\tthis._filteredValuesSubject.next( this._allValues.slice() );\n\t\t});\n\t}\n\n\tngOnInit() {\n\t\tif ( this.serverSideSearch() ) {\n\t\t\tthis._filterFormControl.valueChanges\n\t\t\t\t.pipe(\n\t\t\t\t\tfilter( search => !!search ),\n\t\t\t\t\ttap( () => this.searching = true ),\n\t\t\t\t\tdebounceTime( 200 ),\n\t\t\t\t\tswitchMap( ( search: string ) => {\n\t\t\t\t\t\treturn this.dataService.post( this.serverUrl(),\n\t\t\t\t\t\t {\n\t\t\t\t\t\t\t ...this.serverParams(),\n\t\t\t\t\t\t\t search: search\n\t\t\t\t\t\t } )\n\t\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\t\tcatchError( ( err ) => {\n\t\t\t\t\t\t\t\t\tconsole.log( 'catch 1', err );\n\t\t\t\t\t\t\t\t\treturn of( [] );\n\t\t\t\t\t\t\t\t} ) )\n\t\t\t\t\t} ),\n\t\t\t\t\ttap( ( filteredList ) => {\n\t\t\t\t\t\tthis._filteredValuesSubject.next(\n\t\t\t\t\t\t\tthis._allValues.slice().concat( filteredList as XiriFormFieldSelectOption[] )\n\t\t\t\t\t\t)\n\t\t\t\t\t} ),\n\t\t\t\t\ttap( () => {\n\t\t\t\t\t\tthis.searching = false;\n\t\t\t\t\t\tthis.cdr.markForCheck();\n\t\t\t\t\t} ),\n\t\t\t\t\ttakeUntil( this._onDestroy ),\n\t\t\t\t).subscribe();\n\t\t} else {\n\t\t\tthis._filterFormControl.valueChanges\n\t\t\t\t.pipe( takeUntil( this._onDestroy ) )\n\t\t\t\t.subscribe( () => {\n\t\t\t\t\tthis.searching = true;\n\t\t\t\t\tthis.applyFilter();\n\t\t\t\t\tthis.searching = false;\n\t\t\t\t\tthis.cdr.markForCheck();\n\t\t\t\t} );\n\t\t}\n\n\t}\n\t\n\tngOnDestroy() {\n\t\tthis._onDestroy.next();\n\t\tthis._onDestroy.complete();\n\t}\n\t\n\tprivate applyFilter() {\n\t\tif ( !this._allValues ) {\n\t\t\treturn;\n\t\t}\n\t\t// get the search keyword\n\t\tlet search = this._filterFormControl.value;\n\t\tif ( !search ) {\n\t\t\tthis._filteredValuesSubject.next( this._allValues.slice() );\n\t\t\treturn;\n\t\t} else {\n\t\t\tsearch = search.toLowerCase();\n\t\t}\n\t\t// filter the _allValues\n\t\tthis._filteredValuesSubject.next(\n\t\t\tthis._allValues.filter( el => this.predicate()( search, el ) )\n\t\t);\n\t}\n\t\n\t// [showToggleAllCheckbox]=\"field.multiple\" (toggleAll)=\"xiriSelect.toggleSelectAll($event)\"\n\t/**\n\ttoggleSelectAll(selectAllValue: boolean) {\n\t\tthis._filteredValuesSubject.pipe(take(1), takeUntil(this._onDestroy))\n\t\t\t.subscribe(val => {\n\t\t\t\tif (selectAllValue) {\n\t\t\t\t\tthis._filterFormControl.patchValue(val);\n\t\t\t\t} else {\n\t\t\t\t\tthis._filterFormControl.patchValue([]);\n\t\t\t\t}\n\t\t\t});\n\t}\n\t **/\n}\n","import { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport {\n\tComponent,\n\tElementRef,\n\tforwardRef,\n\tinput,\n\tsignal,\n\tviewChild\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MatAutocomplete, MatAutocompleteSelectedEvent, MatAutocompleteTrigger } from '@angular/material/autocomplete';\nimport { MatChipGrid, MatChipInput, MatChipInputEvent, MatChipRemove, MatChipRow } from '@angular/material/chips';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriFormField, XiriFormFieldSelectOption } from '../field.interface';\nimport { MatOption } from '@angular/material/core';\n\n@Component( {\n\t selector: 'xiri-chips',\n\t templateUrl: './chips.component.html',\n\t styleUrl: './chips.component.scss',\n\t providers: [ {\n\t\t provide: NG_VALUE_ACCESSOR,\n\t\t useExisting: forwardRef( () => XiriChipsComponent ),\n\t\t multi: true\n\t } ],\n\t imports: [\n\t\t MatFormField,\n\t\t MatLabel,\n\t\t MatChipGrid,\n\t\t MatChipRow,\n\t\t MatChipRemove,\n\t\t MatChipInput,\n\t\t MatAutocompleteTrigger,\n\t\t MatAutocomplete,\n\t\t MatOption,\n\t\t MatIcon\n\t ]\n } )\nexport class XiriChipsComponent implements ControlValueAccessor {\n\n\tfield = input.required<XiriFormField>();\n\n\tchips = signal<( string | number )[]>( [] );\n\tfilteredOptions = signal<XiriFormFieldSelectOption[]>( [] );\n\n\treadonly separatorKeyCodes = [ ENTER, COMMA ] as const;\n\n\tchipInput = viewChild<ElementRef<HTMLInputElement>>( 'chipInput' );\n\n\tprivate onChange: ( value: ( string | number )[] ) => void = () => { /* intentionally empty */ };\n\tprivate onTouched: () => void = () => { /* intentionally empty */ };\n\n\twriteValue( value: ( string | number )[] ): void {\n\t\tthis.chips.set( value || [] );\n\t}\n\n\tregisterOnChange( fn: ( value: ( string | number )[] ) => void ): void {\n\t\tthis.onChange = fn;\n\t}\n\n\tregisterOnTouched( fn: () => void ): void {\n\t\tthis.onTouched = fn;\n\t}\n\n\tadd( event: MatChipInputEvent ): void {\n\t\tconst value = ( event.value || '' ).trim();\n\t\tif ( !value ) return;\n\n\t\tconst current = [ ...this.chips() ];\n\t\tif ( !current.includes( value ) ) {\n\t\t\tcurrent.push( value );\n\t\t\tthis.chips.set( current );\n\t\t\tthis.onChange( current );\n\t\t}\n\t\tevent.chipInput.clear();\n\t}\n\n\tremove( chip: string | number ): void {\n\t\tconst current = this.chips().filter( c => c !== chip );\n\t\tthis.chips.set( current );\n\t\tthis.onChange( current );\n\t}\n\n\tselected( event: MatAutocompleteSelectedEvent ): void {\n\t\tconst option = event.option.value as XiriFormFieldSelectOption;\n\t\tconst current = [ ...this.chips() ];\n\t\tif ( !current.includes( option.id ) ) {\n\t\t\tcurrent.push( option.id );\n\t\t\tthis.chips.set( current );\n\t\t\tthis.onChange( current );\n\t\t}\n\t\tconst chipInput = this.chipInput();\n\t\tif ( chipInput ) {\n\t\t\tchipInput.nativeElement.value = '';\n\t\t}\n\t}\n\n\tfilterOptions( value: string ): void {\n\t\tconst list = this.field().list || [];\n\t\tif ( !value ) {\n\t\t\tthis.filteredOptions.set( list );\n\t\t\treturn;\n\t\t}\n\t\tconst filterValue = value.toLowerCase();\n\t\tthis.filteredOptions.set(\n\t\t\tlist.filter( option => option.name.toLowerCase().includes( filterValue ) )\n\t\t);\n\t}\n\n\tonInputChange( event: Event ): void {\n\t\tconst input = event.target as HTMLInputElement;\n\t\tthis.filterOptions( input.value );\n\t\tthis.onTouched();\n\t}\n\n\tonFocus(): void {\n\t\tthis.filterOptions( '' );\n\t}\n\n\tchipColor( chip: string | number ): string {\n\t\tconst option = this.field().list?.find( o => o.id === chip );\n\t\treturn option?.color ? 'chip-' + option.color : '';\n\t}\n\n\tdisplayLabel( chip: string | number ): string {\n\t\tif ( typeof chip === 'number' ) {\n\t\t\tconst option = this.field().list?.find( o => o.id === chip );\n\t\t\treturn option?.name ?? String( chip );\n\t\t}\n\t\treturn chip;\n\t}\n}\n","<mat-form-field>\n\t@if (field().name) {\n\t\t<mat-label>{{ field().name }}</mat-label>\n\t}\n\t<mat-chip-grid #chipGrid>\n\t\t@for (chip of chips(); track chip) {\n\t\t\t<mat-chip-row (removed)=\"remove(chip)\" [class]=\"chipColor(chip)\">\n\t\t\t\t{{ displayLabel(chip) }}\n\t\t\t\t<button matChipRemove [attr.aria-label]=\"'Entfernen: ' + displayLabel( chip )\">\n\t\t\t\t\t<mat-icon>cancel</mat-icon>\n\t\t\t\t</button>\n\t\t\t</mat-chip-row>\n\t\t}\n\t</mat-chip-grid>\n\t<input #chipInput\n\t [matChipInputFor]=\"chipGrid\"\n\t [matChipInputSeparatorKeyCodes]=\"separatorKeyCodes\"\n\t [matChipInputAddOnBlur]=\"true\"\n\t (matChipInputTokenEnd)=\"add($event)\"\n\t (input)=\"onInputChange($event)\"\n\t (focus)=\"onFocus()\"\n\t [matAutocomplete]=\"auto\"\n\t [placeholder]=\"field().hint || ''\">\n\t<mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\n\t\t@for (option of filteredOptions(); track option.id) {\n\t\t\t<mat-option [value]=\"option\">{{ option.name }}</mat-option>\n\t\t}\n\t</mat-autocomplete>\n</mat-form-field>\n","import {\n\tafterRenderEffect,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tOnInit,\n\toutput,\n\tsignal,\n\tuntracked\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n\tAbstractControl,\n\tFormsModule,\n\tReactiveFormsModule,\n\tUntypedFormBuilder,\n\tUntypedFormGroup,\n\tValidationErrors,\n\tValidatorFn,\n\tValidators\n} from '@angular/forms';\nimport { XiriFormField, XiriFormFieldCondition, XiriFormFieldSelectOption } from './field.interface';\nimport { colsToClasses } from '../layout/cols.directive';\nimport { catchError, distinctUntilChanged, EMPTY, filter, map, merge, Observable, Subject, switchMap, timer } from \"rxjs\";\nimport { XiriDataService } from '../services/data.service';\nimport { XiriSnackbarService } from '../services/snackbar.service';\nimport { parseHttpError } from '../services/error.util';\nimport { emptyValueForField } from './helper/empty-value';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { XiriFileComponent } from './file/file.component';\nimport { XiriTimelimitComponent } from './timelimit/timelimit.component';\nimport { XiriVolumeComponent } from './volume/volume.component';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { MatRadioButton, MatRadioGroup } from '@angular/material/radio';\nimport { XiriDateTimeRangeComponent } from './datetimerange/datetimerange.component';\nimport { XiriDateRangeComponent } from './daterange/daterange.component';\nimport { XiriDateComponent } from './date/date.component';\nimport { XiriYearMonthComponent } from './yearmonth/yearmonth.component';\nimport { XiriTreeselectComponent } from './treeselect/treeselect.component';\nimport { XiriSelectDirective } from './select/select.directive';\nimport { NgxMatSelectSearchModule } from 'ngx-mat-select-search';\nimport { MatOption } from '@angular/material/core';\nimport { MatSelect } from '@angular/material/select';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { AsyncPipe } from '@angular/common';\nimport { MatError, MatFormField, MatHint, MatLabel, MatPrefix, MatSuffix } from '@angular/material/form-field';\nimport { SafehtmlPipe } from \"../pipes/safehtml.pipe\";\nimport { XiriChipsComponent } from './chips/chips.component';\nimport { XiriLocaleService } from '../services/locale.service';\n\nexport type XiriFormFieldDisplay = 'full' | 'line' | 'small';\n\nfunction formatValidationDate( localeString: string, unixSeconds: number ): string {\n\treturn new Intl.DateTimeFormat( localeString ).format( new Date( unixSeconds * 1000 ) );\n}\n\n\n@Component( {\n\t selector: 'xiri-form-fields',\n\t templateUrl: './form-fields.component.html',\n\t styleUrl: './form-fields.component.scss',\n\t imports: [\n\t\t FormsModule,\n\t\t ReactiveFormsModule,\n\t\t MatFormField,\n\t\t MatLabel,\n\t\t MatInput,\n\t\t MatPrefix,\n\t\t MatSuffix,\n\t\t MatIcon,\n\t\t MatHint,\n\t\t MatError,\n\t\t MatIconButton,\n\t\t MatSelect,\n\t\t MatOption,\n\t\t NgxMatSelectSearchModule,\n\t\t XiriSelectDirective,\n\t\t XiriTreeselectComponent,\n\t\t XiriDateComponent,\n\t\t XiriYearMonthComponent,\n\t\t XiriDateRangeComponent,\n\t\t XiriDateTimeRangeComponent,\n\t\t MatCheckbox,\n\t\t MatRadioButton,\n\t\t MatRadioGroup,\n\t\t XiriVolumeComponent,\n\t\t XiriTimelimitComponent,\n\t\t XiriFileComponent,\n\t\t MatProgressSpinner,\n\t\t AsyncPipe,\n\t\t SafehtmlPipe,\n\t\t XiriChipsComponent,\n\t ]\n } )\nexport class XiriFormFieldsComponent implements OnInit {\n\t\n\tprivate formBuilder = inject( UntypedFormBuilder );\n\tprivate destroyRef = inject( DestroyRef );\n\tprivate elementRef = inject<ElementRef<HTMLElement>>( ElementRef );\n\tprivate readonly localeService = inject( XiriLocaleService );\n\tprivate dataService = inject( XiriDataService );\n\tprivate snackbar = inject( XiriSnackbarService );\n\n\tform = input<XiriFormField[] | null>( null );\n\tdisplay = input<XiriFormFieldDisplay>( 'full' );\n\tdisabled = input<boolean>( false );\n\tformChange = output<UntypedFormGroup>();\n\tcheck = input<Observable<void> | null>( null );\n\n\t// fields: XiriFormField[] = [];\n\tformGroup: UntypedFormGroup;\n\tprivate lastValue: string | null = null;\n\tprivate _fields: XiriFormField[] | null = null;\n\tcollapsedSections = signal<Set<string>>( new Set() );\n\tprivate _fieldsLoaded = false;\n\tprivate _initialEmitDone = false;\n\tprivate _autoFocusDone = false;\n\n\t// Render-Kopien der gepatchten Felder, siehe displayFields(). Das Signal daneben stößt nur die\n\t// Neuberechnung an; die Identitäten selbst leben in der Map, damit sie stabil bleiben.\n\tprivate patchedClones = new Map<string, XiriFormField>();\n\tprivate patchVersion = signal( 0 );\n\t// Zuletzt angewendeter Patch pro Feld - Rohdaten vom Server, also frei von den Referenzen,\n\t// die z.B. der Treeselect nachträglich in die Optionsliste hängt.\n\tprivate lastPatch = new Map<string, Record<string, unknown>>();\n\t// Zählt jeden Aufbau einer neuen Feldliste, damit der Initial-Reload auch dann feuert, wenn\n\t// das neue Formular zufällig dieselben Trigger-Werte trägt wie das alte.\n\tprivate formGeneration = 0;\n\t// Startet den Reload einmalig nach dem Aufbau der Controls.\n\tprivate reloadKick = new Subject<void>();\n\t// Unterdrückt den formChange-Emit der valueChanges-Subscription, während ein Patch angewendet\n\t// wird - nach dem Patch wird genau einmal emittiert.\n\tprivate applyingPatch = false;\n\n\tconstructor() {\n\n\t\t// Fokussiert nach dem ersten Render das erste sichtbare, interaktive Feld (spart den ersten Klick).\n\t\t// Nicht-interaktive Feldtypen (header, divider, info, html) rendern kein fokussierbares Element\n\t\t// und werden dadurch automatisch übersprungen, ebenso versteckte (showWhen/collapsed) Felder,\n\t\t// die per @if gar nicht ins DOM kommen. Felder mit field.hide bleiben aber via [hidden] im DOM und\n\t\t// müssen daher explizit über einen [hidden]-Vorfahren ausgefiltert werden. Der Selektor beschränkt\n\t\t// sich bewusst auf echte Eingabe-Elemente, damit der klappbare Header (tabindex=\"0\") kein Ziel ist.\n\t\tafterRenderEffect( () => {\n\t\t\tthis.fields();\n\t\t\tif ( this._autoFocusDone )\n\t\t\t\treturn;\n\t\t\tconst target = Array.from(\n\t\t\t\tthis.elementRef.nativeElement.querySelectorAll<HTMLElement>( 'input, mat-select, textarea' )\n\t\t\t).find( el => !el.closest( '[hidden]' ) );\n\t\t\tif ( target ) {\n\t\t\t\tthis._autoFocusDone = true;\n\t\t\t\ttarget.focus( { preventScroll: true } );\n\t\t\t}\n\t\t} );\n\t\t\n\t\tthis.formGroup = this.formBuilder.group( {} );\n\t\t\n\t\teffect( () => {\n\t\t\tconst isDisabled = this.disabled();\n\t\t\tif ( isDisabled ) {\n\t\t\t\tthis.formGroup.disable( { emitEvent: false } );\n\t\t\t} else {\n\t\t\t\tthis.formGroup.enable( { emitEvent: false } );\n\t\t\t\t// Felder die vom Backend als disabled kamen, wieder deaktivieren\n\t\t\t\tif ( this._fields ) {\n\t\t\t\t\tfor ( const field of this._fields ) {\n\t\t\t\t\t\tif ( field.disabled ) {\n\t\t\t\t\t\t\tthis.formGroup.get( field.id )?.disable( { emitEvent: false } );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t\t\n\t\t// Track form input changes and emit after controls are created\n\t\teffect( () => {\n\t\t\tconst formInput = this.form();\n\t\t\tif ( formInput !== null ) {\n\t\t\t\t// Force evaluation of computed to create controls\n\t\t\t\tthis.fields();\n\t\t\t\t// Schedule emission for next microtask to ensure view is ready\n\t\t\t\tif ( this._fieldsLoaded && !this._initialEmitDone ) {\n\t\t\t\t\tthis._initialEmitDone = true;\n\t\t\t\t\t// Use queueMicrotask to emit after current change detection cycle\n\t\t\t\t\tqueueMicrotask( () => {\n\t\t\t\t\t\tthis.formChange.emit( this.formGroup );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Ein Reload direkt nach dem Aufbau der Controls, immer. Der Server liefert seine Listen\n\t\t// zum Startwert eines Triggers - der muss aber nicht der aktuelle sein: xiri-query stellt\n\t\t// gespeicherte Filterwerte über formService.loadState() wieder her, bevor die Controls\n\t\t// entstehen. Ein bedingtes \"nur wenn abweichend\" ist von hier aus nicht erkennbar.\n\t\teffect( () => {\n\t\t\tconst formInput = this.form();\n\t\t\tthis.fields();\n\t\t\tif ( formInput !== null && this._fieldsLoaded )\n\t\t\t\tthis.reloadKick.next();\n\t\t} );\n\t}\n\n\t// Gepatchte Felder werden als Kopie gerendert, damit Kind-Komponenten mit eigenem State\n\t// (treeselect, chips, die Select-Directive) ihre Inputs neu auswerten. Die Originale bleiben\n\t// die Quelle der Wahrheit - sie tragen field.control und werden von xiri-query mitgelesen.\n\t//\n\t// Die Kopie wird gecacht: die Identität eines Felds darf sich nur ändern, wenn genau dieses\n\t// Feld erneut gepatcht wurde. Würde hier bei jedem Patch neu geklont, liefe der Input-Setter\n\t// aller je gepatchten Felder erneut - beim Treeselect wäre das ein kompletter Neuaufbau.\n\tdisplayFields = computed( () => {\n\t\tconst fields = this.fields();\n\t\tthis.patchVersion();\n\t\tif ( fields === null || this.patchedClones.size === 0 )\n\t\t\treturn fields;\n\t\treturn fields.map( f => this.patchedClones.get( f.id ) ?? f );\n\t} );\n\t\n\tngOnInit(): void {\n\t\t\n\t\tthis.check()?.pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe( () => {\n\t\t\tthis.validateAllFormFields();\n\t\t} );\n\t\t\n\t\tthis.formGroup.valueChanges.pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe( () => {\n\t\t\tif ( this._fieldsLoaded && !this.applyingPatch ) {\n\t\t\t\tconst currentValue = JSON.stringify( this.formGroup.value );\n\t\t\t\tif ( currentValue === this.lastValue )\n\t\t\t\t\treturn;\n\t\t\t\tthis.lastValue = currentValue;\n\t\t\t\tthis.formChange.emit( this.formGroup );\n\t\t\t}\n\t\t} );\n\n\t\t// Ein Trigger-Wechsel lädt die abhängigen Felder nach.\n\t\t//\n\t\t// Der Snapshot wird ungefiltert gebildet und erst danach entprellt: das äußere switchMap\n\t\t// bricht damit einen noch laufenden Request sofort ab, sobald sich der Stand ändert. Läge\n\t\t// debounceTime davor, bliebe die Anfrage zum überholten Stand noch 200 ms aktiv und könnte\n\t\t// in diesem Fenster antworten - ihr Patch würde dann Werte verwerfen, die für den neuen\n\t\t// Stand gültig sind, und kein späterer Patch stellt sie wieder her.\n\t\tmerge( this.reloadKick, this.formGroup.valueChanges ).pipe(\n\t\t\t// Während des Control-Aufbaus feuert valueChanges für jedes entfernte und neue Control;\n\t\t\t// diese Zwischenstände sind kein Trigger-Wechsel. Der Kick danach übernimmt.\n\t\t\tfilter( () => this._fieldsLoaded ),\n\t\t\tmap( () => JSON.stringify( { g: this.formGeneration, v: this.triggerValues() } ) ),\n\t\t\tdistinctUntilChanged(),\n\t\t\tswitchMap( () => timer( 200 ).pipe( switchMap( () => this.fetchPatches() ) ) ),\n\t\t\ttakeUntilDestroyed( this.destroyRef ),\n\t\t).subscribe( patch => this.applyPatch( patch.url, patch.fields ) );\n\t}\n\n\t// Felder, die inhaltlich von anderen abhängen (beide Angaben nötig, siehe field.interface).\n\tprivate dependentFields(): XiriFormField[] {\n\t\treturn ( this._fields ?? [] ).filter( f => !!f.reloadUrl && !!f.reloadOn?.length );\n\t}\n\n\t// Nur die Trigger-Werte gehen an den Server, nicht das ganze Formular: ein Options-Endpoint\n\t// braucht keine Passwörter. Alles Weitere gehört in die reloadUrl.\n\t//\n\t// Ohne URL sind es alle Trigger (für den Änderungsvergleich), mit URL nur die, von denen die\n\t// Felder genau dieser URL abhängen - jeder Endpoint sieht also nur seine eigenen Werte.\n\tprivate triggerValues( url?: string ): Record<string, unknown> | null {\n\t\tconst dependent = this.dependentFields().filter( f => url === undefined || f.reloadUrl === url );\n\t\tif ( dependent.length === 0 )\n\t\t\treturn null;\n\n\t\tconst raw = this.formGroup.getRawValue();\n\t\tconst values: Record<string, unknown> = {};\n\t\tfor ( const field of dependent )\n\t\t\tfor ( const trigger of field.reloadOn ?? [] )\n\t\t\t\tif ( trigger in raw )\n\t\t\t\t\tvalues[ trigger ] = raw[ trigger ];\n\n\t\treturn values;\n\t}\n\n\tprivate fetchPatches(): Observable<{ url: string, fields: Record<string, unknown> }> {\n\n\t\tconst urls = new Set( this.dependentFields().map( f => f.reloadUrl as string ) );\n\t\tif ( urls.size === 0 )\n\t\t\treturn EMPTY;\n\n\t\t// Ein Request pro URL, jeder für sich: schlägt einer fehl, werden die Patches der\n\t\t// anderen trotzdem angewendet.\n\t\treturn merge( ...Array.from( urls ).map( url =>\n\t\t\tthis.dataService.post( url, this.triggerValues( url ) ?? {} ).pipe(\n\t\t\t\tmap( res => ( { url, fields: ( res as { fields?: Record<string, unknown> } )?.fields ?? {} } ) ),\n\t\t\t\tcatchError( err => {\n\t\t\t\t\tthis.snackbar.error( parseHttpError( err ) );\n\t\t\t\t\treturn EMPTY;\n\t\t\t\t} ),\n\t\t\t) ) );\n\t}\n\n\tprivate applyPatch( url: string, patch: Record<string, unknown> ): void {\n\n\t\tconst fields = this._fields;\n\t\tif ( fields === null || !patch )\n\t\t\treturn;\n\n\t\tconst patchedNow = new Set<string>();\n\n\t\tthis.applyingPatch = true;\n\t\ttry {\n\t\t\tfor ( const field of fields ) {\n\n\t\t\t\t// Der Server ist eine Trust-Boundary: eine Antwort darf nur die abhängigen Felder\n\t\t\t\t// genau dieser URL anfassen.\n\t\t\t\tif ( !field.reloadOn?.length || field.reloadUrl !== url )\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst entry = patch[ field.id ];\n\t\t\t\tif ( entry === null || typeof entry !== 'object' )\n\t\t\t\t\tcontinue;\n\n\t\t\t\tconst applied = applyPatchProperties( field, entry as Record<string, unknown>,\n\t\t\t\t this.lastPatch.get( field.id ) );\n\t\t\t\tthis.lastPatch.set( field.id, entry as Record<string, unknown> );\n\t\t\t\tif ( applied.length === 0 )\n\t\t\t\t\tcontinue;\n\t\t\t\tpatchedNow.add( field.id );\n\t\t\t\tthis.patchedClones.set( field.id, { ...field } );\n\n\t\t\t\tconst control = field.control;\n\t\t\t\tif ( !control )\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif ( applied.includes( 'list' ) )\n\t\t\t\t\tthis.pruneValue( field, control );\n\n\t\t\t\tif ( applied.includes( 'required' ) || applied.includes( 'min' ) || applied.includes( 'max' ) ) {\n\t\t\t\t\tfield.validations = undefined;\n\t\t\t\t\tcontrol.setValidators( this.bindValidations( field ) );\n\t\t\t\t\tcontrol.updateValueAndValidity( { emitEvent: false } );\n\t\t\t\t}\n\n\t\t\t\t// Mit dem globalen disabled kombinieren, sonst reaktiviert ein disabled:false im\n\t\t\t\t// Patch ein Control, obwohl die ganze Form gerade deaktiviert ist.\n\t\t\t\tif ( applied.includes( 'disabled' ) ) {\n\t\t\t\t\tif ( field.disabled || this.disabled() )\n\t\t\t\t\t\tcontrol.disable( { emitEvent: false } );\n\t\t\t\t\telse\n\t\t\t\t\t\tcontrol.enable( { emitEvent: false } );\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.applyingPatch = false;\n\t\t}\n\n\t\tif ( patchedNow.size === 0 )\n\t\t\treturn;\n\n\t\t// Nur anstoßen: die Klon-Identitäten selbst liegen in patchedClones und bleiben für alle\n\t\t// Felder stabil, die dieser Patch nicht angefasst hat.\n\t\tthis.patchVersion.update( v => v + 1 );\n\t\tthis.lastValue = JSON.stringify( this.formGroup.value );\n\t\tthis.formChange.emit( this.formGroup );\n\t}\n\n\t// Verwirft Werte, die die neue Liste nicht mehr anbietet. Das emittiert bewusst, damit ein\n\t// Feld, das seinerseits von diesem abhängt, nachzieht. Die Kette terminiert, weil Pruning\n\t// monoton ist: ein leeres Feld hat nichts mehr zu verwerfen.\n\tprivate pruneValue( field: XiriFormField, control: AbstractControl ): void {\n\n\t\t// Nur wenn die Liste autoritativ ist. Bei Server-Suche ist list nur der statische Sockel,\n\t\t// bei chips sind es Vorschläge - dort würde Pruning gültige Eingaben löschen.\n\t\tif ( field.url || field.type === 'chips' )\n\t\t\treturn;\n\n\t\tconst ids = collectOptionIds( field.list ?? [] );\n\t\tconst value = control.value;\n\n\t\tif ( Array.isArray( value ) ) {\n\t\t\tconst kept = value.filter( v => ids.has( v as string | number ) );\n\t\t\tif ( kept.length !== value.length )\n\t\t\t\tcontrol.setValue( kept );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( value === null || value === undefined || value === '' )\n\t\t\treturn;\n\t\tif ( !ids.has( value as string | number ) )\n\t\t\tcontrol.setValue( emptyValueForField( field ) );\n\t}\n\t\n\tfields = computed( () => {\n\t\t\n\t\tthis._fieldsLoaded = false;\n\t\tif ( this._fields !== null ) {\n\t\t\tfor ( let i = 0; i != this._fields.length; i++ ) {\n\t\t\t\tthis.formGroup.removeControl( this._fields[ i ].id );\n\t\t\t}\n\t\t\tthis._fields = null;\n\t\t}\n\t\t\n\t\tconst fields = this.form();\n\t\tif ( fields == null ) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tthis._fields = fields;\n\n\t\t// Neue Feldliste: alte Render-Kopien und Patch-Stände gehören zum vorherigen Formular.\n\t\tthis.formGeneration++;\n\t\tthis.patchedClones.clear();\n\t\tthis.lastPatch.clear();\n\n\t\tconst initialCollapsed = new Set<string>();\n\t\tfor ( const f of fields ) {\n\t\t\tif ( f.type === 'header' && f.collapsible && f.collapsed )\n\t\t\t\tinitialCollapsed.add( f.id );\n\t\t}\n\t\tuntracked( () => this.collapsedSections.set( initialCollapsed ) );\n\n\t\tthis.createControl();\n\t\t\n\t\tthis.lastValue = JSON.stringify( this.formGroup.value );\n\t\tthis._fieldsLoaded = true;\n\t\treturn this._fields;\n\t} );\n\t\n\tprivate createControl(): void {\n\n\t\tconst fields = this._fields;\n\t\tif ( fields === null )\n\t\t\treturn;\n\n\t\tfor ( let i = 0; i != fields.length; i++ ) {\n\t\t\tconst field = fields[ i ];\n\t\t\t\n\t\t\tif ( field.formtype )\n\t\t\t\tfield.type = field.formtype;\n\t\t\tif ( !field.subtype )\n\t\t\t\tfield.subtype = field.type;\n\t\t\tif ( !field.class )\n\t\t\t\tfield.class = field.cols !== undefined ? colsToClasses( field.cols ) : 'xcol';\n\t\t\t\n\t\t\tswitch ( field.type ) {\n\t\t\t\tcase 'email':\n\t\t\t\t\tfield.type = 'text';\n\t\t\t\t\tfield.subtype = 'email';\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'password':\n\t\t\t\t\tfield.subtype = 'password';\n\t\t\t\t\tfield.pwdhide = true;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'objectlist':\n\t\t\t\t\tfield.multiple = true;\n\t\t\t\t\tif ( field.subtype != 'objectlist' )\n\t\t\t\t\t\tfield.type = field.subtype;\n\t\t\t\t\telse {\n\t\t\t\t\t\tif ( field.tree === undefined )\n\t\t\t\t\t\t\tfield.tree = true;\n\t\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\t\tfield.type = 'treeselect';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'volume':\n\t\t\t\t\tfield.required = true;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'treeselect':\n\t\t\t\t\tfield.tree = true;\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'multiselect':\n\t\t\t\t\tfield.tree = false;\n\t\t\t\t\tfield.type = 'treeselect';\n\t\t\t\t\t\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'radio':\n\t\t\t\t\tfillListFromArray( field );\n\t\t\t\t\tif ( field.value === undefined && field.list?.length )\n\t\t\t\t\t\tfield.value = field.list[ 0 ].id;\n\t\t\t\t\tfield.multiple = false;\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'select':\n\t\t\t\tcase 'object':\n\t\t\t\tcase 'model':\n\t\t\t\t\tif ( field.type == 'object' || field.type == 'model' ) {\n\t\t\t\t\t\tfield.type = 'select';\n\t\t\t\t\t\tfield.subtype = 'model';\n\t\t\t\t\t\tfield.multiple = false;\n\t\t\t\t\t}\n\t\t\t\t\tif ( field.subtype == 'object' )\n\t\t\t\t\t\tfield.subtype = 'model';\n\n\t\t\t\t\tfillListFromArray( field );\n\n\t\t\t\t\tif ( field.subtype === 'model' ) {\n\t\t\t\t\t\tif ( field.value === undefined && field.list !== undefined && field.list.length != 0 )\n\t\t\t\t\t\t\tfield.value = field.list[ 0 ].id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( field.value === undefined || field.value === null )\n\t\t\t\t\t\t\tfield.value = [];\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\t\n\t\t\t\t\tfield.serverSideSearch = !!field.url;\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'date':\n\t\t\t\tcase 'datetime':\n\t\t\t\t\tfield.type = 'date';\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tif ( field.subtype == 'datetime' )\n\t\t\t\t\t\tfield.class += ' datetime';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'yearmonth':\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tfield.class += ' yearmonth';\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'daterange':\n\t\t\t\tcase 'datetimerange':\n\t\t\t\t\tif ( field.required === undefined )\n\t\t\t\t\t\tfield.required = true;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'bool':\n\t\t\t\t\tif ( field.name === undefined && field.placeholder )\n\t\t\t\t\t\tfield.name = field.placeholder;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'question':\n\t\t\t\t\tif ( field.question )\n\t\t\t\t\t\tfield.value = field.question;\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\t// if ( field.hint || (field.type == 'textarea' && field.max) )\n\t\t\t//\tfield.class += ' hashint';\n\t\t\t\n\t\t\tif ( field.value === undefined ) {\n\t\t\t\tif ( field.type == 'text' || field.type == 'textarea' )\n\t\t\t\t\tfield.value = '';\n\t\t\t\telse if ( field.type == 'bool' )\n\t\t\t\t\tfield.value = false;\n\t\t\t}\n\t\t\t\n\t\t\tfield.required = !!field.required;\n\t\t\tfield.disabled = !!field.disabled;\n\t\t\t\n\t\t\tconst control = this.formBuilder.control(\n\t\t\t\tfield.value,\n\t\t\t\tthis.bindValidations( field )\n\t\t\t);\n\t\t\t\n\t\t\tfield.control = control;\n\t\t\tthis.formGroup.addControl( field.id, control );\n\t\t}\n\t}\n\t\n\tprivate bindValidations( field: XiriFormField ) {\n\n\t\tconst validList: ValidatorFn[] = [];\n\n\t\tif ( field.validations === undefined ) {\n\n\t\t\tfield.validations = [];\n\t\t\t// Sprache wird bei jedem Zugriff auf `message` frisch aus dem Service gelesen (Getter),\n\t\t\t// damit die Fehlertexte bei einem Sprachwechsel ohne Neuaufbau der Validatoren umschalten.\n\t\t\tconst localeService = this.localeService;\n\t\t\tconst messagesFor = () => localeService.validationMessagesFor();\n\t\t\tconst localeStringFor = () => localeService.localeString();\n\n\t\t\tif ( field.min !== undefined ) {\n\t\t\t\tconst min = field.min;\n\t\t\t\tif ( field.type == 'number' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'min',\n\t\t\t\t\t\t validator: Validators.min( min ),\n\t\t\t\t\t\t get message() { return messagesFor().minNumber( min ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'date' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'min',\n\t\t\t\t\t\t validator: Validators.min( min ),\n\t\t\t\t\t\t get message() { return messagesFor().minDate( formatValidationDate( localeStringFor(), min ) ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'daterange' || field.type == 'datetimerange' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'min',\n\t\t\t\t\t\t validator: validatorDateRangeStart( min ),\n\t\t\t\t\t\t get message() { return messagesFor().minDateRange( formatValidationDate( localeStringFor(), min ) ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'multiselect' || field.type == 'treeselect' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'min',\n\t\t\t\t\t\t validator: validatorArrayMin( min ),\n\t\t\t\t\t\t get message() { return messagesFor().minSelection( min ); }\n\t\t\t\t\t } );\n\t\t\t\telse\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'minlength',\n\t\t\t\t\t\t validator: Validators.minLength( min ),\n\t\t\t\t\t\t get message() { return messagesFor().minLength( min ); }\n\t\t\t\t\t } );\n\t\t\t}\n\t\t\tif ( field.max !== undefined ) {\n\t\t\t\tconst max = field.max;\n\t\t\t\tif ( field.type == 'number' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'max',\n\t\t\t\t\t\t validator: Validators.max( max ),\n\t\t\t\t\t\t get message() { return messagesFor().maxNumber( max ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'date' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'max',\n\t\t\t\t\t\t validator: Validators.max( max ),\n\t\t\t\t\t\t get message() { return messagesFor().maxDate( formatValidationDate( localeStringFor(), max ) ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'daterange' || field.type == 'datetimerange' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'max',\n\t\t\t\t\t\t validator: validatorDateRangeEnd( max ),\n\t\t\t\t\t\t get message() { return messagesFor().maxDateRange( formatValidationDate( localeStringFor(), max ) ); }\n\t\t\t\t\t } );\n\t\t\t\telse if ( field.type == 'multiselect' || field.type == 'treeselect' )\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'max',\n\t\t\t\t\t\t validator: validatorArrayMax( max ),\n\t\t\t\t\t\t get message() { return messagesFor().maxSelection( max ); }\n\t\t\t\t\t } );\n\t\t\t\telse\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'maxlength',\n\t\t\t\t\t\t validator: Validators.maxLength( max ),\n\t\t\t\t\t\t get message() { return messagesFor().maxLength( max ); }\n\t\t\t\t\t } );\n\t\t\t}\n\n\t\t\tif ( field.pattern !== undefined ) {\n\t\t\t\tfield.validations.push( {\n\t\t\t\t\t id: 'pattern',\n\t\t\t\t\t validator: Validators.pattern( field.pattern ),\n\t\t\t\t\t get message() { return messagesFor().invalidFormat; }\n\t\t\t\t } );\n\t\t\t} else {\n\t\t\t\tif ( field.type == 'text' && field.subtype == 'email' ) {\n\t\t\t\t\tfield.validations.push( {\n\t\t\t\t\t\t id: 'email',\n\t\t\t\t\t\t validator: Validators.email,\n\t\t\t\t\t\t get message() { return messagesFor().invalidEmail; }\n\t\t\t\t\t } );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( field.required == true ) {\n\t\t\t\tfield.validations.push( {\n\t\t\t\t\t id: 'required',\n\t\t\t\t\t validator: Validators.required,\n\t\t\t\t\t get message() { return messagesFor().required; },\n\t\t\t\t } );\n\t\t\t} else {\n\t\t\t\tfield.validations.push( {\n\t\t\t\t\t id: 'undefined',\n\t\t\t\t\t validator: validatorUndefined(),\n\t\t\t\t\t get message() { return messagesFor().valueRequired; },\n\t\t\t\t } );\n\t\t\t}\n\t\t}\n\n\t\tfield.validations.forEach( valid => {\n\t\t\tvalidList.push( valid.validator );\n\t\t} );\n\n\t\treturn validList.length ? Validators.compose( validList ) : null;\n\t}\n\t\n\tprivate validateAllFormFields() {\n\n\t\tthis.formGroup.markAsDirty();\n\t\tthis.formGroup.markAllAsTouched();\n\t\tthis.formGroup.updateValueAndValidity();\n\t}\n\t\n\tisFieldVisible( field: XiriFormField ): boolean {\n\t\t\n\t\t// Check if field is inside a collapsed section\n\t\tif ( this.isInCollapsedSection( field ) )\n\t\t\treturn false;\n\t\t\n\t\tif ( !field.showWhen )\n\t\t\treturn true;\n\t\t\n\t\tconst conditions: XiriFormFieldCondition[] = Array.isArray( field.showWhen )\n\t\t ? field.showWhen\n\t\t : [ field.showWhen ];\n\t\t\n\t\treturn conditions.every( condition => this.evaluateCondition( condition ) );\n\t}\n\t\n\ttoggleSection( header: XiriFormField ): void {\n\t\tthis.collapsedSections.update( set => {\n\t\t\tconst next = new Set( set );\n\t\t\tif ( next.has( header.id ) )\n\t\t\t\tnext.delete( header.id );\n\t\t\telse\n\t\t\t\tnext.add( header.id );\n\t\t\treturn next;\n\t\t} );\n\t}\n\t\n\tisSectionCollapsed( headerId: string ): boolean {\n\t\treturn this.collapsedSections().has( headerId );\n\t}\n\n\tprivate isInCollapsedSection( field: XiriFormField ): boolean {\n\t\tconst fields = this._fields;\n\t\tif ( !fields ) return false;\n\n\t\t// Ein header startet seine eigene Section und ist nie Teil einer vorherigen\n\t\tif ( field.type === 'header' ) return false;\n\n\t\t// Über die ID suchen, nicht über die Identität: gepatchte Felder werden als Kopie\n\t\t// gerendert, damit die Kind-Komponenten eine neue Input-Identität sehen.\n\t\tconst idx = fields.findIndex( f => f.id === field.id );\n\t\tif ( idx <= 0 ) return false;\n\n\t\t// Walk backwards to find the nearest header or divider\n\t\tfor ( let i = idx - 1; i >= 0; i-- ) {\n\t\t\tconst f = fields[ i ];\n\t\t\tif ( f.type === 'header' ) {\n\t\t\t\treturn !!f.collapsible && this.collapsedSections().has( f.id );\n\t\t\t}\n\t\t\tif ( f.type === 'divider' ) {\n\t\t\t\treturn false; // Divider breaks the section\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\t\n\tprivate evaluateCondition( condition: XiriFormFieldCondition ): boolean {\n\t\t\n\t\tconst control = this.formGroup.get( condition.field );\n\t\tif ( !control )\n\t\t\treturn false;\n\t\t\n\t\tconst fieldValue = control.value;\n\t\t\n\t\tswitch ( condition.operator ) {\n\t\t\tcase 'equals':\n\t\t\t\treturn fieldValue === condition.value;\n\t\t\tcase 'notEquals':\n\t\t\t\treturn fieldValue !== condition.value;\n\t\t\tcase 'contains':\n\t\t\t\treturn typeof fieldValue === 'string' && fieldValue.includes( condition.value as string );\n\t\t\tcase 'greaterThan':\n\t\t\t\treturn fieldValue > ( condition.value as number );\n\t\t\tcase 'lessThan':\n\t\t\t\treturn fieldValue < ( condition.value as number );\n\t\t\tcase 'in':\n\t\t\t\treturn Array.isArray( condition.value ) && condition.value.includes( fieldValue );\n\t\t\tcase 'notEmpty':\n\t\t\t\treturn fieldValue !== null && fieldValue !== undefined && fieldValue !== '';\n\t\t\tdefault:\n\t\t\t\treturn true;\n\t\t}\n\t}\n}\n\n// Was ein Reload-Patch am Feld ändern darf, jeweils mit Typprüfung. Der Server ist eine\n// Trust-Boundary: eine kaputte `list` oder ein `min: \"3\"` dürfen weder das Pruning noch den\n// Validator-Aufbau verfälschen.\n//\n// Bewusst nicht patchbar: `id`, `type`, `subtype` (createControl normalisiert die einmalig, ein\n// Roh-Wert vom Server würde das zerlegen), `value` (den Wert behält der Client, siehe pruneValue),\n// `control`, `showWhen` und `url` (`serverSideSearch` und der Suchfluss der Select-Directive\n// werden nur beim Aufbau abgeleitet, eine Änderung käme nie an).\nconst PATCH_GUARDS: Record<string, ( value: unknown ) => boolean> = {\n\tlist: isOptionList,\n\tname: isString,\n\t// Go exportiert einen leeren Hint als null - sonst liesse er sich nie wieder abräumen.\n\thint: isStringOrNull,\n\tclass: isString,\n\trequired: isBoolean,\n\tdisabled: isBoolean,\n\thide: isBoolean,\n\tsearch: isBoolean,\n\tmin: isNumber,\n\tmax: isNumber,\n\tparams: isPlainObject,\n};\n\nfunction isString( value: unknown ): boolean {\n\treturn typeof value === 'string';\n}\n\nfunction isStringOrNull( value: unknown ): boolean {\n\treturn value === null || typeof value === 'string';\n}\n\nfunction isBoolean( value: unknown ): boolean {\n\treturn typeof value === 'boolean';\n}\n\nfunction isNumber( value: unknown ): boolean {\n\treturn typeof value === 'number' && Number.isFinite( value );\n}\n\nfunction isPlainObject( value: unknown ): boolean {\n\treturn typeof value === 'object' && value !== null && !Array.isArray( value );\n}\n\n// Rekursiv, inklusive children: eine Option mit einem children-Feld, das kein Array ist, würde\n// sonst erst später beim Sammeln der IDs oder beim Aufbau des Baums knallen.\nfunction isOptionList( value: unknown ): boolean {\n\treturn Array.isArray( value ) && value.every( isOption );\n}\n\nfunction isOption( value: unknown ): boolean {\n\tif ( !isPlainObject( value ) )\n\t\treturn false;\n\tconst option = value as { id?: unknown, children?: unknown };\n\tif ( typeof option.id !== 'string' && typeof option.id !== 'number' )\n\t\treturn false;\n\treturn option.children === undefined || option.children === null || isOptionList( option.children );\n}\n\n// Schreibt die erlaubten Properties ins Feld und meldet, welche davon wirklich etwas geändert\n// haben. Ein Reload liefert oft dasselbe zurück - z.B. weil ein anderer Trigger sich geändert\n// hat. Unveränderte Properties zu überspringen erspart den Klon (der einen Treeselect neu\n// aufbauen und bei gesetzter url erneut laden würde), den Validator-Neubau und den formChange.\n//\n// Verglichen wird bevorzugt mit dem zuletzt angewendeten Patch, nicht mit dem Feld: der\n// Treeselect hängt beim Aufbau parent-Referenzen und state an die Optionsknoten, wodurch die\n// Liste am Feld verschachtelt zyklisch wird und ohnehin nie mehr gleich aussieht.\nfunction applyPatchProperties( field: XiriFormField,\n entry: Record<string, unknown>,\n previous: Record<string, unknown> | undefined ): string[] {\n\n\tconst applied: string[] = [];\n\tconst target = field as unknown as Record<string, unknown>;\n\n\tfor ( const key of Object.keys( PATCH_GUARDS ) ) {\n\t\tif ( !( key in entry ) )\n\t\t\tcontinue;\n\t\tconst value = entry[ key ];\n\t\tif ( !PATCH_GUARDS[ key ]( value ) )\n\t\t\tcontinue;\n\t\tconst before = previous && key in previous ? previous[ key ] : target[ key ];\n\t\tif ( sameValue( before, value ) )\n\t\t\tcontinue;\n\t\ttarget[ key ] = value === null ? undefined : value;\n\t\tapplied.push( key );\n\t}\n\n\treturn applied;\n}\n\nfunction sameValue( a: unknown, b: unknown ): boolean {\n\tif ( a === b )\n\t\treturn true;\n\tif ( typeof a !== 'object' || typeof b !== 'object' || a === null || b === null )\n\t\treturn false;\n\ttry {\n\t\treturn JSON.stringify( a ) === JSON.stringify( b );\n\t} catch {\n\t\t// Zyklisch (siehe oben) - dann lieber anwenden als fälschlich überspringen.\n\t\treturn false;\n\t}\n}\n\n// Option-IDs inklusive verschachtelter children - eine flache Sammlung würde jede ausgewählte\n// Leaf-ID eines Treeselects verwerfen.\nfunction collectOptionIds( list: XiriFormFieldSelectOption[],\n into: Set<string | number> = new Set() ): Set<string | number> {\n\tfor ( const option of list ) {\n\t\tinto.add( option.id );\n\t\tif ( option.children?.length )\n\t\t\tcollectOptionIds( option.children, into );\n\t}\n\treturn into;\n}\n\nfunction fillListFromArray( field: XiriFormField ): void {\n\tif ( field.list === undefined && field.array !== undefined ) {\n\t\tconst list: XiriFormFieldSelectOption[] = [];\n\t\tfield.array.forEach( val => {\n\t\t\tlist.push( {\n\t\t\t\t id: val as unknown as number,\n\t\t\t\t name: val as unknown as string,\n\t\t\t } )\n\t\t} );\n\t\tfield.list = list;\n\t}\n}\n\nfunction validatorDateRangeStart( min: number ): ValidatorFn {\n\treturn ( control: AbstractControl ): ValidationErrors | null => {\n\t\tif ( control.value === undefined || control.value === null || control.value.start === null )\n\t\t\treturn null;\n\t\tconst ok = min < control.value.start;\n\t\treturn ok ? null : { min: { value: control.value } };\n\t};\n}\n\nfunction validatorDateRangeEnd( max: number ): ValidatorFn {\n\treturn ( control: AbstractControl ): ValidationErrors | null => {\n\t\tif ( control.value === undefined || control.value === null || control.value.end === null )\n\t\t\treturn null;\n\t\tconst ok = max > control.value.end;\n\t\treturn ok ? null : { max: { value: control.value } };\n\t};\n}\n\nfunction validatorUndefined(): ValidatorFn {\n\treturn ( control: AbstractControl ): ValidationErrors | null => {\n\t\treturn control.value === undefined ? { undefined: { value: control.value } } : null;\n\t};\n}\n\nfunction validatorArrayMin( min: number ): ValidatorFn {\n\treturn ( control: AbstractControl ): ValidationErrors | null => {\n\t\tif ( control.value === null || control.value === undefined )\n\t\t\treturn null;\n\t\tconst ok = control.value.length >= min;\n\t\treturn ok ? null : { min: { value: control.value } };\n\t};\n}\n\nfunction validatorArrayMax( max: number ): ValidatorFn {\n\treturn ( control: AbstractControl ): ValidationErrors | null => {\n\t\tif ( control.value === null || control.value === undefined )\n\t\t\treturn null;\n\t\tconst ok = control.value.length <= max;\n\t\treturn ok ? null : { max: { value: control.value } };\n\t};\n}\n","<form class=\"xrow dynamic-form\" [formGroup]=\"formGroup\" [class]=\"display()\">\n\t@for (field of displayFields(); track field.id) {\n\t\t@if (isFieldVisible(field)) {\n\t\t@switch (field.type) {\n\t\t\t@case ('text') {\n\t\t\t\t<mat-form-field [class]=\"field.class\" [formGroup]=\"formGroup\" floatLabel=\"auto\" [hidden]=\"field.hide\">\n\t\t\t\t\t@if (field.name) {\n\t\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t}\n\t\t\t\t\t<input matInput\n\t\t\t\t\t [formControlName]=\"field.id\"\n\t\t\t\t\t [type]=\"field.subtype || 'text'\"\n\t\t\t\t\t [autocomplete]=\"field.name\"\n\t\t\t\t\t [attr.minlength]=\"field.min\"\n\t\t\t\t\t [attr.maxlength]=\"field.max\"\n\t\t\t\t\t [required]=\"!!field.required\">\n\t\t\t\t\t@if (field.textPrefix) {\n\t\t\t\t\t\t<span matTextPrefix=\"\">{{ field.textPrefix }}</span>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.textSuffix) {\n\t\t\t\t\t\t<span matTextSuffix=\"\">{{ field.textSuffix }}</span>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.iconPrefix) {\n\t\t\t\t\t\t<mat-icon matPrefix>{{ field.iconPrefix }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.iconSuffix) {\n\t\t\t\t\t\t<mat-icon matSuffix>{{ field.iconSuffix }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.max) {\n\t\t\t\t\t\t<mat-hint align=\"end\">{{ formGroup.get(field.id)?.value?.length || 0 }} / {{ field.max }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('number') {\n\t\t\t\t<mat-form-field [class]=\"field.class\" [formGroup]=\"formGroup\" floatLabel=\"auto\" [hidden]=\"field.hide\">\n\t\t\t\t\t@if (field.name) {\n\t\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t}\n\t\t\t\t\t<input matInput\n\t\t\t\t\t [formControlName]=\"field.id\"\n\t\t\t\t\t [autocomplete]=\"field.name || field.id\"\n\t\t\t\t\t [lang]=\"field.locale || ''\"\n\t\t\t\t\t [type]=\"field.type\"\n\t\t\t\t\t [attr.min]=\"field.min\"\n\t\t\t\t\t [attr.max]=\"field.max\"\n\t\t\t\t\t [required]=\"!!field.required\">\n\t\t\t\t\t@if (field.textPrefix) {\n\t\t\t\t\t\t<span matTextPrefix=\"\">{{ field.textPrefix }}</span>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.textSuffix) {\n\t\t\t\t\t\t<span matTextSuffix=\"\">{{ field.textSuffix }}</span>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.iconPrefix) {\n\t\t\t\t\t\t<mat-icon matPrefix>{{ field.iconPrefix }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.iconSuffix) {\n\t\t\t\t\t\t<mat-icon matSuffix>{{ field.iconSuffix }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('password') {\n\t\t\t\t<mat-form-field [class]=\"field.class\" [formGroup]=\"formGroup\" floatLabel=\"auto\" [hidden]=\"field.hide\">\n\t\t\t\t\t@if (field.name) {\n\t\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t}\n\t\t\t\t\t<input matInput\n\t\t\t\t\t [formControlName]=\"field.id\"\n\t\t\t\t\t [type]=\"field.pwdhide ? 'password' : 'text'\"\n\t\t\t\t\t [autocomplete]=\"field.name\"\n\t\t\t\t\t [attr.minlength]=\"field.min\"\n\t\t\t\t\t [attr.maxlength]=\"field.max\"\n\t\t\t\t\t [required]=\"!!field.required\">\n\t\t\t\t\t<button mat-icon-button matSuffix class=\"form-field-button\" (click)=\"field.pwdhide = !field.pwdhide\" [attr.aria-label]=\"'Hide password'\"\n\t\t\t\t\t [attr.aria-pressed]=\"field.pwdhide\">\n\t\t\t\t\t\t<mat-icon>{{ field.pwdhide ? 'visibility_off' : 'visibility' }}</mat-icon>\n\t\t\t\t\t</button>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.max) {\n\t\t\t\t\t\t<mat-hint align=\"end\">{{ formGroup.get(field.id)?.value?.length || 0 }} / {{ field.max }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('select') {\n\t\t\t\t<mat-form-field [class]=\"field.class\" [formGroup]=\"formGroup\" floatLabel=\"auto\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t@if (field.search === false) {\n\t\t\t\t\t\t<mat-select [formControlName]=\"field.id\" [multiple]=\"field.multiple\" [required]=\"!!field.required\" panelClass=\"selectPanel\">\n\t\t\t\t\t\t\t@for (x of field.list; track x.id) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"x.id\" [disabled]=\"x.disabled\">{{ x.name }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<mat-select [formControlName]=\"field.id\" [multiple]=\"field.multiple\" [required]=\"!!field.required\" panelClass=\"selectPanel\">\n\t\t\t\t\t\t\t<mat-option>\n\t\t\t\t\t\t\t\t<ngx-mat-select-search [formControl]=\"xiriSelect.formControl\" xiriSelect #xiriSelect=\"xiriSelect\"\n\t\t\t\t\t\t\t\t [values]=\"field.list || []\" [searching]=\"xiriSelect.searching\"\n\t\t\t\t\t\t\t\t [serverSideSearch]=\"!!field.serverSideSearch\" [serverUrl]=\"field.url || ''\"\n\t\t\t\t\t\t\t\t [serverParams]=\"field.params || {}\"></ngx-mat-select-search>\n\t\t\t\t\t\t\t</mat-option>\n\t\t\t\t\t\t\t@for (x of xiriSelect.filter | async; track x.id) {\n\t\t\t\t\t\t\t\t<mat-option [value]=\"x.id\" [disabled]=\"x.disabled\">{{ x.name }}</mat-option>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('treeselect') {\n\t\t\t\t<div class=\"treeselect\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-treeselect [field]=\"field\" [formControlName]=\"field.id\"\n\t\t\t\t\t [class.error]=\"formGroup.get(field.id)?.touched && formGroup.get(field.id)?.invalid\"></xiri-treeselect>\n\t\t\t\t\t<div class=\"xhint\" aria-live=\"polite\" [class.error]=\"formGroup.get(field.id)?.touched && formGroup.get(field.id)?.invalid\">\n\t\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (field.max) {\n\t\t\t\t\t\t\t<mat-hint align=\"end\">{{ formGroup.get(field.id)?.value?.length || 0 }} / {{ field.max }}</mat-hint>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.touched && formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('date') {\n\t\t\t\t<mat-form-field [formGroup]=\"formGroup\" class=\"date\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t<xiri-date [field]=\"field\" [formControlName]=\"field.id\"></xiri-date>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('yearmonth') {\n\t\t\t\t<mat-form-field [formGroup]=\"formGroup\" class=\"yearmonth\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t<xiri-yearmonth [field]=\"field\" [formControlName]=\"field.id\"></xiri-yearmonth>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('daterange') {\n\t\t\t\t<mat-form-field [formGroup]=\"formGroup\" class=\"daterange\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t<xiri-date-range [field]=\"field\" [formControlName]=\"field.id\"></xiri-date-range>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('datetimerange') {\n\t\t\t\t<mat-form-field [formGroup]=\"formGroup\" class=\"datetimerange\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t<xiri-date-time-range [field]=\"field\" [formControlName]=\"field.id\"></xiri-date-time-range>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('bool') {\n\t\t\t\t<div class=\"bool\" [class]=\"field.class\" [formGroup]=\"formGroup\" [hidden]=\"field.hide\">\n\t\t\t\t\t<mat-checkbox [formControlName]=\"field.id\">{{ field.name }}</mat-checkbox>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('radio') {\n\t\t\t\t<div class=\"radio\" [class]=\"field.class\" [formGroup]=\"formGroup\" [hidden]=\"field.hide\">\n\t\t\t\t\t@if (field.name) {\n\t\t\t\t\t\t<span class=\"radio-label\" [id]=\"field.id + '-label'\">{{ field.name }}</span>\n\t\t\t\t\t}\n\t\t\t\t\t<mat-radio-group\n\t\t\t\t\t\t[formControlName]=\"field.id\"\n\t\t\t\t\t\t[attr.aria-labelledby]=\"field.name ? field.id + '-label' : null\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@for (x of field.list; track x.id) {\n\t\t\t\t\t\t\t<mat-radio-button [value]=\"x.id\" [disabled]=\"x.disabled\">{{ x.name }}</mat-radio-button>\n\t\t\t\t\t\t}\n\t\t\t\t\t</mat-radio-group>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('volume') {\n\t\t\t\t<div [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-volume [field]=\"field\" [formControlName]=\"field.id\"></xiri-volume>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('timelimit') {\n\t\t\t\t<div [class]=\"field.class\" [formGroup]=\"formGroup\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-timelimit matInput [formControlName]=\"field.id\" [required]=\"!!field.required\" [texts]=\"field.texts || {}\"></xiri-timelimit>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('textarea') {\n\t\t\t\t<mat-form-field [class]=\"field.class\" [formGroup]=\"formGroup\" [hidden]=\"field.hide\">\n\t\t\t\t\t@if (field.name) {\n\t\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t}\n\t\t\t\t\t<textarea matInput [formControlName]=\"field.id\" [required]=\"!!field.required\" [rows]=\"field.rows || 5\"></textarea>\n\t\t\t\t\t@if (field.hint) {\n\t\t\t\t\t\t<mat-hint>{{ field.hint }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@if (field.max) {\n\t\t\t\t\t\t<mat-hint align=\"end\">{{ formGroup.get(field.id)?.value?.length || 0 }} / {{ field.max }}</mat-hint>\n\t\t\t\t\t}\n\t\t\t\t\t@for (vali of field.validations; track vali.id) {\n\t\t\t\t\t\t<ng-container ngProjectAs=\"mat-error\">\n\t\t\t\t\t\t\t@if (formGroup.get(field.id)?.hasError(vali.id)) {\n\t\t\t\t\t\t\t\t<mat-error>{{ vali.message }}</mat-error>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t</mat-form-field>\n\t\t\t}\n\t\t\t@case ('file') {\n\t\t\t\t<div [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-file [field]=\"field\" [formControlName]=\"field.id\"></xiri-file>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('info') {\n\t\t\t\t<div class=\"info\" [class]=\"field.class\">{{ field.value }}</div>\n\t\t\t}\n\t\t\t@case ('header') {\n\t\t\t\t@if (field.collapsible) {\n\t\t\t\t\t<div class=\"header collapsible\" [class]=\"field.class\" role=\"button\" tabindex=\"0\"\n\t\t\t\t\t [attr.aria-expanded]=\"!isSectionCollapsed(field.id)\"\n\t\t\t\t\t (click)=\"toggleSection(field)\" (keydown.enter)=\"toggleSection(field)\" (keydown.space)=\"toggleSection(field); $event.preventDefault()\">\n\t\t\t\t\t\t<mat-icon class=\"collapse-icon\" [class.collapsed]=\"isSectionCollapsed(field.id)\">expand_more</mat-icon>\n\t\t\t\t\t\t{{ field.value }}\n\t\t\t\t\t</div>\n\t\t\t\t} @else {\n\t\t\t\t\t<div class=\"header\" [class]=\"field.class\">{{ field.value }}</div>\n\t\t\t\t}\n\t\t\t}\n\t\t\t@case ('divider') {\n\t\t\t\t<div class=\"divider\" [class]=\"field.class\">\n\t\t\t\t\t@if (field.value) {\n\t\t\t\t\t\t<span class=\"divider-text\">{{ field.value }}</span>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('html') {\n\t\t\t\t<div class=\"html\" [class]=\"field.class\" [innerHtml]=\"$any(field.value) | safeHtml\"></div>\n\t\t\t}\n\t\t\t@case ('question') {\n\t\t\t\t<div class=\"xcol question\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<div class=\"left\">\n\t\t\t\t\t\t<mat-icon [class]=\"field.iconColor || 'warn'\" inline=\"true\">{{ field.icon }}</mat-icon>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"right\">{{ field.value }}</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('waiting') {\n\t\t\t\t<div class=\"xcol waiting\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<div class=\"left\">\n\t\t\t\t\t\t@if (!field.done) {\n\t\t\t\t\t\t\t<mat-spinner diameter=\"40\"></mat-spinner>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@if (field.done) {\n\t\t\t\t\t\t\t<mat-icon inline=\"true\">done</mat-icon>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"right\">{{ field.value }}</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('chips') {\n\t\t\t\t<div [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-chips [field]=\"field\" [formControlName]=\"field.id\"></xiri-chips>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@default {\n\t\t\t\t<div>default: {{ field.type }}</div>\n\t\t\t}\n\t\t}\n\t\t}\n\t}\n</form>\n","import { Component, computed, effect, input, signal } from '@angular/core';\nimport {\n\tMatTableDataSource,\n\tMatTable,\n\tMatColumnDef,\n\tMatHeaderCellDef,\n\tMatHeaderCell,\n\tMatCellDef,\n\tMatCell,\n\tMatHeaderRowDef,\n\tMatHeaderRow,\n\tMatRowDef,\n\tMatRow\n} from \"@angular/material/table\";\nimport { XiriTableField } from \"./tabefield.interface\";\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\nimport { RouterLink } from '@angular/router';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { MatIcon } from '@angular/material/icon';\n\n\n/** A single table row: a map of column id → cell value (value shapes vary by column format). */\nexport type XiriRawTableRow = Record<string, unknown>;\n\nexport interface XiriRawTableSettings {\n\tdata: unknown\n\tfields?: XiriTableField[]\n\tdensity?: 'compact' | 'regular' | 'relaxed'\n\tdense?: number\n\tforceMinWidth?: boolean\n\tshowHeader?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-raw-table',\n\t templateUrl: './xiri-raw-table.component.html',\n\t styleUrl: './xiri-raw-table.component.scss',\n\t imports: [ MatTable,\n\t MatColumnDef,\n\t MatHeaderCellDef,\n\t MatHeaderCell,\n\t MatCellDef,\n\t MatCell,\n\t MatIcon,\n\t MatTooltip,\n\t RouterLink,\n\t MatHeaderRowDef,\n\t MatHeaderRow,\n\t MatRowDef,\n\t MatRow,\n\t SafehtmlPipe,\n\t XiriUrlPipe ],\n } )\nexport class XiriRawTableComponent {\n\t\n\tsettings = input.required<XiriRawTableSettings>();\n\tshowHeader = computed( () => this.settings().showHeader === true );\n\n\tdisplayedColumns: XiriTableField[] = [];\n\tcolumnsToDisplay: string[] = [];\n\tdataSource = new MatTableDataSource<XiriRawTableRow>();\n\ttableClass = signal( 'dense-6' );\n\n\tconstructor() {\n\t\teffect( () => {\n\t\t\tconst DENSITY_TO_LEVEL = { compact: 6, regular: 2, relaxed: 1 } as const;\n\t\t\tconst density = this.settings().density;\n\t\t\tconst level = density ? DENSITY_TO_LEVEL[ density ] : ( this.settings().dense || 6 );\n\t\t\tthis.tableClass.set( 'dense-' + level + ( this.settings().forceMinWidth ? ' force-min-width' : '' ) );\n\n\t\t\tthis.loadFields( this.settings().fields ?? [] );\n\t\t\tthis.dataSource.data = this.settings().data as XiriRawTableRow[];\n\t\t} );\n\t}\n\t\n\tprivate loadFields( fields: XiriTableField[] ) {\n\n\t\tthis.displayedColumns = [];\n\t\tthis.columnsToDisplay = [];\n\n\t\tfor ( let fid = 0; fid != fields.length; fid++ ) {\n\t\t\tconst column = fields[ fid ];\n\n\t\t\tif ( column.format == 'id' )\n\t\t\t\tcontinue;\n\t\t\tif ( !column.display )\n\t\t\t\tcolumn.display = '';\n\t\t\tif ( column.format )\n\t\t\t\tcolumn.display = column.format + ' ' + column.display;\n\t\t\tif ( column.align )\n\t\t\t\tcolumn.display += ` align-${ column.align }`;\n\n\t\t\tthis.displayedColumns.push( column );\n\t\t\tthis.columnsToDisplay.push( column.name );\n\t\t}\n\t}\n}\n","<div class=\"table-out\" [class]=\"tableClass()\">\n\t<table mat-table [dataSource]=\"dataSource\">\n\t\t@for (column of displayedColumns; track column) {\n\t\t\t<ng-container [matColumnDef]=\"column.name\">\n\t\t\t\t<th mat-header-cell *matHeaderCellDef [class]=\"column.display\"> {{ column.header }}</th>\n\t\t\t\t@switch (column.format) {\n\t\t\t\t\t@case ('icon') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t@if ($any(column.icons)[ $any(row)[ column.id ] ]) {\n\t\t\t\t\t\t\t\t<mat-icon [class]=\"$any(column.icons)[ $any(row)[ column.id ] ][ 'color' ] || 'primary'\"\n\t\t\t\t\t\t\t\t [matTooltip]=\"$any(column.icons)[ $any(row)[ column.id ] ][ 'hint' ]\"\n\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!$any(column.icons)[ $any(row)[ column.id ] ][ 'hint' ]\">{{ $any(column.icons)[$any(row)[column.id]]['icon'] }}\n\t\t\t\t\t\t\t\t</mat-icon>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('html') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [innerHtml]=\"$any(row)[column.id] | safeHtml\" [class]=\"column.display\"></td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('link') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t@if ($any(row)[column.id + 'Link']) {\n\t\t\t\t\t\t\t\t@let cellUrl = $any(row)[column.id + 'Link'] | xiriUrl;\n\t\t\t\t\t\t\t\t<a [routerLink]=\"cellUrl?.path\" [queryParams]=\"cellUrl?.queryParams\" class=\"tablelink\">{{ $any(row)[column.id] }}</a>\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<span>{{ $any(row)[column.id] }}</span>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('text2') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t<div>{{ $any(row)[column.id][0] }}</div>\n\t\t\t\t\t\t\t<div>{{ $any(row)[column.id][1] }}</div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('textn') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t@for (line of $any(row)[column.id]; track $index) {\n\t\t\t\t\t\t\t\t<div>{{ line }}</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('linkrow') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t@if ($any(row)[column.id + 'Link']) {\n\t\t\t\t\t\t\t\t@let rowUrl = $any(row)[column.id + 'Link'] | xiriUrl;\n\t\t\t\t\t\t\t\t<a [routerLink]=\"rowUrl?.path\" [queryParams]=\"rowUrl?.queryParams\">\n\t\t\t\t\t\t\t\t\t<div class=\"linkrow\">\n\t\t\t\t\t\t\t\t\t\t@if ($any(row)['icon']) {\n\t\t\t\t\t\t\t\t\t\t\t@if ($any(row)['iconSet']) {\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"$any(row)['iconColor'] || 'primary'\" [fontSet]=\"$any(row)['iconSet']\">{{ $any(row)['icon'] }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"$any(row)['iconColor'] || 'primary'\">{{ $any(row)['icon'] }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t<span class=\"text\" [class.hasIcon]=\"$any(row)['icon']\">{{ $any(row)[column.id] }}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('number') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t{{ column.textPrefix }}{{ $any(row)[column.id][0] }}{{ column.textSuffix }}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('chips') {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t<div class=\"xiri-chips-display\">\n\t\t\t\t\t\t\t\t@for (chip of $any(row)[column.id]; track chip.label) {\n\t\t\t\t\t\t\t\t\t<span class=\"xiri-chip-display\" [class]=\"chip.color || ''\">{{ chip.label }}</span>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t}\n\t\t\t\t\t@default {\n\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">{{ $any(row)[column.id] }}</td>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</ng-container>\n\t\t}\n\n\t\t@if (showHeader()) {\n\t\t\t<tr mat-header-row *matHeaderRowDef=\"columnsToDisplay\"></tr>\n\t\t}\n\t\t<tr mat-row *matRowDef=\"let row; columns: columnsToDisplay;\"></tr>\n\t</table>\n</div>","import { Component, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MatButton, MatFabButton, MatIconButton, MatMiniFabButton } from \"@angular/material/button\";\nimport { MatIcon } from \"@angular/material/icon\";\nimport { XiriButton } from \"../button/button.component\";\nimport { MatTooltip } from \"@angular/material/tooltip\";\nimport { MatProgressSpinner } from \"@angular/material/progress-spinner\";\n\n@Component( {\n\t selector: 'xiri-buttonstyle',\n\t imports: [\n\t\t MatButton,\n\t\t MatFabButton,\n\t\t MatIcon,\n\t\t MatIconButton,\n\t\t MatMiniFabButton,\n\t\t MatTooltip,\n\t\t MatProgressSpinner,\n\t\t NgTemplateOutlet\n\t ],\n\t templateUrl: './buttonstyle.component.html',\n\t styleUrl: './buttonstyle.component.scss',\n } )\nexport class XiriButtonstyleComponent {\n\tbutton = input.required<XiriButton>();\n\tdisabled = input.required<boolean>();\n\tloading = input<boolean>( false );\n\t// Remaining seconds until the next poll tick; shown inside the button while > 0.\n\tcountdown = input<number>( 0 );\n\t// Optional backend-defined label shown while polling; overrides the countdown when set.\n\tpollText = input<string>( '' );\n}\n","<ng-template #textContent>\n\t@if (loading()) {\n\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t@if (pollText() || countdown() > 0) {\n\t\t\t<span class=\"poll-countdown\">{{ pollText() || countdown() + 's' }}</span>\n\t\t}\n\t} @else {\n\t\t{{ button().text }}\n\t}\n</ng-template>\n\n<!-- Guard sitzt hier, nicht nur in xiri-button: form, dialog, alert und stepper\n rendern XiriButton direkt ueber buttonstyle. -->\n@if (!button().hide) {\n\t@switch (button().type) {\n\t\t@case ('icon') {\n\t\t\t<button mat-icon-button [matTooltip]=\"button().hint\" [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [attr.aria-label]=\"button().hint || button().text\"\n\t\t\t [color]=\"button().color || 'primary'\" [disabled]=\"disabled() || loading()\">\n\t\t\t\t@if (loading()) {\n\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon>{{ button().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t\t@case ('icontext') {\n\t\t\t<button mat-fab extended=\"true\"\n\t\t\t class=\"icontext\"\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t@if (loading()) {\n\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t@if (pollText() || countdown() > 0) {\n\t\t\t\t\t\t<span class=\"poll-countdown\">{{ pollText() || countdown() + 's' }}</span>\n\t\t\t\t\t}\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon>{{ button().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t{{ button().text }}\n\t\t\t</button>\n\t\t}\n\t\t@case ('raised') {\n\t\t\t<button mat-raised-button\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"textContent\"></ng-container>\n\t\t\t</button>\n\t\t}\n\t\t@case ('basic') {\n\t\t\t<button mat-button\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"textContent\"></ng-container>\n\t\t\t</button>\n\t\t}\n\t\t@case ('stroked') {\n\t\t\t<button mat-stroked-button\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"textContent\"></ng-container>\n\t\t\t</button>\n\t\t}\n\t\t@case ('flat') {\n\t\t\t<button mat-flat-button\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t<ng-container [ngTemplateOutlet]=\"textContent\"></ng-container>\n\t\t\t</button>\n\t\t}\n\t\t@case ('minifab') {\n\t\t\t<button mat-mini-fab [matTooltip]=\"button().hint\" [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [attr.aria-label]=\"button().hint || button().text\"\n\t\t\t [color]=\"button().color || 'primary'\" [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t@if (loading()) {\n\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon>{{ button().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t\t@case ('fab') {\n\t\t\t<button mat-fab [matTooltip]=\"button().hint\" [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [attr.aria-label]=\"button().hint || button().text\"\n\t\t\t [color]=\"button().color || 'primary'\" [disabled]=\"disabled() || loading()\"\n\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t@if (loading()) {\n\t\t\t\t\t<mat-spinner diameter=\"24\"></mat-spinner>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon>{{ button().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t\t@default {\n\t\t\t@if (button().icon) {\n\t\t\t\t<button mat-icon-button [matTooltip]=\"button().hint\" [matTooltipDisabled]=\"!button().hint\"\n\t\t\t\t [attr.aria-label]=\"button().hint || button().text\"\n\t\t\t\t [color]=\"button().color || 'primary'\" [disabled]=\"disabled() || loading()\"\n\t\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t\t@if (loading()) {\n\t\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<mat-icon>{{ button().icon }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t</button>\n\t\t\t}\n\t\t\t@if (button().text) {\n\t\t\t\t<button mat-raised-button\n\t\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t\t [color]=\"button().color || 'primary'\"\n\t\t\t\t [disabled]=\"disabled() || loading()\"\n\t\t\t\t [tabIndex]=\"button().tabIndex\">\n\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"textContent\"></ng-container>\n\t\t\t\t</button>\n\t\t\t}\n\t\t}\n\t}\n}\n","import { Component } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\n\n@Component( {\n\t selector: 'xiri-done',\n\t templateUrl: './done.component.html',\n\t styleUrl: './done.component.scss',\n\t imports: [ MatIcon ],\n } )\nexport class XiriDoneComponent {\n}\n","<mat-icon aria-label=\"Erfolgreich abgeschlossen\" role=\"status\">done</mat-icon>\n","import { Component, input } from '@angular/core';\n\n@Component( {\n\t selector: 'xiri-error',\n\t templateUrl: './error.component.html',\n\t styleUrl: './error.component.scss',\n } )\nexport class XiriErrorComponent {\n\t\n\ttext = input.required<string>();\n}\n","<div class=\"error\">\n\t{{ text() }}\n</div>\n","import { Injectable } from '@angular/core';\nimport { HttpResponse } from '@angular/common/http';\n\n\n@Injectable( {\n\t providedIn: 'root',\n } )\nexport class XiriDownloadService {\n\n\t/**\n\t * Opens an empty tab and returns its handle for a later download( …, tab ).\n\t *\n\t * MUST be called synchronously from the click handler: after an HTTP round trip the\n\t * transient user activation is gone and the browser blocks the popup. Returns null\n\t * when it was blocked anyway — pass that through, download() then saves the file.\n\t */\n\tpublic openTab(): Window | null {\n\t\treturn window.open( 'about:blank', '_blank' );\n\t}\n\n\t/**\n\t * Turns the response body into a file. With a tab handle from openTab() the file is\n\t * displayed in that tab, otherwise it is saved via a download anchor.\n\t */\n\tpublic download( result: HttpResponse<Blob>, filename: string, tab?: Window | null ): boolean {\n\n\t\tconst contentDisposition = result.headers.get( 'content-disposition' );\n\t\tif ( contentDisposition ) {\n\t\t\tfilename = contentDisposition.split( 'filename=' )[ 1 ];\n\t\t\tfilename = filename.replace( /\"/g, '' );\n\t\t}\n\n\t\tconst contentType = result.headers.get( 'content-type' ) ?? undefined;\n\t\tconst file = new File( [ result.body as BlobPart ], filename, { type: contentType } );\n\t\tconst fileData = URL.createObjectURL( file );\n\n\t\tif ( tab ) {\n\t\t\t// ponytail: caps window.opener reach. A blob: document is same-origin anyway, so this is\n\t\t\t// no licence to display untrusted HTML — only a correct Content-Type keeps it a viewer.\n\t\t\ttab.opener = null;\n\t\t\ttab.location.replace( fileData );\n\t\t\t// ponytail: 60s is plenty to load; without it the blob lives until the page reloads.\n\t\t\tsetTimeout( () => URL.revokeObjectURL( fileData ), 60 * 1000 )\n\t\t\treturn true;\n\t\t}\n\n\t\tconst a = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'a' ) as HTMLAnchorElement;\n\t\ta.download = filename;\n\t\ta.rel = 'noopener';\n\t\ta.href = fileData;\n\t\t// a.target = '_blank';\n\t\t\n\t\tsetTimeout( () => {\n\t\t\tURL.revokeObjectURL( fileData );\n\t\t}, 2 * 1000 )\n\t\tsetTimeout( () => a.click(), 0 )\n\t\t\n\t\treturn true;\n\t}\n}\n","import { Component, DestroyRef, inject, OnDestroy, signal, Type } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n\tMAT_DIALOG_DATA,\n\tMatDialogActions,\n\tMatDialogContent,\n\tMatDialogRef,\n\tMatDialogTitle\n} from '@angular/material/dialog';\nimport { Subject } from 'rxjs';\nimport { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';\nimport { XiriDataService } from '../services/data.service';\nimport { XiriButton } from \"../button/button.component\";\nimport { XiriSnackbarService } from '../services/snackbar.service';\nimport { XiriRawTableComponent, XiriRawTableSettings } from \"../raw-table/xiri-raw-table.component\";\nimport { Router } from \"@angular/router\";\nimport { XiriButtonstyleComponent } from '../buttonstyle/buttonstyle.component';\nimport { MatDivider } from '@angular/material/divider';\nimport { XiriDoneComponent } from '../done/done.component';\nimport { XiriErrorComponent } from '../error/error.component';\nimport { XiriFormFieldsComponent } from '../formfields/form-fields.component';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriFormField } from \"../formfields/field.interface\";\nimport { XiriDownloadService } from \"../services/download.service\";\nimport { parseHttpError } from '../services/error.util';\nimport { HttpErrorResponse } from '@angular/common/http';\n\n\nexport type XiriDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\nexport interface XiriDialogSettings {\n\turl?: string\n\tsize?: XiriDialogSize | string\n\n\ttype: \"form\" | \"data\" | \"question\" | \"waiting\" | \"table\" | \"component\"\n\tdata?: unknown\n\tfilter?: Record<string, unknown> | null\n}\n\n// Backend response loaded into the dialog (form definition, question, table, done/goto etc.).\nexport interface XiriDialogResponse {\n\tbuttons?: XiriButton[]\n\tsize?: XiriDialogSize | string\n\turl?: string\n\theader?: string\n\ttype?: string\n\tcontent?: unknown\n\tfields?: unknown\n\tmodel?: Record<string, unknown>\n\textra?: Record<string, unknown>\n\ttime?: number\n\tdone?: boolean\n\terror?: string\n\tgoto?: string\n\t[ key: string ]: unknown\n}\n\nconst DIALOG_SIZE_MAP: Record<string, string> = {\n\tsm: '400px',\n\tmd: '600px',\n\tlg: '900px',\n\txl: '1200px',\n\tfull: '95vw',\n};\n\n@Component( {\n\t selector: 'xiri-dialog',\n\t templateUrl: './dialog.component.html',\n\t styleUrls: [ './dialog.component.scss' ],\n\t imports: [ MatDialogTitle,\n\t MatDialogContent,\n\t MatProgressSpinner,\n\t XiriRawTableComponent,\n\t XiriFormFieldsComponent,\n\t NgComponentOutlet,\n\t XiriErrorComponent,\n\t XiriDoneComponent,\n\t MatDivider,\n\t MatDialogActions,\n\t XiriButtonstyleComponent,\n\t MatIconButton,\n\t MatIcon ]\n } )\nexport class XiriDialogComponent implements OnDestroy {\n\tdialogRef = inject<MatDialogRef<XiriDialogComponent>>( MatDialogRef );\n\tinitData = inject<XiriDialogSettings>( MAT_DIALOG_DATA );\n\tprivate breakpointObserver = inject( BreakpointObserver );\n\tprivate dataService = inject( XiriDataService );\n\tprivate router = inject( Router );\n\tprivate snackbar = inject( XiriSnackbarService );\n\t\n\t\n\ttype = signal('form');\n\theader = signal('');\n\tpublic buttons = signal<XiriButton[]>([]);\n\tprivate url = '';\n\tprivate extra = {};\n\tprivate destroyRef = inject( DestroyRef );\n\n\tprivate downloadService = inject( XiriDownloadService );\n\t\n\tpublic formFields = signal<XiriFormField[] | null>( null );\n\tpublic componentData = signal<unknown>( null );\n\t// Dynamisch nachgeladene XiriDynComponentComponent (vermeidet zirkulären Import dialog -> dyncomponent)\n\tpublic dynComponentType = signal<Type<unknown> | null>( null );\n\tpublic loading = signal<boolean>( true );\n\tpublic done = signal<boolean>( false );\n\tpublic error = signal<string>( '' );\n\t\n\tprivate formValues: Record<string, unknown> | null = null;\n\tpublic formValid = signal<boolean>(false);\n\tpublic checkSubject: Subject<void> = new Subject<void>();\n\t\n\tprivate to: ReturnType<typeof setTimeout> | null = null;\n\tprivate refreshTime = 2000;\n\trawTable!: XiriRawTableSettings;\n\n\tprivate effectiveSize: string | undefined;\n\n\tconstructor() {\n\n\t\tthis.dialogRef.addPanelClass( 'xiri-dialog-sized' );\n\t\tthis.effectiveSize = this.initData.size;\n\n\t\tthis.breakpointObserver\n\t\t\t.observe( [ Breakpoints.XSmall, Breakpoints.Small ] )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( ( state: BreakpointState ) => {\n\t\t\t\tthis.applyDialogSize( state.matches );\n\t\t\t} );\n\t\t\n\t\tif ( this.initData.url )\n\t\t\tthis.url = this.initData.url;\n\t\t\n\t\tif ( this.initData.type == 'form' )\n\t\t\tthis.loadData( this.initData as unknown as XiriDialogResponse );\n\t\telse if ( this.initData.type == 'data' )\n\t\t\tthis.send( { data: this.initData.data } );\n\t\telse if ( this.initData.filter )\n\t\t\tthis.send( this.initData.filter );\n\t\telse\n\t\t\tthis.send( null );\n\t\t\n\t}\n\t\n\tprivate send( data: unknown ) {\n\n\t\tthis.loading.set( true );\n\t\tthis.error.set( '' );\n\n\t\tconst req = data === null ?\n\t\t this.dataService.get( this.url ) :\n\t\t this.dataService.post( this.url, { ...( data as object ), ...this.extra } );\n\n\t\t// this.buttons = [];\n\n\t\treq.pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe(\n\t\t\t{\n\t\t\t\tnext: ( res: unknown ) => {\n\t\t\t\t\tif ( res )\n\t\t\t\t\t\tthis.loadData( res as XiriDialogResponse );\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.showError( { status: 500 } );\n\t\t\t\t},\n\t\t\t\terror: ( err ) => {\n\t\t\t\t\tthis.showError( err );\n\t\t\t\t}\n\t\t\t} );\n\t}\n\n\tprivate showError( err: unknown ) {\n\t\tthis.loading.set( false );\n\t\tthis.error.set( parseHttpError( err as HttpErrorResponse ) );\n\t\t\n\t\t// this.header = 'Error';\n\t\tif ( this.buttons().length == 0 ) {\n\t\t\tthis.buttons.set( [ {\n\t\t\t\ttext: 'Close',\n\t\t\t\taction: 'close',\n\t\t\t\ttype: 'raised',\n\t\t\t} ] );\n\t\t}\n\t}\n\t\n\tprivate applyDialogSize( isMobile: boolean ): void {\n\t\tif ( isMobile ) {\n\t\t\tthis.dialogRef.updateSize( '90vw' );\n\t\t\treturn;\n\t\t}\n\t\tconst raw = this.effectiveSize;\n\t\tconst width = ( raw ? DIALOG_SIZE_MAP[ raw ] : undefined ) ?? raw ?? '600px';\n\t\tthis.dialogRef.updateSize( width );\n\t\tif ( raw === 'full' )\n\t\t\tthis.dialogRef.addPanelClass( 'xiri-dialog-full' );\n\t}\n\n\tprivate loadData( res: XiriDialogResponse ): void {\n\n\t\tif ( res.buttons ) {\n\t\t\tif ( res.size && res.size !== this.effectiveSize ) {\n\t\t\t\tthis.effectiveSize = res.size;\n\t\t\t\tthis.applyDialogSize( this.breakpointObserver.isMatched( [ Breakpoints.XSmall, Breakpoints.Small ] ) );\n\t\t\t}\n\t\t\tif ( res.url )\n\t\t\t\tthis.url = res.url;\n\n\t\t\tlet formData: XiriFormField[] | null = [];\n\t\t\tconst inFields: unknown = res.content || res.fields;\n\t\t\tconst model = res.model || {};\n\t\t\tthis.header.set( res.header ?? '' );\n\t\t\tthis.buttons.set( res.buttons );\n\t\t\tthis.type.set( res.type ? res.type : 'form' );\n\t\t\tthis.extra = res.extra || {};\n\n\t\t\tif ( this.type() == 'form' ) {\n\t\t\t\t( inFields as XiriFormField[] ).forEach( ( origField: XiriFormField ) => {\n\t\t\t\t\tif ( origField.hide == true )\n\t\t\t\t\t\treturn;\n\t\t\t\t\tconst field = { ...origField };\n\t\t\t\t\tif ( model[ field.id ] !== undefined )\n\t\t\t\t\t\tfield.value = model[ field.id ];\n\n\t\t\t\t\tformData!.push( field );\n\t\t\t\t} );\n\t\t\t} else if ( this.type() == 'question' ) {\n\t\t\t\tconst field = { ...( inFields as XiriFormField ) };\n\t\t\t\tfield.type = 'question';\n\t\t\t\tformData.push( field );\n\t\t\t\tthis.formValid.set( true );\n\t\t\t} else if ( this.type() == 'waiting' ) {\n\t\t\t\tconst field = { ...( inFields as XiriFormField & { text?: unknown } ) };\n\t\t\t\tfield.type = 'waiting';\n\t\t\t\tfield.done = false;\n\t\t\t\tfield.value = field.text;\n\t\t\t\tformData.push( field );\n\t\t\t} else if ( this.type() == 'table' ) {\n\t\t\t\tthis.rawTable = inFields as XiriRawTableSettings;\n\t\t\t\tformData = [];\n\t\t\t} else if ( this.type() == 'component' ) {\n\t\t\t\tthis.componentData.set( inFields );\n\t\t\t\tthis.formValid.set( true );\n\t\t\t\tformData = null;\n\t\t\t\t// dyncomponent lazy laden, um den zirkulären Import zu vermeiden\n\t\t\t\timport( '../dyncomponent/dyncomponent.component' ).then(\n\t\t\t\t\tm => this.dynComponentType.set( m.XiriDynComponentComponent )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.formValid.set( true );\n\t\t\t\tformData = inFields as XiriFormField[];\n\t\t\t}\n\t\t\t\n\t\t\tthis.formFields.set( formData );\n\n\t\t\tif ( this.type() == 'waiting' ) {\n\t\t\t\tthis.dialogRef.disableClose = true;\n\t\t\t\tthis.refreshTime = res.time || 2000;\n\t\t\t\t// formData.done = false;\n\t\t\t\t// this.formFields.set( formData );\n\t\t\t\tthis.refresh();\n\t\t\t}\n\t\t\t\n\t\t} else if ( res.done ) {\n\t\t\t\n\t\t\tthis.done.set( true );\n\t\t\tthis.formFields.set( null );\n\n\t\t\tthis.type.set( '' );\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.dialogRef.close( res );\n\t\t\t}, 1000 );\n\t\t} else {\n\t\t\tthis.dialogRef.close( res );\n\t\t}\n\t\t\n\t\tthis.loading.set( false );\n\t}\n\t\n\tprivate refresh() {\n\t\t\n\t\tthis.to = setTimeout( () => {\n\t\t\tthis.to = null;\n\t\t\t\n\t\t\tthis.dataService.get( this.url ).pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe(\n\t\t\t\t{\n\t\t\t\t\tnext: ( raw: object ) => {\n\t\t\t\t\t\tconst res = raw as XiriDialogResponse;\n\t\t\t\t\t\tif ( res.done ) {\n\t\t\t\t\t\t\tif ( res.error ) {\n\t\t\t\t\t\t\t\tthis.dialogRef.disableClose = false;\n\t\t\t\t\t\t\t\tthis.error.set( res.error );\n\t\t\t\t\t\t\t\tthis.formFields.set( null );\n\t\t\t\t\t\t\t\tthis.snackbar.error( res.error );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.url = res.url ?? '';\n\t\t\t\t\t\t\t\tthis.extra = res;\n\t\t\t\t\t\t\t\tthis.download( null );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tthis.refresh();\n\t\t\t\t\t},\n\t\t\t\t\terror: ( err ) => {\n\t\t\t\t\t\tconsole.log( \"dialog refresh error\", err );\n\t\t\t\t\t\tthis.snackbar.error( err.error?.error || 'Unknown Error' );\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ( this.refreshTime < 10000 )\n\t\t\t\t\t\t\tthis.refreshTime += 2000;\n\t\t\t\t\t\tthis.refresh();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, this.refreshTime );\n\t}\n\t\n\tpublic download( data: unknown, tab?: Window | null ) {\n\n\t\tif ( data === null ) {\n\t\t\t// TODO: fix, this is actually an external link\n\t\t\t\n\t\t\tconst file = window.open( this.dataService.getConfigApi() + this.url, 'Report' );\n\t\t\tif ( file === null || typeof ( file ) == 'undefined' ) {\n\t\t\t\tthis.buttons.set( [ {\n\t\t\t\t\ttext: 'Download',\n\t\t\t\t\taction: 'download',\n\t\t\t\t\ttype: 'raised',\n\t\t\t\t\tdefault: true,\n\t\t\t\t} ] );\n\t\t\t} else\n\t\t\t\tthis.dialogRef.close( this.extra );\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.dataService.postFileResponse( this.url, data )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe(\n\t\t\t\t\t{\n\t\t\t\t\t\tnext: ( result ) => {\n\n\t\t\t\t\t\t\tconst ret = this.downloadService.download( result, 'Report', tab );\n\t\t\t\t\t\t\tif ( !ret )\n\t\t\t\t\t\t\t\tthis.buttons.set( [ {\n\t\t\t\t\t\t\t\t\ttext: 'Download',\n\t\t\t\t\t\t\t\t\taction: 'href',\n\t\t\t\t\t\t\t\t\ttype: 'raised',\n\t\t\t\t\t\t\t\t\tdefault: true,\n\t\t\t\t\t\t\t\t\turl: this.url\n\t\t\t\t\t\t\t\t} ] );\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tthis.dialogRef.close( this.extra );\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}, error: ( err: HttpErrorResponse ) => {\n\t\t\t\t\t\t\ttab?.close();\n\t\t\t\t\t\t\tthis.snackbar.error( err.error?.error || 'Unknown Error' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t}\n\t\n\tclickButton( button: XiriButton ): void {\n\n\t\tif ( button.default && !this.formValid() )\n\t\t\treturn;\n\n\t\tif ( button.action == 'close' )\n\t\t\tthis.dialogRef.close( null );\n\t\telse if ( button.action == 'return' )\n\t\t\tthis.dialogRef.close( {\n\t\t\t\t valid: this.formValid(),\n\t\t\t\t values: this.formValues\n\t\t\t } );\n\t\telse if ( button.action == 'get' ) {\n\t\t\tthis.url = button.url ? button.url : '';\n\t\t\tthis.startSend( null );\n\t\t} else if ( button.action == 'post' ) {\n\t\t\tthis.url = button.url ? button.url : '';\n\t\t\tthis.startSend( button.data );\n\t\t} else if ( button.action == 'download' ) {\n\t\t\tconst data = this.type() == 'form' ? this.formValues : null;\n\t\t\t// Only the blob path needs a tab handle; data === null is an external link that\n\t\t\t// opens its own tab. openTab() must run here, inside the click.\n\t\t\tthis.download( data, data !== null && button.target === '_blank' ? this.downloadService.openTab() : null );\n\t\t} else if ( button.action == 'link' ) {\n\t\t\tthis.router.navigate( [ button.url ] ).then();\n\t\t} else if ( button.action == 'href' ) {\n\t\t\twindow.location.href = button.url ?? '';\n\t\t} else {\n\t\t\tif ( this.loading() )\n\t\t\t\treturn;\n\n\t\t\tif ( this.type() == 'form' )\n\t\t\t\tthis.startSend( this.formValues );\n\t\t\telse\n\t\t\t\tthis.startSend( [] );\n\t\t}\n\t}\n\t\n\tprivate startSend( data: unknown ): void {\n\n\t\tsetTimeout( () => {\n\t\t\tif ( this.formValid() )\n\t\t\t\tthis.send( data );\n\t\t\telse\n\t\t\t\tthis.checkSubject.next();\n\t\t}, 10 );\n\t}\n\n\tpublic formChanged( event: { valid: boolean; value: Record<string, unknown> | null } ) {\n\n\t\tthis.formValid.set( event.valid );\n\t\tthis.formValues = event.value;\n\t}\n\t\n\tngOnDestroy() {\n\t\tif ( this.to )\n\t\t\tclearTimeout( this.to );\n\t}\n}\n","<div class=\"dialog\">\n\t<div class=\"dialog-header\">\n\t\t<h1 mat-dialog-title>{{ header() }}</h1>\n\t\t@if (type() !== 'waiting') {\n\t\t\t<button mat-icon-button aria-label=\"Schließen\" (click)=\"dialogRef.close(null)\"><mat-icon>close</mat-icon></button>\n\t\t}\n\t</div>\n\t<mat-dialog-content>\n\t\t@if (loading() && formFields() === null) {\n\t\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t\t}\n\t\t@if (formFields() !== null) {\n\t\t\t@if (type() === 'table') {\n\t\t\t\t<xiri-raw-table [settings]=\"rawTable\"></xiri-raw-table>\n\t\t\t} @else {\n\t\t\t\t<xiri-form-fields [form]=\"formFields()\" (formChange)=\"formChanged($event)\" [disabled]=\"loading()\"\n\t\t\t\t [check]=\"checkSubject.asObservable()\"></xiri-form-fields>\n\t\t\t}\n\t\t}\n\t\t@if (componentData() !== null && dynComponentType() !== null) {\n\t\t\t<ng-container [ngComponentOutlet]=\"dynComponentType()\"\n\t\t\t [ngComponentOutletInputs]=\"{ data: componentData() }\"></ng-container>\n\t\t}\n\t\t@if (error()) {\n\t\t\t<xiri-error class=\"error\" [text]=\"error()\"></xiri-error>\n\t\t}\n\t\t@if (done()) {\n\t\t\t<div class=\"xcol done\">\n\t\t\t\t<xiri-done></xiri-done>\n\t\t\t</div>\n\t\t}\n\t</mat-dialog-content>\n\t@if (!done() && !(loading() && formFields() === null) && (loading() || buttons().length > 0)) {\n\t\t<mat-divider></mat-divider>\n\t\t<mat-dialog-actions [class.one]=\"buttons().length===1\">\n\t\t\t@if (loading()) {\n\t\t\t\t<mat-spinner diameter=\"30\" class=\"actions-spinner\"></mat-spinner>\n\t\t\t} @else {\n\t\t\t\t@for (button of buttons(); track $index) {\n\t\t\t\t\t<xiri-buttonstyle [button]=\"button\" (click)=\"clickButton( button )\" [disabled]=\"!!button.default && !formValid()\"></xiri-buttonstyle>\n\t\t\t\t}\n\t\t\t}\n\t\t</mat-dialog-actions>\n\t}\n</div>","import { inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\n\n\ninterface XiriHandlerResponse {\n\tpage?: string;\n\trefresh?: string;\n\ttable?: string;\n\tgoto?: string;\n\tupdate?: string;\n\tid?: unknown;\n\tfield?: unknown;\n\tcontent?: unknown;\n}\n\n@Injectable( {\n\t providedIn: 'root',\n } )\nexport class XiriResponseHandlerService {\n\n\tprivate router = inject( Router );\n\n\thandle( result: unknown, callbacks?: {\n\t\tonTableRefresh?: () => void;\n\t\tonTableUpdate?: ( id: unknown, field: string, content: unknown ) => void;\n\t} ): void {\n\t\tif ( !result )\n\t\t\treturn;\n\t\tconst res = result as XiriHandlerResponse;\n\t\tif ( res.page == 'refresh' || res.refresh == 'page' )\n\t\t\tthis.router.navigate( [ this.router.url ] ).then();\n\t\telse if ( res.table == 'refresh' || res.refresh == 'table' ) {\n\t\t\tif ( callbacks?.onTableRefresh )\n\t\t\t\tcallbacks.onTableRefresh();\n\t\t\telse\n\t\t\t\tthis.router.navigate( [ this.router.url ] ).then();\n\t\t}\n\t\telse if ( res.goto )\n\t\t\tthis.router.navigate( [ res.goto ] ).then();\n\t\telse if ( res.table == 'update' || res.update == 'table' )\n\t\t\tcallbacks?.onTableUpdate?.( res.id, res.field as string, res.content );\n\t}\n}\n","import { Component, computed, DestroyRef, effect, inject, input, OnDestroy, output, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { XiriDialogComponent } from \"../dialog/dialog.component\";\nimport { XiriColor } from '../types/color.type';\nimport { MatDialog, MatDialogRef } from \"@angular/material/dialog\";\nimport { XiriDataService } from \"../services/data.service\";\nimport { RouterLink } from \"@angular/router\";\nimport { Location } from \"@angular/common\";\nimport { XiriButtonstyleComponent } from \"../buttonstyle/buttonstyle.component\";\nimport { XiriDownloadService } from \"../services/download.service\";\nimport { XiriResponseHandlerService } from \"../services/response-handler.service\";\nimport { MatMenu, MatMenuItem, MatMenuTrigger } from \"@angular/material/menu\";\nimport { MatIcon } from \"@angular/material/icon\";\nimport { MatIconButton } from \"@angular/material/button\";\nimport { MatTooltip } from \"@angular/material/tooltip\";\nimport { XiriUrlPipe } from \"../pipes/url.pipe\";\n\n\nexport interface XiriButton {\n\ttext: string\n\ttype: string\n\taction: string\n\t\n\tdefault?: boolean\n\turl?: string\n\thide?: boolean\n\tcolor?: XiriColor\n\ticon?: string\n\ticonColor?: XiriColor\n\tfontIcon?: string\n\tfontSet?: string\n\tclass?: string\n\thint?: string\n\ttabIndex?: number\n\tinline?: boolean\n\tdisabled?: boolean\n\t// When true, the button triggers its action automatically once on load,\n\t// as soon as it is no longer disabled (i.e. filter is valid/present).\n\tautoLoad?: boolean\n\n\tdata?: Record<string, unknown>\n\t// Link target for action \"href\". For action \"download\", \"_blank\" displays the file in a new\n\t// tab instead of saving it — needs a Content-Type the browser can render (e.g. application/pdf).\n\ttarget?: string\n\tloading?: boolean\n\tfilename?: string\n\n\t// send btns\n\tcheck?: string[]\n\tsend?: string[]\n\n\t// menu items (for action \"menu\")\n\tmenuItems?: { action: string, url?: string, icon?: string, color?: string, text?: string, data?: Record<string, unknown> }[]\n}\n\nexport interface XiriButtonResult {\n\tbutton: XiriButton\n\tresult: unknown\n\tdone: boolean\n\tloading: boolean\n}\n\n// Backend response handled by the button (api result, dialog afterClosed result or poll tick).\nexport interface XiriButtonResponse {\n\tpoll?: number\n\tpollUrl?: string\n\ttext?: string\n\tbutton?: Partial<XiriButton>\n\t[ key: string ]: unknown\n}\n\n\n@Component( {\n\t selector: 'xiri-button',\n\t templateUrl: './button.component.html',\n\t styleUrl: './button.component.scss',\n\t imports: [\n\t\t XiriButtonstyleComponent,\n\t\t RouterLink,\n\t\t MatMenu, MatMenuItem, MatMenuTrigger,\n\t\t MatIcon, MatIconButton, MatTooltip,\n\t XiriUrlPipe\n\t ],\n } )\nexport class XiriButtonComponent implements OnDestroy {\n\tbutton = input.required<XiriButton>();\n\tdisabled = input<boolean>( false );\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\turl = input<string | undefined>( undefined );\n\t\n\t// \t\tif ( JSON.stringify( this._filterData ) === JSON.stringify( values ) )\n\t// \t\t\treturn;\n\t\n\tresult = output<XiriButtonResult>();\n\t\n\tprivate dialogRef?: MatDialogRef<XiriDialogComponent> = undefined;\n\tprivate destroyRef = inject( DestroyRef );\n\tprotected loading = signal<boolean>( false );\n\t// Guards the one-shot auto-load trigger (see constructor) so it fires only once.\n\tprivate _autoTriggered = false;\n\n\t// Self-polling: when a processed response (api result or dialog afterClosed) contains a\n\t// \"poll\" interval (ms), the button keeps GET-polling \"pollUrl\" until a response without\n\t// \"poll\" arrives, showing a countdown inside the button.\n\tprivate pollTimer?: ReturnType<typeof setTimeout>;\n\tprivate countdownTimer?: ReturnType<typeof setInterval>;\n\tprotected polling = signal<{ intervalMs: number; nextAt: number; url: string; text?: string } | null>( null );\n\tprivate _now = signal<number>( Date.now() );\n\tprotected countdown = computed<number>( () => {\n\t\tconst p = this.polling();\n\t\tif ( !p )\n\t\t\treturn 0;\n\t\tconst secs = Math.ceil( ( p.nextAt - this._now() ) / 1000 );\n\t\treturn secs > 0 ? secs : 0;\n\t} );\n\t// Optional backend-defined label shown in the button while polling (overrides the countdown).\n\tprotected pollText = computed<string>( () => this.polling()?.text ?? '' );\n\n\t// Backend-driven overrides applied to the button via a \"button\" patch in a response\n\t// (text, color, icon, type, hint, disabled). Persists until the next action starts.\n\tprivate buttonOverride = signal<Partial<XiriButton> | null>( null );\n\tprotected displayButton = computed<XiriButton>( () => {\n\t\tconst o = this.buttonOverride();\n\t\treturn o ? { ...this.button(), ...o } : this.button();\n\t} );\n\t\n\tprivate dataService = inject( XiriDataService );\n\tprivate location = inject( Location );\n\tprivate dialog = inject( MatDialog );\n\tprivate downloadService = inject( XiriDownloadService );\n\tprivate responseHandler = inject( XiriResponseHandlerService );\n\t\n\t_disabled = computed( () => {\n\t\t\n\t\tif ( this.filterData() === null )\n\t\t\treturn true;\n\t\telse if ( this.displayButton().disabled )\n\t\t\treturn true;\n\t\telse if ( this.loading() )\n\t\t\treturn true;\n\n\t\treturn this.disabled();\n\t} );\n\t\n\t_url = computed( () => {\n\t\tif ( this.url() )\n\t\t\treturn this.url();\n\t\treturn this.displayButton().url;\n\t} );\n\n\tconstructor() {\n\t\t// Auto-load: when the button opts in via autoLoad, run its action once as soon\n\t\t// as it becomes enabled (filter valid/present). Subsequent filter changes do not\n\t\t// re-trigger it — only the initial load is automatic.\n\t\teffect( () => {\n\t\t\tthis.filterData(); // track filter changes so the effect re-evaluates\n\t\t\t// A hidden button is not rendered, so it must not fire its action either.\n\t\t\tif ( this.button().autoLoad && !this.displayButton().hide && !this._autoTriggered && !this._disabled() ) {\n\t\t\t\tthis._autoTriggered = true;\n\t\t\t\tthis.runAction();\n\t\t\t}\n\t\t} );\n\t}\n\n\tclicked( event: MouseEvent ) {\n\t\tevent.stopPropagation();\n\t\tthis.runAction();\n\t}\n\n\tprivate runAction() {\n\n\t\tif ( this._disabled() ) {\n\t\t\tthis.result.emit( {\n\t\t\t\t button: this.button(),\n\t\t\t\t result: null,\n\t\t\t\t done: false,\n\t\t\t\t loading: false,\n\t\t\t } );\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tswitch ( this.button().action ) {\n\t\t\tcase 'link':\n\t\t\tcase 'href':\n\t\t\tcase 'close':\n\t\t\tcase 'return':\n\t\t\t\tthis.result.emit( {\n\t\t\t\t\t button: this.button(),\n\t\t\t\t\t result: null,\n\t\t\t\t\t done: true,\n\t\t\t\t\t loading: false,\n\t\t\t\t } );\n\t\t\t\tbreak;\n\t\t\tcase 'dialog':\n\t\t\t\tthis.actionDialog();\n\t\t\t\tbreak;\n\t\t\tcase 'api':\n\t\t\t\tthis.actionApi();\n\t\t\t\tbreak;\n\t\t\tcase 'download':\n\t\t\t\tthis.actionDownload();\n\t\t\t\tbreak;\n\t\t\tcase 'back':\n\t\t\t\tthis.location.back();\n\t\t\t\tbreak;\n\t\t\tcase 'debug':\n\t\t\tcase 'simulate':\n\t\t\t\tthis.result.emit( {\n\t\t\t\t\t button: this.button(),\n\t\t\t\t\t result: true,\n\t\t\t\t\t done: true,\n\t\t\t\t\t loading: false,\n\t\t\t\t } );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.log( \"xiri-button unknown action\", this.button().action );\n\t\t}\n\t}\n\t\n\tprivate actionDialog( dialogData?: Record<string, unknown> ) {\n\n\t\tlet data: Record<string, unknown>;\n\t\tif ( dialogData ) {\n\t\t\tdata = dialogData;\n\t\t} else {\n\t\t\tdata = Object.assign( {}, this.button() ) as unknown as Record<string, unknown>;\n\t\t\tdata['type'] = 'load';\n\t\t}\n\t\tdata['filter'] = this.filterData();\n\n\t\tthis.buttonOverride.set( null );\n\t\tthis.loading.set( true );\n\n\t\tthis.dialogRef = this.dialog.open( XiriDialogComponent, {\n\t\t\tdata: data,\n\t\t} );\n\n\t\tthis.dialogRef.afterClosed().pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe( result => {\n\t\t\tthis.processResult( result );\n\t\t} );\n\t}\n\n\topenMenuDialog( event: MouseEvent, item: Record<string, unknown> ) {\n\t\tevent.stopPropagation();\n\t\tconst data = Object.assign( {}, item ) as Record<string, unknown>;\n\t\tdata['type'] = 'load';\n\t\tthis.actionDialog( data );\n\t}\n\t\n\tprivate actionApi() {\n\n\t\tconst data = { ...this.filterData(), ...this.button().data };\n\t\tthis.buttonOverride.set( null );\n\t\tthis.loading.set( true );\n\t\t\n\t\tthis.result.emit( {\n\t\t\t button: this.button(),\n\t\t\t result: null,\n\t\t\t done: false,\n\t\t\t loading: true,\n\t\t } );\n\t\t\n\t\tthis.dataService.post( this.button().url ?? '', data )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( {\n\t\t\t\t next: ( result: unknown ) => {\n\t\t\t\t\t\t this.processResult( result as XiriButtonResponse );\n\t\t\t\t\t },\n\t\t\t\t\t error: ( err: unknown ) => {\n\t\t\t\t\t\t console.log( \"xiri-button api error\", err );\n\t\t\t\t\t\t this.result.emit( {\n\t\t\t\t\t\t\t button: this.button(),\n\t\t\t\t\t\t\t result: null,\n\t\t\t\t\t\t\t done: true,\n\t\t\t\t\t\t\t loading: false,\n\t\t\t\t\t\t } );\n\t\t\t\t\t\t this.loading.set( false );\n\t\t\t\t\t }\n\t\t\t\t } );\n\t}\n\n\t// Decides what to do with a response (api result or dialog afterClosed result):\n\t// poll present → keep polling; otherwise → final handling (snackbar/refresh/goto + emit).\n\tprivate processResult( result: XiriButtonResponse | null ) {\n\t\tif ( result && result.button )\n\t\t\tthis.buttonOverride.set( { ...( this.buttonOverride() ?? {} ), ...result.button } );\n\t\tif ( result && result.poll && result.poll > 0 ) {\n\t\t\tthis.startPolling( result.pollUrl || this.button().url || '', result.poll, result.text );\n\t\t\treturn;\n\t\t}\n\t\tthis.stopPolling();\n\t\tthis.responseHandler.handle( result );\n\t\tthis.result.emit( {\n\t\t\t button: this.button(),\n\t\t\t result: result,\n\t\t\t done: true,\n\t\t\t loading: false,\n\t\t } );\n\t}\n\n\tprivate startPolling( url: string, intervalMs: number, text?: string ) {\n\t\tthis.cancelPollTimers();\n\t\tconst now = Date.now();\n\t\tthis.polling.set( { intervalMs, nextAt: now + intervalMs, url, text } );\n\t\tthis._now.set( now );\n\t\tthis.loading.set( true );\n\t\tthis.pollTimer = setTimeout( () => {\n\t\t\tthis.pollTimer = undefined;\n\t\t\tthis.pollTick( url );\n\t\t}, intervalMs );\n\t\tthis.countdownTimer = setInterval( () => this._now.set( Date.now() ), 1000 );\n\t}\n\n\tprivate pollTick( url: string ) {\n\t\tthis.dataService.get( url )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( {\n\t\t\t\t next: ( res: unknown ) => this.processResult( res as XiriButtonResponse ),\n\t\t\t\t error: ( err: unknown ) => {\n\t\t\t\t\t\t console.log( \"xiri-button poll error\", err );\n\t\t\t\t\t\t this.stopPolling();\n\t\t\t\t\t\t this.result.emit( {\n\t\t\t\t\t\t\t button: this.button(),\n\t\t\t\t\t\t\t result: null,\n\t\t\t\t\t\t\t done: true,\n\t\t\t\t\t\t\t loading: false,\n\t\t\t\t\t\t } );\n\t\t\t\t\t }\n\t\t\t } );\n\t}\n\n\tprivate cancelPollTimers() {\n\t\tif ( this.pollTimer ) {\n\t\t\tclearTimeout( this.pollTimer );\n\t\t\tthis.pollTimer = undefined;\n\t\t}\n\t\tif ( this.countdownTimer ) {\n\t\t\tclearInterval( this.countdownTimer );\n\t\t\tthis.countdownTimer = undefined;\n\t\t}\n\t}\n\n\tprivate stopPolling() {\n\t\tthis.cancelPollTimers();\n\t\tthis.polling.set( null );\n\t\tthis.loading.set( false );\n\t}\n\n\tprivate actionDownload() {\n\n\t\tconst data = { ...this.filterData(), ...this.button().data };\n\t\tthis.loading.set( true );\n\n\t\t// Must happen before the request: openTab() needs the click's user activation.\n\t\t// Without one (e.g. autoLoad) it returns null and the file is saved instead.\n\t\tconst tab = this.button().target === '_blank' ? this.downloadService.openTab() : null;\n\n\t\tthis.dataService.postFileResponse( this._url() ?? '', data )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe(\n\t\t\t\t\t{\n\t\t\t\t\t\tnext: ( result ) => {\n\n\t\t\t\t\t\t\tlet filename: string;\n\t\t\t\t\t\t\tconst btn = this.button();\n\t\t\t\t\t\t\tif ( btn.filename != undefined )\n\t\t\t\t\t\t\t\tfilename = btn.filename;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t// ponytail: no extension guess when the file is displayed — the\n\t\t\t\t\t\t\t\t// viewer would offer \"Report.csv\" for a PDF on save.\n\t\t\t\t\t\t\t\tfilename = ( btn.text != undefined ? btn.text : 'Download' )\n\t\t\t\t\t\t\t\t\t\t+ ( tab ? '' : '.csv' )\n\n\t\t\t\t\t\t\tthis.downloadService.download( result, filename, tab );\n\n\t\t\t\t\t\t\tthis.result.emit( {\n\t\t\t\t\t\t\t\t button: this.button(),\n\t\t\t\t\t\t\t\t result: result,\n\t\t\t\t\t\t\t\t done: true,\n\t\t\t\t\t\t\t\t loading: false,\n\t\t\t\t\t\t\t } );\n\t\t\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror: ( err: unknown ) => {\n\t\t\t\t\t\t\tconsole.log( \"xiri-button download error\", err );\n\t\t\t\t\t\t\ttab?.close();\n\t\t\t\t\t\t\tthis.result.emit( {\n\t\t\t\t\t\t\t\t button: this.button(),\n\t\t\t\t\t\t\t\t result: null,\n\t\t\t\t\t\t\t\t done: true,\n\t\t\t\t\t\t\t\t loading: false,\n\t\t\t\t\t\t\t } );\n\t\t\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.stopPolling();\n\t\tif ( this.dialogRef ) {\n\t\t\tthis.dialogRef.close( null );\n\t\t}\n\t}\n}\n","<!-- hide has always been part of the XiriButton contract; a hidden button must not\n render and must not run its action (see the autoLoad effect). -->\n@if (!displayButton().hide) {\n\t@switch (button().action) {\n\t\t@case ('link') {\n\t\t\t@let linkUrl = _url() | xiriUrl;\n\t\t\t<a [routerLink]=\"linkUrl?.path\" [queryParams]=\"linkUrl?.queryParams\" [href]=\"_url()\" (click)=\"clicked($event)\">\n\t\t\t\t<xiri-buttonstyle [button]=\"displayButton()\" [disabled]=\"_disabled()\" [loading]=\"loading()\" [countdown]=\"countdown()\" [pollText]=\"pollText()\"></xiri-buttonstyle>\n\t\t\t</a>\n\t\t}\n\t\t@case ('href') {\n\t\t\t<a [href]=\"_url()\" [target]=\"button().target\" (click)=\"clicked($event)\">\n\t\t\t\t<xiri-buttonstyle [button]=\"displayButton()\" [disabled]=\"_disabled()\" [loading]=\"loading()\" [countdown]=\"countdown()\" [pollText]=\"pollText()\"></xiri-buttonstyle>\n\t\t\t</a>\n\t\t}\n\t\t@case ('menu') {\n\t\t\t<button mat-icon-button [matMenuTriggerFor]=\"menuRef\"\n\t\t\t [class]=\"displayButton().color || 'primary'\"\n\t\t\t [matTooltip]=\"button().hint\"\n\t\t\t [matTooltipDisabled]=\"!button().hint\"\n\t\t\t [attr.aria-label]=\"displayButton().hint || displayButton().text\"\n\t\t\t (click)=\"$event.stopPropagation()\">\n\t\t\t\t<mat-icon>{{ displayButton().icon }}</mat-icon>\n\t\t\t</button>\n\t\t\t<mat-menu #menuRef=\"matMenu\">\n\t\t\t\t@for (item of button().menuItems; track item) {\n\t\t\t\t\t@switch (item.action) {\n\t\t\t\t\t\t@case ('link') {\n\t\t\t\t\t\t\t@let menuUrl = item.url | xiriUrl;\n\t\t\t\t\t\t\t<a mat-menu-item [routerLink]=\"menuUrl?.path\" [queryParams]=\"menuUrl?.queryParams\">\n\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@case ('href') {\n\t\t\t\t\t\t\t<a mat-menu-item [href]=\"item.url\" target=\"_blank\">\n\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@case ('dialog') {\n\t\t\t\t\t\t\t<button mat-menu-item (click)=\"openMenuDialog($event, item)\">\n\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</mat-menu>\n\t\t}\n\t\t@default {\n\t\t\t<xiri-buttonstyle [button]=\"displayButton()\" [disabled]=\"_disabled()\" [loading]=\"loading()\" [countdown]=\"countdown()\" [pollText]=\"pollText()\" (click)=\"clicked($event)\"></xiri-buttonstyle>\n\t\t}\n\t}\n}\n","import { afterNextRender, inject, Injectable, Injector, signal } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { XiriDataService } from '../services/data.service';\nimport { XiriSnackbarService } from '../services/snackbar.service';\nimport { XiriTableField } from '../raw-table/tabefield.interface';\nimport { XiriTableCellValue, XiriTableRow } from './tree.service';\n\nexport interface EditableOption { value: string; label: string; color?: string }\n\n// A single chip value as stored on a chips-format cell.\ninterface ChipValue { label: string; color?: string }\n\n// Shape of the per-cell save response: optional field updates applied back to the row.\ninterface InlineEditResult { updates?: Record<string, XiriTableCellValue> }\n\n// Reads a human-readable message out of an unknown HTTP error value.\nfunction errorMessage( err: unknown ): string | undefined {\n\tconst inner = ( err as { error?: { error?: string } | string } )?.error;\n\tif ( inner && typeof inner === 'object' && 'error' in inner )\n\t\treturn inner.error;\n\treturn undefined;\n}\n\n\n@Injectable()\nexport class XiriTableInlineEditService {\n\n\tprivate dataService = inject( XiriDataService );\n\tprivate snackbar = inject( XiriSnackbarService );\n\tprivate injector = inject( Injector );\n\n\teditingCell = signal<{ row: XiriTableRow; field: string } | null>( null );\n\teditingChipsValues = signal<string[]>( [] );\n\teditableOptionsLoading = signal( false );\n\tloadedEditableOptions = signal<EditableOption[]>( [] );\n\tsavingCell = signal<{ row: XiriTableRow; field: string } | null>( null );\n\n\t// Inline-edit select search (client- and server-side)\n\tsearchControl = new FormControl<string>( '', { nonNullable: true } );\n\tsearching = signal( false );\n\tdisplayedOptions = signal<EditableOption[]>( [] );\n\n\tprivate editingOriginalValue: XiriTableCellValue = null;\n\tprivate editableOptionsSub: Subscription | null = null;\n\tprivate optionCache = new Map<string, EditableOption>();\n\tprivate searchSub: Subscription | null = null;\n\tprivate searchReqSub: Subscription | null = null;\n\n\tprivate getEditUrl!: () => string;\n\tprivate getDisplayedColumns!: () => XiriTableField[];\n\tprivate abort$!: Subject<void>;\n\tprivate onSaved!: ( row: XiriTableRow, fieldId: string ) => void;\n\tprivate onDataUpdate!: () => void;\n\tprivate onCallReturn!: ( result: unknown ) => void;\n\n\tprivate get editUrl(): string { return this.getEditUrl?.(); }\n\tprivate get displayedColumns(): XiriTableField[] { return this.getDisplayedColumns?.() ?? []; }\n\n\tinit( config: {\n\t\tgetEditUrl: () => string;\n\t\tgetDisplayedColumns: () => XiriTableField[];\n\t\tabort$: Subject<void>;\n\t\tonSaved: ( row: XiriTableRow, fieldId: string ) => void;\n\t\tonDataUpdate: () => void;\n\t\tonCallReturn: ( result: unknown ) => void;\n\t} ): void {\n\t\tthis.getEditUrl = config.getEditUrl;\n\t\tthis.getDisplayedColumns = config.getDisplayedColumns;\n\t\tthis.abort$ = config.abort$;\n\t\tthis.onSaved = config.onSaved;\n\t\tthis.onDataUpdate = config.onDataUpdate;\n\t\tthis.onCallReturn = config.onCallReturn;\n\t}\n\n\tstart( row: XiriTableRow, column: XiriTableField, skipSavingCheck = false ): void {\n\t\tif ( !column.editable || !this.editUrl || ( !skipSavingCheck && this.savingCell() ) )\n\t\t\treturn;\n\t\tconst val = row[ column.id ] as XiriTableCellValue;\n\t\tthis.editingOriginalValue = Array.isArray( val ) ? JSON.parse( JSON.stringify( val ) ) : val;\n\t\tif ( column.format === 'chips' && Array.isArray( val ) && !column.editableOptionsUrl ) {\n\t\t\tthis.editingChipsValues.set( ( val as unknown as ChipValue[] ).map( ( c ) => {\n\t\t\t\tconst opt = column.editableOptions?.find( o => o.label === c.label );\n\t\t\t\treturn opt?.value || c.label;\n\t\t\t} ) );\n\t\t}\n\t\tthis.editingCell.set( { row, field: column.id } );\n\n\t\tif ( column.editableOptionsUrl ) {\n\t\t\tthis.editableOptionsLoading.set( true );\n\t\t\tthis.loadedEditableOptions.set( [] );\n\t\t\tthis.editableOptionsSub?.unsubscribe();\n\t\t\tconst separator = column.editableOptionsUrl.includes( '?' ) ? '&' : '?';\n\t\t\tconst optionsUrl = column.editableOptionsUrl + separator + 'id=' + encodeURIComponent( String( row.id ) ) + '&field=' + encodeURIComponent( column.id );\n\t\t\tthis.editableOptionsSub = this.dataService.get( optionsUrl ).subscribe( {\n\t\t\t\tnext: ( raw: unknown ) => {\n\t\t\t\t\tconst result = ( raw ?? [] ) as EditableOption[];\n\t\t\t\t\tthis.loadedEditableOptions.set( result );\n\t\t\t\t\tthis.editableOptionsLoading.set( false );\n\t\t\t\t\tif ( column.format === 'chips' && Array.isArray( val ) ) {\n\t\t\t\t\t\tthis.editingChipsValues.set( ( val as unknown as ChipValue[] ).map( ( c ) => {\n\t\t\t\t\t\t\tconst opt = result.find( ( o ) => o.label === c.label );\n\t\t\t\t\t\t\treturn opt?.value || c.label;\n\t\t\t\t\t\t} ) );\n\t\t\t\t\t}\n\t\t\t\t\tthis.editableOptionsSub = null;\n\t\t\t\t\tthis.initSearch( column, row );\n\t\t\t\t\tthis.focus();\n\t\t\t\t},\n\t\t\t\terror: () => {\n\t\t\t\t\tthis.editableOptionsLoading.set( false );\n\t\t\t\t\tthis.editableOptionsSub = null;\n\t\t\t\t\tthis.cancel();\n\t\t\t\t\tthis.snackbar.error( 'Optionen konnten nicht geladen werden' );\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.initSearch( column, row );\n\t\t\tthis.focus();\n\t\t}\n\t}\n\n\t/** Sets up the search box + subscription for searchable inline-edit selects. */\n\tprivate initSearch( column: XiriTableField, row: XiriTableRow ): void {\n\t\tthis.teardownSearch();\n\t\tif ( !column.editableOptionsSearch && !column.editableSearchUrl )\n\t\t\treturn;\n\t\tconst base = this.baseOptions( column );\n\t\tbase.forEach( o => this.optionCache.set( o.value, o ) );\n\t\tthis.displayedOptions.set( base.slice() );\n\t\tthis.searchControl.setValue( '', { emitEvent: false } );\n\t\tthis.searchSub = this.searchControl.valueChanges.pipe(\n\t\t\tdebounceTime( 200 ),\n\t\t\ttakeUntil( this.abort$ )\n\t\t).subscribe( term => this.runSearch( column, row, term ?? '' ) );\n\t}\n\n\t/** Runs the search: server-side POST when editableSearchUrl is set, otherwise local label filter. */\n\tprivate runSearch( column: XiriTableField, row: XiriTableRow, term: string ): void {\n\t\tconst base = this.baseOptions( column );\n\t\tif ( column.editableSearchUrl ) {\n\t\t\tif ( !term ) {\n\t\t\t\tthis.searchReqSub?.unsubscribe();\n\t\t\t\tthis.searchReqSub = null;\n\t\t\t\tthis.searching.set( false );\n\t\t\t\tthis.displayedOptions.set( base.slice() );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.searching.set( true );\n\t\t\tthis.searchReqSub?.unsubscribe();\n\t\t\tthis.searchReqSub = this.dataService.post( column.editableSearchUrl, { id: row.id, field: column.id, search: term } )\n\t\t\t\t.pipe( takeUntil( this.abort$ ) ).subscribe( {\n\t\t\t\t\tnext: ( result: unknown ) => {\n\t\t\t\t\t\tconst opts: EditableOption[] = ( result ?? [] ) as EditableOption[];\n\t\t\t\t\t\topts.forEach( o => this.optionCache.set( o.value, o ) );\n\t\t\t\t\t\tthis.displayedOptions.set( opts );\n\t\t\t\t\t\tthis.searching.set( false );\n\t\t\t\t\t\tthis.searchReqSub = null;\n\t\t\t\t\t},\n\t\t\t\t\terror: () => {\n\t\t\t\t\t\tthis.searching.set( false );\n\t\t\t\t\t\tthis.searchReqSub = null;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t} else {\n\t\t\tconst t = term.toLowerCase();\n\t\t\tthis.displayedOptions.set( t ? base.filter( o => o.label.toLowerCase().includes( t ) ) : base.slice() );\n\t\t}\n\t}\n\n\tprivate teardownSearch(): void {\n\t\tthis.searchSub?.unsubscribe();\n\t\tthis.searchSub = null;\n\t\tthis.searchReqSub?.unsubscribe();\n\t\tthis.searchReqSub = null;\n\t\tthis.searching.set( false );\n\t\tthis.displayedOptions.set( [] );\n\t\tthis.optionCache.clear();\n\t\tthis.searchControl.setValue( '', { emitEvent: false } );\n\t}\n\n\t/** The unfiltered option list: static options on the column, or those loaded via editableOptionsUrl. */\n\tprivate baseOptions( column: XiriTableField ): EditableOption[] {\n\t\treturn column.editableOptions ?? this.loadedEditableOptions();\n\t}\n\n\tcancel(): void {\n\t\tconst editing = this.editingCell();\n\t\tif ( editing ) {\n\t\t\tediting.row[ editing.field ] = this.editingOriginalValue;\n\t\t\tthis.editingCell.set( null );\n\t\t\tthis.editingOriginalValue = null;\n\t\t}\n\t\tthis.editableOptionsSub?.unsubscribe();\n\t\tthis.editableOptionsSub = null;\n\t\tthis.loadedEditableOptions.set( [] );\n\t\tthis.editableOptionsLoading.set( false );\n\t\tthis.teardownSearch();\n\t}\n\n\tsave( row: XiriTableRow, column: XiriTableField ): void {\n\t\tconst editing = this.editingCell();\n\t\tif ( !editing || editing.row !== row || editing.field !== column.id ) return;\n\t\tconst newValue = row[ column.id ] as XiriTableCellValue;\n\t\tconst originalValue = this.editingOriginalValue;\n\t\tthis.editingCell.set( null );\n\t\tthis.editingOriginalValue = null;\n\t\tthis.loadedEditableOptions.set( [] );\n\t\tthis.editableOptionsLoading.set( false );\n\t\tthis.teardownSearch();\n\n\t\tconst unchanged = Array.isArray( newValue )\n\t\t\t? JSON.stringify( newValue ) === JSON.stringify( originalValue )\n\t\t\t: newValue === originalValue;\n\t\tif ( unchanged ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst value: XiriTableCellValue = column.format === 'chips' && Array.isArray( newValue )\n\t\t\t? ( newValue as unknown as ChipValue[] ).map( ( c ) => c.label )\n\t\t\t: newValue;\n\t\tconst payload = { id: row.id, field: column.id, value };\n\t\tthis.savingCell.set( { row, field: column.id } );\n\t\tthis.dataService.post( this.editUrl, payload ).pipe( takeUntil( this.abort$ ) ).subscribe( {\n\t\t\tnext: ( raw: unknown ) => {\n\t\t\t\tconst result = raw as InlineEditResult | null;\n\t\t\t\tthis.savingCell.set( null );\n\t\t\t\tif ( result?.updates ) {\n\t\t\t\t\tconst updates = result.updates;\n\t\t\t\t\tObject.keys( updates ).forEach( key => {\n\t\t\t\t\t\trow[ key ] = updates[ key ];\n\t\t\t\t\t} );\n\t\t\t\t\tthis.onDataUpdate();\n\t\t\t\t}\n\t\t\t\tthis.onSaved( row, column.id );\n\t\t\t\tthis.onCallReturn( result );\n\t\t\t},\n\t\t\terror: ( err: unknown ) => {\n\t\t\t\tthis.savingCell.set( null );\n\t\t\t\trow[ column.id ] = originalValue;\n\t\t\t\tthis.onDataUpdate();\n\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Unknown Error' );\n\t\t\t}\n\t\t} );\n\t}\n\n\tisEditing( row: XiriTableRow, fieldId: string ): boolean {\n\t\tconst editing = this.editingCell();\n\t\treturn editing !== null && editing.row === row && editing.field === fieldId;\n\t}\n\n\tisSaving( row: XiriTableRow, fieldId: string ): boolean {\n\t\tconst saving = this.savingCell();\n\t\treturn saving !== null && saving.row === row && saving.field === fieldId;\n\t}\n\n\tonKeydown( event: KeyboardEvent, row: XiriTableRow, column: XiriTableField ): void {\n\t\tif ( event.key === 'Enter' ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.save( row, column );\n\t\t} else if ( event.key === 'Escape' ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.cancel();\n\t\t} else if ( event.key === 'Tab' ) {\n\t\t\tconst matSelect = ( event.target as HTMLElement ).closest( 'mat-select' );\n\t\t\tif ( matSelect && matSelect.classList.contains( 'mat-mdc-select-open' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t\tconst direction = event.shiftKey ? -1 : 1;\n\t\t\tconst nextColumn = this.getAdjacentEditableColumn( column.id, direction );\n\t\t\tthis.save( row, column );\n\t\t\tif ( nextColumn ) {\n\t\t\t\tthis.start( row, nextColumn, true );\n\t\t\t}\n\t\t}\n\t}\n\n\tfocus(): void {\n\t\tafterNextRender( () => {\n\t\t\tconst el = document.querySelector( '.xiri-inline-edit input, .xiri-inline-edit mat-select' ) as HTMLElement;\n\t\t\tel?.focus();\n\t\t}, { injector: this.injector } );\n\t}\n\n\tgetAdjacentEditableColumn( currentField: string, direction: 1 | -1 ): XiriTableField | null {\n\t\tconst noInlineEdit = new Set( [ 'buttons', 'icon', 'html', 'link', 'input', 'text2', 'textn', 'number', 'header' ] );\n\t\tconst currentIndex = this.displayedColumns.findIndex( c => c.id === currentField );\n\t\tif ( currentIndex === -1 ) return null;\n\t\tfor ( let i = currentIndex + direction; i >= 0 && i < this.displayedColumns.length; i += direction ) {\n\t\t\tconst col = this.displayedColumns[ i ];\n\t\t\tif ( col.editable && !noInlineEdit.has( col.format ?? '' ) ) {\n\t\t\t\treturn col;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tflashSaved( row: XiriTableRow, fieldId: string, dataSource: MatTableDataSource<XiriTableRow> ): void {\n\t\tafterNextRender( () => {\n\t\t\tconst rowIndex = dataSource.data.indexOf( row );\n\t\t\tconst colIndex = this.displayedColumns.findIndex( c => c.id === fieldId );\n\t\t\tif ( rowIndex === -1 || colIndex === -1 ) return;\n\t\t\tconst rows = document.querySelectorAll( '.xiritable tr.mat-mdc-row' );\n\t\t\tconst rowEl = rows[ rowIndex ];\n\t\t\tif ( !rowEl ) return;\n\t\t\tconst cells = rowEl.querySelectorAll( 'td.mat-mdc-cell' );\n\t\t\tconst cell = cells[ colIndex ] as HTMLElement;\n\t\t\tif ( !cell ) return;\n\t\t\tcell.classList.add( 'xiri-cell-saved' );\n\t\t\tsetTimeout( () => cell.classList.remove( 'xiri-cell-saved' ), 500 );\n\t\t}, { injector: this.injector } );\n\t}\n\n\tgetOptions( column: XiriTableField ): EditableOption[] {\n\t\tif ( !column.editableOptionsSearch && !column.editableSearchUrl )\n\t\t\treturn this.baseOptions( column );\n\t\t// While searching, return the currently shown options but always keep the\n\t\t// selected value(s) present so the trigger label stays correct even when\n\t\t// the active search result no longer contains them.\n\t\tconst shown = this.displayedOptions().slice();\n\t\tconst present = new Set( shown.map( o => o.value ) );\n\t\tfor ( const val of this.selectedValues( column ) ) {\n\t\t\tif ( !present.has( val ) )\n\t\t\t\tshown.unshift( this.optionCache.get( val ) ?? { value: val, label: val } );\n\t\t}\n\t\treturn shown;\n\t}\n\n\t/** The currently selected value(s) of the editing cell. */\n\tprivate selectedValues( column: XiriTableField ): string[] {\n\t\tif ( column.format === 'chips' )\n\t\t\treturn this.editingChipsValues();\n\t\tconst row = this.editingCell()?.row;\n\t\tconst v = row ? row[ column.id ] : null;\n\t\treturn v !== null && v !== undefined && v !== '' ? [ String( v ) ] : [];\n\t}\n\n\tonChipsChange( row: XiriTableRow, column: XiriTableField, selectedValues: string[] ): void {\n\t\tthis.editingChipsValues.set( selectedValues );\n\t\trow[ column.id ] = selectedValues.map( val => {\n\t\t\tconst opt = this.optionCache.get( val ) ?? this.getOptions( column ).find( o => o.value === val );\n\t\t\treturn { label: opt?.label || val, color: opt?.color || '' };\n\t\t} );\n\t}\n}\n","interface XiriStorageEntry {\n\ttime: number;\n\tvalue: unknown;\n}\n\n/**\n * Shared implementation for the local- and session-storage services. Internal\n * (not part of the public API); the concrete XiriLocalStorageService and\n * XiriSessionStorageService differ only in which Storage backend they pass in.\n */\nexport abstract class XiriStorageServiceBase {\n\n\tprivate data: Record<string, XiriStorageEntry> = {};\n\n\tprotected constructor( private readonly storage?: Storage ) {\n\t}\n\n\tpublic clear() {\n\n\t\tthis.data = {};\n\t\tthis.storage?.clear();\n\t}\n\n\tpublic set( name: string, value: unknown ) {\n\n\t\tconst val = {\n\t\t\ttime: Date.now(),\n\t\t\tvalue: value,\n\t\t}\n\n\t\tthis.data[ name ] = val;\n\t\tthis.storage?.setItem( name, JSON.stringify( val ) );\n\t}\n\n\tprivate getStruct( name: string ): XiriStorageEntry | null {\n\n\t\tif ( this.data[ name ] )\n\t\t\treturn this.data[ name ];\n\n\t\tconst valstr = this.storage?.getItem( name );\n\t\tif ( valstr ) {\n\t\t\tconst val = JSON.parse( valstr ) as XiriStorageEntry;\n\t\t\tthis.data[ name ] = val;\n\t\t\treturn val;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic remove( name: string ) {\n\n\t\tdelete this.data[ name ];\n\t\tthis.storage?.removeItem( name );\n\t}\n\n\tpublic get( name: string ): unknown {\n\n\t\tconst val = this.getStruct( name );\n\t\tif ( !val )\n\t\t\treturn null;\n\n\t\treturn val.value;\n\t}\n\n\t/**\n\t * @param name\n\t * @param maxTime in seconds\n\t */\n\tpublic getTimeout( name: string, maxTime: number ): unknown {\n\n\t\tconst val = this.getStruct( name );\n\t\tif ( !val )\n\t\t\treturn null;\n\n\t\tif ( val.time < Date.now() - maxTime * 1000 ) {\n\t\t\tthis.remove( name );\n\t\t\treturn null;\n\t\t}\n\n\t\treturn val.value;\n\t}\n\n}\n","import { Injectable } from '@angular/core';\nimport { XiriStorageServiceBase } from './storage-base';\n\n\n@Injectable( {\n\t providedIn: 'root'\n } )\nexport class XiriLocalStorageService extends XiriStorageServiceBase {\n\n\tconstructor() {\n\t\tsuper( window.localStorage );\n\t}\n\n}\n","import { inject, Injectable } from '@angular/core';\nimport { XiriLocalStorageService } from '../services/localStorage.service';\nimport { XiriTagChip } from '../formfields/field.interface';\n\n// A single table cell value. Rows are JSON delivered by the Go builder, so cell values are\n// genuinely dynamic (scalars, nested arrays for formats like \"number\"/\"buttons\", or chip objects).\n// The recursive shape keeps deep template accesses (row[col][i], chip.label, …) type-checking\n// under strictTemplates without resorting to `any`.\nexport type XiriTableCellValue =\n\t| string\n\t| number\n\t| boolean\n\t| null\n\t| undefined\n\t| XiriTagChip\n\t| XiriTableCellValue[]\n\t| { [key: string]: XiriTableCellValue };\n\n// A flat table row: arbitrary JSON keyed by column id, plus the tree metadata attached at runtime.\nexport interface XiriTableRow {\n\t[key: string]: XiriTableCellValue | XiriTreeMeta | undefined;\n\tid?: string | number;\n\tselect?: boolean;\n\t_tree?: XiriTreeMeta;\n}\n\n// Identifier of a tree node (the value of the row's id field) — string or number in practice.\nexport type XiriTreeId = string | number;\n\n/**\n * Opt-in tree-mode settings for xiri-table. When present on XiriTableSettings.tree, the\n * table renders rows hierarchically (indent + expand/collapse) based on each flat row's\n * id/parentId values. Without it the table renders as a flat list (unchanged behaviour).\n */\nexport interface XiriTableTreeSettings {\n\tidField: string // row field holding the node ID\n\tparentIdField: string // row field holding the parent ID; null/undefined/0 = root\n\ttreeColumn?: string // column that renders the indentation; default: first column\n\tcollapseAllByDefault?: boolean // default: false → tree starts fully expanded\n\tpersistStateKey?: string // localStorage key; without it no persistence\n\tshowCounts?: boolean // \"(5)\" badge when collapsed; default: true\n\taddSubHandler?: ( parentRow: XiriTableRow ) => void // when set → \"+ sub\" button per row (Angular consumers)\n\taddSubUrl?: string // when set → \"+ sub\" button that navigates here ({id} placeholder)\n\taddSubField?: string // per-row field whose truthy value gates the \"+ sub\" button (xiri-go path)\n\taddSubWhen?: ( row: XiriTableRow ) => boolean // predicate gating the \"+ sub\" button per row (Angular consumers)\n}\n\n/** Per-row tree metadata, attached as row._tree by flatten()/searchProjection(). */\nexport interface XiriTreeMeta {\n\tlevel: number // indentation depth (0 = root)\n\thasChildren: boolean // node has at least one (visible) child\n\texpanded: boolean // node is currently expanded\n\tchildCount: number // number of direct (visible) children\n\tdimmed?: boolean // ancestor-only context node during an active search\n}\n\nexport interface XiriTreeNode {\n\tid: XiriTreeId\n\trow: XiriTableRow\n\tchildren: XiriTreeNode[]\n\tlevel: number\n}\n\nconst STATE_PREFIX = 'xiri-tree-state-';\n\n// ============================================================================\n// Pure functions (no Angular dependencies — directly unit-testable)\n// ============================================================================\n\n/** Normalises a parent reference: null/undefined/0/'' are treated as \"no parent\" (root). */\nexport function normalizeParent( value: unknown ): XiriTreeId | null {\n\tif ( value === null || value === undefined || value === 0 || value === '' )\n\t\treturn null;\n\treturn value as XiriTreeId;\n}\n\n/**\n * Builds a node tree from a flat row list. Rows whose parentId is missing from the dataset\n * become roots. Cycles are detected and the offending node is treated as a root (with a\n * console warning) instead of crashing.\n */\nexport function buildTree( rows: XiriTableRow[], idField: string, parentIdField: string, treeColumn?: string ): XiriTreeNode[] {\n\tconst nodeMap = new Map<XiriTreeId, XiriTreeNode>();\n\tfor ( const row of rows ) {\n\t\tconst id = row[ idField ] as XiriTreeId;\n\t\tnodeMap.set( id, { id, row, children: [], level: 0 } );\n\t}\n\n\tconst roots: XiriTreeNode[] = [];\n\n\tfor ( const row of rows ) {\n\t\tconst node = nodeMap.get( row[ idField ] as XiriTreeId )!;\n\t\tconst pid = normalizeParent( row[ parentIdField ] );\n\t\tconst parent = pid !== null ? nodeMap.get( pid ) : undefined;\n\n\t\tif ( !parent ) {\n\t\t\troots.push( node );\n\t\t} else if ( createsCycle( node.id, parent, nodeMap, idField, parentIdField ) ) {\n\t\t\tconsole.warn( `xiri-table tree: cycle detected for node \"${ node.id }\", treating it as a root` );\n\t\t\troots.push( node );\n\t\t} else {\n\t\t\tparent.children.push( node );\n\t\t}\n\t}\n\n\tassignLevels( roots, 0 );\n\tif ( treeColumn )\n\t\tsortSiblings( roots, treeColumn );\n\n\treturn roots;\n}\n\n/** Walks up from candidateParent; returns true if it reaches nodeId (would create a cycle). */\nfunction createsCycle( nodeId: XiriTreeId, candidateParent: XiriTreeNode, nodeMap: Map<XiriTreeId, XiriTreeNode>,\n idField: string, parentIdField: string ): boolean {\n\tlet current: XiriTreeNode | undefined = candidateParent;\n\tconst seen = new Set<XiriTreeId>();\n\twhile ( current ) {\n\t\tif ( current.id === nodeId )\n\t\t\treturn true;\n\t\tif ( seen.has( current.id ) )\n\t\t\treturn true; // pre-existing cycle further up\n\t\tseen.add( current.id );\n\t\tconst ppid = normalizeParent( current.row[ parentIdField ] );\n\t\tcurrent = ppid !== null ? nodeMap.get( ppid ) : undefined;\n\t}\n\treturn false;\n}\n\nfunction assignLevels( nodes: XiriTreeNode[], level: number ): void {\n\tfor ( const node of nodes ) {\n\t\tnode.level = level;\n\t\tassignLevels( node.children, level + 1 );\n\t}\n}\n\n/** Sorts siblings alphabetically by the tree column at every level. */\nexport function sortSiblings( nodes: XiriTreeNode[], treeColumn: string ): void {\n\tnodes.sort( ( a, b ) =>\n\t\tString( a.row[ treeColumn ] ?? '' ).localeCompare( String( b.row[ treeColumn ] ?? '' ), undefined, { sensitivity: 'base' } ) );\n\tfor ( const node of nodes )\n\t\tsortSiblings( node.children, treeColumn );\n}\n\n/**\n * Projects the tree to the flat, ordered list of currently visible rows, annotating each\n * row with its tree metadata (row._tree). Children are only included when their parent is\n * in expandedIds.\n */\nexport function flatten( roots: XiriTreeNode[], expandedIds: Set<XiriTreeId> ): XiriTableRow[] {\n\tconst out: XiriTableRow[] = [];\n\tconst walk = ( nodes: XiriTreeNode[] ) => {\n\t\tfor ( const node of nodes ) {\n\t\t\tconst hasChildren = node.children.length > 0;\n\t\t\tconst expanded = hasChildren && expandedIds.has( node.id );\n\t\t\tnode.row._tree = {\n\t\t\t\tlevel: node.level,\n\t\t\t\thasChildren,\n\t\t\t\texpanded,\n\t\t\t\tchildCount: node.children.length,\n\t\t\t} as XiriTreeMeta;\n\t\t\tout.push( node.row );\n\t\t\tif ( expanded )\n\t\t\t\twalk( node.children );\n\t\t}\n\t};\n\twalk( roots );\n\treturn out;\n}\n\n/**\n * Search projection: returns each match together with its full subtree (all descendants)\n * plus the ancestor path leading to it; everything else is hidden. Matches and their\n * descendants are shown fully; ancestor-only context nodes are flagged dimmed. Within the\n * filtered result, expand/collapse follows `expandedIds` (same state model as the flat view) —\n * pass an all-expanded set to show everything. The `matches` predicate decides hits.\n */\nexport function searchProjection( roots: XiriTreeNode[], matches: ( row: XiriTableRow ) => boolean,\n expandedIds: Set<XiriTreeId> ): XiriTableRow[] {\n\tconst visible = new Set<XiriTreeNode>();\n\tconst inMatchSubtree = new Set<XiriTreeNode>(); // node matches itself or sits under a match → shown fully\n\n\t// underMatch: an ancestor of this node already matched, so the whole subtree is shown.\n\tconst mark = ( node: XiriTreeNode, underMatch: boolean ): boolean => {\n\t\tconst selfMatch = matches( node.row );\n\t\tconst inSubtree = underMatch || selfMatch;\n\t\tif ( inSubtree )\n\t\t\tinMatchSubtree.add( node );\n\n\t\tlet descendantVisible = false;\n\t\tfor ( const child of node.children )\n\t\t\tdescendantVisible = mark( child, inSubtree ) || descendantVisible;\n\n\t\t// Visible if part of a matched subtree, or an ancestor on the path to a deeper match.\n\t\tif ( inSubtree || descendantVisible ) {\n\t\t\tvisible.add( node );\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\tfor ( const root of roots )\n\t\tmark( root, false );\n\n\tconst out: XiriTableRow[] = [];\n\tconst walk = ( nodes: XiriTreeNode[] ) => {\n\t\tfor ( const node of nodes ) {\n\t\t\tif ( !visible.has( node ) )\n\t\t\t\tcontinue;\n\t\t\tconst visibleChildren = node.children.filter( c => visible.has( c ) );\n\t\t\tconst hasChildren = visibleChildren.length > 0;\n\t\t\tconst expanded = hasChildren && expandedIds.has( node.id );\n\t\t\tnode.row._tree = {\n\t\t\t\tlevel: node.level,\n\t\t\t\thasChildren,\n\t\t\t\texpanded,\n\t\t\t\tchildCount: visibleChildren.length,\n\t\t\t\tdimmed: !inMatchSubtree.has( node ),\n\t\t\t} as XiriTreeMeta;\n\t\t\tout.push( node.row );\n\t\t\tif ( expanded )\n\t\t\t\twalk( node.children );\n\t\t}\n\t};\n\twalk( roots );\n\treturn out;\n}\n\n/** Collects the ids of every node that has at least one child (i.e. is expandable). */\nexport function collectExpandableIds( roots: XiriTreeNode[] ): Set<XiriTreeId> {\n\tconst ids = new Set<XiriTreeId>();\n\tconst walk = ( nodes: XiriTreeNode[] ) => {\n\t\tfor ( const node of nodes ) {\n\t\t\tif ( node.children.length > 0 ) {\n\t\t\t\tids.add( node.id );\n\t\t\t\twalk( node.children );\n\t\t\t}\n\t\t}\n\t};\n\twalk( roots );\n\treturn ids;\n}\n\n// ============================================================================\n// Stateful service (one instance per table, provided in the component)\n// ============================================================================\n\n@Injectable()\nexport class XiriTableTreeService {\n\n\tprivate localStorage = inject( XiriLocalStorageService );\n\n\tprivate config: XiriTableTreeSettings | null = null;\n\tprivate treeColumnId = '';\n\tprivate roots: XiriTreeNode[] = [];\n\tprivate expanded = new Set<XiriTreeId>();\n\tprivate savedExpanded: Set<XiriTreeId> | null = null; // expand-state snapshot taken when a search starts\n\tprivate searchActive = false;\n\n\t/** Whether tree mode is active for this table. */\n\tget enabled(): boolean { return this.config !== null; }\n\tget settings(): XiriTableTreeSettings | null { return this.config; }\n\tget treeColumn(): string { return this.treeColumnId; }\n\tget showCounts(): boolean { return this.config?.showCounts !== false; }\n\tget hasAddSub(): boolean { return !!( this.config?.addSubHandler || this.config?.addSubUrl ); }\n\n\t/** Initialises the service from the table's tree settings. treeColumn falls back to firstColumnId. */\n\tinit( config: XiriTableTreeSettings, firstColumnId: string ): void {\n\t\tthis.config = config;\n\t\tthis.treeColumnId = config.treeColumn || firstColumnId;\n\t}\n\n\t/** Builds the tree from flat rows and initialises the expand-state. */\n\tbuild( rows: XiriTableRow[] ): void {\n\t\tif ( !this.config )\n\t\t\treturn;\n\n\t\tthis.roots = buildTree( rows, this.config.idField, this.config.parentIdField, this.treeColumnId );\n\n\t\tconst persisted = this.loadPersisted();\n\t\tif ( persisted )\n\t\t\tthis.expanded = new Set( persisted ); // persisted state wins\n\t\telse if ( this.config.collapseAllByDefault )\n\t\t\tthis.expanded = new Set(); // opt-in: start collapsed\n\t\telse\n\t\t\tthis.expanded = collectExpandableIds( this.roots ); // default: start fully expanded\n\t}\n\n\t/** Returns the visible rows: search projection when searching, otherwise the expand-state flatten. */\n\tvisibleRows( matches?: ( row: XiriTableRow ) => boolean ): XiriTableRow[] {\n\t\tif ( this.searchActive && matches )\n\t\t\treturn searchProjection( this.roots, matches, this.expanded );\n\t\treturn flatten( this.roots, this.expanded );\n\t}\n\n\t/**\n\t * Applies (or clears) a search. On the empty→active transition the current expand-state is\n\t * snapshotted and the tree is fully expanded (so all matches are visible); during the search\n\t * the same `expanded` state drives expand/collapse, so the arrows work. On active→empty the\n\t * pre-search state is restored (Spec §5). Returns the new visible rows.\n\t */\n\tapplySearch( matches: ( ( row: XiriTableRow ) => boolean ) | null ): XiriTableRow[] {\n\t\tif ( matches ) {\n\t\t\tif ( !this.searchActive ) {\n\t\t\t\tthis.savedExpanded = new Set( this.expanded );\n\t\t\t\tthis.expanded = collectExpandableIds( this.roots ); // start fully expanded\n\t\t\t\tthis.searchActive = true;\n\t\t\t}\n\t\t\treturn searchProjection( this.roots, matches, this.expanded );\n\t\t}\n\n\t\tif ( this.searchActive ) {\n\t\t\tif ( this.savedExpanded )\n\t\t\t\tthis.expanded = new Set( this.savedExpanded );\n\t\t\tthis.savedExpanded = null;\n\t\t\tthis.searchActive = false;\n\t\t}\n\t\treturn flatten( this.roots, this.expanded );\n\t}\n\n\ttoggle( row: XiriTableRow ): void {\n\t\tconst id = row[ this.config!.idField ] as XiriTreeId;\n\t\tif ( this.expanded.has( id ) )\n\t\t\tthis.expanded.delete( id );\n\t\telse\n\t\t\tthis.expanded.add( id );\n\t\t// Don't persist transient expand changes made while searching — savedExpanded holds the\n\t\t// real state and is restored on reset.\n\t\tif ( !this.searchActive )\n\t\t\tthis.persist();\n\t}\n\n\texpandAll(): void {\n\t\tthis.expanded = collectExpandableIds( this.roots );\n\t\tthis.persist();\n\t}\n\n\tcollapseAll(): void {\n\t\tthis.expanded = new Set();\n\t\tthis.persist();\n\t}\n\n\t/**\n\t * Whether the \"+ sub\" button should be shown for a given row. Opt-in: an addSubWhen predicate\n\t * or a truthy addSubField value gates it; without either, the button shows on every row.\n\t */\n\tcanAddSub( row: XiriTableRow ): boolean {\n\t\tif ( !this.config )\n\t\t\treturn false;\n\t\tif ( this.config.addSubWhen )\n\t\t\treturn this.config.addSubWhen( row );\n\t\tif ( this.config.addSubField )\n\t\t\treturn !!row[ this.config.addSubField ];\n\t\treturn true;\n\t}\n\n\t/** Resolves the \"+ sub\" target URL for a row, substituting the {id} placeholder. */\n\taddSubUrlFor( row: XiriTableRow ): string | null {\n\t\tif ( !this.config?.addSubUrl )\n\t\t\treturn null;\n\t\treturn this.config.addSubUrl.replace( '{id}', encodeURIComponent( String( row[ this.config.idField ] ) ) );\n\t}\n\n\tprivate storageKey(): string | null {\n\t\treturn this.config?.persistStateKey ? STATE_PREFIX + this.config.persistStateKey : null;\n\t}\n\n\tprivate loadPersisted(): XiriTreeId[] | null {\n\t\tconst key = this.storageKey();\n\t\tif ( !key )\n\t\t\treturn null;\n\t\tconst value = this.localStorage.get( key );\n\t\treturn Array.isArray( value ) ? value as XiriTreeId[] : null;\n\t}\n\n\tprivate persist(): void {\n\t\tconst key = this.storageKey();\n\t\tif ( key )\n\t\t\tthis.localStorage.set( key, Array.from( this.expanded ) );\n\t}\n}\n","import { Component, input, output } from '@angular/core';\nimport { XiriButton, XiriButtonComponent, XiriButtonResult } from \"../button/button.component\";\n\n\nexport interface XiriButtonlineSettings {\n\tbuttons: XiriButton[]\n\tclass: string\n}\n\n@Component( {\n\t selector: 'xiri-buttonline',\n\t templateUrl: './buttonline.component.html',\n\t styleUrl: './buttonline.component.scss',\n\t imports: [\n\t\t XiriButtonComponent\n\t ],\n } )\nexport class XiriButtonlineComponent {\n\t\n\tsettings = input.required<XiriButtonlineSettings>();\n\tdisabled = input<boolean>( false );\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\t\n\tresult = output<XiriButtonResult>();\n}\n","<div class=\"buttonline\" [class]=\"settings().class\">\n\t@for (button of settings().buttons; track i; let i = $index) {\n\t\t<xiri-button [button]=\"button\" [filterData]=\"filterData()\" [disabled]=\"disabled()\" (result)=\"result.emit( $event )\"></xiri-button>\n\t}\n</div>\n","import { Injectable } from '@angular/core';\nimport { XiriStorageServiceBase } from './storage-base';\n\n\n@Injectable( {\n\t providedIn: 'root'\n } )\nexport class XiriSessionStorageService extends XiriStorageServiceBase {\n\n\tconstructor() {\n\t\tsuper( window.sessionStorage );\n\t}\n\n}\n","import { Component, input, output } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriButton, XiriButtonComponent, XiriButtonResult } from '../button/button.component';\nimport { XiriColor } from '../types/color.type';\n\nexport interface XiriEmptyStateSettings {\n\ticon?: string\n\ticonColor?: XiriColor\n\ttitle?: string\n\tdescription?: string\n\tbutton?: XiriButton\n}\n\n@Component( {\n\t selector: 'xiri-empty-state',\n\t templateUrl: './empty-state.component.html',\n\t styleUrl: './empty-state.component.scss',\n\t imports: [ MatIcon, XiriButtonComponent ]\n } )\nexport class XiriEmptyStateComponent {\n\n\tsettings = input.required<XiriEmptyStateSettings>();\n\tbuttonResult = output<XiriButtonResult>();\n}\n","<div class=\"empty-state\">\n\t@if (settings().icon) {\n\t\t<mat-icon [class]=\"settings().iconColor || 'gray'\">{{ settings().icon }}</mat-icon>\n\t}\n\t<div class=\"title\">{{ settings().title }}</div>\n\t@if (settings().description) {\n\t\t<div class=\"description\">{{ settings().description }}</div>\n\t}\n\t@if (settings().button) {\n\t\t<div class=\"action\">\n\t\t\t<xiri-button [button]=\"settings().button!\" (result)=\"buttonResult.emit($event)\"></xiri-button>\n\t\t</div>\n\t}\n</div>\n","import {\n\tChangeDetectorRef,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\teffect,\n\tinject,\n\tinput,\n\tOnDestroy,\n\tOnInit,\n\toutput,\n\tsignal,\n\tTemplateRef,\n\tviewChild,\n\tViewEncapsulation\n} from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort, MatSortable, MatSortHeader } from '@angular/material/sort';\nimport {\n\tMatCell, MatCellDef,\n\tMatColumnDef, MatFooterCell, MatFooterCellDef, MatFooterRow, MatFooterRowDef,\n\tMatHeaderCell, MatHeaderCellDef,\n\tMatHeaderRow, MatHeaderRowDef,\n\tMatRow, MatRowDef,\n\tMatTable,\n\tMatTableDataSource\n} from '@angular/material/table';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { Router, RouterLink } from '@angular/router';\nimport { Observable, Subject } from \"rxjs\";\nimport { takeUntil } from \"rxjs/operators\";\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { XiriDialogComponent } from \"../dialog/dialog.component\";\nimport { XiriDataService } from '../services/data.service';\nimport { XiriButton, XiriButtonComponent, XiriButtonResult } from \"../button/button.component\";\nimport { XiriSnackbarService } from '../services/snackbar.service';\nimport { XiriResponseHandlerService } from '../services/response-handler.service';\nimport { XiriDownloadService } from '../services/download.service';\nimport { XiriTableInlineEditService } from './inline-edit.service';\nimport { XiriTableCellValue, XiriTableRow, XiriTableTreeService, XiriTableTreeSettings } from './tree.service';\nimport { XiriTagChip } from '../formfields/field.interface';\nimport { XiriButtonlineComponent, XiriButtonlineSettings } from \"../buttonline/buttonline.component\";\nimport { XiriDynData } from \"../dyncomponent/dyndata.interface\";\nimport { XiriTableField } from \"../raw-table/tabefield.interface\";\nimport { XiriSessionStorageService } from \"../services/sessionStorage.service\";\nimport { XiriLocaleService } from '../services/locale.service';\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgxMatSelectSearchModule } from 'ngx-mat-select-search';\nimport { MatInput } from '@angular/material/input';\nimport { MatFormField, MatSuffix } from '@angular/material/form-field';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { XiriButtonstyleComponent } from '../buttonstyle/buttonstyle.component';\nimport { XiriSearchComponent } from '../search/search.component';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatButton, MatIconButton } from '@angular/material/button';\nimport { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';\nimport { MatSelect, MatOption } from '@angular/material/select';\nimport { DatePipe, NgTemplateOutlet } from '@angular/common';\nimport { MatCard } from '@angular/material/card';\nimport { XiriEmptyStateComponent } from '../empty-state/empty-state.component';\nimport { XiriColor } from '../types/color.type';\n\n\n// Minimal shape of an HTTP error as surfaced by the data service (Angular HttpErrorResponse).\ninterface XiriHttpError {\n\terror?: { error?: string } | string;\n\tstatusText?: string;\n}\n\n// Reads a human-readable message out of an unknown error value.\nfunction errorMessage( err: unknown ): string | undefined {\n\tconst e = err as XiriHttpError;\n\tconst inner = e?.error;\n\tif ( inner && typeof inner === 'object' && 'error' in inner )\n\t\treturn inner.error;\n\treturn undefined;\n}\n\n// Shape of a server data response consumed by loadData().\nexport interface XiriTableResponse {\n\tdata?: XiriTableRow[];\n\tfields?: XiriTableField[];\n\tsummary?: XiriDynData[];\n\tcomponents?: XiriDynData[];\n\tfooter?: Record<string, XiriTableCellValue>;\n\ttotalCount?: number;\n\tpoll?: number;\n\t[key: string]: unknown;\n}\n\n// Dialog payload passed to XiriDialogComponent from a table button (copied from the button,\n// with type/url/data overridden per action). `data` carries either the button's own payload\n// or, for selection dialogs, the selected row ids.\ntype XiriTableDialogData = Omit<Partial<XiriButton>, 'data'> & {\n\ttype: string;\n\turl?: string;\n\tdata?: XiriButton['data'] | ( string | number )[];\n};\n\n// Persisted (session-storage) table state restored on first data load.\ninterface XiriTableSavedState {\n\tpageIndex?: number;\n\tpageSize?: number;\n\tfilter?: string;\n\tsort?: string;\n\tsortDirection?: 'asc' | 'desc' | '';\n}\n\nexport interface XiriTableEmptyState {\n\ticon?: string\n\ticonColor?: XiriColor\n\ttitle?: string\n\tdescription?: string\n}\n\nexport interface XiriTableOptions {\n\treload?: boolean\n\tdense?: boolean\n\tdensity?: 'compact' | 'regular' | 'relaxed'\n\tsort?: boolean\n\tsearch?: boolean\n\tclass?: string\n\tpagination?: boolean\n\titemsPerPage?: number\n\tpageSizes?: number[]\n\tselect?: boolean\n\tselectButtons?: XiriButton[]\n\t// UX-007 Bulk-Actions (additiv): when set, a selection column is shown and a sticky\n\t// context bar with these actions appears once at least one row is selected.\n\tbulkActions?: XiriButton[]\n\t// Offer \"select all results\" (whole filter, not just the current page) in the bulk bar.\n\tselectAllResults?: boolean\n\t// Keep the bulk context bar pinned to the top while scrolling.\n\tstickyBulkBar?: boolean\n\ttitle?: string\n\ttextNoData?: string\n\temptyState?: XiriTableEmptyState\n\tbuttons?: XiriButtonlineSettings\n\tminWidth?: string\n\tsaveState?: boolean\n\tsaveStateId?: string\n\tsaveInput?: string\n\tsaveInputUrl?: string\n\tborders?: boolean\n\tbordersHeader?: boolean\n\tfooter?: boolean\n\tserverSide?: boolean\n\tscrollHeight?: string\n\teditUrl?: string\n\ttree?: XiriTableTreeSettings // opt-in tree mode; delivered here by the Go builder (options.tree)\n}\n\nexport interface XiriTableSettings {\n\turl?: string\n\tdata?: XiriTableRow[]\n\tfields?: XiriTableField[]\n\toptions?: XiriTableOptions\n\thasFilter?: boolean\n\ttree?: XiriTableTreeSettings // opt-in tree mode; for direct Angular consumers (Spec §6)\n}\n\nexport type { XiriTableTreeSettings, XiriTableRow, XiriTableCellValue } from './tree.service';\n\n@Component( {\n\t selector: 'xiri-table',\n\t templateUrl: './table.component.html',\n\t styleUrl: './table.component.scss',\n\t encapsulation: ViewEncapsulation.None,\n\t providers: [ XiriTableInlineEditService, XiriTableTreeService ],\n\t imports: [ MatCard,\n\t MatIconButton,\n\t MatIcon,\n\t XiriButtonlineComponent,\n\t XiriSearchComponent,\n\t MatButton,\n\t MatTable,\n\t MatSort,\n\t MatColumnDef,\n\t MatHeaderCell,\n\t MatSortHeader,\n\t MatCell,\n\t RouterLink,\n\t XiriButtonstyleComponent,\n\t MatTooltip,\n\t MatFormField, MatSuffix,\n\t MatInput,\n\t FormsModule,\n\t ReactiveFormsModule,\n\t NgxMatSelectSearchModule,\n\t MatCheckbox,\n\t MatHeaderRow,\n\t MatRow,\n\t MatProgressSpinner,\n\t MatPaginator,\n\t NgTemplateOutlet,\n\t DatePipe,\n\t SafehtmlPipe, XiriUrlPipe, XiriButtonComponent, MatHeaderCellDef, MatCellDef, MatHeaderRowDef, MatRowDef,\n\t MatFooterRow, MatFooterRowDef, MatFooterCell, MatFooterCellDef,\n\t MatMenu, MatMenuItem, MatMenuTrigger,\n\t MatSelect, MatOption,\n\t XiriEmptyStateComponent ]\n } )\nexport class XiriTableComponent implements OnInit, OnDestroy {\n\t\n\tprivate dialog: MatDialog = inject( MatDialog );\n\tprivate dataService: XiriDataService = inject( XiriDataService );\n\tprivate router: Router = inject( Router );\n\tprivate sessionStorageService: XiriSessionStorageService = inject( XiriSessionStorageService );\n\tprivate numberService = inject( XiriLocaleService );\n\tprivate snackbar = inject( XiriSnackbarService );\n\tprivate responseHandler = inject( XiriResponseHandlerService );\n\tprivate downloadService = inject( XiriDownloadService );\n\tinlineEdit = inject( XiriTableInlineEditService );\n\ttree = inject( XiriTableTreeService );\n\tprotected _changeDetectorRef: ChangeDetectorRef = inject( ChangeDetectorRef );\n\tprivate destroyRef = inject( DestroyRef );\n\t\n\tdyncomponent = input<TemplateRef<unknown>>();\n\tsettings = input.required<XiriTableSettings>();\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\tclickedRow = output<XiriTableRow>();\n\n\tpaginator = viewChild.required<MatPaginator>( MatPaginator );\n\tsort = viewChild.required<MatSort>( MatSort );\n\ttable = viewChild.required<MatTable<XiriTableRow>>( MatTable );\n\tloading = signal<boolean>( true );\n\tprivate _totalCount = signal<number>( 0 );\n\n\tdisplayedColumns: XiriTableField[] = [];\n\tcolumnsToDisplay: string[] = [];\n\tcolumnsToSearch: string[] = [];\n\tdataSource = new MatTableDataSource<XiriTableRow>();\n\tprotected _displayeddata: readonly XiriTableRow[] = [];\n\t_alldata = signal<XiriTableRow[] | null>( null );\n\tfooter: Record<string, XiriTableCellValue> = {};\n\n\textraHeaderFields: XiriTableField[] = [];\n\textraHeaders: string[] = [];\n\n\tpublic selection = new SelectionModel<XiriTableRow>( true, [] );\n\t// UX-007: true once the user opted into \"all results\" (whole filter) instead of just the\n\t// selected rows on the current page. Reset whenever the selection is cleared or changed.\n\tpublic bulkAllResults = signal<boolean>( false );\n\tprivate dialogRef?: MatDialogRef<unknown>;\n\tprivate reloadAbort$ = new Subject<void>();\n\n\t// Auto-refresh (backend-driven polling): activated when the table data response\n\t// contains a \"poll\" interval (ms). While active the whole table reloads after that\n\t// interval and a table-wide indicator with countdown is shown. Stops automatically\n\t// when a response no longer contains \"poll\".\n\tprivate autoRefreshTimer?: ReturnType<typeof setTimeout>;\n\tprivate countdownTimer?: ReturnType<typeof setInterval>;\n\tautoRefresh = signal<{ intervalMs: number; nextAt: number } | null>( null );\n\t// Timestamp of the last successful load, shown as \"Stand HH:MM\" so a stale/polled\n\t// view never lets the user act on silently outdated numbers.\n\tlastUpdated = signal<Date | null>( null );\n\tprivate _now = signal<number>( Date.now() );\n\tcountdown = computed<number>( () => {\n\t\tconst ar = this.autoRefresh();\n\t\tif ( !ar )\n\t\t\treturn 0;\n\t\tconst secs = Math.ceil( ( ar.nextAt - this._now() ) / 1000 );\n\t\treturn secs > 0 ? secs : 0;\n\t} );\n\n\tpublic options: XiriTableOptions = {\n\t\treload: false,\n\t\tdense: false,\n\t\tdensity: 'regular',\n\t\tsort: true,\n\t\tsearch: true,\n\t\tpagination: true,\n\t\titemsPerPage: 50,\n\t\tpageSizes: [ 10, 25, 50, 100, 500 ],\n\t\tselect: false,\n\t\ttitle: '',\n\t\ttextNoData: 'no data found',\n\t\tsaveInput: undefined,\n\t\tsaveInputUrl: undefined,\n\t\tsaveState: false,\n\t\tsaveStateId: undefined,\n\t\tborders: false,\n\t\tbordersHeader: false,\n\t\tfooter: false,\n\t\tserverSide: false,\n\t};\n\t\n\tpublic dynData: {\n\t\tdata: XiriDynData[] | null,\n\t\tfilterData: Record<string, unknown> | null | undefined,\n\t} = { data: null, filterData: undefined };\n\tpublic errorMsg = '';\n\tprivate _firstData = true;\n\tpublic searchText = '';\n\tpublic searchTextInit = '';\n\n\t// Resolves the legacy dense:true alias to density:'compact' when density itself is not set explicitly.\n\tpublic mergeOptions( incoming: XiriTableOptions ): XiriTableOptions {\n\t\tconst merged: XiriTableOptions = { ...incoming };\n\t\tif ( merged.density === undefined && merged.dense === true )\n\t\t\tmerged.density = 'compact';\n\t\treturn merged;\n\t}\n\n\t// Density-Klasse reaktiv aus settings() ableiten, damit ein Live-Umschalten des density-Werts\n\t// wirkt (options wird sonst nur einmal in ngOnInit gemergt und würde nicht reagieren).\n\tpublic densityClass = computed( () => 'density-' + ( this.mergeOptions( this.settings().options ?? {} ).density ?? 'regular' ) );\n\n\tprivate tableStateKey(): string | null {\n\t\treturn this.options.saveStateId ? this.options.saveStateId + ':table' : null;\n\t}\n\n\ttrackByRowId = ( index: number, row: XiriTableRow ): string | number => row.id ?? index;\n\n\t// Inline edit signals delegated to inlineEdit service\n\tget editingCell() { return this.inlineEdit.editingCell; }\n\tget editingChipsValues() { return this.inlineEdit.editingChipsValues; }\n\tget editableOptionsLoading() { return this.inlineEdit.editableOptionsLoading; }\n\tget loadedEditableOptions() { return this.inlineEdit.loadedEditableOptions; }\n\tget savingCell() { return this.inlineEdit.savingCell; }\n\tget inlineSearchControl() { return this.inlineEdit.searchControl; }\n\tget inlineSearching() { return this.inlineEdit.searching; }\n\t\n\t_filterData = computed( () => {\n\t\t\n\t\tconst values = this.filterData();\n\t\t\n\t\tif ( values === undefined )\n\t\t\treturn undefined;\n\t\telse if ( values === null )\n\t\t\treturn null;\n\t\t\n\t\treturn values;\n\t} );\n\t\n\tconstructor() {\n\t\t\n\t\teffect( () => {\n\t\t\tconst filterData = this._filterData();\n\n\t\t\tthis.loading.set( true );\n\t\t\tthis.reloadAbort$.next();\n\t\t\tthis.clearAutoRefresh();\n\n\t\t\tif ( filterData === null )\n\t\t\t\treturn;\n\n\t\t\tthis.loadData();\n\t\t} );\n\t\t\n\t\teffect( () => {\n\t\t\tconst all = this._alldata();\n\t\t\tif ( all === null ) {\n\t\t\t\tthis.dataSource.data = [];\n\t\t\t} else if ( this.tree.enabled ) {\n\t\t\t\tthis.tree.build( all );\n\t\t\t\tthis.refreshTree();\n\t\t\t} else {\n\t\t\t\tthis.dataSource.data = all;\n\t\t\t}\n\t\t} );\n\t}\n\t\n\tpublic ngOnInit() {\n\t\t\n\t\tif ( this.settings().options )\n\t\t\tthis.options = { ...this.options, ...this.mergeOptions( this.settings().options as XiriTableOptions ) };\n\t\tconst settingsFields = this.settings().fields;\n\t\tif ( settingsFields )\n\t\t\tthis.loadFields( settingsFields );\n\n\t\t// Tree mode: accept config from top-level settings (Angular consumers) or options (Go builder).\n\t\tconst treeCfg = this.settings().tree ?? this.options.tree;\n\t\tif ( treeCfg && this.displayedColumns.length > 0 )\n\t\t\tthis.tree.init( treeCfg, this.displayedColumns[ 0 ].id );\n\n\t\tthis.inlineEdit.init( {\n\t\t\tgetEditUrl: () => this.options.editUrl ?? '',\n\t\t\tgetDisplayedColumns: () => this.displayedColumns,\n\t\t\tabort$: this.reloadAbort$,\n\t\t\tonSaved: ( row, fieldId ) => this.inlineEdit.flashSaved( row, fieldId, this.dataSource ),\n\t\t\tonDataUpdate: () => this.dataSource._updateChangeSubscription(),\n\t\t\tonCallReturn: ( result ) => this.callReturn( result ),\n\t\t} );\n\n\t\tif ( this.options.pagination )\n\t\t\tthis.paginator().pageSize = this.options.itemsPerPage as number;\n\t\tif ( this.options.pagination && !this.options.serverSide )\n\t\t\tthis.dataSource.paginator = this.paginator();\n\t\t// In tree mode column sorting is disabled (Spec §5); siblings are sorted alphabetically\n\t\t// at build time. Connecting MatSort would re-order rows globally and break tree order.\n\t\tif ( this.options.sort && !this.options.serverSide && !this.tree.enabled ) {\n\t\t\tthis.dataSource.sort = this.sort();\n\t\t\tthis.dataSource.sortingDataAccessor = this.getSortingDataAccessor();\n\t\t\tif ( this.options.pagination )\n\t\t\t\tthis.sort().sortChange.subscribe( () => this.paginator().firstPage() );\n\t\t}\n\n\t\tif ( this.options.serverSide ) {\n\t\t\tthis.paginator().page\n\t\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t\t.subscribe( () => {\n\t\t\t\t\tthis.reload();\n\t\t\t\t} );\n\n\t\t\tif ( this.options.sort ) {\n\t\t\t\tthis.sort().sortChange\n\t\t\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t\t\t.subscribe( () => {\n\t\t\t\t\t\tthis.paginator().firstPage();\n\t\t\t\t\t\tthis.reload();\n\t\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Tree mode uses its own search projection (matches + ancestors), not the flat filter predicate.\n\t\tif ( this.options.search && !this.options.serverSide && !this.tree.enabled ) {\n\t\t\tthis.dataSource.filterPredicate = ( data: XiriTableRow, filter: string ): boolean => {\n\t\t\t\tconst dataStr = this.columnsToSearch.reduce( ( currentTerm: string, key: string ) => {\n\t\t\t\t\treturn currentTerm + data[ key ] + '◬';\n\t\t\t\t}, '' ).toLowerCase();\n\t\t\t\treturn dataStr.indexOf( filter ) !== -1;\n\t\t\t};\n\t\t}\n\t\t\n\t\tif ( this.options.buttons )\n\t\t\tthis.options.buttons.class = 'small';\n\t\t\n\t\tthis.dataSource.connect()\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( data => {\n\t\t\t\t\tthis._displayeddata = data || [];\n\t\t\t\t\t\n\t\t\t\t\tconst stateKey = this.tableStateKey();\n\t\t\t\t\tif ( this.options.saveState && this._firstData === false && stateKey ) {\n\t\t\t\t\t\tthis.sessionStorageService.set( stateKey, {\n\t\t\t\t\t\t\tpageIndex: this.paginator()?.pageIndex,\n\t\t\t\t\t\t\tpageSize: this.paginator()?.pageSize,\n\t\t\t\t\t\t\tfilter: this.searchText,\n\t\t\t\t\t\t\tsort: this.sort()?.active,\n\t\t\t\t\t\t\tsortDirection: this.sort()?.direction,\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ( this.options.footer ) {\n\t\t\t\t\t\tthis.displayedColumns.forEach( ( column: XiriTableField ) => {\n\t\t\t\t\t\t\tif ( column.footer === 'no' )\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif ( column.footer === 'count' ) {\n\t\t\t\t\t\t\t\tthis.footer[ column.id ] = this._displayeddata.length + '#';\n\t\t\t\t\t\t\t} else if ( column.footer === 'sum' ) {\n\t\t\t\t\t\t\t\tlet sum = 0;\n\t\t\t\t\t\t\t\tthis._displayeddata.forEach( ( row: XiriTableRow ) => {\n\t\t\t\t\t\t\t\t\tconst cell = row[ column.id ] as XiriTableCellValue[] | undefined;\n\t\t\t\t\t\t\t\t\tsum += +( cell ? cell[ 1 ] as number : 0 );\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif ( !column.webformat )\n\t\t\t\t\t\t\t\t\tthis.footer[ column.id ] = sum;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tthis.footer[ column.id ] = this.numberService.formatNumber( sum, column.webformat );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t} );\n\n\t\t// if ( !this.settings().hasFilter )\n\t\t//\tthis.loadData();\n\t}\n\t\n\tprivate loadData() {\n\t\t\n\t\tthis.errorMsg = '';\n\t\tthis.selection.clear();\n\t\tthis.bulkAllResults.set( false );\n\t\tthis.dynData.data = null;\n\t\t// Cancel any pending auto-refresh while this load is in flight; the response decides\n\t\t// whether to reschedule (res.poll present) or stop (clearAutoRefresh).\n\t\tthis.cancelAutoRefreshTimers();\n\n\t\tconst inlineData = this.settings().data;\n\t\tif ( inlineData ) {\n\t\t\tthis.options.reload = false;\n\t\t\tthis.clearAutoRefresh();\n\t\t\tthis.setData( inlineData );\n\t\t\tthis.loading.set( false );\n\t\t} else if ( this.settings().url ) {\n\n\t\t\tconst url = this.settings().url ?? '';\n\t\t\tconst payload: Record<string, unknown> = this.settings().hasFilter\n\t\t\t\t? { ...( this._filterData() as Record<string, unknown> ) }\n\t\t\t\t: {};\n\n\t\t\tif ( this.options.serverSide ) {\n\t\t\t\tpayload._page = this.paginator().pageIndex;\n\t\t\t\tpayload._pageSize = this.paginator().pageSize;\n\t\t\t\tif ( this.sort().active ) {\n\t\t\t\t\tpayload._sort = this.sort().active;\n\t\t\t\t\tpayload._sortDir = this.sort().direction;\n\t\t\t\t}\n\t\t\t\tif ( this.searchText ) {\n\t\t\t\t\tpayload._search = this.searchText;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst api: Observable<unknown> = this.dataService.post(\n\t\t\t\turl, Object.keys( payload ).length > 0 ? payload : null );\n\n\t\t\tapi.pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\t\tnext: ( raw: unknown ) => {\n\t\t\t\t\tconst res = raw as XiriTableResponse | null;\n\n\t\t\t\t\tif ( !res || !res.data ) {\n\t\t\t\t\t\tthis.errorMsg = 'ERROR: unknown server response';\n\t\t\t\t\t\tthis._alldata.set( [] );\n\t\t\t\t\t\tthis.clearAutoRefresh();\n\t\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( res.fields )\n\t\t\t\t\t\tthis.loadFields( res.fields );\n\t\t\t\t\tif ( res.summary )\n\t\t\t\t\t\tthis.dynData.data = res.summary;\n\t\t\t\t\telse if ( res.components )\n\t\t\t\t\t\tthis.dynData.data = res.components;\n\n\t\t\t\t\tif ( res.footer )\n\t\t\t\t\t\tthis.setFooter( res.footer );\n\t\t\t\t\tif ( res.totalCount !== undefined && this.options.serverSide ) {\n\t\t\t\t\t\tthis._totalCount.set( res.totalCount );\n\t\t\t\t\t\tthis.paginator().length = res.totalCount;\n\t\t\t\t\t}\n\t\t\t\t\tthis.setData( res.data );\n\t\t\t\t\tthis.lastUpdated.set( new Date() );\n\t\t\t\t\tif ( res.poll )\n\t\t\t\t\t\tthis.scheduleAutoRefresh( res.poll );\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.clearAutoRefresh();\n\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t\t}, error: ( err: unknown ) => {\n\t\t\t\t\tthis.errorMsg = errorMessage( err ) ?? ( err as XiriHttpError )?.statusText ?? '';\n\t\t\t\t\tthis._alldata.set( [] );\n\t\t\t\t\tthis.clearAutoRefresh();\n\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\t\n\tprivate loadFields( fields: XiriTableField[] ) {\n\t\t\n\t\tthis.displayedColumns = [];\n\t\tthis.columnsToDisplay = [];\n\t\tthis.columnsToSearch = [];\n\t\tthis.extraHeaderFields = [];\n\t\tthis.extraHeaders = [];\n\t\t\n\t\tif ( this.showSelectColumn )\n\t\t\tthis.columnsToDisplay.push( 'select' );\n\t\t\n\t\tfor ( let fid = 0; fid != fields.length; fid++ ) {\n\t\t\tconst column = fields[ fid ];\n\t\t\t\n\t\t\tif ( column.format == 'header' ) {\n\t\t\t\tthis.extraHeaderFields.push( column );\n\t\t\t\tthis.extraHeaders.push( column.id );\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif ( column.id === undefined )\n\t\t\t\tcolumn.id = '' + fid;\n\t\t\tif ( column.format == 'id' )\n\t\t\t\tcontinue;\n\t\t\tif ( !column.display )\n\t\t\t\tcolumn.display = '';\n\t\t\tif ( column.format )\n\t\t\t\tcolumn.display = column.format + ' ' + column.display;\n\t\t\tif ( column.align )\n\t\t\t\tcolumn.display += ` align-${ column.align }`;\n\t\t\t\n\t\t\tcolumn.sort = column.sort === undefined ? true : column.sort;\n\t\t\tcolumn.search = column.search === undefined ? true : column.search;\n\t\t\tcolumn.sticky = column.sticky === undefined ? false : column.sticky;\n\t\t\tcolumn.hide = column.hide === undefined ? false : column.hide;\n\t\t\t\n\t\t\tif ( !column.hide ) {\n\t\t\t\tthis.displayedColumns.push( column );\n\t\t\t\tthis.columnsToDisplay.push( column.id );\n\t\t\t}\n\t\t\t\n\t\t\tif ( column.search )\n\t\t\t\tthis.columnsToSearch.push( column.id );\n\t\t}\n\t}\n\t\n\tprivate setData( data: XiriTableRow[] ): void {\n\n\t\tthis._alldata.set( data );\n\n\t\tif ( this._firstData ) {\n\t\t\tthis._firstData = false;\n\n\t\t\tconst stateKey = this.tableStateKey();\n\t\t\tif ( this.options.saveState && stateKey ) {\n\t\t\t\tconst saved = this.sessionStorageService.getTimeout( stateKey, 3600 ) as XiriTableSavedState | null;\n\t\t\t\tif ( !saved )\n\t\t\t\t\treturn;\n\n\t\t\t\tif ( saved.filter !== undefined ) {\n\t\t\t\t\tthis.searchText = saved.filter;\n\t\t\t\t\tthis.searchTextInit = saved.filter;\n\t\t\t\t}\n\t\t\t\tif ( saved.sort !== undefined && saved.sortDirection !== undefined )\n\t\t\t\t\tthis.sort().sort( ( { id: saved.sort, start: saved.sortDirection } ) as MatSortable );\n\t\t\t\tif ( saved.pageSize !== undefined && saved.pageIndex !== undefined ) {\n\t\t\t\t\tthis.paginator().pageIndex = saved.pageIndex;\n\t\t\t\t\tthis.paginator()._changePageSize( saved.pageSize );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setFooter( footer: Record<string, XiriTableCellValue> ): void {\n\t\tthis.footer = footer;\n\n\t\tthis.displayedColumns.forEach( ( column: XiriTableField ) => {\n\t\t\tconst value = this.footer[ column.id ];\n\t\t\tif ( Array.isArray( value ) )\n\t\t\t\tthis.footer[ column.id ] = value[ 0 ];\n\t\t} );\n\t}\n\t\n\treload(): void {\n\t\tif ( this.loading() )\n\t\t\treturn;\n\n\t\tthis.loading.set( true );\n\t\tthis.loadData();\n\t}\n\n\t// Schedules the next auto-refresh reload and (re)starts the 1s countdown ticker.\n\tprivate scheduleAutoRefresh( intervalMs: number ): void {\n\t\tthis.cancelAutoRefreshTimers();\n\t\tconst now = Date.now();\n\t\tthis.autoRefresh.set( { intervalMs, nextAt: now + intervalMs } );\n\t\tthis._now.set( now );\n\t\tthis.autoRefreshTimer = setTimeout( () => {\n\t\t\tthis.autoRefreshTimer = undefined;\n\t\t\tthis.reload();\n\t\t}, intervalMs );\n\t\tthis.countdownTimer = setInterval( () => {\n\t\t\tthis._now.set( Date.now() );\n\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t}, 1000 );\n\t}\n\n\t// Clears pending timers without touching the indicator (used while a load is in flight).\n\tprivate cancelAutoRefreshTimers(): void {\n\t\tif ( this.autoRefreshTimer ) {\n\t\t\tclearTimeout( this.autoRefreshTimer );\n\t\t\tthis.autoRefreshTimer = undefined;\n\t\t}\n\t\tif ( this.countdownTimer ) {\n\t\t\tclearInterval( this.countdownTimer );\n\t\t\tthis.countdownTimer = undefined;\n\t\t}\n\t}\n\n\t// Fully stops auto-refresh and hides the indicator.\n\tprivate clearAutoRefresh(): void {\n\t\tthis.cancelAutoRefreshTimers();\n\t\tthis.autoRefresh.set( null );\n\t}\n\t\n\tsearchDo( $event: string ) {\n\t\tthis.searchText = $event.trim().toLowerCase();\n\n\t\tif ( this.options.serverSide ) {\n\t\t\tthis.paginator().firstPage();\n\t\t\tthis.reload();\n\t\t} else if ( this.tree.enabled ) {\n\t\t\tthis.refreshTree();\n\t\t\tif ( this.dataSource.paginator )\n\t\t\t\tthis.dataSource.paginator.firstPage();\n\t\t} else {\n\t\t\tthis.dataSource.filter = this.searchText;\n\t\t\tif ( this.dataSource.paginator ) {\n\t\t\t\tthis.dataSource.paginator.firstPage();\n\t\t\t}\n\t\t}\n\t}\n\n\t// ============================================================================\n\t// Tree mode (only active when settings.tree / options.tree is set)\n\t// ============================================================================\n\n\tget treeEnabled(): boolean { return this.tree.enabled; }\n\tget treeColumnId(): string { return this.tree.treeColumn; }\n\tget treeShowCounts(): boolean { return this.tree.showCounts; }\n\tget treeHasAddSub(): boolean { return this.tree.hasAddSub; }\n\ttreeCanAddSub( row: XiriTableRow ): boolean { return this.tree.canAddSub( row ); }\n\n\t/** Recomputes the visible rows from the tree (respecting the active search), into the data source. */\n\tprivate refreshTree(): void {\n\t\tconst term = this.searchText;\n\t\tconst matcher = term ? ( row: XiriTableRow ) => this.rowMatches( row, term ) : null;\n\t\tthis.dataSource.data = this.tree.applySearch( matcher );\n\t}\n\n\tprivate rowMatches( row: XiriTableRow, term: string ): boolean {\n\t\tlet dataStr = '';\n\t\tfor ( const key of this.columnsToSearch )\n\t\t\tdataStr += row[ key ] + '◬';\n\t\treturn dataStr.toLowerCase().indexOf( term ) !== -1;\n\t}\n\n\ttoggleNode( event: MouseEvent, row: XiriTableRow ): void {\n\t\tevent.stopPropagation();\n\t\tthis.tree.toggle( row );\n\t\tthis.refreshTree();\n\t}\n\n\texpandAllNodes(): void {\n\t\tthis.tree.expandAll();\n\t\tthis.refreshTree();\n\t}\n\n\tcollapseAllNodes(): void {\n\t\tthis.tree.collapseAll();\n\t\tthis.refreshTree();\n\t}\n\n\taddSub( event: MouseEvent, row: XiriTableRow ): void {\n\t\tevent.stopPropagation();\n\t\tconst cfg = this.tree.settings;\n\t\tif ( cfg?.addSubHandler ) {\n\t\t\tcfg.addSubHandler( row );\n\t\t\treturn;\n\t\t}\n\t\tconst url = this.tree.addSubUrlFor( row );\n\t\tif ( url )\n\t\t\tthis.router.navigateByUrl( url );\n\t}\n\t\n\t// A row is selectable unless the backend opted it out (select: false) or it has no id.\n\t// Every selection payload carries ids only, so an id-less row could never be acted on —\n\t// letting it into the selection would make bulkCount() and the confirmation prompt count\n\t// rows the backend never receives.\n\tisSelectable( row: XiriTableRow ): boolean {\n\t\treturn row.select !== false && row[ 'id' ] !== undefined && row[ 'id' ] !== null;\n\t}\n\n\tisAllSelected() {\n\t\tlet found = 0;\n\t\tthis._displayeddata.forEach( row => {\n\t\t\tif ( this.isSelectable( row ) ) {\n\t\t\t\tif ( !this.selection.isSelected( row ) )\n\t\t\t\t\tfound++;\n\t\t\t}\n\t\t} );\n\t\treturn found === 0;\n\t}\n\n\tmasterToggle() {\n\t\tthis.bulkAllResults.set( false );\n\t\tif ( this.isAllSelected() ) {\n\t\t\tthis.selection.clear();\n\t\t} else {\n\t\t\tthis._displayeddata.forEach( row => {\n\t\t\t\tif ( this.isSelectable( row ) )\n\t\t\t\t\tthis.selection.select( row );\n\t\t\t} );\n\t\t}\n\t}\n\n\t// Toggles a single row and drops the \"all results\" mode: an individual change means the\n\t// user is now working with an explicit per-row selection again, not the whole filter.\n\ttoggleRow( row: XiriTableRow ) {\n\t\tif ( !this.isSelectable( row ) )\n\t\t\treturn;\n\t\tthis.bulkAllResults.set( false );\n\t\tthis.selection.toggle( row );\n\t}\n\n\t// ============================================================================\n\t// UX-007 Bulk actions\n\t// ============================================================================\n\n\tget bulkActionsEnabled(): boolean {\n\t\treturn ( this.options.bulkActions?.length ?? 0 ) > 0;\n\t}\n\n\t// The selection column is shown for legacy select mode OR when bulk actions are configured.\n\tget showSelectColumn(): boolean {\n\t\treturn !!this.options.select || this.bulkActionsEnabled;\n\t}\n\n\t// The sticky context bar is only meaningful in bulk mode and only once something is selected.\n\tget bulkBarActive(): boolean {\n\t\treturn this.bulkActionsEnabled && this.selection.hasValue();\n\t}\n\n\t// Exact total number of results behind the current filter (all pages), NOT just the page:\n\t// the server-side totalCount when known, otherwise every filtered client-side row.\n\tbulkTotalCount(): number {\n\t\treturn this.options.serverSide ? this._totalCount() : this.dataSource.filteredData.length;\n\t}\n\n\t// The count the triggered action operates on: the whole filtered result in \"all results\"\n\t// mode, otherwise the explicitly selected rows on the current page.\n\tbulkCount(): number {\n\t\treturn this.bulkAllResults() ? this.bulkTotalCount() : this.selection.selected.length;\n\t}\n\n\t// Offer \"select all results\" only when the current page is fully selected and there are\n\t// genuinely more results behind the filter than are selected right now.\n\tcanSelectAllResults(): boolean {\n\t\treturn !!this.options.selectAllResults\n\t\t\t&& !this.bulkAllResults()\n\t\t\t&& this.selection.hasValue()\n\t\t\t&& this.isAllSelected()\n\t\t\t&& this.bulkTotalCount() > this.selection.selected.length;\n\t}\n\n\tselectAllResults(): void {\n\t\tthis.bulkAllResults.set( true );\n\t}\n\n\tcancelBulk(): void {\n\t\tthis.selection.clear();\n\t\tthis.bulkAllResults.set( false );\n\t}\n\n\t// Dispatches a bulk action. The payload always carries the selected ids, the selection\n\t// mode (page vs. all results) and the exact count; in \"all results\" mode it additionally\n\t// carries the active filter so the backend acts on the whole result set, never silently\n\t// on just the current page. Destructive actions (color 'warn') confirm with the exact count.\n\tbulkAction( event: MouseEvent, button: XiriButton ): void {\n\t\tevent.stopPropagation();\n\t\tif ( this.selection.isEmpty() )\n\t\t\treturn;\n\n\t\tconst allResults = this.bulkAllResults();\n\t\tconst count = this.bulkCount();\n\n\t\tif ( button.color === 'warn' ) {\n\t\t\tconst label = button.text || 'Aktion ausführen';\n\t\t\tif ( !confirm( `${ label }: ${ count } ${ count === 1 ? 'Eintrag' : 'Einträge' }? Dies kann nicht rückgängig gemacht werden.` ) )\n\t\t\t\treturn;\n\t\t}\n\n\t\tconst payload: Record<string, unknown> = {\n\t\t\tids: this.getSelectionIDs(),\n\t\t\tmode: allResults ? 'allResults' : 'page',\n\t\t\tcount: count,\n\t\t};\n\t\tif ( allResults )\n\t\t\tpayload.filter = this._filterData() ?? null;\n\n\t\tswitch ( button.action ) {\n\t\t\tcase 'dialog': {\n\t\t\t\tconst data: XiriTableDialogData = { ...button, type: 'data', data: payload };\n\t\t\t\tthis.dialogRef = this.dialog.open( XiriDialogComponent, { data } );\n\t\t\t\tthis.dialogRef.afterClosed().subscribe( ( result ) => {\n\t\t\t\t\tthis.clearBulk();\n\t\t\t\t\tthis.callReturn( result );\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'download': {\n\t\t\t\t// Before the request — openTab() needs the click's user activation.\n\t\t\t\tconst tab = button.target === '_blank' ? this.downloadService.openTab() : null;\n\t\t\t\tthis.dataService.postFileResponse( button.url ?? '', payload ).pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\t\t\tnext: ( result ) => this.downloadService.download( result, button.filename || 'download.csv', tab ),\n\t\t\t\t\terror: ( err: unknown ) => {\n\t\t\t\t\t\ttab?.close();\n\t\t\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Download Error' );\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthis.dataService.post( button.url ?? '', payload ).pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\t\t\tnext: ( result: unknown ) => {\n\t\t\t\t\t\tthis.clearBulk();\n\t\t\t\t\t\tthis.callReturn( result );\n\t\t\t\t\t},\n\t\t\t\t\terror: ( err: unknown ) => this.snackbar.error( errorMessage( err ) || 'Unknown Error' ),\n\t\t\t\t} );\n\t\t}\n\t}\n\n\tprivate clearBulk(): void {\n\t\tthis.selection.clear();\n\t\tthis.bulkAllResults.set( false );\n\t}\n\n\tclicked( row: XiriTableRow ) {\n\t\tthis.clickedRow.emit( row );\n\t}\n\n\topenDialog( event: MouseEvent, button: XiriButton, id: string, subid: number, row: XiriTableRow ) {\n\n\t\tevent.stopPropagation();\n\t\tconst data: XiriTableDialogData = { ...button, type: 'load' };\n\t\tdata.url = ( row[ id ] as XiriTableCellValue[] )[ subid ] as string;\n\n\t\tthis.startDialog( data );\n\t}\n\n\topenMenuDialog( event: MouseEvent, item: NonNullable<XiriButton['menuItems']>[number], columnId: string, buttonIndex: number, menuItemIndex: number, row: XiriTableRow ) {\n\t\tevent.stopPropagation();\n\t\tconst data: XiriTableDialogData = { ...item, type: 'load' } as XiriTableDialogData;\n\t\tconst cell = ( ( row[ columnId ] as XiriTableCellValue[] )[ buttonIndex ] as XiriTableCellValue[] )[ menuItemIndex ];\n\t\tdata.url = cell as string;\n\t\tthis.startDialog( data );\n\t}\n\n\topenDialogSelection( event: MouseEvent, button: XiriButton ) {\n\n\t\tevent.stopPropagation();\n\t\tif ( this.selection.isEmpty() )\n\t\t\treturn true;\n\n\t\tconst data: XiriTableDialogData = { ...button, type: 'data' };\n\t\tdata.data = this.getSelectionIDs();\n\n\t\tthis.startDialog( data );\n\t\treturn true;\n\t}\n\n\tprivate startDialog( data: XiriTableDialogData ) {\n\t\t\n\t\tthis.dialogRef = this.dialog.open( XiriDialogComponent, {\n\t\t\tdata: data,\n\t\t} );\n\t\t\n\t\tthis.dialogRef.afterClosed().subscribe( {\n\t\t\t next: ( result ) => this.callReturn( result )\n\t\t } );\n\t}\n\t\n\tapiCall( event: MouseEvent, url: string ) {\n\t\tevent.stopPropagation();\n\t\tthis.makeApiCall( this.dataService.get( url ) );\n\t}\n\t\n\tapiCallSelection( event: MouseEvent, button: XiriButton ) {\n\t\tevent.stopPropagation();\n\t\tif ( this.selection.isEmpty() )\n\t\t\treturn;\n\t\t\n\t\tconst data = { data: this.getSelectionIDs() };\n\t\t\n\t\tthis.makeApiCall( this.dataService.post( button.url ? button.url : '', data ) );\n\t}\n\t\n\tsaveCall( event: MouseEvent, button: XiriButton, row: XiriTableRow, url: string ) {\n\t\tevent.stopPropagation();\n\n\t\tif ( !this.saveCallCheck( button, row ) )\n\t\t\treturn;\n\n\t\tconst data: Record<string, XiriTableCellValue> = {};\n\t\tconst send = button.send ?? [];\n\t\tfor ( let i = 0; i != send.length; i++ ) {\n\t\t\tconst k = send[ i ];\n\t\t\tdata[ k ] = row[ k ] as XiriTableCellValue;\n\t\t}\n\n\t\tthis.dataService.post( url, data ).pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\tnext: ( result: unknown ) => this.callReturn( result ),\n\t\t\terror: ( err: unknown ) => {\n\t\t\t\tconsole.log( \"table save error\", err );\n\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Unknown Error' );\n\t\t\t}\n\t\t} );\n\t}\n\n\tsaveCallCheck( button: XiriButton, row: XiriTableRow ): boolean {\n\n\t\tconst check = button.check ?? [];\n\t\tfor ( let i = 0; i != check.length; i++ ) {\n\t\t\tconst k = check[ i ];\n\n\t\t\tif ( row[ k ] === null || row[ k ] === undefined || row[ k ] === '' ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tdownloadSelection( event: MouseEvent, button: XiriButton ) {\n\t\tevent.stopPropagation();\n\t\tif ( this.selection.isEmpty() )\n\t\t\treturn;\n\n\t\tconst url = button.url ? button.url : '';\n\t\t// Before the request — openTab() needs the click's user activation.\n\t\tconst tab = button.target === '_blank' ? this.downloadService.openTab() : null;\n\t\tthis.dataService.postFileResponse( url, this.getSelectionIDs() ).pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\tnext: ( result ) => {\n\t\t\t\tthis.downloadService.download( result, 'download.csv', tab );\n\t\t\t},\n\t\t\terror: ( err: unknown ) => {\n\t\t\t\ttab?.close();\n\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Download Error' );\n\t\t\t}\n\t\t} );\n\t}\n\n\tprivate makeApiCall( apicall: Observable<unknown> ) {\n\n\t\tapicall.pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\tnext: ( result: unknown ) => this.callReturn( result ),\n\t\t\terror: ( err: unknown ) => {\n\t\t\t\tconsole.log( \"table api error\", err );\n\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Unknown Error' );\n\t\t\t}\n\t\t} );\n\t}\n\t\n\tpublic buttonReturn( event: XiriButtonResult ) {\n\t\t\n\t\tif ( !event.done )\n\t\t\treturn;\n\t\t\n\t\tthis.callReturn( event.result );\n\t}\n\t\n\tprivate callReturn( result: unknown ) {\n\t\tthis.responseHandler.handle( result, {\n\t\t\tonTableRefresh: () => this.reload(),\n\t\t\tonTableUpdate: ( id, field, content ) => {\n\t\t\t\tconst i = this.dataSource.data.findIndex( ( x: XiriTableRow ) => x.id === id );\n\t\t\t\tif ( i == -1 )\n\t\t\t\t\treturn;\n\t\t\t\tthis.dataSource.data[ i ][ field ] = content as XiriTableCellValue;\n\t\t\t\tthis.dataSource._updateChangeSubscription();\n\t\t\t}\n\t\t} );\n\t}\n\n\t// Row ids are backend values (int64 or string) and are passed through untouched.\n\t// Coercing them to number would round anything above 2^53 and turn a non-numeric\n\t// id into NaN; rows without an id are dropped rather than sent as undefined.\n\tprivate getSelectionIDs(): ( string | number )[] {\n\n\t\treturn this.selection.selected\n\t\t .map( ( item ) => item[ 'id' ] as string | number | undefined )\n\t\t .filter( ( id ): id is string | number => id !== undefined && id !== null );\n\t}\n\n\tstartInlineEdit( row: XiriTableRow, column: XiriTableField, skipSavingCheck = false ): void {\n\t\tthis.inlineEdit.start( row, column, skipSavingCheck );\n\t}\n\n\tcancelInlineEdit(): void {\n\t\tthis.inlineEdit.cancel();\n\t}\n\n\tsaveInlineEdit( row: XiriTableRow, column: XiriTableField ): void {\n\t\tthis.inlineEdit.save( row, column );\n\t}\n\n\tisEditing( row: XiriTableRow, fieldId: string ): boolean {\n\t\treturn this.inlineEdit.isEditing( row, fieldId );\n\t}\n\n\tisSaving( row: XiriTableRow, fieldId: string ): boolean {\n\t\treturn this.inlineEdit.isSaving( row, fieldId );\n\t}\n\n\tonInlineEditKeydown( event: KeyboardEvent, row: XiriTableRow, column: XiriTableField ): void {\n\t\tthis.inlineEdit.onKeydown( event, row, column );\n\t}\n\n\tgetEditableOptions( column: XiriTableField ): { value: string; label: string; color?: string }[] {\n\t\treturn this.inlineEdit.getOptions( column );\n\t}\n\n\tonChipsSelectionChange( row: XiriTableRow, column: XiriTableField, selectedValues: string[] ): void {\n\t\tthis.inlineEdit.onChipsChange( row, column, selectedValues );\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.reloadAbort$.next();\n\t\tthis.reloadAbort$.complete();\n\t\tthis.clearAutoRefresh();\n\t\tif ( this.dialogRef )\n\t\t\tthis.dialogRef.close( null );\n\t}\n\t\n\tpublic pasteInput( $event: ClipboardEvent, row: XiriTableRow, column: XiriTableField ) {\n\n\t\tif ( column.inputPaste !== true )\n\t\t\treturn false;\n\n\t\t// Get the clipboard text\n\t\tconst clipboardText = $event.clipboardData!.getData( 'text' );\n\n\t\t// Split into rows, then each row into columns.\n\t\tconst clipRowsArray: string[][] = clipboardText.split( \"\\n\" ).map( line => line.split( \"\\t\" ) );\n\n\t\tif ( clipRowsArray.length < 2 ) {\n\t\t\tif ( clipRowsArray[ 0 ].length < 2 )\n\t\t\t\treturn null;\n\t\t}\n\n\t\tconst startRow = this.dataSource.data.findIndex( ( x: XiriTableRow ) => x.id === row.id );\n\t\tif ( startRow == -1 )\n\t\t\treturn false;\n\t\tconst startCol = this.displayedColumns.findIndex( ( x: XiriTableField ) => x.id === column.id );\n\t\tif ( startCol == -1 )\n\t\t\treturn false;\n\n\t\tfor ( let i = 0; i < clipRowsArray.length; i++ ) {\n\t\t\tconst curRow = i + startRow;\n\t\t\tif ( curRow >= this.dataSource.data.length )\n\t\t\t\tbreak;\n\n\t\t\tconst result = this.dataSource.data[ curRow ];\n\t\t\tfor ( let j = 0; j < clipRowsArray[ i ].length; j++ ) {\n\t\t\t\tconst curCol = j + startCol;\n\t\t\t\tif ( curCol >= this.displayedColumns.length )\n\t\t\t\t\tbreak;\n\n\t\t\t\tconst col = this.displayedColumns[ curCol ];\n\t\t\t\tresult[ col.id ] = clipRowsArray[ i ][ j ];\n\t\t\t}\n\t\t}\n\n\t\tthis.dataSource._updateChangeSubscription();\n\t\treturn false;\n\t}\n\t\n\tpublic saveInputData() {\n\t\t\n\t\t// this.loading.set( true );\n\t\tconst data = this.dataSource.data;\n\t\tif ( this.settings().url ) {\n\t\t\tthis._alldata.set( [] );\n\t\t\t// this.dataSource.data = [];\n\t\t\tthis.dataSource._updateChangeSubscription();\n\t\t}\n\t\tthis._changeDetectorRef.markForCheck();\n\t\t\n\t\tthis.dataService.post( this.options.saveInputUrl ?? '', data ).pipe( takeUntil( this.reloadAbort$ ) ).subscribe( {\n\t\t\tnext: ( result: unknown ) => {\n\t\t\t\tthis.callReturn( result );\n\t\t\t},\n\t\t\terror: ( err: unknown ) => {\n\t\t\t\tthis._alldata.set( data );\n\t\t\t\tthis.dataSource._updateChangeSubscription();\n\t\t\t\tconsole.log( \"table save error\", err );\n\t\t\t\tthis.snackbar.error( errorMessage( err ) || 'Unknown Error' );\n\t\t\t\tthis._changeDetectorRef.markForCheck();\n\t\t\t}\n\t\t} );\n\t}\n\n\tprivate getSortingDataAccessor(): ( data: XiriTableRow, sortHeaderId: string ) => string | number {\n\t\treturn ( data: XiriTableRow, sortHeaderId: string ): string | number => {\n\t\t\tconst column = this.displayedColumns.find( col => col.id === sortHeaderId );\n\t\t\tif ( column && column.format === 'number' )\n\t\t\t\treturn ( data[ sortHeaderId ] as XiriTableCellValue[] )[ 1 ] as number;\n\n\t\t\t// ponytail: sort by the first chip's label — without this MatTable compares the raw object\n\t\t\t// array, which coerces to \"[object Object],...\" and effectively sorts by chip count.\n\t\t\tif ( column && column.format === 'chips' )\n\t\t\t\treturn ( data[ sortHeaderId ] as XiriTagChip[] | null | undefined )?.[ 0 ]?.label ?? '';\n\n\t\t\treturn data[ sortHeaderId ] as string | number;\n\t\t};\n\t}\n}\n","<mat-card class=\"xiritablecard mat-mdc-elevation-specific mat-elevation-z3\">\n\t<div class=\"xiritable\" [class]=\"options.class\">\n\t\t<div class=\"table-full\">\n\t\t\t@if (bulkBarActive) {\n\t\t\t\t<div class=\"xiri-bulk-bar\" [class.sticky]=\"options.stickyBulkBar\" role=\"toolbar\"\n\t\t\t\t aria-label=\"Massenaktionen\" data-testid=\"table-bulk-bar\">\n\t\t\t\t\t<button mat-icon-button (click)=\"cancelBulk()\" matTooltip=\"Auswahl aufheben\"\n\t\t\t\t\t aria-label=\"Auswahl aufheben\">\n\t\t\t\t\t\t<mat-icon>close</mat-icon>\n\t\t\t\t\t</button>\n\t\t\t\t\t<span class=\"xiri-bulk-count\" aria-live=\"polite\" data-testid=\"table-bulk-count\">\n\t\t\t\t\t\t@if (bulkAllResults()) {\n\t\t\t\t\t\t\tAlle {{ bulkTotalCount() }} Ergebnisse ausgewählt\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t{{ selection.selected.length }} ausgewählt\n\t\t\t\t\t\t}\n\t\t\t\t\t</span>\n\t\t\t\t\t@if (canSelectAllResults()) {\n\t\t\t\t\t\t<button mat-button color=\"primary\" (click)=\"selectAllResults()\"\n\t\t\t\t\t\t data-testid=\"table-bulk-selectall\">\n\t\t\t\t\t\t\tAlle {{ bulkTotalCount() }} Ergebnisse auswählen\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t\t<span class=\"xiri-bulk-spacer\"></span>\n\t\t\t\t\t@for (button of options.bulkActions; track button) {\n\t\t\t\t\t\t@if (!button.hide) {\n\t\t\t\t\t\t\t<button mat-button [color]=\"button.color || 'primary'\"\n\t\t\t\t\t\t\t (click)=\"bulkAction($event, button)\"\n\t\t\t\t\t\t\t [matTooltip]=\"button.hint\" [matTooltipDisabled]=\"!button.hint\">\n\t\t\t\t\t\t\t\t@if (button.icon) {\n\t\t\t\t\t\t\t\t\t<mat-icon>{{ button.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t{{ button.text }}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t<div class=\"header\" [hidden]=\"bulkBarActive\">\n\t\t\t\t@if (options.reload) {\n\t\t\t\t\t<div class=\"buttons\">\n\t\t\t\t\t\t<button mat-icon-button (click)=\"reload()\" color=\"primary\" aria-label=\"Tabelle neu laden\">\n\t\t\t\t\t\t\t<mat-icon>autorenew</mat-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (autoRefresh()) {\n\t\t\t\t\t<div class=\"autorefresh-indicator\" role=\"status\" aria-live=\"polite\"\n\t\t\t\t\t matTooltip=\"Tabelle aktualisiert sich automatisch\">\n\t\t\t\t\t\t<mat-icon class=\"spin\">sync</mat-icon>\n\t\t\t\t\t\t<span>Auto-Refresh aktiv · nächste in {{ countdown() }}s</span>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (lastUpdated(); as updated) {\n\t\t\t\t\t<div class=\"lastupdated-indicator\" data-testid=\"table-last-updated\" role=\"status\" aria-live=\"polite\">\n\t\t\t\t\t\tStand {{ updated | date:'HH:mm' }}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (treeEnabled) {\n\t\t\t\t\t<div class=\"buttons xiri-tree-actions\">\n\t\t\t\t\t\t<button mat-icon-button (click)=\"expandAllNodes()\" color=\"primary\"\n\t\t\t\t\t\t matTooltip=\"Alle ausklappen\" aria-label=\"Alle ausklappen\">\n\t\t\t\t\t\t\t<mat-icon>unfold_more</mat-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button mat-icon-button (click)=\"collapseAllNodes()\" color=\"primary\"\n\t\t\t\t\t\t matTooltip=\"Alle einklappen\" aria-label=\"Alle einklappen\">\n\t\t\t\t\t\t\t<mat-icon>unfold_less</mat-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<div class=\"middle\" [class.hasButtons]=\"options.buttons\">{{ options.title }}</div>\n\t\t\t\t@if (options.buttons) {\n\t\t\t\t\t<xiri-buttonline [settings]=\"options.buttons\" (result)=\"buttonReturn($event)\"\n\t\t\t\t\t [filterData]=\"_filterData()\"></xiri-buttonline>\n\t\t\t\t}\n\t\t\t\t@if (options.search) {\n\t\t\t\t\t<xiri-search (changed)=\"searchDo($event)\" [placeholder]=\"''\" [text]=\"searchTextInit\"></xiri-search>\n\t\t\t\t}\n\t\t\t\t@if (options.saveInput) {\n\t\t\t\t\t<div class=\"buttons saveInput\">\n\t\t\t\t\t\t<button mat-raised-button (click)=\"saveInputData()\" color=\"primary\">\n\t\t\t\t\t\t\t{{ options.saveInput }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div class=\"tableout-wrap\">\n\t\t\t<div class=\"tableout\" [class.is-loading]=\"loading()\" [style.max-height]=\"options.scrollHeight || null\">\n\t\t\t\t<table mat-table [dataSource]=\"dataSource\" matSort [style.min-width]=\"options.minWidth ?? '100%'\"\n\t\t\t\t [class]=\"densityClass()\"\n\t\t\t\t [class.borders]=\"options.borders\" [class.bordersHeader]=\"options.bordersHeader\"\n\t\t\t\t [trackBy]=\"trackByRowId\">\n\n\t\t\t\t\t@for (column of displayedColumns; track column.id) {\n\t\t\t\t\t\t<ng-container [matColumnDef]=\"column.id\" [sticky]=\"column.sticky\">\n\t\t\t\t\t\t\t<th mat-header-cell *matHeaderCellDef mat-sort-header=\"{{ column.id }}\" [disabled]=\"!column.sort || !options.sort\" disableClear\n\t\t\t\t\t\t\t [style.width]=\"column.width\" [style.min-width]=\"column.minWidth\"\n\t\t\t\t\t\t\t [class]=\"column.display + ' ' + (column.header || '')\"> {{ column.name }}\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t@switch (column.format) {\n\t\t\t\t\t\t\t\t@case ('buttons') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t@for (button of column.buttons; track button; let i = $index) {\n\t\t\t\t\t\t\t\t\t\t\t@if (row[column.id][i] !== false && !button.hide) {\n\t\t\t\t\t\t\t\t\t\t\t\t@switch (button.action) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('link') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-button [button]=\"button\" [disabled]=\"false\" [url]=\"row[column.id][ i ]\"></xiri-button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('href') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-button [button]=\"button\" [disabled]=\"false\" [url]=\"row[column.id][ i ]\"></xiri-button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('download') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-button [button]=\"button\" [disabled]=\"false\" [url]=\"row[column.id][ i ]\"></xiri-button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('dialog') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-buttonstyle [button]=\"button\" [disabled]=\"false\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t (click)=\"openDialog( $event, button, column.id, i, row)\"></xiri-buttonstyle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('api') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-buttonstyle [button]=\"button\" [disabled]=\"false\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t (click)=\"apiCall( $event, row[column.id][ i ] )\"></xiri-buttonstyle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('save') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<xiri-buttonstyle [button]=\"button\" (click)=\"saveCall( $event, button, row, row[column.id][ i ] )\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [disabled]=\"!saveCallCheck( button, row )\"></xiri-buttonstyle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('icon') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"btnicon\" [class]=\"button.color || 'primary'\" [matTooltip]=\"button.hint\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!button.hint\">{{ button.icon }}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('menu') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button mat-icon-button [matMenuTriggerFor]=\"menuRef\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [class]=\"button.color || 'primary'\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [matTooltip]=\"button.hint\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!button.hint\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [attr.aria-label]=\"button.hint || button.text\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t (click)=\"$event.stopPropagation()\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon>{{ button.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-menu #menuRef=\"matMenu\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@for (item of button.menuItems; track item; let j = $index) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (row[column.id][i][j] !== false) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@switch (item.action) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('link') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@let menuUrl = row[column.id][i][j] | xiriUrl;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a mat-menu-item [routerLink]=\"menuUrl?.path\" [queryParams]=\"menuUrl?.queryParams\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('href') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a mat-menu-item [href]=\"row[column.id][i][j]\" target=\"_blank\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@case ('dialog') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button mat-menu-item (click)=\"openMenuDialog($event, item, column.id, i, j, row)\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ item.text }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-menu>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('icon') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t@if (column.icons?.[ $any(row[ column.id ]) ]; as icon) {\n\t\t\t\t\t\t\t\t\t\t\t<mat-icon [class]=\"icon[ 'color' ] || 'primary'\"\n\t\t\t\t\t\t\t\t\t\t\t [matTooltip]=\"icon[ 'hint' ] || '' \"\n\t\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!icon[ 'hint' ]\">{{ icon['icon'] }}\n\t\t\t\t\t\t\t\t\t\t\t</mat-icon>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('html') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [innerHtml]=\"row[column.id] | safeHtml\" [class]=\"column.display\"></td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('link') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\"\n\t\t\t\t\t\t\t\t\t [class.xiri-tree-td]=\"treeEnabled && column.id === treeColumnId\">\n\t\t\t\t\t\t\t\t\t\t@if (treeEnabled && column.id === treeColumnId) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"treePrefix; context: { $implicit: row }\"></ng-container>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (row[column.id + 'Link']) {\n\t\t\t\t\t\t\t\t\t\t\t@let cellUrl = row[column.id + 'Link'] | xiriUrl;\n\t\t\t\t\t\t\t\t\t\t\t<a [routerLink]=\"cellUrl?.path\" [queryParams]=\"cellUrl?.queryParams\" class=\"tablelink\">{{ row[column.id] }}</a>\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t<span>{{ row[column.id] }}</span>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (treeEnabled && column.id === treeColumnId) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"treeSuffix; context: { $implicit: row }\"></ng-container>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('input') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t<mat-form-field subscriptSizing=\"dynamic\">\n\t\t\t\t\t\t\t\t\t\t\t<input matInput\n\t\t\t\t\t\t\t\t\t\t\t [type]=\"column.inputType || 'text'\"\n\t\t\t\t\t\t\t\t\t\t\t [(ngModel)]=\"row[ column.id ]\"\n\t\t\t\t\t\t\t\t\t\t\t [lang]=\"column.inputLang || ''\"\n\t\t\t\t\t\t\t\t\t\t\t [required]=\"column.inputRequired || true\"\n\t\t\t\t\t\t\t\t\t\t\t (paste)=\"pasteInput( $event, row, column )\">\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('text2') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t<div>{{ row[column.id][0] }}</div>\n\t\t\t\t\t\t\t\t\t\t<div>{{ row[column.id][1] }}</div>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('textn') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t@for (line of row[column.id]; track $index) {\n\t\t\t\t\t\t\t\t\t\t\t<div>{{ line }}</div>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('number') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t{{ column.textPrefix }}{{ row[column.id][0] }}{{ column.textSuffix }}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@case ('chips') {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t\t@if (isSaving(row, column.id)) {\n\t\t\t\t\t\t\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t\t\t\t\t\t} @else if (column.editable && options.editUrl && isEditing(row, column.id)) {\n\t\t\t\t\t\t\t\t\t\t\t@if (editableOptionsLoading()) {\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-form-field class=\"xiri-inline-edit\" subscriptSizing=\"dynamic\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-select multiple\n\t\t\t\t\t\t\t\t\t\t\t\t\t [ngModel]=\"editingChipsValues()\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (selectionChange)=\"onChipsSelectionChange(row, column, $event.value)\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (keydown)=\"onInlineEditKeydown($event, row, column)\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (openedChange)=\"!$event && saveInlineEdit(row, column)\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (column.editableOptionsSearch || column.editableSearchUrl) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ngx-mat-select-search [formControl]=\"inlineSearchControl\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t [searching]=\"inlineSearching()\"></ngx-mat-select-search>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@for (opt of getEditableOptions(column); track opt.value) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t} @else if (column.editable && options.editUrl) {\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"xiri-editable-cell\" role=\"button\" tabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t\t (click)=\"startInlineEdit(row, column); $event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t\t\t (keydown.enter)=\"startInlineEdit(row, column); $event.stopPropagation()\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"xiri-chips-display\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t@for (chip of row[column.id]; track chip.label) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"xiri-chip-display\" [class]=\"chip.color || ''\">{{ chip.label }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"xiri-edit-icon\">edit</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"xiri-chips-display\">\n\t\t\t\t\t\t\t\t\t\t\t\t@for (chip of row[column.id]; track chip.label) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"xiri-chip-display\" [class]=\"chip.color || ''\">{{ chip.label }}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t@default {\n\t\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\" [class]=\"column.display\"\n\t\t\t\t\t\t\t\t\t [class.xiri-tree-td]=\"treeEnabled && column.id === treeColumnId\">\n\t\t\t\t\t\t\t\t\t\t@if (treeEnabled && column.id === treeColumnId) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"treePrefix; context: { $implicit: row }\"></ng-container>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (isSaving(row, column.id)) {\n\t\t\t\t\t\t\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t\t\t\t\t\t} @else if (column.editable && options.editUrl && isEditing(row, column.id)) {\n\t\t\t\t\t\t\t\t\t\t\t@if (column.editableOptions || column.editableOptionsUrl || column.editableSearchUrl) {\n\t\t\t\t\t\t\t\t\t\t\t\t@if (editableOptionsLoading()) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-spinner diameter=\"20\"></mat-spinner>\n\t\t\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-form-field class=\"xiri-inline-edit\" subscriptSizing=\"dynamic\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-select [(ngModel)]=\"row[column.id]\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t (keydown)=\"onInlineEditKeydown($event, row, column)\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t (openedChange)=\"!$event && saveInlineEdit(row, column)\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@if (column.editableOptionsSearch || column.editableSearchUrl) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ngx-mat-select-search [formControl]=\"inlineSearchControl\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t [searching]=\"inlineSearching()\"></ngx-mat-select-search>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@for (opt of getEditableOptions(column); track opt.value) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-option [value]=\"opt.value\">{{ opt.label }}</mat-option>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-select>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-form-field class=\"xiri-inline-edit\" subscriptSizing=\"dynamic\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input matInput\n\t\t\t\t\t\t\t\t\t\t\t\t\t [(ngModel)]=\"row[column.id]\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (blur)=\"saveInlineEdit(row, column)\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (keydown)=\"onInlineEditKeydown($event, row, column)\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button matSuffix mat-icon-button class=\"xiri-inline-edit-confirm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t (mousedown)=\"$event.preventDefault(); saveInlineEdit(row, column)\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t aria-label=\"Änderung speichern\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t tabindex=\"-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon>check</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-form-field>\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t} @else if (column.editable && options.editUrl) {\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"xiri-editable-cell\" role=\"button\" tabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t\t (click)=\"startInlineEdit(row, column); $event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t\t\t (keydown.enter)=\"startInlineEdit(row, column); $event.stopPropagation()\">\n\t\t\t\t\t\t\t\t\t\t\t\t{{ column.textPrefix }}{{ row[column.id] }}{{ column.textSuffix }}\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"xiri-edit-icon\">edit</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t\t{{ column.textPrefix }}{{ row[column.id] }}{{ column.textSuffix }}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t@if (treeEnabled && column.id === treeColumnId) {\n\t\t\t\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"treeSuffix; context: { $implicit: row }\"></ng-container>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t<td mat-footer-cell *matFooterCellDef [hidden]=\"!options.footer\"\n\t\t\t\t\t\t\t [style.width]=\"column.width\" [style.min-width]=\"column.minWidth\" class=\"bottomrow\"\n\t\t\t\t\t\t\t [class]=\"column.display\">\n\t\t\t\t\t\t\t\t\t@if ( footer[ column.id ] ) {\n\t\t\t\t\t\t\t\t\t\t{{ column.textPrefix }}{{ footer[ column.id ] }}{{ column.textSuffix }}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\t\t\t\t\t@if (showSelectColumn) {\n\t\t\t\t\t\t<ng-container matColumnDef=\"select\" [sticky]=\"true\">\n\t\t\t\t\t\t\t<th mat-header-cell *matHeaderCellDef [style.width]=\"'65px'\">\n\t\t\t\t\t\t\t\t<mat-checkbox (change)=\"$event ? masterToggle() : null\"\n\t\t\t\t\t\t\t\t [checked]=\"selection.hasValue() && isAllSelected()\"\n\t\t\t\t\t\t\t\t [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\">\n\t\t\t\t\t\t\t\t@if (isSelectable(row)) {\n\t\t\t\t\t\t\t\t\t<mat-checkbox\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"$event.stopPropagation()\"\n\t\t\t\t\t\t\t\t\t\t\t(change)=\"$event ? toggleRow(row) : null\"\n\t\t\t\t\t\t\t\t\t\t\t[checked]=\"selection.isSelected(row)\">\n\t\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td mat-footer-cell *matFooterCellDef [style.width]=\"'65px'\" class=\"bottomrow\" [hidden]=\"!options.footer\">\n\t\t\t\t\t\t\t\t<mat-checkbox (change)=\"$event ? masterToggle() : null\"\n\t\t\t\t\t\t\t\t [checked]=\"selection.hasValue() && isAllSelected()\"\n\t\t\t\t\t\t\t\t [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n\t\t\t\t\t\t\t\t</mat-checkbox>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t}\n\n\t\t\t\t\t@if (extraHeaderFields.length > 0) {\n\t\t\t\t\t\t@for (column of extraHeaderFields; track column.id) {\n\t\t\t\t\t\t\t<ng-container matColumnDef=\"{{ column.id }}\" [sticky]=\"column.sticky\">\n\t\t\t\t\t\t\t\t<th mat-header-cell *matHeaderCellDef [attr.colspan]=\"column.headerSpan\">{{ column.name }}</th>\n\t\t\t\t\t\t\t</ng-container>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<tr mat-header-row *matHeaderRowDef=\"extraHeaders; sticky: true\" [class.dense]=\"options.dense\"></tr>\n\t\t\t\t\t}\n\n\t\t\t\t\t<tr mat-header-row *matHeaderRowDef=\"columnsToDisplay; sticky: true\" [class.dense]=\"options.dense\"></tr>\n\t\t\t\t\t<tr mat-row *matRowDef=\"let row; columns: columnsToDisplay;\" (click)=\"clicked(row)\"\n\t\t\t\t\t [class.xiri-tree-dimmed]=\"treeEnabled && row._tree?.dimmed\"></tr>\n\t\t\t\t\t<tr mat-footer-row *matFooterRowDef=\"columnsToDisplay; sticky: true\" [hidden]=\"!options.footer\"></tr>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t\t<div class=\"loader\" [hidden]=\"!loading()\" [class.has-bottombar]=\"(options.select || options.pagination) && !options.footer\">\n\t\t\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t@if (!loading()) {\n\t\t\t\t@if (!errorMsg && dataSource.filteredData.length === 0) {\n\t\t\t\t\t@if (options.emptyState) {\n\t\t\t\t\t\t<xiri-empty-state [settings]=\"options.emptyState\"></xiri-empty-state>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<div class=\"nodata\">{{ options.textNoData }}</div>\n\t\t\t\t\t}\n\t\t\t\t} @else if (errorMsg) {\n\t\t\t\t\t<div class=\"alert alert-danger\">\n\t\t\t\t\t\t<span>{{ errorMsg }}</span>\n\t\t\t\t\t\t<button mat-button type=\"button\" data-testid=\"table-retry\" (click)=\"reload()\">\n\t\t\t\t\t\t\t<mat-icon>autorenew</mat-icon> Retry\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t<div class=\"xrow xsmall\" [class.bottomrow]=\"(options.select || options.pagination) && !options.footer\">\n\t\t\t\t@if (options.select) {\n\t\t\t\t\t<div class=\"xcol xcol-md-2 select-buttons\">\n\t\t\t\t\t\t@for (button of options.selectButtons; track button) {\n\t\t\t\t\t\t\t@if (!button.hide) {\n\t\t\t\t\t\t\t\t@switch (button.action) {\n\t\t\t\t\t\t\t\t\t@case ('dialog') {\n\t\t\t\t\t\t\t\t\t\t<button mat-icon-button\n\t\t\t\t\t\t\t\t\t\t (click)=\"openDialogSelection( $event, button )\"\n\t\t\t\t\t\t\t\t\t\t [disabled]=\"selection.isEmpty()\"\n\t\t\t\t\t\t\t\t\t\t [color]=\"button.color || 'primary'\"\n\t\t\t\t\t\t\t\t\t\t [matTooltip]=\"button.hint\"\n\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!button.hint\"\n\t\t\t\t\t\t\t\t\t\t [attr.aria-label]=\"button.hint || button.text\">\n\t\t\t\t\t\t\t\t\t\t\t<mat-icon>{{ button.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t@case ('api') {\n\t\t\t\t\t\t\t\t\t\t<button mat-icon-button\n\t\t\t\t\t\t\t\t\t\t (click)=\"apiCallSelection( $event, button )\"\n\t\t\t\t\t\t\t\t\t\t [disabled]=\"selection.isEmpty()\"\n\t\t\t\t\t\t\t\t\t\t [color]=\"button.color || 'primary'\"\n\t\t\t\t\t\t\t\t\t\t [matTooltip]=\"button.hint\"\n\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!button.hint\"\n\t\t\t\t\t\t\t\t\t\t [attr.aria-label]=\"button.hint || button.text\">\n\t\t\t\t\t\t\t\t\t\t\t<mat-icon>{{ button.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t@case ('download') {\n\t\t\t\t\t\t\t\t\t\t<button mat-icon-button\n\t\t\t\t\t\t\t\t\t\t (click)=\"downloadSelection( $event, button )\"\n\t\t\t\t\t\t\t\t\t\t [disabled]=\"selection.isEmpty()\"\n\t\t\t\t\t\t\t\t\t\t [color]=\"button.color || 'primary'\"\n\t\t\t\t\t\t\t\t\t\t [matTooltip]=\"button.hint\"\n\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!button.hint\"\n\t\t\t\t\t\t\t\t\t\t [attr.aria-label]=\"button.hint || button.text\">\n\t\t\t\t\t\t\t\t\t\t\t<mat-icon>{{ button.icon }}</mat-icon>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<div class=\"xcol xcol-right-md-10\">\n\t\t\t\t\t<mat-paginator [hidden]=\"!options.pagination\" [pageSizeOptions]=\"options.pageSizes || []\" showFirstLastButtons=\"true\"></mat-paginator>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</mat-card>\n\n@if (dynData.data) {\n\t<ng-container *ngTemplateOutlet=\"dyncomponent(); context: { $implicit: dynData }\"></ng-container>\n}\n\n<!-- Tree mode: indent + expand/collapse arrow rendered before the tree column's content -->\n<ng-template #treePrefix let-row>\n\t<span class=\"xiri-tree-prefix\" [style.padding-left.px]=\"(row._tree?.level || 0) * 24\">\n\t\t@if (row._tree?.hasChildren) {\n\t\t\t<button type=\"button\" class=\"xiri-tree-iconbtn xiri-tree-toggle\" (click)=\"toggleNode($event, row)\"\n\t\t\t tabindex=\"-1\" [attr.aria-label]=\"row._tree.expanded ? 'einklappen' : 'ausklappen'\">\n\t\t\t\t<mat-icon color=\"primary\">{{ row._tree.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n\t\t\t</button>\n\t\t} @else {\n\t\t\t<span class=\"xiri-tree-spacer\"></span>\n\t\t}\n\t</span>\n</ng-template>\n\n<!-- Tree mode: child-count badge (when collapsed) + optional \"+ sub\" button after the content -->\n<ng-template #treeSuffix let-row>\n\t@if (treeShowCounts && row._tree && !row._tree.expanded && row._tree.childCount > 0) {\n\t\t<span class=\"xiri-tree-count\">({{ row._tree.childCount }})</span>\n\t}\n\t@if (treeHasAddSub && treeCanAddSub(row)) {\n\t\t<button type=\"button\" class=\"xiri-tree-iconbtn xiri-tree-addsub\" (click)=\"addSub($event, row)\"\n\t\t tabindex=\"-1\" matTooltip=\"Sub-Eintrag hinzufügen\" aria-label=\"Sub-Eintrag hinzufügen\">\n\t\t\t<mat-icon color=\"primary\">add</mat-icon>\n\t\t</button>\n\t}\n</ng-template>\n","import { inject, Injectable } from '@angular/core';\nimport { XiriDataService } from './data.service';\nimport { Router } from \"@angular/router\";\nimport { XiriButton } from \"../button/button.component\";\nimport { XiriFormField } from \"../formfields/field.interface\";\nimport { catchError, map, Observable, throwError, timer } from \"rxjs\";\nimport { HttpErrorResponse } from \"@angular/common/http\";\nimport { XiriSessionStorageService } from \"./sessionStorage.service\";\nimport { parseHttpError } from './error.util';\n\n\nexport interface XiriFormServiceReturn {\n\turl?: string\n\tfields?: XiriFormField[]\n\tbuttons?: XiriButton[]\n\tdone?: boolean\n\tgoto?: string\n\tmodel?: object\n\textra?: object\n\n\t// dialog\n\ttype?: string\n\theader?: string\n\ttime?: number\n}\n\nexport interface XiriFormServiceData {\n\turl: string\n\tfields?: XiriFormField[]\n\tbuttons?: XiriButton[]\n\textra?: object\n\tdone?: Observable<void>\n\n\t// dialog\n\ttype?: string // form, data\n\theader?: string\n\ttime?: number\n}\n\nexport interface XiriFormServiceError {\n\terror: string\n}\n\n@Injectable( {\n\tprovidedIn: 'root',\n} )\nexport class XiriFormService {\n\n\tprivate dataService: XiriDataService = inject( XiriDataService );\n\tprivate router: Router = inject( Router );\n\tprivate sessionStorageService: XiriSessionStorageService = inject( XiriSessionStorageService );\n\t\n\t\n\tpublic get( url: string, data?: object | null, extra?: object ): Observable<XiriFormServiceData> {\n\n\t\tconst req: Observable<XiriFormServiceReturn> = data === null\n\t\t\t? this.dataService.get( url ) as Observable<XiriFormServiceReturn>\n\t\t\t: this.dataService.post( url, { ...data, ...extra } ) as Observable<XiriFormServiceReturn>;\n\n\t\treturn req.pipe(\n\t\t\tmap( res => this.parse( res ) ),\n\t\t\tcatchError( ( err: HttpErrorResponse ): Observable<never> => {\n\t\t\t\treturn throwError( () => ({\n\t\t\t\t\terror: parseHttpError( err )\n\t\t\t\t} as XiriFormServiceError) );\n\t\t\t} )\n\t\t);\n\t}\n\n\tpublic parse( res: XiriFormServiceReturn ): XiriFormServiceData {\n\n\t\tif ( res.buttons ) {\n\t\t\tconst fields: XiriFormField[] = [];\n\t\t\tconst model = ( res.model || {} ) as Record<string, unknown>;\n\t\t\tconst type = res.type ? res.type : 'form';\n\n\t\t\tif ( type == 'form' ) {\n\t\t\t\tres.fields?.forEach( ( field: XiriFormField ) => {\n\t\t\t\t\tif ( field.hide == true )\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif ( model[ field.id ] !== undefined )\n\t\t\t\t\t\tfield.value = model[ field.id ];\n\n\t\t\t\t\tfields.push( field );\n\t\t\t\t} );\n\t\t\t} else if ( type == 'question' ) {\n\t\t\t\tconst obj = res.fields as unknown as XiriFormField;\n\t\t\t\tobj.type = 'question';\n\t\t\t\tfields.push( obj );\n\t\t\t} else if ( type == 'waiting' ) {\n\t\t\t\tconst obj = res.fields as unknown as XiriFormField & { text?: string };\n\t\t\t\tobj.type = 'waiting';\n\t\t\t\tobj.done = false;\n\t\t\t\tobj.value = obj.text;\n\t\t\t\tfields.push( obj );\n\t\t\t} else {\n\t\t\t\tconsole.log( 'XiriFormService unknown form type', type );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\turl: res.url,\n\t\t\t\tbuttons: res.buttons,\n\t\t\t\textra: res.extra || {},\n\t\t\t\tfields: fields,\n\n\t\t\t\ttype: type,\n\t\t\t\ttime: res.time || 2000,\n\t\t\t} as XiriFormServiceData;\n\n\t\t} else if ( res.goto ) {\n\t\t\treturn {\n\t\t\t\tdone: timer( res.done ? 1000 : 0 ).pipe( map( () => {\n\t\t\t\t\tthis.router.navigate( [res.goto] ).then();\n\t\t\t\t} ) )\n\t\t\t} as XiriFormServiceData;\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdone: timer( res.done ? 1000 : 0 ).pipe( map( () => {\n\t\t\t\t\t/* intentionally empty */\n\t\t\t\t} ) )\n\t\t\t} as XiriFormServiceData;\n\t\t}\n\t}\n\t\n\tpublic loadState( saveStateId: string|null|undefined, fields: XiriFormField[] ): XiriFormField[] {\n\t\t\n\t\tif ( !saveStateId )\n\t\t\treturn fields;\n\t\t\n\t\tconst data = this.sessionStorageService.getTimeout( saveStateId, 3600 ) as Record<string, unknown> | null;\n\t\tif ( !data )\n\t\t\treturn fields;\n\n\t\tfor ( const field of fields ) {\n\n\t\t\tif ( data[ field.id ] === undefined )\n\t\t\t\tcontinue;\n\n\t\t\tconst value = data[ field.id ];\n\n\t\t\tswitch ( field.type ) {\n\t\t\t\tcase 'bool':\n\t\t\t\t\tfield.value = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'select':\n\t\t\t\tcase 'object':\n\t\t\t\tcase 'model':\n\t\t\t\t\tif ( !field.list )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tfor ( const item of field.list ) {\n\t\t\t\t\t\tif ( item.id == value ) {\n\t\t\t\t\t\t\tfield.value = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'date':\n\t\t\t\t\tif ( field.min && field.min > ( value as number ) )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif ( field.max && field.max < ( value as number ) )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tfield.value = value;\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 'daterange':\n\t\t\t\tcase 'datetimerange':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn fields;\n\t}\n\t\n\tpublic saveState( saveStateId: string|null|undefined, values: unknown ): void {\n\t\t\n\t\tif ( !saveStateId )\n\t\t\treturn;\n\t\t\n\t\tthis.sessionStorageService.set( saveStateId, values );\n\t}\n}\n","import { Component, DestroyRef, inject, input, OnInit, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subject } from \"rxjs\";\nimport { UntypedFormGroup } from '@angular/forms';\nimport { Location } from '@angular/common';\nimport { XiriButton } from \"../button/button.component\";\nimport { XiriFormService, XiriFormServiceData, XiriFormServiceError } from \"../services/form.service\";\nimport { XiriButtonstyleComponent } from '../buttonstyle/buttonstyle.component';\nimport { XiriDoneComponent } from '../done/done.component';\nimport { XiriErrorComponent } from '../error/error.component';\nimport { XiriFormFieldsComponent } from '../formfields/form-fields.component';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { XiriFormField } from \"../formfields/field.interface\";\n\nexport interface XiriFormSettings {\n\tload?: boolean\n\turl: string\n\tfields?: XiriFormField[]\n\tbuttons?: XiriButton[]\n\theader?: string\n}\n\n@Component( {\n\t selector: 'xiri-form',\n\t templateUrl: './form.component.html',\n\t styleUrl: './form.component.scss',\n\t imports: [ CdkTrapFocus,\n\t MatProgressSpinner,\n\t XiriFormFieldsComponent,\n\t XiriErrorComponent,\n\t XiriDoneComponent,\n\t XiriButtonstyleComponent ]\n } )\nexport class XiriFormComponent implements OnInit {\n\n\tsettings = input.required<XiriFormSettings>();\n\n\tprivate location = inject( Location );\n\tprivate formService = inject( XiriFormService );\n\tprivate destroyRef = inject( DestroyRef );\n\n\tpublic formFields = signal<XiriFormField[] | null>( null );\n\tpublic loading = signal<boolean>( true );\n\tpublic loadingButton = signal<XiriButton | null>( null );\n\tpublic done = signal<boolean>( false );\n\tpublic error = signal<string>( '' );\n\n\tprivate url!: string;\n\tpublic buttons: XiriButton[] = [];\n\tprivate extra = {};\n\tprivate formValues: object | null | undefined = null;\n\tpublic formValid = true;\n\tpublic checkSubject: Subject<void> = new Subject<void>();\n\t\n\t\n\tngOnInit(): void {\n\t\t\n\t\tthis.url = this.settings().url;\n\t\t\n\t\tif ( this.settings().load ) {\n\t\t\tthis.send( null );\n\t\t} else\n\t\t\tthis.loadData( this.formService.parse( this.settings() ) );\n\t}\n\t\n\tprivate send( data: object | null | undefined ) {\n\t\t\n\t\tthis.loading.set( true );\n\t\tthis.error.set( '' );\n\t\t\n\t\tthis.formService.get( this.url, data, this.extra ).pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe(\n\t\t\t{\n\t\t\t\tnext: ( res: XiriFormServiceData ) => {\n\t\t\t\t\tthis.loadData( res );\n\t\t\t\t},\n\t\t\t\terror: ( err: XiriFormServiceError ) => {\n\t\t\t\t\tthis.loading.set( false );\n\t\t\t\t\tthis.loadingButton.set( null );\n\t\t\t\t\tthis.error.set( err.error ?? 'Unknown Error' );\n\t\t\t\t\t\n\t\t\t\t\tif ( this.buttons.length == 0 ) {\n\t\t\t\t\t\tthis.buttons = [ {\n\t\t\t\t\t\t\ttext: 'Close',\n\t\t\t\t\t\t\taction: 'close',\n\t\t\t\t\t\t\ttype: 'raised',\n\t\t\t\t\t\t} ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t}\n\n\tprivate loadData( res: XiriFormServiceData ): void {\n\t\t\n\t\tif ( res.buttons ) {\n\t\t\tif ( res.url )\n\t\t\t\tthis.url = res.url;\n\t\t\tthis.buttons = res.buttons;\n\t\t\tthis.extra = res.extra ?? {};\n\t\t\tthis.formFields.set( res.fields ?? null );\n\t\t} else if ( res.done ) {\n\t\t\tthis.done.set( true );\n\t\t\tthis.formFields.set( null );\n\t\t\tthis.buttons = [];\n\t\t\tres.done.pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe();\n\t\t}\n\t\t\n\t\tthis.loading.set( false );\n\t\tthis.loadingButton.set( null );\n\t}\n\t\n\tclickButton( button: XiriButton ): void {\n\n\t\tif ( button.action == 'back' )\n\t\t\tthis.location.back();\n\t\telse if ( button.action == 'get' ) {\n\t\t\tthis.url = button.url as string;\n\t\t\tthis.loadingButton.set( button );\n\t\t\tthis.startSend( null );\n\t\t} else if ( button.action == 'post' ) {\n\t\t\tthis.url = button.url as string;\n\t\t\tthis.loadingButton.set( button );\n\t\t\tthis.startSend( button.data );\n\t\t} else if ( button.action == 'debug' ) {\n\t\t\tthis.checkSubject.next();\n\t\t} else if ( button.action == 'simulate' ) {\n\t\t\tif ( this.formValid ) {\n\t\t\t\tthis.loadingButton.set( button );\n\t\t\t\tthis.loading.set( true );\n\t\t\t\tthis.error.set( '' );\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tthis.loadData( this.formService.parse( {\n\t\t\t\t\t\t done: true,\n\t\t\t\t\t } ) );\n\t\t\t\t}, 5000 );\n\t\t\t} else\n\t\t\t\tthis.checkSubject.next();\n\n\n\t\t} else {\n\t\t\tif ( this.loading() )\n\t\t\t\treturn;\n\n\t\t\tthis.loadingButton.set( button );\n\t\t\tthis.startSend( this.formValues );\n\t\t}\n\t}\n\t\n\tprivate startSend( data: object | null | undefined ): void {\n\t\t\n\t\tsetTimeout( () => {\n\t\t\tif ( this.formValid )\n\t\t\t\tthis.send( data );\n\t\t\telse\n\t\t\t\tthis.checkSubject.next();\n\t\t}, 10 );\n\t}\n\t\n\tpublic formChanged( event: UntypedFormGroup ) {\n\n\t\tthis.formValid = event.valid;\n\t\tthis.formValues = event.value;\n\t\t\n\t\t// data = { ...data, ...this.extra }\n\t\t// this.events.push( '' + this.formValid + ' => ' + JSON.stringify( event.value ) );\n\t}\n\t\n}\n","<div class=\"xrow\" cdkTrapFocus>\n\t<div class=\"xcol\">\n\t\t@if (loading() && formFields() === null) {\n\t\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t\t}\n\t\t@if (formFields() !== null) {\n\t\t\t<xiri-form-fields [form]=\"formFields()\" (formChange)=\"formChanged($event)\" [disabled]=\"loading()\"\n\t\t\t [check]=\"checkSubject.asObservable()\"></xiri-form-fields>\n\t\t}\n\t\t@if (error()) {\n\t\t\t<xiri-error class=\"error\" [text]=\"error()\"></xiri-error>\n\t\t}\n\t</div>\n\t@if (done()) {\n\t\t<div class=\"xcol done\">\n\t\t\t<xiri-done></xiri-done>\n\t\t</div>\n\t} @else {\n\t\t<div class=\"xcol formbtnline\">\n\t\t\t@for (button of buttons; track button) {\n\t\t\t\t@if (button.default) {\n\t\t\t\t\t<xiri-buttonstyle (click)=\"clickButton( button )\" [button]=\"button\" [disabled]=\"!formValid || loading()\" [loading]=\"loadingButton() === button\"></xiri-buttonstyle>\n\t\t\t\t} @else {\n\t\t\t\t\t<xiri-buttonstyle (click)=\"clickButton( button )\" [button]=\"button\" [disabled]=\"loading()\" [loading]=\"loadingButton() === button\"></xiri-buttonstyle>\n\t\t\t\t}\n\t\t\t}\n\t\t</div>\n\t}\n</div>\n","import { Subject, Observable } from 'rxjs';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\nexport class XiriSidepanelRef {\n\tprivate readonly closed$ = new Subject<unknown>();\n\n\tconstructor( private readonly overlayRef?: OverlayRef, private readonly previouslyFocused?: HTMLElement | null ) {\n\t}\n\n\tafterClosed(): Observable<unknown> {\n\t\treturn this.closed$.asObservable();\n\t}\n\n\tclose( result?: unknown ): void {\n\t\tthis.overlayRef?.dispose();\n\t\tthis.previouslyFocused?.focus?.();\n\t\tthis.closed$.next( result );\n\t\tthis.closed$.complete();\n\t}\n}\n","import { Component, computed, input } from '@angular/core';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { XiriColor } from '../types/color.type';\n\nexport interface XiriProgressSettings {\n\tlabel: string\n\tcurrent: number\n\ttotal: number\n\tvalue: number\n\tcolor?: XiriColor\n\tindeterminate?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-progress',\n\t templateUrl: './progress.component.html',\n\t styleUrl: './progress.component.scss',\n\t imports: [ MatProgressBar ]\n } )\nexport class XiriProgressComponent {\n\n\tsettings = input.required<XiriProgressSettings>();\n\n\tmode = computed<'determinate' | 'indeterminate'>(\n\t\t() => this.settings().indeterminate ? 'indeterminate' : 'determinate' );\n}\n","<div class=\"xiri-progress\">\n\t<div class=\"progress-head\">\n\t\t<span class=\"progress-label\">{{ settings().label }}</span>\n\t\t@if (!settings().indeterminate) {\n\t\t\t<span class=\"progress-count\">{{ settings().current }} / {{ settings().total }}</span>\n\t\t}\n\t</div>\n\t<mat-progress-bar [mode]=\"mode()\" [value]=\"settings().value\" [class]=\"settings().color || ''\"></mat-progress-bar>\n</div>\n","import { Component, computed, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatCard, MatCardContent } from '@angular/material/card';\nimport { RouterLink } from '@angular/router';\nimport { XiriColor } from '../types/color.type';\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\n\n\nexport interface XiriInfopointSettings {\n\ttext: string\n\tinfo: string\n\n\turl?: string\n\turlParams?: object\n\n\ticon: string\n\ticonSet?: string;\n\ticonColor: XiriColor\n\n\tdense?: boolean\n\tcompact?: boolean\n\thtml?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-infopoint',\n\t templateUrl: './infopoint.component.html',\n\t styleUrl: './infopoint.component.scss',\n\t imports: [ RouterLink, MatCard, MatCardContent, MatIcon, SafehtmlPipe ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriInfopointComponent {\n\n\tsettings = input.required<XiriInfopointSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n}\n","<div class=\"point\" [class.isLink]=\"settings().url\" [routerLink]=\"settings().url\" [queryParams]=\"settings().urlParams\">\n\t@if (compact()) {\n\t\t<div class=\"card xiri-infopoint-flat\" [class.dense]=\"settings().dense\">\n\t\t\t<div class=\"icon\" [class]=\"settings().iconColor\">\n\t\t\t\t@if (settings().iconSet) {\n\t\t\t\t\t<mat-icon [fontSet]=\"settings().iconSet!\">{{ settings().icon }}</mat-icon>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon>{{ settings().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div class=\"right\">\n\t\t\t\t@if (settings().text) {\n\t\t\t\t\t@if (settings().html) {\n\t\t\t\t\t\t<div class=\"text\" [innerHtml]=\"settings().text | safeHtml\"></div>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<div class=\"text\">{{ settings().text }}</div>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@if (settings().html) {\n\t\t\t\t\t<div class=\"info\" [innerHtml]=\"settings().info | safeHtml\"></div>\n\t\t\t\t} @else {\n\t\t\t\t\t<div class=\"info\">{{ settings().info }}</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t} @else {\n\t\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t\t<mat-card-content [class.dense]=\"settings().dense\">\n\t\t\t\t<div class=\"icon\" [class]=\"settings().iconColor\">\n\t\t\t\t\t@if (settings().iconSet) {\n\t\t\t\t\t\t<mat-icon [fontSet]=\"settings().iconSet!\">{{ settings().icon }}</mat-icon>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<mat-icon>{{ settings().icon }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"right\">\n\t\t\t\t\t@if (settings().text) {\n\t\t\t\t\t\t@if (settings().html) {\n\t\t\t\t\t\t\t<div class=\"text\" [innerHtml]=\"settings().text | safeHtml\"></div>\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t<div class=\"text\">{{ settings().text }}</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t@if (settings().html) {\n\t\t\t\t\t\t<div class=\"info\" [innerHtml]=\"settings().info | safeHtml\"></div>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<div class=\"info\">{{ settings().info }}</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</mat-card-content>\n\t\t</mat-card>\n\t}\n</div>\n","import { Component, DestroyRef, inject, input } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { XiriDataService } from \"../services/data.service\";\nimport { XiriColor } from '../types/color.type';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { RouterLink } from '@angular/router';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\nimport { MatCard, MatCardContent } from '@angular/material/card';\nimport {\n\tMatListItem,\n\tMatListItemIcon,\n\tMatListItemLine,\n\tMatListItemMeta,\n\tMatListItemTitle,\n\tMatListSubheaderCssMatStyler,\n\tMatNavList\n} from '@angular/material/list';\n\nexport interface XiriListSettings {\n\tsections: XiriListSection[];\n}\n\nexport interface XiriListSection {\n\tname: string;\n\tdata: XiriListItem[];\n}\n\nexport interface XiriListItem {\n\tname: string;\n\tinfo: string;\n\ticon: string;\n\ticonSet?: string;\n\ticonColor: XiriColor;\n\turl: string;\n\thasFavorite?: boolean;\n\tisFavorite?: boolean;\n\tfavoriteUrl?: string;\n\tfavoriteHint?: string;\n}\n\n@Component( {\n\t selector: 'xiri-list',\n\t templateUrl: './list.component.html',\n\t styleUrl: './list.component.scss',\n\t imports: [\n\t\t MatListSubheaderCssMatStyler,\n\t\t MatCard,\n\t\t MatCardContent,\n\t\t MatNavList,\n\t\t MatListItem,\n\t\t RouterLink,\n\t\t MatListItemIcon,\n\t\t MatIcon,\n\t\t MatListItemTitle,\n\t\t MatListItemLine,\n\t\t MatListItemMeta,\n\t\t MatIconButton,\n\t\t MatTooltip,\n\t\t XiriUrlPipe,\n\t ],\n } )\nexport class XiriListComponent {\n\n\tsettings = input.required<XiriListSettings>();\n\tprivate dataService = inject( XiriDataService );\n\tprivate destroyRef = inject( DestroyRef );\n\n\tchangeFavorite( item: XiriListItem, event: Event ) {\n\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\n\t\tconst url = item.favoriteUrl + ( item.isFavorite ? '0' : '1' );\n\t\tthis.dataService.get( url ).pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe();\n\t\titem.isFavorite = !item.isFavorite;\n\t}\n}\n","@for (section of settings().sections; track section) {\n\t@if (section.name) {\n\t\t<div mat-subheader>{{ section.name }}</div>\n\t}\n\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<mat-card-content>\n\t\t\t<mat-nav-list>\n\t\t\t\t@for (item of section.data; track item) {\n\t\t\t\t\t@let itemUrl = item.url | xiriUrl;\n\t\t\t\t\t<a mat-list-item [routerLink]=\"itemUrl?.path\" [queryParams]=\"itemUrl?.queryParams\" class=\"linelink\">\n\t\t\t\t\t\t<div matListItemIcon class=\"list-icon\" [class]=\"item.iconColor\">\n\t\t\t\t\t\t\t@if (item.iconSet) {\n\t\t\t\t\t\t\t\t<mat-icon [fontSet]=\"item.iconSet\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<mat-icon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span matListItemTitle>{{ item.name }}</span>\n\t\t\t\t\t\t<span matListItemLine>{{ item.info }}</span>\n\t\t\t\t\t\t@if (item.hasFavorite) {\n\t\t\t\t\t\t\t<div matListItemMeta class=\"list-fav\">\n\t\t\t\t\t\t\t\t<button mat-icon-button (click)=\"changeFavorite(item, $event)\" [matTooltip]=\"item.favoriteHint\"\n\t\t\t\t\t\t\t [attr.aria-label]=\"'Favorit: ' + item.name\"\n\t\t\t\t\t\t\t [attr.aria-pressed]=\"!!item.isFavorite\">\n\t\t\t\t\t\t\t\t\t@if (item.isFavorite) {\n\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"accent\">star</mat-icon>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t@if (!item.isFavorite) {\n\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"gray\">star_outline</mat-icon>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</a>\n\t\t\t\t}\n\t\t\t</mat-nav-list>\n\t\t</mat-card-content>\n\t</mat-card>\n}\n","import { Component, input } from '@angular/core';\n\nexport interface XiriHeaderSettings {\n\ttext: string\n\tcolor: string\n\tsize: string\n}\n\n@Component( {\n\t selector: 'xiri-header',\n\t templateUrl: './header.component.html',\n\t styleUrl: './header.component.scss',\n\t imports: [],\n } )\nexport class XiriHeaderComponent {\n\t\n\tsettings = input.required<XiriHeaderSettings>();\n}\n","<div class=\"name\" [class]=\"settings().color + ' ' + settings().size\">{{ settings().text }}</div>\n","import {\n\tComponent,\n\tDestroyRef,\n\tinject,\n\tinput,\n\tOnInit,\n\tsignal,\n\tviewChild,\n\tWritableSignal\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { XiriButton } from \"../button/button.component\";\nimport { BreakpointObserver, Breakpoints } from \"@angular/cdk/layout\";\nimport { map, Observable, Subscription } from \"rxjs\";\nimport { MatStep, MatStepper } from \"@angular/material/stepper\";\nimport { XiriDataService } from \"../services/data.service\";\nimport { Location } from \"@angular/common\";\nimport { Router } from \"@angular/router\";\nimport { StepperSelectionEvent } from \"@angular/cdk/stepper\";\nimport { XiriFormField } from \"../formfields/field.interface\";\nimport { XiriDoneComponent } from '../done/done.component';\nimport { XiriButtonstyleComponent } from '../buttonstyle/buttonstyle.component';\nimport { XiriErrorComponent } from '../error/error.component';\nimport { XiriFormFieldsComponent } from '../formfields/form-fields.component';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { HttpErrorResponse } from '@angular/common/http';\n\nexport interface XiriStepperSettings {\n\turl?: string\n\tsteps: XiriStepperStep[]\n}\n\nexport interface XiriStepperStep {\n\turl?: string\n\ttitle: string\n\tfields: XiriFormField[]\n\tdata?: Record<string, unknown>\n\textra?: Record<string, unknown>\n\tbuttons: XiriButton[]\n}\n\n// Event emitted by xiri-form-fields (carries the underlying FormGroup, exposing valid/value/pristine).\nexport interface XiriStepperFormChangeEvent {\n\tvalid: boolean\n\tvalue: Record<string, unknown> | null\n\tpristine?: boolean\n}\n\n// Backend response to a step check (next step definition, step jump or final goto).\nexport interface XiriStepperResponse {\n\tstep?: number\n\tfields?: XiriFormField[]\n\tbuttons?: XiriButton[]\n\turl?: string\n\tgoto?: string\n\t[ key: string ]: unknown\n}\n\ninterface StepState {\n\turl?: string\n\ttitle: string\n\tcompleted: WritableSignal<boolean>\n\tcheck: WritableSignal<boolean>\n\tvalid: WritableSignal<boolean>\n\tload: WritableSignal<boolean>\n\tgotonext: WritableSignal<boolean>\n\terrorMsg: WritableSignal<string | null>\n\tfields: WritableSignal<XiriFormField[]>\n\tbuttons: WritableSignal<XiriButton[]>\n\tdata?: Record<string, unknown>\n\textra?: Record<string, unknown>\n}\n\n\n@Component( {\n\t selector: 'xiri-stepper',\n\t templateUrl: './stepper.component.html',\n\t styleUrl: './stepper.component.scss',\n\t imports: [ MatStepper,\n\t MatStep,\n\t MatProgressSpinner,\n\t XiriFormFieldsComponent,\n\t XiriErrorComponent,\n\t XiriButtonstyleComponent,\n\t XiriDoneComponent ]\n } )\nexport class XiriStepperComponent implements OnInit {\n\n\tprivate dataService: XiriDataService = inject( XiriDataService );\n\tprivate location: Location = inject( Location );\n\tprivate router: Router = inject( Router );\n\tprivate destroyRef = inject( DestroyRef );\n\tprivate breakpointObserver = inject( BreakpointObserver );\n\n\tsettings = input.required<XiriStepperSettings>();\n\n\t// Auf Phone (XSmall) vertikal, damit die Schrittbezeichnungen nicht abgeschnitten werden.\n\torientation = toSignal(\n\t\tthis.breakpointObserver.observe( Breakpoints.XSmall ).pipe(\n\t\t\tmap( result => result.matches ? 'vertical' : 'horizontal' as const )\n\t\t),\n\t\t{ initialValue: 'horizontal' as const }\n\t);\n\n\tpublic done = signal( false );\n\tprivate calls: Subscription[] = [];\n\n\tstepper = viewChild.required<MatStepper>( MatStepper );\n\n\tpublic steps = signal<StepState[]>( [] );\n\n\n\tngOnInit(): void {\n\t\tconst steps: StepState[] = [];\n\t\tfor ( let i = 0; i != this.settings().steps.length; i++ ) {\n\t\t\tconst step = this.settings().steps[ i ];\n\n\t\t\tsteps.push( {\n\t\t\t\turl: step.url,\n\t\t\t\ttitle: step.title,\n\t\t\t\tcompleted: signal( false ),\n\t\t\t\tcheck: signal( false ),\n\t\t\t\tvalid: signal( false ),\n\t\t\t\tload: signal( i > 0 ),\n\t\t\t\tgotonext: signal( false ),\n\t\t\t\terrorMsg: signal( null ),\n\t\t\t\tfields: signal<XiriFormField[]>( step.fields ),\n\t\t\t\tbuttons: signal<XiriButton[]>( step.buttons ),\n\t\t\t\tdata: step.data,\n\t\t\t\textra: step.extra\n\t\t\t} );\n\t\t}\n\t\tthis.steps.set( steps );\n\t}\n\n\tstepChanged( $event: StepperSelectionEvent ) {\n\t\tconst step = this.steps()[ $event.selectedIndex ];\n\n\t\tif ( step.gotonext() ) {\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.stepper().next();\n\t\t\t}, 10 );\n\t\t}\n\t}\n\n\tformChanged( step: StepState, event: XiriStepperFormChangeEvent, i: number ) {\n\n\t\tif ( event.valid )\n\t\t\tstep.data = event.value as Record<string, unknown>;\n\t\tif ( !event.pristine ) {\n\t\t\tstep.completed.set( false );\n\t\t\tconst steps = this.steps();\n\t\t\tfor ( let x = i + 1; x < steps.length; x++ ) {\n\t\t\t\tsteps[ x ].completed.set( false );\n\t\t\t\tsteps[ x ].load.set( true );\n\t\t\t\tsteps[ x ].gotonext.set( false );\n\t\t\t}\n\t\t}\n\n\t\tstep.valid.set( event.valid );\n\t}\n\n\tclickButton( button: XiriButton ): void {\n\n\t\tif ( button.action == 'back' )\n\t\t\tthis.location.back();\n\t\telse if ( button.action == 'prev' ) {\n\t\t\tthis.calls.forEach( c => c.unsubscribe() );\n\t\t\tthis.calls = [];\n\n\t\t\tif ( this.stepper().selectedIndex != 0 ) {\n\t\t\t\tfor ( let i = this.stepper().selectedIndex - 1; i != 0; i-- ) {\n\t\t\t\t\tif ( this.steps()[ i ].gotonext() )\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tthis.stepper().selectedIndex = i;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.stepper().selectedIndex = 0;\n\t\t\t} else\n\t\t\t\tthis.location.back();\n\t\t} else if ( button.action == 'next' ) {\n\t\t\tconst step = this.steps()[ this.stepper().selectedIndex ];\n\t\t\tif ( step.valid() && !step.check() )\n\t\t\t\tthis.checkStep( this.stepper().selectedIndex );\n\t\t}\n\t\telse if ( button.action == 'get' ) {\n\t\t\t//\n\t\t} else if ( button.action == 'post' ) {\n\t\t\t//\n\t\t}\n\t}\n\n\tprivate checkStep( current: number ) {\n\t\tconst steps = this.steps();\n\t\tconst stepCurrent = steps[ current ];\n\t\tlet stepNext: StepState | null = null;\n\t\tlet needLoad: boolean;\n\n\t\tif ( current + 1 < steps.length ) {\n\t\t\tstepNext = steps[ current + 1 ];\n\t\t\tneedLoad = stepNext.load();\n\t\t} else {\n\t\t\tneedLoad = true;\n\t\t}\n\n\t\tif ( !needLoad ) {\n\t\t\tthis.stepper().next();\n\t\t\treturn;\n\t\t}\n\n\t\tstepCurrent.check.set( true );\n\t\tstepCurrent.errorMsg.set( null );\n\n\t\tconst x = this.sendStep( current ).pipe( takeUntilDestroyed( this.destroyRef ) ).subscribe(\n\t\t\t{\n\t\t\t\tnext: ( res: XiriStepperResponse | null ) => {\n\n\t\t\t\t\tif ( res == null ) {\n\t\t\t\t\t\tthis.showError( stepCurrent, null );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( res.step && res.step != current + 1 ) {\n\n\t\t\t\t\t\tfor ( let i = current + 1; i != res.step; i++ ) {\n\t\t\t\t\t\t\tsteps[ i ].completed.set( true );\n\t\t\t\t\t\t\tsteps[ i ].gotonext.set( true );\n\t\t\t\t\t\t\tsteps[ i ].load.set( false );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstepNext = steps[ res.step ];\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( stepNext ) {\n\t\t\t\t\t\tif ( res.fields )\n\t\t\t\t\t\t\tstepNext.fields.set( res.fields );\n\t\t\t\t\t\tif ( res.buttons )\n\t\t\t\t\t\t\tstepNext.buttons.set( res.buttons );\n\t\t\t\t\t\tif ( res.url )\n\t\t\t\t\t\t\tstepNext.url = res.url;\n\t\t\t\t\t\tstepNext.load.set( false );\n\t\t\t\t\t\tstepNext.gotonext.set( false );\n\t\t\t\t\t}\n\n\t\t\t\t\tstepCurrent.check.set( false );\n\t\t\t\t\tstepCurrent.completed.set( true );\n\n\t\t\t\t\tif ( res.step && stepNext ) {\n\t\t\t\t\t\tconst nextIndex = res.step;\n\t\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\t\tthis.stepper().selectedIndex = nextIndex;\n\t\t\t\t\t\t}, 0 )\n\t\t\t\t\t} else if ( res.goto ) {\n\t\t\t\t\t\tthis.done.set( true );\n\t\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\t\tthis.router.navigate( [ res.goto ] ).then();\n\t\t\t\t\t\t}, 1000 );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: ( err ) => {\n\t\t\t\t\tthis.showError( stepCurrent, err );\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.calls.push( x );\n\t}\n\n\tprivate showError( stepCurrent: StepState, err: HttpErrorResponse | null ) {\n\n\t\tif ( err == null )\n\t\t\tstepCurrent.errorMsg.set( 'Unknown error' );\n\t\telse if ( err.status == 400 )\n\t\t\tstepCurrent.errorMsg.set( err.error.error || 'Format Error' );\n\t\telse if ( err.status == 403 )\n\t\t\tstepCurrent.errorMsg.set( 'Access denied' );\n\t\telse\n\t\t\tstepCurrent.errorMsg.set( 'Unknown error' );\n\n\t\tstepCurrent.check.set( false );\n\t\tstepCurrent.completed.set( false );\n\t}\n\n\tprivate sendStep( i: number ): Observable<XiriStepperResponse | null> {\n\t\tconst steps = this.steps();\n\t\tlet data: Record<string, unknown> = {};\n\t\tconst step = steps[ i ];\n\n\t\tfor ( let x = 0; x <= i; x++ )\n\t\t\tdata = { ...data, ...steps[ x ].data };\n\n\t\tif ( step.extra )\n\t\t\tdata = { ...data, ...step.extra };\n\n\t\tconst url = step.url ? step.url : ( this.settings().url ?? '' );\n\t\treturn this.dataService.post( url, data ) as Observable<XiriStepperResponse | null>;\n\t}\n\n}\n","<mat-stepper [orientation]=\"orientation()\" [linear]=\"true\" (selectionChange)=\"stepChanged( $event )\" [hidden]=\"done()\">\n\t@for (step of steps(); track i; let i = $index) {\n\t\t<mat-step [label]=\"step.title\" [completed]=\"step.completed()\">\n\t\t\t<div class=\"xrow\">\n\t\t\t\t<div class=\"xcol\">\n\t\t\t\t\t@if (!step.load()) {\n\t\t\t\t\t\t<xiri-form-fields [form]=\"step.fields()\" (formChange)=\"formChanged(step, $event, i)\" [disabled]=\"step.check()\"></xiri-form-fields>\n\t\t\t\t\t}\n\t\t\t\t\t@if (step.errorMsg()) {\n\t\t\t\t\t\t<xiri-error class=\"error\" [text]=\"step.errorMsg()!\"></xiri-error>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t@if (step.check()) {\n\t\t\t\t\t<div class=\"xcol checking\">\n\t\t\t\t\t\t<mat-spinner diameter=\"25\"></mat-spinner>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<div class=\"xcol buttons\">\n\t\t\t\t\t@for (button of step.buttons(); track button) {\n\t\t\t\t\t\t@if (!button.default) {\n\t\t\t\t\t\t\t<xiri-buttonstyle [disabled]=\"false\" (click)=\"clickButton( button )\" [button]=\"button\"></xiri-buttonstyle>\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t<xiri-buttonstyle (click)=\"clickButton( button )\" [button]=\"button\" [disabled]=\"!step.valid() || step.check()\"></xiri-buttonstyle>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</mat-step>\n\t}\n</mat-stepper>\n\n@if (done()) {\n\t<div class=\"xcol done\">\n\t\t<xiri-done></xiri-done>\n\t</div>\n}\n","import {\n\tChangeDetectorRef,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\tinject,\n\tinput,\n\tOnInit,\n\toutput,\n\tsignal,\n\tTemplateRef\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { catchError, debounceTime, of, Subject, switchMap } from \"rxjs\";\nimport { XiriFormField } from \"../formfields/field.interface\";\nimport { XiriDynData } from \"../dyncomponent/dyndata.interface\";\nimport { NgTemplateOutlet } from '@angular/common';\nimport { XiriFormFieldsComponent } from '../formfields/form-fields.component';\nimport { emptyValueForField } from '../formfields/helper/empty-value';\nimport { XiriDataService } from \"../services/data.service\";\nimport { XiriFormService } from \"../services/form.service\";\nimport { XiriSessionStorageService } from \"../services/sessionStorage.service\";\nimport { XiriButtonlineComponent } from \"../buttonline/buttonline.component\";\nimport { XiriButtonResult } from \"../button/button.component\";\nimport { MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle } from \"@angular/material/expansion\";\nimport { MatIcon } from \"@angular/material/icon\";\nimport { MatButton } from \"@angular/material/button\";\nimport { MatProgressSpinner } from \"@angular/material/progress-spinner\";\nimport { MatChip, MatChipRemove, MatChipSet } from \"@angular/material/chips\";\nimport { HttpErrorResponse } from \"@angular/common/http\";\n\nexport interface XiriQuerySettings {\n\tfields?: XiriFormField[]\n\tdyn?: XiriDynData[]\n\turl?: string\n\tbuttonline?: XiriDynData\n\textra?: Record<string, unknown>\n\tsaveState?: boolean\n\tsaveStateId?: string\n\tcollapsed?: boolean\n\tshowActiveFilters?: boolean\n\tshowResultCount?: boolean\n}\n\n// A single active filter, rendered as a removable chip.\nexport interface XiriQueryActiveFilter {\n\tid: string\n\tlabel: string\n\tvalue: string\n}\n\n// Result count for the query. `total` (unfiltered) is optional.\nexport interface XiriQueryResultCount {\n\tfiltered: number\n\ttotal?: number\n}\n\n// Field types that never carry a filter value (structural/informational).\nconst NON_FILTER_FIELD_TYPES = new Set( [ 'header', 'divider', 'info', 'html', 'question', 'waiting' ] );\n\n// Event emitted by xiri-form-fields (carries the underlying FormGroup, exposing valid/value/pristine).\nexport interface XiriQueryFormChangeEvent {\n\tvalid: boolean\n\tvalue: Record<string, unknown> | null\n\tpristine?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-query',\n\t templateUrl: './query.component.html',\n\t styleUrl: './query.component.scss',\n\t imports: [ XiriFormFieldsComponent, NgTemplateOutlet, XiriButtonlineComponent, MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle, MatIcon, MatButton, MatProgressSpinner, MatChipSet, MatChip, MatChipRemove ],\n } )\nexport class XiriQueryComponent implements OnInit {\n\n\tprivate dataService: XiriDataService = inject( XiriDataService );\n\tprivate formService = inject( XiriFormService );\n\tprivate storageService: XiriSessionStorageService = inject( XiriSessionStorageService );\n\tprivate cdr = inject( ChangeDetectorRef );\n\tprivate destroyRef = inject( DestroyRef );\n\n\tsettings = input.required<XiriQuerySettings>();\n\tdyncomponent = input<TemplateRef<unknown>>();\n\t// Host-provided result count (e.g. client-side filtering). URL loads may override it via the response.\n\tcount = input<XiriQueryResultCount | null>( null );\n\tfilterChange = output<Record<string, unknown> | null>();\n\n\tprivate waiter: Subject<XiriQueryFormChangeEvent> = new Subject<XiriQueryFormChangeEvent>();\n\tprivate loader: Subject<void> = new Subject<void>();\n\n\tpublic dynData: {\n\t\tdata: XiriDynData[] | null,\n\t\tfilterData: Record<string, unknown> | null,\n\t} = { data: null, filterData: null };\n\n\tprivate saveState = false;\n\tprivate saveStateId: string | null = null;\n\tprivate extra: Record<string, unknown> | null = null;\n\tprivate _initialChangeDone = false;\n\n\tprivate get effectiveSaveKey(): string | null {\n\t\treturn this.saveStateId ? this.saveStateId + ':filter' : null;\n\t}\n\n\tprivate get collapsedSaveKey(): string | null {\n\t\treturn this.saveStateId ? this.saveStateId + ':collapsed' : null;\n\t}\n\n\t// Expansion-panel state; undefined = no panel at all, the filter is always open.\n\tpublic collapsed = signal<boolean | undefined>( undefined );\n\n\tpublic data = signal<XiriDynData[] | null>( null );\n\tpublic error = signal<string | null>( null );\n\tpublic formFields = signal<XiriFormField[] | null>( null );\n\tpublic formValid = signal<boolean>( true );\n\tpublic filterData = signal<Record<string, unknown> | null>( null );\n\tpublic loading = signal<boolean>( false );\n\n\t// Raw (un-merged with `extra`) form value, used to derive the visible active-filter chips.\n\tprivate rawValue = signal<Record<string, unknown> | null>( null );\n\t// Result count picked up from a URL load response (`count`/`total`), overrides the `count` input.\n\tprivate responseCount = signal<XiriQueryResultCount | null>( null );\n\n\tpublic resultCount = computed<XiriQueryResultCount | null>( () => this.responseCount() ?? this.count() );\n\n\tpublic activeFilters = computed<XiriQueryActiveFilter[]>( () => {\n\t\tconst fields = this.formFields();\n\t\tconst value = this.rawValue();\n\t\tif ( !fields || !value )\n\t\t\treturn [];\n\n\t\tconst result: XiriQueryActiveFilter[] = [];\n\t\tfor ( const field of fields ) {\n\t\t\tif ( NON_FILTER_FIELD_TYPES.has( field.type ) )\n\t\t\t\tcontinue;\n\t\t\tconst raw = value[ field.id ];\n\t\t\tif ( isEmptyFilterValue( raw ) )\n\t\t\t\tcontinue;\n\t\t\tresult.push( { id: field.id, label: field.name ?? field.id, value: formatFilterValue( field, raw ) } );\n\t\t}\n\t\treturn result;\n\t} );\n\n\tngOnInit(): void {\n\n\t\tthis.startLoader();\n\n\t\tconst settings = this.settings();\n\t\tif ( settings.dyn !== undefined && settings.dyn !== null && settings.dyn.length != 0 )\n\t\t\tthis.dynData.data = settings.dyn;\n\t\t\n\t\tthis.saveState = settings.saveState === undefined ? false : settings.saveState;\n\t\tthis.saveStateId = settings.saveStateId === undefined ? null : settings.saveStateId;\n\t\tthis.initCollapsed( settings.collapsed );\n\t\tthis.formFields.set( this.formService.loadState( this.effectiveSaveKey, settings.fields ?? [] ) );\n\t\tthis.extra = settings.extra || null;\n\t\t\n\t\tthis.waiter.pipe( debounceTime( 300 ), takeUntilDestroyed( this.destroyRef ) ).subscribe( event => {\n\n\t\t\tif ( event.valid ) {\n\t\t\t\tthis.dynData.filterData = this.filterData();\n\t\t\t\tthis.filterChange.emit( this.filterData() );\n\t\t\t\tif ( this.saveState )\n\t\t\t\t\tthis.formService.saveState( this.effectiveSaveKey, event.value );\n\n\t\t\t\tif ( this.settings().url )\n\t\t\t\t\tthis.load();\n\t\t\t} else {\n\t\t\t\tthis.data.set( null );\n\t\t\t\tthis.dynData.filterData = null;\n\t\t\t\tthis.filterChange.emit( null );\n\t\t\t}\n\t\t\tthis.cdr.markForCheck();\n\t\t} );\n\t}\n\n\t// The panel only exists when the backend sent `collapsed`. A previously stored state — kept under\n\t// the same saveStateId as the filter values — wins over the backend default, so a reload restores\n\t// the panel the way the user left it.\n\tprivate initCollapsed( fromSettings: boolean | undefined ) {\n\n\t\tif ( fromSettings === undefined )\n\t\t\treturn;\n\n\t\tconst key = this.collapsedSaveKey;\n\t\tconst stored = key ? this.storageService.getTimeout( key, 3600 ) : null;\n\t\tthis.collapsed.set( typeof stored === 'boolean' ? stored : fromSettings );\n\t}\n\n\t// Material owns the panel; mirror its state back so the next load can restore it. The equality\n\t// guard keeps the initial expandedChange emission from rewriting the state nobody touched.\n\tpublic panelToggled( expanded: boolean ) {\n\n\t\tif ( this.collapsed() === !expanded )\n\t\t\treturn;\n\n\t\tthis.collapsed.set( !expanded );\n\t\tconst key = this.collapsedSaveKey;\n\t\tif ( key )\n\t\t\tthis.storageService.set( key, !expanded );\n\t}\n\n\tpublic formChanged( event: XiriQueryFormChangeEvent ) {\n\t\tthis.formValid.set( event.valid );\n\t\tthis.rawValue.set( event.value );\n\n\t\tif ( this.extra !== null ) {\n\t\t\tif ( event.value && typeof event.value === 'object' )\n\t\t\t\tthis.filterData.set( { ...this.extra, ...event.value } );\n\t\t\telse\n\t\t\t\tthis.filterData.set( this.extra );\n\t\t} else\n\t\t\tthis.filterData.set( event.value );\n\n\t\t// Emit immediately on first valid change (for initial load), debounce subsequent changes\n\t\tif ( !this._initialChangeDone && event.valid ) {\n\t\t\tthis._initialChangeDone = true;\n\t\t\tthis.dynData.filterData = this.filterData();\n\t\t\tthis.filterChange.emit( this.filterData() );\n\t\t\tif ( this.saveState )\n\t\t\t\tthis.formService.saveState( this.effectiveSaveKey, event.value );\n\t\t\tif ( this.settings().url )\n\t\t\t\tthis.load();\n\t\t} else {\n\t\t\tthis.waiter.next( event );\n\t\t}\n\t}\n\t\n\t// Re-runs the last URL load after an error; filter payload is retained in dynData.filterData.\n\tpublic retry() {\n\t\tif ( this.settings().url )\n\t\t\tthis.load();\n\t}\n\n\tpublic clickedButton( event: XiriButtonResult ) {\n\t\t\n\t\tif ( !event.loading && event.done ) {\n\t\t\tthis.data.set( event.result as XiriDynData[] | null );\n\t\t\tthis.error.set( null );\n\t\t\tthis.filterChange.emit( this.filterData() );\n\t\t} else {\n\t\t\tthis.data.set( null );\n\t\t\tthis.error.set( null );\n\t\t}\n\t\t\n\t\tthis.loading.set( event.loading );\n\t}\n\t\n\t// Clears a single filter. Mutating the control fires the form's valueChanges, which routes back through\n\t// formChanged() — i.e. exactly the same filter flow as editing/applying the form, not just a visual removal.\n\tpublic removeFilter( id: string ) {\n\t\tconst field = this.formFields()?.find( f => f.id === id );\n\t\tfield?.control?.reset( emptyValueForField( field ) );\n\t}\n\n\t// Clears all filters; each reset re-runs the same (debounced) filter flow as apply.\n\tpublic resetFilters() {\n\t\tfor ( const field of this.formFields() ?? [] )\n\t\t\tfield.control?.reset( emptyValueForField( field ) );\n\t}\n\n\tprivate load() {\n\n\t\t// Stale-while-revalidate: keep the previous data() visible (dimmed via loading())\n\t\t// instead of flashing empty on every navigation/filter change.\n\t\tthis.error.set( null );\n\t\tthis.loading.set( true );\n\n\t\tthis.loader.next();\n\t}\n\n\t// Alle Loads laufen über einen switchMap: ein noch offener Request wird abgebrochen, sobald\n\t// ein neuer startet. Zwei Loads kurz hintereinander sind der Normalfall, sobald ein abhängiges\n\t// Feld seine Optionen nachlädt und dabei einen ungültig gewordenen Filterwert verwirft — ohne\n\t// switchMap könnte die späte Antwort des überholten Requests die neuere überschreiben.\n\tprivate startLoader() {\n\n\t\tthis.loader.pipe(\n\t\t\tswitchMap( () => this.dataService.post( this.settings().url ?? '', this.dynData.filterData )\n\t\t\t\t.pipe( catchError( ( err: HttpErrorResponse ) => of( { __error: err } ) ) ) ),\n\t\t\ttakeUntilDestroyed( this.destroyRef ),\n\t\t).subscribe( ( res: unknown ) => {\n\t\t\tconst failed = ( res as { __error?: HttpErrorResponse } )?.__error;\n\t\t\tif ( failed )\n\t\t\t\tthis.loadFailed( failed );\n\t\t\telse\n\t\t\t\tthis.loadSucceeded( res );\n\t\t} );\n\t}\n\n\tprivate loadSucceeded( res: unknown ) {\n\n\t\tthis.loading.set( false );\n\t\tif ( !res ) {\n\t\t\tthis.data.set( null );\n\t\t\tthis.error.set( 'Unknown Error' );\n\t\t\tthis.cdr.markForCheck();\n\t\t\treturn;\n\t\t}\n\n\t\tconst data = ( res as { data: XiriDynData[] | XiriDynData } ).data;\n\t\t// check if res is an array\n\t\tif ( Array.isArray( data ) )\n\t\t\tthis.data.set( data );\n\t\telse\n\t\t\tthis.data.set( [ data ] );\n\n\t\t// Pick up an optional result count from the response (backend-driven counts).\n\t\tconst counted = res as { count?: number, total?: number };\n\t\tif ( typeof counted.count === 'number' )\n\t\t\tthis.responseCount.set( { filtered: counted.count, total: counted.total } );\n\n\t\tthis.cdr.markForCheck();\n\t}\n\n\tprivate loadFailed( err: HttpErrorResponse ) {\n\n\t\tthis.loading.set( false );\n\t\tthis.data.set( null );\n\t\tif ( err.status === 404 )\n\t\t\tthis.error.set( 'Page not found' );\n\t\telse if ( err.status === 401 )\n\t\t\tthis.error.set( 'No permission to view page' );\n\t\telse if ( err.status === 403 )\n\t\t\tthis.error.set( 'Access denied' );\n\t\telse if ( err.status === 500 )\n\t\t\tthis.error.set( 'Internal Error' );\n\t\telse\n\t\t\tthis.error.set( 'Unknown Error' );\n\n\t\tconsole.log( 'XiriQueryComponent error', err );\n\t\tthis.cdr.markForCheck();\n\t}\n}\n\n// A filter counts as active unless it is null/undefined, an empty string, an empty array,\n// a boolean false, or a range object with no bounds set.\nfunction isEmptyFilterValue( value: unknown ): boolean {\n\tif ( value === null || value === undefined || value === '' || value === false )\n\t\treturn true;\n\tif ( Array.isArray( value ) )\n\t\treturn value.length === 0;\n\tif ( typeof value === 'object' ) {\n\t\tconst vals = Object.values( value as Record<string, unknown> );\n\t\treturn vals.length === 0 || vals.every( v => v === null || v === undefined || v === '' );\n\t}\n\treturn false;\n}\n\n// Renders a readable value for the chip. Scalar and list-backed (select/multiselect) fields map\n// cleanly to their option name(s); anything else (e.g. range objects) falls back to a plain string.\nfunction formatFilterValue( field: XiriFormField, value: unknown ): string {\n\tconst optionName = ( id: unknown ): string => {\n\t\tconst opt = field.list?.find( o => o.id === id );\n\t\treturn opt ? opt.name : String( id );\n\t};\n\n\tif ( Array.isArray( value ) )\n\t\treturn value.map( optionName ).join( ', ' );\n\tif ( field.list && ( typeof value === 'string' || typeof value === 'number' ) )\n\t\treturn optionName( value );\n\tif ( value === true )\n\t\treturn field.name ?? 'Ja';\n\treturn String( value );\n}\n","<div class=\"xrow\">\n\t<div class=\"xcol\">\n\t\t@if (collapsed() !== undefined) {\n\t\t\t<mat-expansion-panel [expanded]=\"!collapsed()\" (expandedChange)=\"panelToggled($event)\" class=\"query-expansion\">\n\t\t\t\t<mat-expansion-panel-header>\n\t\t\t\t\t<mat-panel-title>\n\t\t\t\t\t\t<mat-icon>filter_list</mat-icon> Filter\n\t\t\t\t\t</mat-panel-title>\n\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t<div class=\"query\">\n\t\t\t\t\t<xiri-form-fields [form]=\"formFields()\" (formChange)=\"formChanged($event)\" display=\"line\"></xiri-form-fields>\n\t\t\t\t\t<ng-container *ngTemplateOutlet=\"filterState\"></ng-container>\n\t\t\t\t\t@if (error()) {\n\t\t\t\t\t\t<div class=\"error\">\n\t\t\t\t\t\t\t<span>{{ error() }}</span>\n\t\t\t\t\t\t\t<button mat-button type=\"button\" data-testid=\"query-retry\" (click)=\"retry()\">\n\t\t\t\t\t\t\t\t<mat-icon>refresh</mat-icon> Retry\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</mat-expansion-panel>\n\t\t} @else {\n\t\t\t<div class=\"query\">\n\t\t\t\t<xiri-form-fields [form]=\"formFields()\" (formChange)=\"formChanged($event)\" display=\"line\"></xiri-form-fields>\n\t\t\t\t<ng-container *ngTemplateOutlet=\"filterState\"></ng-container>\n\t\t\t\t@if (error()) {\n\t\t\t\t\t<div class=\"error\">\n\t\t\t\t\t\t<span>{{ error() }}</span>\n\t\t\t\t\t\t<button mat-button type=\"button\" data-testid=\"query-retry\" (click)=\"retry()\">\n\t\t\t\t\t\t\t<mat-icon>refresh</mat-icon> Retry\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t</div>\n\t@if (settings().buttonline; as buttonline) {\n\t\t<div class=\"xcol formbtnline\" [class]=\"buttonline.display\">\n\t\t\t<xiri-buttonline [settings]=\"$any(buttonline.data)\" [filterData]=\"filterData()\" [disabled]=\"!formValid()\"\n\t\t\t (result)=\"clickedButton($event)\"></xiri-buttonline>\n\t\t</div>\n\t\t@if (loading()) {\n\t\t\t<div class=\"xcol\">\n\t\t\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t\t\t</div>\n\t\t}\n\t}\n\t@if (dynData.data) {\n\t\t<div class=\"xcol\">\n\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent(); context: { $implicit: dynData }\"></ng-container>\n\t\t</div>\n\t}\n\t@if (data()) {\n\t\t<div class=\"xcol\" [class.is-loading]=\"loading()\">\n\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent(); context: { $implicit: data() }\"></ng-container>\n\t\t</div>\n\t}\n</div>\n\n<ng-template #filterState>\n\t@if (settings().showActiveFilters && activeFilters().length) {\n\t\t<div class=\"query-filter-state\">\n\t\t\t<mat-chip-set aria-label=\"Aktive Filter\">\n\t\t\t\t@for (filter of activeFilters(); track filter.id) {\n\t\t\t\t\t<mat-chip data-testid=\"query-filter-chip\" (removed)=\"removeFilter(filter.id)\">\n\t\t\t\t\t\t<span class=\"chip-label\">{{ filter.label }}: {{ filter.value }}</span>\n\t\t\t\t\t\t<button matChipRemove type=\"button\"\n\t\t\t\t\t\t [attr.aria-label]=\"'Filter entfernen: ' + filter.label + ' ' + filter.value\">\n\t\t\t\t\t\t\t<mat-icon>cancel</mat-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</mat-chip>\n\t\t\t\t}\n\t\t\t</mat-chip-set>\n\t\t\t<button mat-button type=\"button\" class=\"reset-filters\" data-testid=\"query-reset-filters\"\n\t\t\t (click)=\"resetFilters()\">\n\t\t\t\t<mat-icon>filter_list_off</mat-icon> Alle zurücksetzen\n\t\t\t</button>\n\t\t</div>\n\t}\n\t@if (settings().showResultCount && resultCount(); as rc) {\n\t\t<div class=\"query-result-count\" data-testid=\"query-result-count\" aria-live=\"polite\">\n\t\t\t@if (rc.total !== undefined) {\n\t\t\t\t<span><strong>{{ rc.filtered }}</strong> von {{ rc.total }} Treffern</span>\n\t\t\t} @else {\n\t\t\t\t<span><strong>{{ rc.filtered }}</strong> Treffer</span>\n\t\t\t}\n\t\t</div>\n\t}\n</ng-template>\n","import { Component, computed, inject, input, OnDestroy } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { XiriButton } from \"../button/button.component\";\nimport { XiriColor } from '../types/color.type';\nimport { XiriDialogComponent } from \"../dialog/dialog.component\";\nimport { MatDialog, MatDialogRef } from \"@angular/material/dialog\";\nimport { Router, RouterLink } from \"@angular/router\";\nimport { XiriUrlPipe } from \"../pipes/url.pipe\";\nimport { MatListItem, MatListItemIcon, MatListItemTitle, MatNavList } from '@angular/material/list';\nimport { MatIcon } from '@angular/material/icon';\nimport {\n\tMatCard,\n\tMatCardAvatar,\n\tMatCardContent,\n\tMatCardHeader,\n\tMatCardSubtitle,\n\tMatCardTitle\n} from '@angular/material/card';\n\nexport interface XiriLinksSettings {\n\tdata: XiriButton[]\n\theaderIcon?: string\n\theaderIconColor?: XiriColor\n\theaderSub?: string\n\theader?: string\n\tcompact?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-links',\n\t templateUrl: './links.component.html',\n\t styleUrl: './links.component.scss',\n\t imports: [ MatCard,\n\t MatCardHeader,\n\t MatCardAvatar,\n\t MatIcon,\n\t MatCardSubtitle,\n\t MatCardTitle,\n\t MatCardContent,\n\t MatNavList,\n\t MatListItem,\n\t MatListItemIcon,\n\t MatListItemTitle,\n\t RouterLink,\n\t NgTemplateOutlet,\n\t XiriUrlPipe ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriLinksComponent implements OnDestroy {\n\n\tsettings = input.required<XiriLinksSettings>();\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\tprivate dialog = inject( MatDialog );\n\tprivate router = inject( Router );\n\t\n\tprivate dialogRef?: MatDialogRef<unknown>;\n\n\tngOnDestroy(): void {\n\t\tif ( this.dialogRef )\n\t\t\tthis.dialogRef.close( null );\n\t}\n\t\n\topenDialog( item: XiriButton ) {\n\t\t\n\t\tconst data = {\n\t\t\ttype: 'load',\n\t\t\turl: item.url,\n\t\t};\n\t\t\n\t\tthis.dialogRef = this.dialog.open( XiriDialogComponent, {\n\t\t\tdata: data,\n\t\t} );\n\t\t\n\t\tthis.dialogRef.afterClosed().subscribe( ( result: { page?: string; refresh?: string } | null ) => {\n\t\t\tif ( !result )\n\t\t\t\treturn;\n\t\t\tif ( result.page == 'refresh' || result.refresh == 'page' )\n\t\t\t\tthis.router.navigate( [ this.router.url ] ).then();\n\t\t} );\n\t\t\n\t\treturn true;\n\t}\n\t\n}\n","@if (compact()) {\n\t<div class=\"card xiri-links-flat\">\n\t\t@if (settings().header || settings().headerIcon) {\n\t\t\t<div class=\"xiri-links-header\">\n\t\t\t\t@if (settings().headerIcon) {\n\t\t\t\t\t<div class=\"header-image\">\n\t\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<div class=\"header-text\">\n\t\t\t\t\t@if (settings().header) {\n\t\t\t\t\t\t<div class=\"header-title\">{{ settings().header }}</div>\n\t\t\t\t\t}\n\t\t\t\t\t@if (settings().headerSub) {\n\t\t\t\t\t\t<div class=\"header-sub\">{{ settings().headerSub }}</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t}\n\t\t<ng-container *ngTemplateOutlet=\"linkList\"></ng-container>\n\t</div>\n} @else {\n\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<mat-card-header>\n\t\t\t@if (settings().headerIcon) {\n\t\t\t\t<div mat-card-avatar class=\"header-image\">\n\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@if (settings().headerSub) {\n\t\t\t\t<mat-card-subtitle>{{ settings().headerSub }}</mat-card-subtitle>\n\t\t\t}\n\t\t\t@if (settings().header) {\n\t\t\t\t<mat-card-title>{{ settings().header }}</mat-card-title>\n\t\t\t}\n\t\t</mat-card-header>\n\t\t<mat-card-content>\n\t\t\t<ng-container *ngTemplateOutlet=\"linkList\"></ng-container>\n\t\t</mat-card-content>\n\t</mat-card>\n}\n\n<ng-template #linkList>\n\t<mat-nav-list>\n\t\t@for (item of settings().data; track item) {\n\t\t\t@if (!item.hide && (!item.action || item.action === 'link')) {\n\t\t\t\t@let itemUrl = item.url | xiriUrl;\n\t\t\t\t<a mat-list-item [routerLink]=\"itemUrl?.path\" [queryParams]=\"itemUrl?.queryParams\">\n\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t<mat-icon matListItemIcon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t<span matListItemTitle>{{ item.text }}</span>\n\t\t\t\t</a>\n\t\t\t} @else if (!item.hide && item.action === 'dialog') {\n\t\t\t\t<mat-list-item (click)=\"openDialog( item ) && $event.stopPropagation()\" (keydown.enter)=\"openDialog( item )\" (keydown.space)=\"openDialog( item ); $event.preventDefault()\">\n\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t<mat-icon matListItemIcon [class]=\"item.color || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t<span matListItemTitle>{{ item.text }}</span>\n\t\t\t\t</mat-list-item>\n\t\t\t}\n\t\t}\n\t</mat-nav-list>\n</ng-template>\n","import { Component, computed, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatRipple } from '@angular/material/core';\nimport { MatCard, MatCardHeader, MatCardAvatar, MatCardTitle, MatCardSubtitle } from '@angular/material/card';\nimport { RouterLink } from '@angular/router';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\n\nexport interface XiriCardlinkSettings {\n\tlink: string\n\ticon?: string\n\ticonSet: string\n\ttext?: string\n\tsub?: string\n\tcompact?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-cardlink',\n\t templateUrl: './cardlink.component.html',\n\t styleUrls: [ './cardlink.component.scss' ],\n\t imports: [ RouterLink,\n\t MatCard,\n\t MatRipple,\n\t MatCardHeader,\n\t MatCardAvatar,\n\t MatIcon,\n\t MatCardTitle,\n\t MatCardSubtitle,\n\t XiriUrlPipe ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriCardlinkComponent {\n\n\tsettings = input.required<XiriCardlinkSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n}\n","@let cardUrl = settings().link | xiriUrl;\n<a [routerLink]=\"cardUrl?.path\" [queryParams]=\"cardUrl?.queryParams\">\n\t@if (compact()) {\n\t\t<div class=\"card xiri-cardlink-flat\" matRipple>\n\t\t\t<mat-card-header>\n\t\t\t\t@if (settings().icon) {\n\t\t\t\t\t<div mat-card-avatar>\n\t\t\t\t\t\t<mat-icon [fontSet]=\"settings().iconSet\">{{ settings().icon }}</mat-icon>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (settings().text) {\n\t\t\t\t\t<mat-card-title>{{ settings().text }}</mat-card-title>\n\t\t\t\t}\n\t\t\t\t@if (settings().sub) {\n\t\t\t\t\t<mat-card-subtitle>{{ settings().sub }}</mat-card-subtitle>\n\t\t\t\t}\n\t\t\t</mat-card-header>\n\t\t</div>\n\t} @else {\n\t\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\" matRipple>\n\t\t\t<mat-card-header>\n\t\t\t\t@if (settings().icon) {\n\t\t\t\t\t<div mat-card-avatar>\n\t\t\t\t\t\t<mat-icon [fontSet]=\"settings().iconSet\">{{ settings().icon }}</mat-icon>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t@if (settings().text) {\n\t\t\t\t\t<mat-card-title>{{ settings().text }}</mat-card-title>\n\t\t\t\t}\n\t\t\t\t@if (settings().sub) {\n\t\t\t\t\t<mat-card-subtitle>{{ settings().sub }}</mat-card-subtitle>\n\t\t\t\t}\n\t\t\t</mat-card-header>\n\t\t</mat-card>\n\t}\n</a>\n","import { Component, computed, input } from '@angular/core';\n\nexport type XiriSkeletonType = 'text' | 'circle' | 'rect' | 'table-row';\n\n@Component( {\n\t selector: 'xiri-skeleton',\n\t templateUrl: './skeleton.component.html',\n\t styleUrl: './skeleton.component.scss',\n\t host: { 'role': 'status', 'aria-label': 'Laden...', '[class.fill]': 'fill()' }\n } )\nexport class XiriSkeletonComponent {\n\n\ttype = input<XiriSkeletonType>( 'text' );\n\twidth = input<string>( '100%' );\n\theight = input<string>( '1em' );\n\tlines = input<number>( 1 );\n\tcolumns = input<number>( 4 );\n\tanimate = input<boolean>( true );\n\tfill = input<boolean>( false );\n\n\tlinesArray = computed( () => Array.from( { length: this.lines() } ) );\n\tcolumnsArray = computed( () => Array.from( { length: this.columns() } ) );\n}\n","@switch (type()) {\n\t@case ('text') {\n\t\t<div class=\"skeleton-text\">\n\t\t\t@for (_ of linesArray(); track $index) {\n\t\t\t\t<div class=\"skeleton-line\" [class.animate]=\"animate()\"\n\t\t\t\t [style.width]=\"$last ? '60%' : width()\"\n\t\t\t\t [style.height]=\"height()\"></div>\n\t\t\t}\n\t\t</div>\n\t}\n\t@case ('circle') {\n\t\t<div class=\"skeleton-circle\" [class.animate]=\"animate()\"\n\t\t [style.width]=\"width()\"\n\t\t [style.height]=\"width()\"></div>\n\t}\n\t@case ('rect') {\n\t\t<div class=\"skeleton-rect\" [class.animate]=\"animate()\"\n\t\t [style.width]=\"width()\"\n\t\t [style.height]=\"height()\"></div>\n\t}\n\t@case ('table-row') {\n\t\t<div class=\"skeleton-table\" [class.fill-height]=\"fill()\">\n\t\t\t@for (_ of linesArray(); track $index) {\n\t\t\t\t<div class=\"skeleton-table-row\">\n\t\t\t\t\t@for (_ of columnsArray(); track $index) {\n\t\t\t\t\t\t<div class=\"skeleton-table-cell\">\n\t\t\t\t\t\t\t<div class=\"skeleton-line\" [class.animate]=\"animate()\"></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t}\n}\n","import { Component, computed, forwardRef, inject, input, linkedSignal, Signal } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { XiriButtonlineSettings, XiriButtonlineComponent } from \"../buttonline/buttonline.component\";\nimport { XiriColor } from '../types/color.type';\nimport { XiriRawTableSettings, XiriRawTableComponent } from \"../raw-table/xiri-raw-table.component\";\nimport { XiriTableField } from \"../raw-table/tabefield.interface\";\nimport { XiriDataService } from '../services/data.service';\nimport { XiriSkeletonComponent } from '../skeleton/skeleton.component';\nimport { XiriDynData } from '../dyncomponent/dyndata.interface';\nimport { XiriDynComponentComponent } from '../dyncomponent/dyncomponent.component';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport {\n\tMatCard,\n\tMatCardHeader,\n\tMatCardAvatar,\n\tMatCardTitle,\n\tMatCardSubtitle,\n\tMatCardContent,\n\tMatCardActions\n} from '@angular/material/card';\n\nexport interface XiriCardSettings {\n\turl?: string\n\treload?: boolean\n\tdata?: unknown\n\tfields?: XiriTableField[]\n\tcomponents?: XiriDynData[]\n\theader?: string\n\theaderSub?: string\n\theaderIcon?: string\n\theaderIconColor?: XiriColor\n\tbuttonsTop?: XiriButtonlineSettings\n\tbuttonsBottom?: XiriButtonlineSettings\n\tdense?: number\n\tforceMinWidth?: boolean\n\tshowHeader?: boolean\n\tcollapsible?: boolean\n\tcollapsed?: boolean\n\tmaxHeight?: string\n\tpadding?: string // Token 'xs'|'sm'|'md'|'lg'|'xl' oder freier CSS-Wert ('16px', '1rem', 'var(--…)').\n\t // Wirkt nur im Multi-Component-Modus (settings.components).\n\t // Auf xs-Viewport (<576px) immer 8px.\n}\n\n@Component( {\n\t selector: 'xiri-card',\n\t templateUrl: './card.component.html',\n\t styleUrl: './card.component.scss',\n\t imports: [ MatCard,\n\t MatCardHeader,\n\t MatCardAvatar,\n\t MatIcon,\n\t MatIconButton,\n\t MatCardTitle,\n\t MatCardSubtitle,\n\t XiriButtonlineComponent,\n\t MatCardContent,\n\t XiriRawTableComponent,\n\t XiriSkeletonComponent,\n\t MatCardActions,\n\t forwardRef( () => XiriDynComponentComponent ) ],\n } )\nexport class XiriCardComponent {\n\n\tprivate dataService = inject( XiriDataService );\n\n\tsettings = input.required<XiriCardSettings>();\n\n\tisCollapsed = linkedSignal<boolean | undefined, boolean>( {\n\t\tsource: () => this.settings().collapsed,\n\t\tcomputation: ( collapsed, previous ) => collapsed ?? previous?.value ?? false,\n\t} );\n\n\tprivate cardResource = rxResource( {\n\t\tparams: () => this.settings().url,\n\t\tstream: ( { params } ) => this.dataService.post( params, null ),\n\t} );\n\n\tloading = this.cardResource.isLoading;\n\n\terrorMsg = computed( () => {\n\t\tconst e = this.cardResource.error() as { cause?: unknown } | undefined;\n\t\tif ( !e ) return '';\n\t\tconst http = ( e.cause ?? e ) as { error?: { error?: string } };\n\t\treturn http.error?.error || 'Fehler beim Laden';\n\t} );\n\n\tprivate _loaded = computed( () => {\n\t\tconst res = this.cardResource.value();\n\t\tif ( res == null ) return res;\n\t\treturn ( res as { data?: unknown } ).data ?? res;\n\t} );\n\n\tcardData = computed( () => this._loaded() ?? this.settings().data );\n\n\thasComponents = computed( () => ( this.settings().components?.length ?? 0 ) > 0 );\n\n\t/** Resolves padding setting (token or free CSS value) into a CSS length string. */\n\tcomponentsPadding = computed<string>( () => {\n\t\tconst v = this.settings().padding;\n\t\tif ( !v ) return 'var(--xiri-spacing-md, 16px)';\n\t\tswitch ( v ) {\n\t\t\tcase 'xs': return 'var(--xiri-spacing-xs, 4px)';\n\t\t\tcase 'sm': return 'var(--xiri-spacing-sm, 8px)';\n\t\t\tcase 'md': return 'var(--xiri-spacing-md, 16px)';\n\t\t\tcase 'lg': return 'var(--xiri-spacing-lg, 24px)';\n\t\t\tcase 'xl': return 'var(--xiri-spacing-xl, 32px)';\n\t\t\tdefault: return v; // freier CSS-Wert\n\t\t}\n\t} );\n\n\trawTable: Signal<XiriRawTableSettings | null> = computed( () => {\n\n\t\tconst data = this.cardData();\n\t\tif ( data == null ) return null;\n\n\t\tconst rt: XiriRawTableSettings = {\n\t\t\tdata: data,\n\t\t\tfields: this.settings().fields,\n\t\t\tdense: this.settings().dense,\n\t\t\tforceMinWidth: this.settings().forceMinWidth,\n\t\t\tshowHeader: this.settings().showHeader,\n\t\t};\n\n\t\tif ( !this.settings().fields && ( data as { length?: number } ).length !== 0 ) {\n\n\t\t\tconst fields: XiriTableField[] = [];\n\t\t\tif ( Array.isArray( data ) ) {\n\t\t\t\tfields.push( {\n\t\t\t\t\t id: '0',\n\t\t\t\t\t name: '0',\n\t\t\t\t\t format: 'text',\n\t\t\t\t\t display: 'info',\n\t\t\t\t\t minWidth: '30px',\n\t\t\t\t } );\n\t\t\t\tfields.push( {\n\t\t\t\t\t id: '1',\n\t\t\t\t\t name: '1',\n\t\t\t\t\t format: 'html',\n\t\t\t\t\t display: 'right',\n\t\t\t\t\t minWidth: '30px',\n\t\t\t\t } );\n\t\t\t} else {\n\n\t\t\t\tfields.push( {\n\t\t\t\t\t id: 'f0',\n\t\t\t\t\t name: 'f0',\n\t\t\t\t\t format: 'text',\n\t\t\t\t\t display: 'info',\n\t\t\t\t\t minWidth: '30px',\n\t\t\t\t } );\n\t\t\t\tfields.push( {\n\t\t\t\t\t id: 'f1',\n\t\t\t\t\t name: 'f1',\n\t\t\t\t\t format: 'html',\n\t\t\t\t\t display: 'right',\n\t\t\t\t\t minWidth: '30px',\n\t\t\t\t } );\n\n\t\t\t\tconst transformedData = [];\n\t\t\t\tconst record = data as Record<string, unknown>;\n\t\t\t\tfor ( const key in record ) {\n\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( record, key ) ) {\n\t\t\t\t\t\ttransformedData.push( {\n\t\t\t\t\t\t\t 'f0': key,\n\t\t\t\t\t\t\t 'f1': record[ key ],\n\t\t\t\t\t\t } );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trt.data = transformedData;\n\t\t\t}\n\n\t\t\trt.fields = fields;\n\t\t}\n\n\t\treturn rt;\n\t} );\n\n\ttoggleCollapse(): void {\n\t\tthis.isCollapsed.update( v => !v );\n\t}\n\n\treload() {\n\t\tif ( this.loading() ) return;\n\t\tthis.cardResource.reload();\n\t}\n\n}\n","<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t<mat-card-header>\n\t\t@if (settings().headerIcon) {\n\t\t\t<div mat-card-avatar class=\"header-image\">\n\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t</div>\n\t\t}\n\t\t@if (settings().header) {\n\t\t\t<mat-card-title [class]=\"{hasHeaderSub: settings().headerSub}\">{{ settings().header }}</mat-card-title>\n\t\t}\n\t\t@if (settings().headerSub) {\n\t\t\t<mat-card-subtitle>{{ settings().headerSub }}</mat-card-subtitle>\n\t\t}\n\t\t@if (settings().buttonsTop) {\n\t\t\t<xiri-buttonline [settings]=\"settings().buttonsTop!\"></xiri-buttonline>\n\t\t}\n\t\t@if (settings().collapsible) {\n\t\t\t<button mat-icon-button (click)=\"toggleCollapse()\" class=\"collapse-btn\" aria-label=\"Auf-/Zuklappen\">\n\t\t\t\t<mat-icon>{{ isCollapsed() ? 'expand_more' : 'expand_less' }}</mat-icon>\n\t\t\t</button>\n\t\t}\n\t\t@if (settings().reload && settings().url) {\n\t\t\t<button mat-icon-button (click)=\"reload()\" [disabled]=\"loading()\" class=\"reload-btn\" aria-label=\"Neu laden\">\n\t\t\t\t<mat-icon [class.spinning]=\"loading()\">autorenew</mat-icon>\n\t\t\t</button>\n\t\t}\n\t</mat-card-header>\n\t<div class=\"collapse-wrapper\" [class.collapsed]=\"isCollapsed()\">\n\t\t<div class=\"collapse-inner\">\n\t\t\t@if (loading() && !cardData()) {\n\t\t\t\t<mat-card-content>\n\t\t\t\t\t<xiri-skeleton type=\"table-row\" [columns]=\"2\" [lines]=\"3\"></xiri-skeleton>\n\t\t\t\t</mat-card-content>\n\t\t\t} @else if (errorMsg()) {\n\t\t\t\t<mat-card-content>\n\t\t\t\t\t<div class=\"load-error\">{{ errorMsg() }}</div>\n\t\t\t\t</mat-card-content>\n\t\t\t} @else if (hasComponents()) {\n\t\t\t\t<mat-card-content class=\"hasComponents\" [style.--xiri-card-padding]=\"componentsPadding()\">\n\t\t\t\t\t<xiri-dyncomponent [data]=\"settings().components!\" class=\"xrow\"></xiri-dyncomponent>\n\t\t\t\t</mat-card-content>\n\t\t\t} @else {\n\t\t\t\t<mat-card-content class=\"hasTable\" [style.max-height]=\"settings().maxHeight || '50vh'\">\n\t\t\t\t\t@if (rawTable()) {\n\t\t\t\t\t\t<xiri-raw-table [settings]=\"rawTable()!\"></xiri-raw-table>\n\t\t\t\t\t}\n\t\t\t\t</mat-card-content>\n\t\t\t}\n\t\t\t@if (settings().buttonsBottom) {\n\t\t\t\t<mat-card-actions align=\"end\">\n\t\t\t\t\t<xiri-buttonline [settings]=\"settings().buttonsBottom!\"></xiri-buttonline>\n\t\t\t\t</mat-card-actions>\n\t\t\t}\n\t\t</div>\n\t</div>\n</mat-card>\n","import { Component, effect, input, signal, TemplateRef } from '@angular/core';\nimport { MatTabGroup, MatTab, MatTabLabel } from '@angular/material/tabs';\nimport { MatIcon } from '@angular/material/icon';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { XiriDynData } from '../dyncomponent/dyndata.interface';\n\nexport interface XiriTabSettings {\n\tlabel: string\n\ticon?: string\n\tdisabled?: boolean\n\tdata: XiriDynData[]\n\tlazy?: boolean\n\tunload?: boolean\n}\n\nexport interface XiriTabsSettings {\n\ttabs: XiriTabSettings[]\n\tselectedIndex?: number\n\tdynamicHeight?: boolean\n\tanimationDuration?: string\n\tlazy?: boolean\n\tunload?: boolean\n\theaderPosition?: 'above' | 'below'\n\talignTabs?: 'start' | 'center' | 'end'\n\tstretchTabs?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-tabs',\n\t templateUrl: './tabs.component.html',\n\t styleUrl: './tabs.component.scss',\n\t imports: [\n\t\t MatTabGroup,\n\t\t MatTab,\n\t\t MatTabLabel,\n\t\t MatIcon,\n\t\t NgTemplateOutlet\n\t ]\n } )\nexport class XiriTabsComponent {\n\t\n\tsettings = input.required<XiriTabsSettings>();\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\tdyncomponent = input<TemplateRef<unknown>>();\n\t\n\tselectedIndex = signal( 0 );\n\tvisitedTabs = signal<Set<number>>( new Set( [ 0 ] ) );\n\t\n\tconstructor() {\n\t\teffect( () => {\n\t\t\tconst idx = this.settings().selectedIndex ?? 0;\n\t\t\tthis.selectedIndex.set( idx );\n\t\t\tthis.visitedTabs.update( set => {\n\t\t\t\tconst newSet = new Set( set );\n\t\t\t\tnewSet.add( idx );\n\t\t\t\treturn newSet;\n\t\t\t} );\n\t\t} );\n\t}\n\t\n\tonTabChange( index: number ): void {\n\t\tthis.selectedIndex.set( index );\n\t\tthis.visitedTabs.update( set => {\n\t\t\tconst newSet = new Set( set );\n\t\t\tnewSet.add( index );\n\t\t\treturn newSet;\n\t\t} );\n\t}\n\t\n\tshouldRenderContent( index: number, tab: XiriTabSettings ): boolean {\n\t\tconst globalUnload = this.settings().unload ?? false;\n\t\tconst tabUnload = tab.unload ?? globalUnload;\n\n\t\tif ( tabUnload )\n\t\t\treturn this.selectedIndex() === index;\n\n\t\tconst globalLazy = this.settings().lazy ?? false;\n\t\tconst tabLazy = tab.lazy ?? globalLazy;\n\n\t\tif ( !tabLazy ) return true;\n\t\treturn this.visitedTabs().has( index );\n\t}\n}\n","<mat-tab-group\n\t[selectedIndex]=\"selectedIndex()\"\n\t[dynamicHeight]=\"settings().dynamicHeight ?? false\"\n\t[animationDuration]=\"settings().animationDuration ?? '225ms'\"\n\t[headerPosition]=\"settings().headerPosition ?? 'above'\"\n\t[mat-align-tabs]=\"settings().alignTabs ?? 'start'\"\n\t[mat-stretch-tabs]=\"settings().stretchTabs ?? false\"\n\t(selectedIndexChange)=\"onTabChange($event)\">\n\n\t@for (tab of settings().tabs; track tab.label; let i = $index) {\n\t\t<mat-tab [disabled]=\"tab.disabled ?? false\">\n\t\t\t<ng-template mat-tab-label>\n\t\t\t\t@if (tab.icon) {\n\t\t\t\t\t<mat-icon>{{ tab.icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t{{ tab.label }}\n\t\t\t</ng-template>\n\n\t\t\t@if (shouldRenderContent(i, tab)) {\n\t\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent(); context: { $implicit: { data: tab.data, filterData: filterData() } }\"></ng-container>\n\t\t\t}\n\t\t</mat-tab>\n\t}\n</mat-tab-group>\n","import { Component, input, signal, TemplateRef } from '@angular/core';\nimport { MatAccordion, MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle, MatExpansionPanelDescription } from '@angular/material/expansion';\nimport { MatIcon } from '@angular/material/icon';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { XiriDynData } from '../dyncomponent/dyndata.interface';\n\nexport interface XiriExpansionPanelSettings {\n\ttitle: string\n\tdescription?: string\n\ticon?: string\n\tdisabled?: boolean\n\texpanded?: boolean\n\tdata: XiriDynData[]\n\tlazy?: boolean\n\tunload?: boolean\n}\n\nexport interface XiriExpansionSettings {\n\tpanels: XiriExpansionPanelSettings[]\n\tmulti?: boolean\n\tdisplayMode?: 'default' | 'flat'\n\ttogglePosition?: 'before' | 'after'\n\thideToggle?: boolean\n\tlazy?: boolean\n\tunload?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-expansion',\n\t templateUrl: './expansion.component.html',\n\t styleUrl: './expansion.component.scss',\n\t imports: [\n\t\t MatAccordion,\n\t\t MatExpansionPanel,\n\t\t MatExpansionPanelHeader,\n\t\t MatExpansionPanelTitle,\n\t\t MatExpansionPanelDescription,\n\t\t MatIcon,\n\t\t NgTemplateOutlet\n\t ]\n } )\nexport class XiriExpansionComponent {\n\n\tsettings = input.required<XiriExpansionSettings>();\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\tdyncomponent = input<TemplateRef<unknown>>();\n\n\topenedPanels = signal<Set<number>>( new Set() );\n\tvisitedPanels = signal<Set<number>>( new Set() );\n\n\tonPanelOpened( index: number ): void {\n\t\tthis.openedPanels.update( set => {\n\t\t\tconst newSet = new Set( set );\n\t\t\tnewSet.add( index );\n\t\t\treturn newSet;\n\t\t} );\n\t\tthis.visitedPanels.update( set => {\n\t\t\tconst newSet = new Set( set );\n\t\t\tnewSet.add( index );\n\t\t\treturn newSet;\n\t\t} );\n\t}\n\n\tonPanelClosed( index: number ): void {\n\t\tthis.openedPanels.update( set => {\n\t\t\tconst newSet = new Set( set );\n\t\t\tnewSet.delete( index );\n\t\t\treturn newSet;\n\t\t} );\n\t}\n\n\tshouldRenderContent( index: number, panel: XiriExpansionPanelSettings ): boolean {\n\t\tconst globalUnload = this.settings().unload ?? false;\n\t\tconst panelUnload = panel.unload ?? globalUnload;\n\n\t\tif ( panelUnload )\n\t\t\treturn this.openedPanels().has( index );\n\n\t\tconst globalLazy = this.settings().lazy ?? false;\n\t\tconst panelLazy = panel.lazy ?? globalLazy;\n\n\t\tif ( !panelLazy ) return true;\n\t\treturn this.visitedPanels().has( index );\n\t}\n}\n","<mat-accordion\n\t[multi]=\"settings().multi ?? false\"\n\t[displayMode]=\"settings().displayMode ?? 'default'\"\n\t[hideToggle]=\"settings().hideToggle ?? false\"\n\t[togglePosition]=\"settings().togglePosition ?? 'after'\">\n\n\t@for (panel of settings().panels; track panel.title; let i = $index) {\n\t\t<mat-expansion-panel\n\t\t\t[disabled]=\"panel.disabled ?? false\"\n\t\t\t[expanded]=\"panel.expanded ?? false\"\n\t\t\t(opened)=\"onPanelOpened(i)\"\n\t\t\t(closed)=\"onPanelClosed(i)\">\n\n\t\t\t<mat-expansion-panel-header>\n\t\t\t\t@if (panel.icon) {\n\t\t\t\t\t<mat-icon>{{ panel.icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<mat-panel-title>{{ panel.title }}</mat-panel-title>\n\t\t\t\t@if (panel.description) {\n\t\t\t\t\t<mat-panel-description>{{ panel.description }}</mat-panel-description>\n\t\t\t\t}\n\t\t\t</mat-expansion-panel-header>\n\n\t\t\t@if (shouldRenderContent(i, panel)) {\n\t\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent(); context: { $implicit: { data: panel.data, filterData: filterData() } }\"></ng-container>\n\t\t\t}\n\t\t</mat-expansion-panel>\n\t}\n</mat-accordion>\n","import { Component, computed, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatCard, MatCardContent } from '@angular/material/card';\nimport { XiriColor } from '../types/color.type';\n\nexport interface XiriStatTrend {\n\tvalue: number\n\tdirection: 'up' | 'down' | 'neutral'\n}\n\nexport interface XiriStatSettings {\n\tvalue: string | number\n\tlabel: string\n\ticon?: string\n\ticonColor?: XiriColor\n\ttrend?: XiriStatTrend\n\tprefix?: string\n\tsuffix?: string\n\tcolor?: XiriColor\n\treference?: string\n\tcompact?: boolean\n\tlink?: string\n}\n\n@Component( {\n\t selector: 'xiri-stat',\n\t templateUrl: './stat.component.html',\n\t styleUrl: './stat.component.scss',\n\t imports: [ MatIcon, MatCard, MatCardContent, NgTemplateOutlet ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriStatComponent {\n\n\tsettings = input.required<XiriStatSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n}\n","@if (compact()) {\n\t<div class=\"stat-flat\">\n\t\t<ng-container *ngTemplateOutlet=\"statBody\"></ng-container>\n\t</div>\n} @else {\n\t<mat-card class=\"stat-card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<mat-card-content>\n\t\t\t<ng-container *ngTemplateOutlet=\"statBody\"></ng-container>\n\t\t</mat-card-content>\n\t</mat-card>\n}\n\n<ng-template #statBody>\n\t<div class=\"stat-content\">\n\t\t@if (settings().icon) {\n\t\t\t<div class=\"stat-icon\">\n\t\t\t\t<mat-icon [class]=\"settings().iconColor || 'primary'\">{{ settings().icon }}</mat-icon>\n\t\t\t</div>\n\t\t}\n\t\t<div class=\"stat-data\">\n\t\t\t<div class=\"stat-value\" [class]=\"settings().color || ''\">\n\t\t\t\t@if (settings().prefix) {\n\t\t\t\t\t<span class=\"prefix\">{{ settings().prefix }}</span>\n\t\t\t\t}\n\t\t\t\t{{ settings().value }}\n\t\t\t\t@if (settings().suffix) {\n\t\t\t\t\t<span class=\"suffix\">{{ settings().suffix }}</span>\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div class=\"stat-label\">{{ settings().label }}</div>\n\t\t\t@if (settings().reference; as reference) {\n\t\t\t\t<div class=\"stat-reference\">{{ reference }}</div>\n\t\t\t}\n\t\t</div>\n\t\t@if (settings().trend; as trend) {\n\t\t\t<div class=\"stat-trend\" [class]=\"trend.direction\">\n\t\t\t\t<mat-icon>\n\t\t\t\t\t@switch (trend.direction) {\n\t\t\t\t\t\t@case ('up') { trending_up }\n\t\t\t\t\t\t@case ('down') { trending_down }\n\t\t\t\t\t\t@default { trending_flat }\n\t\t\t\t\t}\n\t\t\t\t</mat-icon>\n\t\t\t\t<span>{{ trend.value > 0 ? '+' : '' }}{{ trend.value }}%</span>\n\t\t\t</div>\n\t\t}\n\t</div>\n</ng-template>\n","import { Component, forwardRef, input, signal, TemplateRef, OnInit } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatDivider } from '@angular/material/divider';\nimport { XiriButtonlineComponent, XiriButtonlineSettings } from '../buttonline/buttonline.component';\nimport { XiriDynComponentComponent } from '../dyncomponent/dyncomponent.component';\nimport { XiriDynData } from '../dyncomponent/dyndata.interface';\n\nexport interface XiriSectionSettings {\n\ttitle?: string\n\tsubtitle?: string\n\ticon?: string\n\ticonColor?: string\n\tcollapsible?: boolean\n\tcollapsed?: boolean\n\tbuttons?: XiriButtonlineSettings\n\tcomponents?: XiriDynData[]\n}\n\n@Component( {\n\t selector: 'xiri-section',\n\t templateUrl: './section.component.html',\n\t styleUrl: './section.component.scss',\n\t imports: [ MatIcon, MatDivider, XiriButtonlineComponent, forwardRef( () => XiriDynComponentComponent ) ]\n } )\nexport class XiriSectionComponent implements OnInit {\n\n\tsettings = input.required<XiriSectionSettings>();\n\tdyncomponent = input<TemplateRef<unknown>>();\n\n\tcollapsed = signal<boolean>( false );\n\n\tngOnInit() {\n\t\tif ( this.settings().collapsed ) {\n\t\t\tthis.collapsed.set( true );\n\t\t}\n\t}\n\n\ttoggle() {\n\t\tthis.collapsed.update( v => !v );\n\t}\n}\n","<section class=\"xiri-section\">\n\t@if (settings().title) {\n\t\t<div class=\"section-header\"\n\t\t [class.collapsible]=\"settings().collapsible\"\n\t\t [attr.role]=\"settings().collapsible ? 'button' : null\"\n\t\t [attr.tabindex]=\"settings().collapsible ? 0 : null\"\n\t\t (click)=\"settings().collapsible && toggle()\"\n\t\t (keydown.enter)=\"settings().collapsible && toggle()\"\n\t\t (keydown.space)=\"settings().collapsible && toggle(); settings().collapsible && $event.preventDefault()\">\n\t\t\t<div class=\"section-header-left\">\n\t\t\t\t@if (settings().icon) {\n\t\t\t\t\t<mat-icon [class]=\"settings().iconColor || ''\">{{ settings().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<div>\n\t\t\t\t\t<h2>{{ settings().title }}</h2>\n\t\t\t\t\t@if (settings().subtitle) {\n\t\t\t\t\t\t<span class=\"section-subtitle\">{{ settings().subtitle }}</span>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"section-header-right\">\n\t\t\t\t@if (settings().buttons) {\n\t\t\t\t\t<xiri-buttonline [settings]=\"settings().buttons!\"></xiri-buttonline>\n\t\t\t\t}\n\t\t\t\t@if (settings().collapsible) {\n\t\t\t\t\t<mat-icon class=\"collapse-icon\" [class.collapsed]=\"collapsed()\">expand_more</mat-icon>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t\t<mat-divider></mat-divider>\n\t}\n\t<div class=\"collapse-wrapper\" [class.collapsed]=\"collapsed()\">\n\t\t<div class=\"collapse-inner\">\n\t\t\t<div class=\"section-content\">\n\t\t\t\t<ng-content></ng-content>\n\t\t\t\t@if (settings().components) {\n\t\t\t\t\t<xiri-dyncomponent [data]=\"settings().components!\" [dyncomponent]=\"dyncomponent()\" class=\"xrow\"></xiri-dyncomponent>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</section>\n","import { Component, computed, inject, input } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatCard, MatCardContent } from '@angular/material/card';\nimport { XiriStatSettings } from '../stat/stat.component';\nimport { XiriColor } from '../types/color.type';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\nimport { XiriDataService } from '../services/data.service';\nimport { XiriSkeletonComponent } from '../skeleton/skeleton.component';\n\nexport interface XiriMultiStatSettings {\n\ttitle?: string\n\ticon?: string\n\ticonColor?: XiriColor\n\titems?: XiriStatSettings[]\n\turl?: string\n\treload?: boolean\n\tverticalItems?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-multi-stat',\n\t templateUrl: './multi-stat.component.html',\n\t styleUrl: './multi-stat.component.scss',\n\t imports: [ MatIcon, MatIconButton, MatCard, MatCardContent, RouterLink, NgTemplateOutlet, XiriUrlPipe, XiriSkeletonComponent ]\n } )\nexport class XiriMultiStatComponent {\n\n\tprivate dataService = inject( XiriDataService );\n\n\tsettings = input.required<XiriMultiStatSettings>();\n\n\t// AJAX-Modus: lädt die Items von settings().url (Card-Muster). Bleibt idle,\n\t// solange keine url gesetzt ist (rxResource ruft stream nur bei definierten params).\n\tprivate resource = rxResource( {\n\t\tparams: () => this.settings().url,\n\t\tstream: ( { params } ) => this.dataService.post( params, null ),\n\t} );\n\n\tloading = this.resource.isLoading;\n\n\terrorMsg = computed<string>( () => {\n\t\tconst e = this.resource.error() as { cause?: unknown } | undefined;\n\t\tif ( !e ) return '';\n\t\tconst http = ( e.cause ?? e ) as { error?: { error?: string } };\n\t\treturn http.error?.error || 'Fehler beim Laden';\n\t} );\n\n\t// Antwort auspacken ({ data: ... } → data), sonst inline settings.items.\n\tprivate loaded = computed<XiriMultiStatSettings | null | undefined>( () => {\n\t\tconst res = this.resource.value();\n\t\tif ( res == null ) return res;\n\t\treturn ( ( res as { data?: unknown } ).data ?? res ) as XiriMultiStatSettings;\n\t} );\n\n\titems = computed<XiriStatSettings[]>( () => this.loaded()?.items ?? this.settings().items ?? [] );\n\n\treload(): void {\n\t\tif ( this.loading() ) return;\n\t\tthis.resource.reload();\n\t}\n}\n","<mat-card class=\"multi-stat-card mat-mdc-elevation-specific mat-elevation-z2\">\n\t<mat-card-content>\n\t\t@if (settings().title || settings().icon || (settings().reload && settings().url)) {\n\t\t\t<div class=\"multi-stat-header\">\n\t\t\t\t@if (settings().icon) {\n\t\t\t\t\t<mat-icon [class]=\"settings().iconColor || 'primary'\">{{ settings().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t@if (settings().title) {\n\t\t\t\t\t<h3 class=\"multi-stat-title\">{{ settings().title }}</h3>\n\t\t\t\t}\n\t\t\t\t@if (settings().reload && settings().url) {\n\t\t\t\t\t<button mat-icon-button (click)=\"reload()\" [disabled]=\"loading()\" class=\"reload-btn\" aria-label=\"Neu laden\">\n\t\t\t\t\t\t<mat-icon [class.spinning]=\"loading()\">autorenew</mat-icon>\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\n\t\t@if (loading() && !items().length) {\n\t\t\t<xiri-skeleton type=\"rect\" height=\"72px\"></xiri-skeleton>\n\t\t} @else if (errorMsg()) {\n\t\t\t<div class=\"load-error\">{{ errorMsg() }}</div>\n\t\t} @else {\n\t\t\t<div class=\"multi-stat-items\" [class.vertical]=\"settings().verticalItems\">\n\t\t\t\t@for (item of items(); track $index) {\n\t\t\t\t\t<div class=\"multi-stat-item\">\n\t\t\t\t\t\t@if (item.link) {\n\t\t\t\t\t\t\t@let itemUrl = item.link | xiriUrl;\n\t\t\t\t\t\t\t<a class=\"multi-stat-link\" [routerLink]=\"itemUrl?.path\" [queryParams]=\"itemUrl?.queryParams\">\n\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"itemBody; context: { $implicit: item }\"></ng-container>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"itemBody; context: { $implicit: item }\"></ng-container>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t</mat-card-content>\n</mat-card>\n\n<ng-template #itemBody let-item>\n\t@if (item.icon) {\n\t\t<div class=\"stat-icon\">\n\t\t\t<mat-icon [class]=\"item.iconColor || 'primary'\">{{ item.icon }}</mat-icon>\n\t\t</div>\n\t}\n\t<div class=\"stat-data\">\n\t\t<div class=\"stat-value\" [class]=\"item.color || ''\">\n\t\t\t@if (item.prefix) {\n\t\t\t\t<span class=\"prefix\">{{ item.prefix }}</span>\n\t\t\t}\n\t\t\t{{ item.value }}\n\t\t\t@if (item.suffix) {\n\t\t\t\t<span class=\"suffix\">{{ item.suffix }}</span>\n\t\t\t}\n\t\t</div>\n\t\t<div class=\"stat-label\">{{ item.label }}</div>\n\t</div>\n\t@if (item.trend; as trend) {\n\t\t<!-- Trend als Geschwister von .stat-data: horizontal daneben, vertikal darunter.\n\t\t ponytail: Trend-Mapping dupliziert stat.component.html; teilen wenn ein 3. Nutzer kommt -->\n\t\t<div class=\"stat-trend\" [class]=\"trend.direction\">\n\t\t\t<mat-icon>\n\t\t\t\t@switch (trend.direction) {\n\t\t\t\t\t@case ('up') { trending_up }\n\t\t\t\t\t@case ('down') { trending_down }\n\t\t\t\t\t@default { trending_flat }\n\t\t\t\t}\n\t\t\t</mat-icon>\n\t\t\t<span>{{ trend.value > 0 ? '+' : '' }}{{ trend.value }}%</span>\n\t\t</div>\n\t}\n</ng-template>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\n\n// Farbstufe des Status. Trägt nie allein die Bedeutung — das Label ist immer sichtbar.\nexport type XiriStatusTone = 'neutral' | 'info' | 'success' | 'warning' | 'error';\n\n// Darstellungsform: gefüllte Pille, farbiger Punkt neben dem Label oder reiner Text.\nexport type XiriStatusVariant = 'badge' | 'dot' | 'text';\n\nexport interface XiriStatusSettings {\n\tlabel: string // immer sichtbar, nie nur über Farbe transportiert\n\ttone?: XiriStatusTone // default 'neutral'\n\tvariant?: XiriStatusVariant // default 'badge'\n\ticon?: string // Material-Icon-Name, optional und rein redundant zum Label\n\thint?: string // optionaler Tooltip/Zusatz\n\tariaLabel?: string // überschreibt den zugänglichen Namen\n}\n\n@Component( {\n\t selector: 'xiri-status',\n\t templateUrl: './status.component.html',\n\t styleUrl: './status.component.scss',\n\t changeDetection: ChangeDetectionStrategy.OnPush,\n\t imports: [ MatIcon ],\n\t host: {\n\t\t '[class]': 'hostClass()',\n\t\t '[attr.role]': \"'status'\",\n\t\t '[attr.aria-label]': 'settings().ariaLabel ?? null',\n\t\t '[attr.title]': 'settings().hint ?? null'\n\t }\n } )\nexport class XiriStatusComponent {\n\n\tsettings = input.required<XiriStatusSettings>();\n\n\ttone = computed<XiriStatusTone>( () => this.settings().tone ?? 'neutral' );\n\tvariant = computed<XiriStatusVariant>( () => this.settings().variant ?? 'badge' );\n\n\t// Tone und Variant werden als Host-Klassen abgebildet; das SCSS mappt sie auf Tokens.\n\thostClass = computed<string>( () => `xiri-status tone-${ this.tone() } variant-${ this.variant() }` );\n}\n","@if (variant() === 'dot') {\n\t<span class=\"status-dot\" aria-hidden=\"true\"></span>\n}\n@if (settings().icon; as icon) {\n\t<mat-icon class=\"status-icon\" aria-hidden=\"true\">{{ icon }}</mat-icon>\n}\n<span class=\"status-label\">{{ settings().label }}</span>\n","import { ChangeDetectionStrategy, Component, computed, input, output, signal } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { XiriButton, XiriButtonComponent, XiriButtonResult } from '../button/button.component';\n\nexport type XiriCalloutTone = 'info' | 'success' | 'warning' | 'error';\n\nexport interface XiriCalloutSettings {\n\ttone: XiriCalloutTone\n\ttext: string\n\n\ttitle?: string\n\ticon?: string\n\tactions?: XiriButton[]\n\tdismissible?: boolean\n\tcompact?: boolean\n}\n\n@Component( {\n\t selector: 'xiri-callout',\n\t templateUrl: './callout.component.html',\n\t styleUrl: './callout.component.scss',\n\t changeDetection: ChangeDetectionStrategy.OnPush,\n\t imports: [ MatIcon, MatIconButton, XiriButtonComponent ]\n\t } )\nexport class XiriCalloutComponent {\n\n\tsettings = input.required<XiriCalloutSettings>();\n\tbuttonResult = output<XiriButtonResult>();\n\n\t// Dismiss ist rein lokaler Component-State — der Hinweis verschwindet nur clientseitig.\n\tdismissed = signal<boolean>( false );\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\t// Nur ein dynamisch als Fehler eingesetzter Hinweis ist eine aggressive Live-Region.\n\t// Statische Hinweise sind ein semantisches \"note\" ohne Live-Ansage.\n\trole = computed<string>( () => this.settings().tone === 'error' ? 'alert' : 'note' );\n\n\tdismiss(): void {\n\t\tthis.dismissed.set( true );\n\t}\n}\n","@if (!dismissed()) {\n\t<div class=\"callout\" [class]=\"'tone-' + settings().tone\" [class.compact]=\"compact()\" [attr.role]=\"role()\">\n\t\t@if (settings().icon) {\n\t\t\t<div class=\"icon\">\n\t\t\t\t<mat-icon>{{ settings().icon }}</mat-icon>\n\t\t\t</div>\n\t\t}\n\t\t<div class=\"body\">\n\t\t\t@if (settings().title) {\n\t\t\t\t<div class=\"title\">{{ settings().title }}</div>\n\t\t\t}\n\t\t\t<div class=\"text\">{{ settings().text }}</div>\n\t\t\t@if (settings().actions?.length) {\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t@for (button of settings().actions!; track button) {\n\t\t\t\t\t\t<xiri-button [button]=\"button\" (result)=\"buttonResult.emit( $event )\"></xiri-button>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t\t@if (settings().dismissible) {\n\t\t\t<button mat-icon-button class=\"dismiss\" (click)=\"dismiss()\" aria-label=\"Hinweis schließen\">\n\t\t\t\t<mat-icon>close</mat-icon>\n\t\t\t</button>\n\t\t}\n\t</div>\n}\n","import { Component, computed, forwardRef, input, TemplateRef } from '@angular/core';\nimport { XiriDynData } from \"./dyndata.interface\";\nimport { colsToClasses } from '../layout/cols.directive';\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\nimport { XiriImagetextComponent } from '../imagetext/imagetext.component';\nimport { XiriMultiprogressComponent } from '../multiprogress/multiprogress.component';\nimport { XiriProgressComponent } from '../progress/progress.component';\nimport { XiriInfopointComponent } from '../infopoint/infopoint.component';\nimport { XiriListComponent } from '../list/list.component';\nimport { XiriHeaderComponent } from '../header/header.component';\nimport { XiriStepperComponent } from '../stepper/stepper.component';\nimport { XiriQueryComponent } from '../query/query.component';\nimport { XiriFormComponent } from '../form/form.component';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MatCard, MatCardContent, MatCardHeader, MatCardTitle } from '@angular/material/card';\nimport { XiriLinksComponent } from '../links/links.component';\nimport { XiriCardlinkComponent } from '../cardlink/cardlink.component';\nimport { XiriTableComponent } from '../table/table.component';\nimport { XiriButtonlineComponent } from '../buttonline/buttonline.component';\nimport { XiriCardComponent } from '../card/card.component';\nimport { XiriTabsComponent } from '../tabs/tabs.component';\nimport { XiriExpansionComponent } from '../expansion/expansion.component';\nimport { XiriStatComponent } from '../stat/stat.component';\nimport { XiriEmptyStateComponent } from '../empty-state/empty-state.component';\nimport { XiriTimelineComponent } from '../timeline/timeline.component';\nimport { XiriPageHeaderComponent } from '../page-header/page-header.component';\nimport { XiriSectionComponent } from '../section/section.component';\nimport { XiriDividerComponent } from '../divider/divider.component';\nimport { XiriStatGridComponent } from '../stat-grid/stat-grid.component';\nimport { XiriMultiStatComponent } from '../multi-stat/multi-stat.component';\nimport { XiriToolbarComponent } from '../toolbar/toolbar.component';\nimport { XiriDescriptionListComponent } from '../description-list/description-list.component';\nimport { XiriBarChartComponent } from '../barchart/barchart.component';\nimport { XiriLineChartComponent } from '../linechart/linechart.component';\nimport { XiriPieChartComponent } from '../piechart/piechart.component';\nimport { XiriGaugeChartComponent } from '../gaugechart/gaugechart.component';\nimport { XiriBulletChartComponent } from '../bulletchart/bulletchart.component';\nimport { XiriHeatmapComponent } from '../heatmap/heatmap.component';\nimport { XiriCalendarComponent } from '../calendar/calendar.component';\nimport { XiriTreeComponent } from '../tree/tree.component';\nimport { XiriSankeyComponent } from '../sankey/sankey.component';\nimport { XiriGanttComponent } from '../gantt/gantt.component';\nimport { XiriSkeletonComponent } from '../skeleton/skeleton.component';\nimport { XiriStatusComponent } from '../status/status.component';\nimport { XiriCalloutComponent } from '../callout/callout.component';\n\n\n@Component( {\n\t selector: 'xiri-dyncomponent',\n\t templateUrl: './dyncomponent.component.html',\n\t styleUrl: './dyncomponent.component.scss',\n\t imports: [ forwardRef( () => XiriCardComponent ),\n\t XiriButtonlineComponent,\n\t XiriTableComponent,\n\t XiriCardlinkComponent,\n\t XiriLinksComponent,\n\t MatCard,\n\t MatCardHeader,\n\t MatCardTitle,\n\t MatCardContent,\n\t XiriFormComponent,\n\t XiriQueryComponent,\n\t XiriStepperComponent,\n\t XiriHeaderComponent,\n\t XiriListComponent,\n\t XiriInfopointComponent,\n\t XiriMultiprogressComponent,\n\t XiriProgressComponent,\n\t XiriImagetextComponent,\n\t NgTemplateOutlet,\n\t SafehtmlPipe,\n\t XiriTabsComponent,\n\t XiriExpansionComponent,\n\t XiriStatComponent,\n\t XiriEmptyStateComponent,\n\t XiriStatusComponent,\n\t XiriCalloutComponent,\n\t XiriTimelineComponent,\n\t XiriPageHeaderComponent,\n\t XiriSectionComponent,\n\t XiriDividerComponent,\n\t XiriSkeletonComponent,\n\t XiriStatGridComponent,\n\t XiriMultiStatComponent,\n\t XiriToolbarComponent,\n\t XiriDescriptionListComponent,\n\t XiriBarChartComponent,\n\t XiriLineChartComponent,\n\t XiriPieChartComponent,\n\t XiriGaugeChartComponent,\n\t XiriBulletChartComponent,\n\t XiriHeatmapComponent,\n\t XiriCalendarComponent,\n\t XiriTreeComponent,\n\t XiriSankeyComponent,\n\t XiriGanttComponent ]\n } )\nexport class XiriDynComponentComponent {\n\t\n\tdata = input.required<XiriDynData[]>();\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\tdyncomponent = input<TemplateRef<unknown>>();\n\t\n\tdataInt = computed( () => {\n\t\t\n\t\tlet data = this.data();\n\t\t\n\t\tif ( data === undefined || data === null )\n\t\t\treturn [];\n\t\tif ( !Array.isArray( data ) )\n\t\t\tdata = [ data ];\n\t\t\n\t\treturn data.map( ( d: XiriDynData ) => {\n\t\t\t\n\t\t\tif ( d.id === undefined )\n\t\t\t\td.id = Math.floor( Math.random() * 1000000 );\n\t\t\t\n\t\t\treturn d;\n\t\t} );\n\t} );\n\n\tresolveClass( obj: XiriDynData, fallback = 'xcol' ): string {\n\t\tif ( obj.display )\n\t\t\treturn obj.display;\n\t\tif ( obj.cols !== undefined )\n\t\t\treturn colsToClasses( obj.cols );\n\t\treturn fallback;\n\t}\n}\n","@for (obj of dataInt(); track obj.id) {\n\n\t@switch (obj.type) {\n\t\t@case ('card') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-4')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-card [settings]=\"$any(obj.data)\"></xiri-card>\n\t\t\t</div>\n\t\t}\n\t\t@case ('buttonline') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-buttonline [settings]=\"$any(obj.data)\" [filterData]=\"filterData()\"></xiri-buttonline>\n\t\t\t</div>\n\t\t}\n\t\t@case ('table') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-table [settings]=\"$any(obj.data)\" [filterData]=\"filterData()\" [dyncomponent]=\"selfdyncomponent\"></xiri-table>\n\t\t\t</div>\n\t\t}\n\t\t@case ('cardlink') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-4 xcol-lg-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-cardlink [settings]=\"$any(obj.data)\"></xiri-cardlink>\n\t\t\t</div>\n\t\t}\n\t\t@case ('links') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-4 xcol-lg-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-links [settings]=\"$any(obj.data)\"></xiri-links>\n\t\t\t</div>\n\t\t}\n\t\t@case ('form') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol form')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<mat-card class=\"mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t\t\t\t@if ($any(obj.data).header) {\n\t\t\t\t\t\t<mat-card-header>\n\t\t\t\t\t\t\t<mat-card-title>{{ $any(obj.data).header }}</mat-card-title>\n\t\t\t\t\t\t</mat-card-header>\n\t\t\t\t\t}\n\t\t\t\t\t<mat-card-content>\n\t\t\t\t\t\t<xiri-form [settings]=\"$any(obj.data)\"></xiri-form>\n\t\t\t\t\t</mat-card-content>\n\t\t\t\t</mat-card>\n\t\t\t</div>\n\t\t}\n\t\t@case ('query') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-query [settings]=\"$any(obj.data)\" [dyncomponent]=\"selfdyncomponent\"></xiri-query>\n\t\t\t</div>\n\t\t}\n\t\t@case ('stepper') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-stepper [settings]=\"$any(obj.data)\"></xiri-stepper>\n\t\t\t</div>\n\t\t}\n\t\t@case ('header') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-header [settings]=\"$any(obj.data)\"></xiri-header>\n\t\t\t</div>\n\t\t}\n\t\t@case ('list') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-list [settings]=\"$any(obj.data)\"></xiri-list>\n\t\t\t</div>\n\t\t}\n\t\t@case ('spacer') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<div class=\"spacer\"> </div>\n\t\t\t</div>\n\t\t}\n\t\t@case ('container') {\n\t\t\t@if (obj.data) {\n\t\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t\t<xiri-dyncomponent [data]=\"$any(obj.data).components\" [dyncomponent]=\"dyncomponent()\" class=\"xrow\"></xiri-dyncomponent>\n\t\t\t\t</div>\n\t\t\t}\n\t\t}\n\t\t@case ('infopoint') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-infopoint [settings]=\"$any(obj.data)\"></xiri-infopoint>\n\t\t\t</div>\n\t\t}\n\t\t@case ('multiprogress') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-4')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer (on viewport) { <xiri-multiprogress [settings]=\"$any(obj.data)\"></xiri-multiprogress> } @placeholder { <xiri-skeleton type=\"rect\" height=\"48px\" /> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('progress') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-4')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-progress [settings]=\"$any(obj.data)\"></xiri-progress>\n\t\t\t</div>\n\t\t}\n\t\t@case ('imagetext') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-4')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer (on viewport) { <xiri-imagetext [settings]=\"$any(obj.data)\"></xiri-imagetext> } @placeholder { <xiri-skeleton type=\"rect\" height=\"120px\" /> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('tabs') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-tabs [settings]=\"$any(obj.data)\" [filterData]=\"filterData()\" [dyncomponent]=\"selfdyncomponent\"></xiri-tabs>\n\t\t\t</div>\n\t\t}\n\t\t@case ('expansion') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-expansion [settings]=\"$any(obj.data)\" [filterData]=\"filterData()\" [dyncomponent]=\"selfdyncomponent\"></xiri-expansion>\n\t\t\t</div>\n\t\t}\n\t\t@case ('infotext') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@if ($any(obj.data).html) {\n\t\t\t\t\t<div class=\"infotext\" [innerHtml]=\"$any(obj.data).text | safeHtml\"></div>\n\t\t\t\t} @else {\n\t\t\t\t\t<div class=\"infotext\">{{ $any(obj.data).text }}</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t\t@case ('html') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<div class=\"html\" [innerHtml]=\"$any(obj.data).html | safeHtml\"></div>\n\t\t\t</div>\n\t\t}\n\t\t@case ('stat') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-4')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-stat [settings]=\"$any(obj.data)\"></xiri-stat>\n\t\t\t</div>\n\t\t}\n\t\t@case ('empty-state') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-empty-state [settings]=\"$any(obj.data)\"></xiri-empty-state>\n\t\t\t</div>\n\t\t}\n\t\t@case ('status') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-status [settings]=\"$any(obj.data)\"></xiri-status>\n\t\t\t</div>\n\t\t}\n\t\t@case ('callout') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-callout [settings]=\"$any(obj.data)\"></xiri-callout>\n\t\t\t</div>\n\t\t}\n\t\t@case ('timeline') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer (on viewport) { <xiri-timeline [settings]=\"$any(obj.data)\"></xiri-timeline> } @placeholder { <xiri-skeleton type=\"rect\" height=\"96px\" /> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('page-header') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer (on viewport) { <xiri-page-header [settings]=\"$any(obj.data)\"></xiri-page-header> } @placeholder { <xiri-skeleton type=\"rect\" height=\"64px\" /> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('section') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-section [settings]=\"$any(obj.data)\" [dyncomponent]=\"dyncomponent()\"></xiri-section>\n\t\t\t</div>\n\t\t}\n\t\t@case ('divider') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer (on viewport) { <xiri-divider [settings]=\"$any(obj.data)\"></xiri-divider> } @placeholder { <xiri-skeleton type=\"rect\" height=\"16px\" /> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('stat-grid') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-stat-grid [settings]=\"$any(obj.data)\"></xiri-stat-grid> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('multi-stat') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t<xiri-multi-stat [settings]=\"$any(obj.data)\"></xiri-multi-stat>\n\t\t\t</div>\n\t\t}\n\t\t@case ('toolbar') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-toolbar [settings]=\"$any(obj.data)\" [filterData]=\"filterData()\"></xiri-toolbar> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('description-list') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-description-list [settings]=\"$any(obj.data)\"></xiri-description-list> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('barchart') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-barchart [mode]=\"obj.mode ?? 'simple'\" [settings]=\"$any(obj.data)\"></xiri-barchart> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('linechart') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-linechart [settings]=\"$any(obj.data)\"></xiri-linechart> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('piechart') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-piechart [settings]=\"$any(obj.data)\"></xiri-piechart> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('gaugechart') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-gaugechart [settings]=\"$any(obj.data)\"></xiri-gaugechart> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('bulletchart') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol xcol-md-6 xcol-xl-3')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-bulletchart [settings]=\"$any(obj.data)\"></xiri-bulletchart> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('heatmap') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-heatmap [settings]=\"$any(obj.data)\"></xiri-heatmap> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('calendar') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-calendar [settings]=\"$any(obj.data)\"></xiri-calendar> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('tree') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-tree [settings]=\"$any(obj.data)\"></xiri-tree> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('sankey') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-sankey [settings]=\"$any(obj.data)\"></xiri-sankey> }\n\t\t\t</div>\n\t\t}\n\t\t@case ('gantt') {\n\t\t\t<div [class]=\"resolveClass(obj, 'xcol')\" [class.xcol-start]=\"obj.newRow\">\n\t\t\t\t@defer { <xiri-gantt [settings]=\"$any(obj.data)\"></xiri-gantt> }\n\t\t\t</div>\n\t\t}\n\t\t@default {\n\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent() || defaultComponentUnknown; context: { $implicit: obj, filterData: filterData() }\"></ng-container>\n\t\t}\n\t}\n}\n\n<ng-template #selfdyncomponent let-obj>\n\t<xiri-dyncomponent [data]=\"$any(obj).data\" [filterData]=\"$any(obj).filterData\" [dyncomponent]=\"dyncomponent()\" class=\"xrow\"></xiri-dyncomponent>\n</ng-template>\n<ng-template #defaultComponentUnknown let-obj>\n\t<div class=\"xcol\">unknown type: {{ $any(obj).type }}</div>\n</ng-template>\n","import { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriDynComponentComponent } from '../dyncomponent/dyncomponent.component';\nimport { XiriSidepanelConfig } from './sidepanel.service';\nimport { XiriSidepanelRef } from './sidepanel-ref';\n\n@Component( {\n\tselector: 'xiri-sidepanel',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstyleUrl: './sidepanel.component.scss',\n\timports: [ MatIconButton, MatIcon, XiriDynComponentComponent ],\n\thost: {\n\t\trole: 'dialog',\n\t\t'aria-modal': 'true',\n\t\t'[attr.aria-labelledby]': 'titleId()'\n\t},\n\ttemplate: `\n\t\t<div class=\"sidepanel-header\">\n\t\t\t<span class=\"sidepanel-title\" [id]=\"titleId()\">{{ config().title }}</span>\n\t\t\t<button mat-icon-button (click)=\"ref().close()\" aria-label=\"Schließen\"><mat-icon>close</mat-icon></button>\n\t\t</div>\n\t\t<div class=\"sidepanel-content\">\n\t\t\t@if (config().data) {\n\t\t\t\t<xiri-dyncomponent [data]=\"$any(config().data)\"></xiri-dyncomponent>\n\t\t\t}\n\t\t</div>\n\t`\n} )\nexport class XiriSidepanelComponent {\n\tconfig = input.required<XiriSidepanelConfig>();\n\tref = input.required<XiriSidepanelRef>();\n\n\tprotected readonly titleId = computed( () => this.config().title ? 'xiri-sidepanel-title' : null );\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';\nimport { ESCAPE } from '@angular/cdk/keycodes';\nimport { filter } from 'rxjs/operators';\nimport { XiriSidepanelComponent } from './sidepanel.component';\nimport { XiriSidepanelRef } from './sidepanel-ref';\n\nexport interface XiriSidepanelConfig {\n\ttitle?: string;\n\twidth?: string;\n\tdata?: unknown;\n}\n\n@Injectable( { providedIn: 'root' } )\nexport class XiriSidepanelService {\n\tprivate readonly overlay = inject( Overlay );\n\tprivate readonly focusTrapFactory = inject( ConfigurableFocusTrapFactory );\n\n\topen( config: XiriSidepanelConfig ): XiriSidepanelRef {\n\n\t\t// Element merken, das das Panel geöffnet hat, um den Fokus beim Schließen zurückzugeben.\n\t\tconst previouslyFocused = document.activeElement as HTMLElement | null;\n\n\t\tconst overlayRef = this.overlay.create( {\n\t\t\tpositionStrategy: this.overlay.position().global().right( '0' ).top( '0' ),\n\t\t\theight: '100%',\n\t\t\twidth: config.width ?? '420px',\n\t\t\thasBackdrop: true,\n\t\t\tpanelClass: 'xiri-sidepanel-overlay'\n\t\t} );\n\n\t\tconst ref = new XiriSidepanelRef( overlayRef, previouslyFocused );\n\n\t\tconst portal = new ComponentPortal( XiriSidepanelComponent );\n\t\tconst cmp = overlayRef.attach( portal );\n\t\tcmp.setInput( 'config', config );\n\t\tcmp.setInput( 'ref', ref );\n\n\t\t// Fokus im Panel halten (CDK Overlay macht das nicht automatisch, anders als MatDialog).\n\t\tconst focusTrap = this.focusTrapFactory.create( overlayRef.overlayElement );\n\t\tfocusTrap.focusInitialElementWhenReady();\n\t\toverlayRef.detachments().subscribe( () => focusTrap.destroy() );\n\n\t\toverlayRef.backdropClick().subscribe( () => ref.close() );\n\t\toverlayRef.keydownEvents().pipe( filter( e => e.keyCode === ESCAPE ) ).subscribe( () => ref.close() );\n\n\t\treturn ref;\n\t}\n}\n","import { Component, DestroyRef, OnInit, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n\tMAT_DIALOG_DATA,\n\tMatDialogRef,\n\tMatDialogTitle,\n\tMatDialogContent,\n\tMatDialogActions\n} from '@angular/material/dialog';\nimport { BreakpointObserver, Breakpoints, BreakpointState } from '@angular/cdk/layout';\nimport { XiriButton } from \"../button/button.component\";\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\nimport { XiriButtonstyleComponent } from '../buttonstyle/buttonstyle.component';\nimport { MatDivider } from '@angular/material/divider';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\n\n\nexport interface XiriAlertConfig {\n\theader: string\n\ttext: string\n\ticon: string\n\tbuttons: XiriButton[]\n}\n\n@Component( {\n\t selector: 'xiri-alert',\n\t templateUrl: './alert.component.html',\n\t styleUrls: [ './alert.component.scss' ],\n\t imports: [ MatDialogTitle,\n\t CdkScrollable,\n\t MatDialogContent,\n\t MatProgressSpinner,\n\t MatIcon,\n\t MatDivider,\n\t MatDialogActions,\n\t XiriButtonstyleComponent,\n\t SafehtmlPipe ]\n } )\nexport class XiriAlertComponent implements OnInit {\n\tdialogRef = inject<MatDialogRef<XiriAlertComponent>>( MatDialogRef );\n\tinitData = inject( MAT_DIALOG_DATA );\n\tprivate breakpointObserver = inject( BreakpointObserver );\n\tprivate destroyRef = inject( DestroyRef );\n\n\n\tloading = signal(true);\n\theader = signal('');\n\tbuttons = signal<XiriButton[]>([]);\n\ttext = signal('');\n\ticon = signal('warning');\n\n\tngOnInit() {\n\n\t\tthis.breakpointObserver\n\t\t\t.observe( [ Breakpoints.XSmall, Breakpoints.Small ] )\n\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t.subscribe( ( state: BreakpointState ) => {\n\t\t\t\tif ( state.matches )\n\t\t\t\t\tthis.dialogRef.updateSize( '80vw' );\n\t\t\t\telse\n\t\t\t\t\tthis.dialogRef.updateSize( '600px' );\n\t\t\t} );\n\n\t\tthis.loadData( this.initData );\n\t}\n\t\n\tprivate loadData( res: XiriAlertConfig ): void {\n\n\t\tif ( res.buttons ) {\n\t\t\tthis.header.set( res.header );\n\t\t\tthis.buttons.set( res.buttons );\n\t\t\tthis.text.set( res.text );\n\t\t\tthis.icon.set( res.icon ? res.icon : 'warning' );\n\t\t} else {\n\t\t\tthis.dialogRef.close( res );\n\t\t}\n\n\t\tthis.loading.set( false );\n\t}\n\t\n\tclickButton( button: XiriButton ): void {\n\n\t\tthis.dialogRef.close( button );\n\t}\n}\n","@if (!loading()) {\n\t<h1 mat-dialog-title>{{ header() }}</h1>\n}\n<mat-dialog-content>\n\t@if (loading()) {\n\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t} @else {\n\t\t<div class=\"content\">\n\t\t\t<div class=\"icon\">\n\t\t\t\t<mat-icon class=\"warn\" inline=\"true\">{{ icon() }}</mat-icon>\n\t\t\t</div>\n\t\t\t<div class=\"text\" [innerHtml]=\"text() | safeHtml\"></div>\n\t\t</div>\n\t}\n</mat-dialog-content>\n@if (!loading()) {\n\t<mat-divider></mat-divider>\n\t<mat-dialog-actions>\n\t\t@for (button of buttons(); track button) {\n\t\t\t<xiri-buttonstyle [button]=\"button\" [disabled]=\"false\" (click)=\"clickButton( button )\"></xiri-buttonstyle>\n\t\t}\n\t</mat-dialog-actions>\n}\n","import { Component, computed, input, signal } from '@angular/core';\nimport { SlicePipe } from '@angular/common';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatCard, MatCardAvatar, MatCardContent } from '@angular/material/card';\nimport { XiriColor } from '../types/color.type';\n\n\nexport interface XiriMultiprogressSettings {\n\tdata: XiriMultiprogressItem[]\n\theaderIcon?: string\n\theaderIconColor?: XiriColor\n\theader?: string\n\tshow?: number\n\tcompact?: boolean\n}\n\nexport interface XiriMultiprogressItem {\n\ttext: string\n\tvalue: string\n\tprogress: number\n\tcolor?: XiriColor\n}\n\n@Component( {\n\t selector: 'xiri-multiprogress',\n\t templateUrl: './multiprogress.component.html',\n\t styleUrls: [ './multiprogress.component.scss' ],\n\t imports: [ MatCard, MatCardAvatar, MatIcon, MatIconButton, MatCardContent, MatProgressBar, SlicePipe ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriMultiprogressComponent {\n\tpublic isOpen = signal<boolean>(false);\n\n\tsettings = input.required<XiriMultiprogressSettings>();\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n}\n","@if (compact()) {\n\t<div class=\"card xiri-multiprogress-flat\">\n\t\t<div class=\"header align-items-center\">\n\t\t\t@if (settings().headerIcon) {\n\t\t\t\t<div class=\"header-image\">\n\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t<span class=\"title\">{{ settings().header }}</span>\n\t\t\t@if (settings().show && settings().data.length > settings().show!) {\n\t\t\t\t<span class=\"open\">\n\t\t\t\t\t<button mat-icon-button class=\"d-btn\" (click)=\"isOpen.set(!isOpen())\" [attr.aria-label]=\"isOpen() ? 'Weniger anzeigen' : 'Mehr anzeigen'\" [attr.aria-expanded]=\"isOpen()\">\n\t\t\t\t\t\t@if (isOpen()) { <mat-icon>expand_less</mat-icon> } @else { <mat-icon>expand_more</mat-icon> }\n\t\t\t\t\t</button>\n\t\t\t\t</span>\n\t\t\t}\n\t\t</div>\n\t\t<div class=\"xiri-multiprogress-content\">\n\t\t\t@for (item of settings().data | slice:0:(isOpen() ? 999 : settings().show); track item) {\n\t\t\t\t<div class=\"item\">\n\t\t\t\t\t<div class=\"line\">\n\t\t\t\t\t\t<span class=\"text\">{{ item.text }}</span>\n\t\t\t\t\t\t<span class=\"value\">{{ item.value }}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<mat-progress-bar mode=\"determinate\" [class]=\"item.color\" [value]=\"item.progress\" class=\"bar\"></mat-progress-bar>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t</div>\n} @else {\n\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<div class=\"header align-items-center\">\n\t\t\t@if (settings().headerIcon) {\n\t\t\t\t<div mat-card-avatar class=\"header-image\">\n\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t<span class=\"title\">{{ settings().header }}</span>\n\t\t\t@if (settings().show && settings().data.length > settings().show!) {\n\t\t\t\t<span class=\"open\">\n\t\t\t\t\t<button mat-icon-button class=\"d-btn\" (click)=\"isOpen.set(!isOpen())\" [attr.aria-label]=\"isOpen() ? 'Weniger anzeigen' : 'Mehr anzeigen'\" [attr.aria-expanded]=\"isOpen()\">\n\t\t\t\t\t\t@if (isOpen()) { <mat-icon>expand_less</mat-icon> } @else { <mat-icon>expand_more</mat-icon> }\n\t\t\t\t\t</button>\n\t\t\t\t</span>\n\t\t\t}\n\t\t</div>\n\t\t<mat-card-content>\n\t\t\t@for (item of settings().data | slice:0:(isOpen() ? 999 : settings().show); track item) {\n\t\t\t\t<div class=\"item\">\n\t\t\t\t\t<div class=\"line\">\n\t\t\t\t\t\t<span class=\"text\">{{ item.text }}</span>\n\t\t\t\t\t\t<span class=\"value\">{{ item.value }}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<mat-progress-bar mode=\"determinate\" [class]=\"item.color\" [value]=\"item.progress\" class=\"bar\"></mat-progress-bar>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</mat-card-content>\n\t</mat-card>\n}\n","import { Component, computed, input, signal } from '@angular/core';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { XiriColor } from '../types/color.type';\nimport { MatIcon } from '@angular/material/icon';\nimport {\n\tMatCard,\n\tMatCardAvatar,\n\tMatCardContent,\n\tMatCardHeader,\n\tMatCardSubtitle,\n\tMatCardTitle\n} from '@angular/material/card';\n\nexport interface XiriImagetextSettings {\n\turl: string;\n\tinfo: string;\n\n\theaderIcon?: string\n\theaderIconColor?: XiriColor\n\theaderSub?: string\n\theader?: string\n\tcompact?: boolean\n}\n\n\n@Component( {\n\t selector: 'xiri-imagetext',\n\t templateUrl: './imagetext.component.html',\n\t styleUrl: './imagetext.component.scss',\n\t imports: [ MatCard,\n\t MatCardHeader,\n\t MatCardAvatar,\n\t MatIcon,\n\t MatCardTitle,\n\t MatCardSubtitle,\n\t MatCardContent,\n\t MatProgressSpinner ],\n\t host: { '[class.compact]': 'compact()' }\n } )\nexport class XiriImagetextComponent {\n\n\tsettings = input.required<XiriImagetextSettings>();\n\tloading = signal<boolean>( true )\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n}\n","@if (compact()) {\n\t<div class=\"card xiri-imagetext-flat\">\n\t\t@if (settings().header || settings().headerIcon) {\n\t\t\t<div class=\"xiri-imagetext-header align-items-center\">\n\t\t\t\t@if (settings().headerIcon) {\n\t\t\t\t\t<div class=\"header-image\">\n\t\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<div class=\"header-text\">\n\t\t\t\t\t@if (settings().header) {\n\t\t\t\t\t\t<div class=\"header-title\">{{ settings().header }}</div>\n\t\t\t\t\t}\n\t\t\t\t\t@if (settings().headerSub) {\n\t\t\t\t\t\t<div class=\"header-sub\">{{ settings().headerSub }}</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t}\n\t\t<div class=\"xiri-imagetext-content\">\n\t\t\t<mat-spinner [hidden]=\"!loading()\" diameter=\"30\"></mat-spinner>\n\t\t\t<img [hidden]=\"loading()\" (load)=\"loading.set(false)\" [src]=\"settings().url\" [alt]=\"settings().info\" id=\"ximg\"/>\n\t\t</div>\n\t</div>\n} @else {\n\t<mat-card class=\"card mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<mat-card-header class=\"align-items-center\">\n\t\t\t@if (settings().headerIcon) {\n\t\t\t\t<div mat-card-avatar class=\"header-image\">\n\t\t\t\t\t<mat-icon [class]=\"settings().headerIconColor || 'primary'\">{{ settings().headerIcon }}</mat-icon>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@if (settings().header) {\n\t\t\t\t<mat-card-title>{{ settings().header }}</mat-card-title>\n\t\t\t}\n\t\t\t@if (settings().headerSub) {\n\t\t\t\t<mat-card-subtitle>{{ settings().headerSub }}</mat-card-subtitle>\n\t\t\t}\n\t\t</mat-card-header>\n\t\t<mat-card-content>\n\t\t\t<mat-spinner [hidden]=\"!loading()\" diameter=\"30\"></mat-spinner>\n\t\t\t<img [hidden]=\"loading()\" (load)=\"loading.set(false)\" [src]=\"settings().url\" [alt]=\"settings().info\" id=\"ximg\"/>\n\t\t</mat-card-content>\n\t</mat-card>\n}\n","import { ChangeDetectorRef, Component, effect, inject, input } from '@angular/core';\nimport { filter } from \"rxjs\";\nimport { Event, NavigationEnd, Router, RouterLink } from \"@angular/router\";\nimport { XiriUrlPipe } from \"../pipes/url.pipe\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { MatIcon } from '@angular/material/icon';\nimport { MatListItem, MatListItemIcon, MatListItemMeta, MatListItemTitle } from '@angular/material/list';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\n\nexport interface XiriSidebarSettings {\n\t\n\tprefix: string\n\tfields: XiriNavigationField[]\n}\n\nexport interface XiriNavigationField {\n\tname: string\n\tlink?: string\n\ticon: string\n\ticonSet?: string\n\textern?: string\n\tactive?: boolean\n\tpath?: string\n\tregex?: RegExp\n\t\n\t// Leaves the entry out entirely — it never reaches the DOM, so no routerLink\n\t// stays behind. Meant for a backend that omits routes a user cannot open;\n\t// client-side filtering is not authorization, the routes must be gated anyway.\n\thide?: boolean\n\n\tmenu?: boolean\n\tshowSubmenu?: boolean\n\tsub?: XiriNavigationField[]\n}\n\n@Component( {\n\t selector: 'xiri-sidenav',\n\t templateUrl: './sidenav.component.html',\n\t styleUrls: [ './sidenav.component.scss' ],\n\t imports: [\n\t\t MatProgressSpinner,\n\t\t MatListItem,\n\t\t RouterLink,\n\t\t MatIcon,\n\t\t MatListItemIcon,\n\t\t MatListItemTitle,\n\t\t MatListItemMeta,\n\t\t XiriUrlPipe,\n\t ],\n } )\nexport class XiriSidenavComponent {\n\t\n\tprivate router: Router = inject( Router );\n\tprivate cdr: ChangeDetectorRef = inject( ChangeDetectorRef );\n\t\n\tsettings = input<XiriSidebarSettings>();\n\tloading = true;\n\tfields: XiriNavigationField[] = [];\n\tprivate prefix = '';\n\t\n\tconstructor() {\n\n\t\tthis.router.events.pipe(\n\t\t\tfilter( ( event: Event ) => event instanceof NavigationEnd ),\n\t\t\ttakeUntilDestroyed()\n\t\t).subscribe( ( route: NavigationEnd ) => {\n\t\t\tthis.checkUrl( route.urlAfterRedirects );\n\t\t} );\n\n\t\teffect( () => {\n\t\t\tconst value = this.settings();\n\n\t\t\tthis.loading = value == null || value.fields == null;\n\n\t\t\tif ( !this.loading && value != null ) {\n\t\t\t\tthis.fields = value.fields;\n\t\t\t\tthis.prefix = value.prefix;\n\n\t\t\t\tthis.compileRegex( this.fields );\n\n\t\t\t\tthis.checkUrl( this.router.url );\n\t\t\t} else {\n\t\t\t\tthis.fields = [];\n\t\t\t}\n\t\t} );\n\t}\n\t\n\tprivate compileRegex( fields: XiriNavigationField[] ): void {\n\n\t\tif ( !fields )\n\t\t\treturn;\n\n\t\tfor ( let i = 0; i != fields.length; i++ ) {\n\t\t\tconst field = fields[ i ];\n\n\t\t\tif ( field.path )\n\t\t\t\tfield.regex = new RegExp( '^' + field.path );\n\n\t\t\tif ( field.sub )\n\t\t\t\tthis.compileRegex( field.sub );\n\t\t}\n\t}\n\n\tprivate checkUrl( url: string ): void {\n\n\t\tif ( !this.fields )\n\t\t\treturn;\n\n\t\tif ( this.prefix ) {\n\t\t\tif ( url.startsWith( this.prefix ) )\n\t\t\t\turl = url.substring( this.prefix.length );\n\t\t}\n\n\t\tfor ( let i = 0; i != this.fields.length; i++ )\n\t\t\tthis.checkField( this.fields[ i ], url );\n\n\t\tthis.cdr.markForCheck();\n\t}\n\n\tprivate checkField( field: XiriNavigationField, url: string ): boolean {\n\n\t\t// A hidden entry is not rendered, so it must not activate or expand its parent either.\n\t\tif ( field.hide ) {\n\t\t\tfield.active = false;\n\t\t\treturn false;\n\t\t}\n\n\t\tconst matchesSelf = ( field.link != null && field.link == url ) || ( field.regex != null && field.regex.test( url ) );\n\n\t\tif ( field.menu ) {\n\n\t\t\tlet found = false;\n\t\t\tif ( field.sub ) {\n\t\t\t\tfor ( let i = 0; i != field.sub.length; i++ ) {\n\t\t\t\t\tif ( this.checkField( field.sub[ i ], url ) )\n\t\t\t\t\t\tfound = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfield.active = found || matchesSelf;\n\t\t\tfield.showSubmenu = field.active;\n\t\t\treturn field.active;\n\t\t}\n\n\t\tfield.active = matchesSelf;\n\t\treturn field.active;\n\t}\n\n}\n","@if (loading) {\n\t<div class=\"loading\">\n\t\t<mat-spinner diameter=\"30\"></mat-spinner>\n\t</div>\n}\n\n@for (nav of fields; track nav) {\n\n\t<!-- One guard per level, not per branch: a hidden entry can never slip through\n\t link/menu/extern. Structural, so no routerLink is left in the DOM. -->\n\t@if (!nav.hide) {\n\t\t@if ( nav.link ) {\n\t\t\t@let navUrl = nav.link | xiriUrl;\n\t\t\t<a mat-list-item [routerLink]=\"navUrl?.path\" [queryParams]=\"navUrl?.queryParams\" [class.active]=\"nav.active\">\n\t\t\t\t@if (nav.iconSet) {\n\t\t\t\t\t<mat-icon matListItemIcon [fontSet]=\"nav.iconSet\" [class]=\"nav.active ? 'primary' : 'accent'\">{{ nav.icon }}</mat-icon>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon matListItemIcon [class]=\"nav.active ? 'primary' : 'accent'\">{{ nav.icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<span matListItemTitle>{{ nav.name }}</span>\n\t\t\t</a>\n\t\t} @else if (nav.menu) {\n\t\t\t<mat-list-item (click)=\"nav.showSubmenu = !nav.showSubmenu\" (keydown.enter)=\"nav.showSubmenu = !nav.showSubmenu\" (keydown.space)=\"nav.showSubmenu = !nav.showSubmenu; $event.preventDefault()\" [attr.aria-expanded]=\"nav.showSubmenu\" class=\"parent\">\n\t\t\t\t@if (nav.iconSet) {\n\t\t\t\t\t<mat-icon matListItemIcon [fontSet]=\"nav.iconSet\" [class]=\"nav.active ? 'primary' : 'accent'\">{{ nav.icon }}</mat-icon>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon matListItemIcon [class]=\"nav.active ? 'primary' : 'accent'\">{{ nav.icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<span matListItemTitle>{{ nav.name }}</span>\n\t\t\t\t<span matListItemMeta>\n\t\t\t\t\t<mat-icon class=\"menu-button\" [class.rotated]=\"nav.showSubmenu\">expand_more</mat-icon>\n\t\t\t\t</span>\n\t\t\t</mat-list-item>\n\t\t\t<div class=\"submenu\" [class.expanded]=\"nav.showSubmenu\">\n\t\t\t\t@for (subnav of nav.sub; track subnav) {\n\t\t\t\t\t@if (!subnav.hide) {\n\t\t\t\t\t\t@if (subnav.link) {\n\t\t\t\t\t\t\t@let subnavUrl = subnav.link | xiriUrl;\n\t\t\t\t\t\t\t<a mat-list-item [routerLink]=\"subnavUrl?.path\" [queryParams]=\"subnavUrl?.queryParams\" [class.active]=\"subnav.active\">{{ subnav.name }}</a>\n\t\t\t\t\t\t} @else if (subnav.menu) {\n\t\t\t\t\t\t\t<mat-list-item (click)=\"subnav.showSubmenu = !subnav.showSubmenu\" (keydown.enter)=\"subnav.showSubmenu = !subnav.showSubmenu\" (keydown.space)=\"subnav.showSubmenu = !subnav.showSubmenu; $event.preventDefault()\" [attr.aria-expanded]=\"subnav.showSubmenu\" class=\"parent\">\n\t\t\t\t\t\t\t\t<span matListItemTitle>{{ subnav.name }}</span>\n\t\t\t\t\t\t\t\t<span matListItemMeta>\n\t\t\t\t\t\t\t\t\t<mat-icon class=\"menu-button\" [class.rotated]=\"subnav.showSubmenu\">expand_more</mat-icon>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</mat-list-item>\n\t\t\t\t\t\t\t<div class=\"submenu submenu-nested\" [class.expanded]=\"subnav.showSubmenu\">\n\t\t\t\t\t\t\t\t@for (subsubnav of subnav.sub; track subsubnav) {\n\t\t\t\t\t\t\t\t\t@if (!subsubnav.hide) {\n\t\t\t\t\t\t\t\t\t\t@if (subsubnav.link) {\n\t\t\t\t\t\t\t\t\t\t\t@let subsubnavUrl = subsubnav.link | xiriUrl;\n\t\t\t\t\t\t\t\t\t\t\t<a mat-list-item [routerLink]=\"subsubnavUrl?.path\" [queryParams]=\"subsubnavUrl?.queryParams\" [class.active]=\"subsubnav.active\">{{ subsubnav.name }}</a>\n\t\t\t\t\t\t\t\t\t\t} @else if (subsubnav.extern) {\n\t\t\t\t\t\t\t\t\t\t\t<a mat-list-item [href]=\"subsubnav.extern\">{{ subsubnav.name }}</a>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t} @else if (subnav.extern) {\n\t\t\t\t\t\t\t<a mat-list-item [href]=\"subnav.extern\">{{ subnav.name }}</a>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</div>\n\t\t} @else if (nav.extern) {\n\t\t\t<a mat-list-item [href]=\"nav.extern\">\n\t\t\t\t@if (nav.iconSet) {\n\t\t\t\t\t<mat-icon matListItemIcon [fontSet]=\"nav.iconSet\" class=\"accent\">{{ nav.icon }}</mat-icon>\n\t\t\t\t} @else {\n\t\t\t\t\t<mat-icon matListItemIcon class=\"accent\">{{ nav.icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<span matListItemTitle>{{ nav.name }}</span>\n\t\t\t</a>\n\t\t}\n\t}\n}\n","import { Component, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { RouterLink } from '@angular/router';\nimport { XiriUrlPipe } from '../pipes/url.pipe';\n\nexport interface XiriBreadcrumbItem {\n\tlabel: string;\n\tlink?: string;\n\ticon?: string;\n\textern?: boolean;\n}\n\n@Component( {\n\t selector: 'xiri-breadcrumb',\n\t templateUrl: './breadcrumb.component.html',\n\t styleUrl: './breadcrumb.component.scss',\n\t imports: [ MatIcon, RouterLink, XiriUrlPipe ]\n } )\nexport class XiriBreadcrumbComponent {\n\n\tsettings = input.required<XiriBreadcrumbItem[]>();\n}\n","<nav class=\"breadcrumb\" aria-label=\"Breadcrumb\">\n\t<ol>\n\t\t@for (item of settings(); track $index; let last = $last) {\n\t\t\t<li [class.active]=\"last\">\n\t\t\t\t@if (item.link) {\n\t\t\t\t\t@if (item.extern) {\n\t\t\t\t\t\t<a [href]=\"item.link\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t<mat-icon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t@let itemUrl = item.link | xiriUrl;\n\t\t\t\t\t\t<a [routerLink]=\"itemUrl?.path\" [queryParams]=\"itemUrl?.queryParams\">\n\t\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t\t<mat-icon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t}\n\t\t\t\t} @else {\n\t\t\t\t\t<span>\n\t\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t\t<mat-icon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{{ item.label }}\n\t\t\t\t\t</span>\n\t\t\t\t}\n\t\t\t\t@if (!last) {\n\t\t\t\t\t<mat-icon class=\"separator\">chevron_right</mat-icon>\n\t\t\t\t}\n\t\t\t</li>\n\t\t}\n\t</ol>\n</nav>\n","import { Component, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriColor } from '../types/color.type';\n\nexport interface XiriTimelineItem {\n\ttitle: string;\n\tdescription?: string;\n\tdatetime?: string;\n\ticon?: string;\n\ticonColor?: XiriColor;\n}\n\nexport interface XiriTimelineSettings {\n\titems: XiriTimelineItem[];\n\torientation?: 'horizontal' | 'vertical';\n}\n\n@Component( {\n\t selector: 'xiri-timeline',\n\t templateUrl: './timeline.component.html',\n\t styleUrl: './timeline.component.scss',\n\t imports: [ MatIcon ]\n } )\nexport class XiriTimelineComponent {\n\n\tsettings = input.required<XiriTimelineSettings>();\n}\n","<div class=\"timeline\" [class.horizontal]=\"settings().orientation === 'horizontal'\">\n\t@for (item of settings().items; track $index; let last = $last; let first = $first) {\n\t\t<div class=\"timeline-item\" [class.last]=\"last\" [class.first]=\"first\">\n\t\t\t<div class=\"timeline-marker\">\n\t\t\t\t<div class=\"timeline-line line-before\"></div>\n\t\t\t\t<div class=\"timeline-dot\" [class]=\"item.iconColor || 'primary'\">\n\t\t\t\t\t@if (item.icon) {\n\t\t\t\t\t\t<mat-icon>{{ item.icon }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"timeline-line line-after\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"timeline-content\">\n\t\t\t\t<div class=\"timeline-header\">\n\t\t\t\t\t<span class=\"timeline-title\">{{ item.title }}</span>\n\t\t\t\t\t@if (item.datetime) {\n\t\t\t\t\t\t<span class=\"timeline-datetime\">{{ item.datetime }}</span>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t@if (item.description && settings().orientation !== 'horizontal') {\n\t\t\t\t\t<div class=\"timeline-description\">{{ item.description }}</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t}\n</div>\n","import {\n\tAfterViewInit,\n\tComponent,\n\tcomputed,\n\tDestroyRef,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tNgZone,\n\tOnDestroy,\n\toutput,\n\tsignal,\n\tviewChild,\n\tViewEncapsulation\n} from '@angular/core';\nimport { MatCard, MatCardContent } from '@angular/material/card';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsCallbackParams } from './params';\n\n/** Payload emitted when a chart data item (bar, slice, point, …) is clicked. */\nexport interface XiriEchartsClick {\n\tcomponentType: string; // 'series' for a data-point click\n\tseriesType: string;\n\tseriesIndex: number;\n\tdataIndex: number;\n\tname: string;\n\tvalue: unknown;\n}\n\n/** Minimal structural view of the echarts instance methods the host uses. */\ninterface XiriEchartsInstance {\n\ton( event: string, handler: ( params: XiriEchartsCallbackParams ) => void ): void;\n\tsetOption( option: unknown, notMerge?: boolean ): void;\n\tresize(): void;\n\tdispose(): void;\n}\n\n/** Minimal structural view of the lazily-imported echarts module. */\ninterface XiriEchartsModule {\n\tinit( el: HTMLElement ): XiriEchartsInstance;\n}\n\n/**\n * `xiri-echarts-host` — shared echarts plumbing for all chart components.\n *\n * Handles lazy `import('echarts')`, init / setOption / dispose, ResizeObserver,\n * the optional mat-card surface (with header + compact mode), and a flat\n * variant when nested inside another card.\n *\n * Specialized chart components (`xiri-barchart`, `xiri-linechart`, …) build\n * a typed echarts option from their settings and feed it via the `option`\n * input. Each re-emit of `option` re-renders the chart with `setOption(option, true)`.\n *\n * Compact-Mode strips the outer mat-card so the chart sits flat inside an\n * outer xiri-card without card-in-card visuals.\n */\n@Component( {\n\tselector: 'xiri-echarts-host',\n\ttemplateUrl: './echarts-host.component.html',\n\tstyleUrl: './echarts-host.component.scss',\n\tencapsulation: ViewEncapsulation.None,\n\timports: [ MatCard, MatCardContent, MatIcon ],\n\thost: { '[class.compact]': 'compact()' }\n} )\nexport class XiriEchartsHostComponent implements AfterViewInit, OnDestroy {\n\n\toption = input.required<unknown>();\n\tcompact = input<boolean>( false );\n\ttitle = input<string | undefined>( undefined );\n\theaderIcon = input<string | undefined>( undefined );\n\theaderIconColor = input<XiriColor | undefined>( undefined );\n\tchartHeight = input<string>( '200px' );\n\n\t// Emitted when a data item (bar, slice, point, …) is clicked.\n\titemClick = output<XiriEchartsClick>();\n\n\tchartHostRef = viewChild.required<ElementRef<HTMLDivElement>>( 'chartHost' );\n\n\tprivate zone = inject( NgZone );\n\tprivate destroyRef = inject( DestroyRef );\n\n\tprivate chart: XiriEchartsInstance | null = null;\n\tprivate echarts: XiriEchartsModule | null = null;\n\tprivate resizeObserver: ResizeObserver | null = null;\n\tprivate loadError = signal<string | null>( null );\n\n\treadonly error = this.loadError.asReadonly();\n\treadonly hasHeader = computed( () => !!( this.title() || this.headerIcon() ) );\n\n\tconstructor() {\n\t\teffect( () => {\n\t\t\t// Re-render whenever the option changes.\n\t\t\tthis.option();\n\t\t\tif ( this.chart ) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t} );\n\t}\n\n\tasync ngAfterViewInit(): Promise<void> {\n\t\ttry {\n\t\t\tthis.echarts = await import( 'echarts' ) as unknown as XiriEchartsModule;\n\t\t} catch {\n\t\t\tthis.loadError.set( 'echarts is not installed. Add `npm install echarts` to your app.' );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.zone.runOutsideAngular( () => {\n\t\t\tthis.chart = this.echarts!.init( this.chartHostRef().nativeElement );\n\n\t\t\tthis.chart.on( 'click', ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\tif ( p.componentType !== 'series' )\n\t\t\t\t\treturn;\n\t\t\t\tthis.zone.run( () => this.itemClick.emit( {\n\t\t\t\t\tcomponentType: p.componentType ?? '',\n\t\t\t\t\tseriesType: p.seriesType ?? '',\n\t\t\t\t\tseriesIndex: p.seriesIndex ?? 0,\n\t\t\t\t\tdataIndex: p.dataIndex,\n\t\t\t\t\tname: p.name ?? '',\n\t\t\t\t\tvalue: p.value,\n\t\t\t\t} ) );\n\t\t\t} );\n\n\t\t\tthis.render();\n\n\t\t\tthis.resizeObserver = new ResizeObserver( () => this.chart?.resize() );\n\t\t\tthis.resizeObserver.observe( this.chartHostRef().nativeElement );\n\t\t} );\n\n\t\tthis.destroyRef.onDestroy( () => this.dispose() );\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.dispose();\n\t}\n\n\tprivate dispose(): void {\n\t\tthis.resizeObserver?.disconnect();\n\t\tthis.resizeObserver = null;\n\t\tthis.chart?.dispose();\n\t\tthis.chart = null;\n\t}\n\n\tprivate render(): void {\n\t\tif ( !this.chart ) return;\n\t\tconst opt = this.option();\n\t\tif ( !opt ) return;\n\t\tthis.chart.setOption( opt, true );\n\t}\n}\n","@if (compact()) {\n\t<div class=\"xiri-echarts xiri-echarts-flat\">\n\t\t@if (hasHeader()) {\n\t\t\t<div class=\"xiri-echarts-header\">\n\t\t\t\t@if (headerIcon()) {\n\t\t\t\t\t<mat-icon [class]=\"headerIconColor() || 'primary'\">{{ headerIcon() }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t@if (title()) {\n\t\t\t\t\t<div class=\"xiri-echarts-title\">{{ title() }}</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t\t<div #chartHost class=\"xiri-echarts-host\" [style.height]=\"chartHeight()\"></div>\n\t\t@if (error()) {\n\t\t\t<div class=\"xiri-echarts-error\">{{ error() }}</div>\n\t\t}\n\t</div>\n} @else {\n\t<mat-card class=\"xiri-echarts mat-mdc-elevation-specific mat-elevation-z2\">\n\t\t<mat-card-content>\n\t\t\t@if (hasHeader()) {\n\t\t\t\t<div class=\"xiri-echarts-header\">\n\t\t\t\t\t@if (headerIcon()) {\n\t\t\t\t\t\t<mat-icon [class]=\"headerIconColor() || 'primary'\">{{ headerIcon() }}</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (title()) {\n\t\t\t\t\t\t<div class=\"xiri-echarts-title\">{{ title() }}</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t<div #chartHost class=\"xiri-echarts-host\" [style.height]=\"chartHeight()\"></div>\n\t\t\t@if (error()) {\n\t\t\t\t<div class=\"xiri-echarts-error\">{{ error() }}</div>\n\t\t\t}\n\t\t</mat-card-content>\n\t</mat-card>\n}\n","import { signal } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\n\n/**\n * Maps semantic XiriColor names to CSS color values.\n *\n * Theme tokens reference the theme variables written by `xirimat.theming()`;\n * extended tokens are fixed brand colors that work in light and dark alike.\n * Anything referencing a variable is resolved by `resolveColor()` before it\n * reaches echarts — see there for why.\n */\nexport const COLOR_CSS_VAR: Record<string, string> = {\n\tprimary: 'var(--primary)',\n\tsecondary: 'var(--secondary)',\n\ttertiary: 'var(--tertiary)',\n\taccent: 'var(--tertiary)',\n\twarn: '#f5a623',\n\terror: 'var(--error)',\n\tsuccess: '#2e7d32',\n\temerald: '#10b981',\n\tred: '#e53935',\n\tyellow: '#fbc02d',\n\tgreen: '#43a047',\n\tblue: '#1e88e5',\n\tpurple: '#8b5cf6',\n\torange: '#fb8c00',\n\tgray: '#9e9e9e',\n\tlightgray: '#cfcfcf',\n\tdarkgray: '#616161',\n\twhite: '#ffffff',\n\tblack: '#000000',\n\tinherit: 'currentColor'\n};\n\n/**\n * Bumped whenever the active theme changes. `resolveColor()` reads it, so the\n * `computed()` that builds a chart option re-evaluates on a theme switch and\n * the chart is re-rendered with the new colors — without every chart component\n * having to know about the theme.\n */\nconst themeEpoch = signal( 0 );\n\n/** Called by XiriThemeService after it applied a theme class. */\nexport function notifyThemeChanged(): void {\n\tthemeEpoch.update( v => v + 1 );\n}\n\n/**\n * Reads a `var(--x)` / `var(--x, y)` expression off the document root.\n * Returns undefined when there is no document (SSR) or the variable is unset.\n */\nfunction readCssVar( expression: string ): string | undefined {\n\tif ( typeof document === 'undefined' ) return undefined;\n\n\tconst name = expression.slice( 4, -1 ).split( ',' )[ 0 ].trim();\n\tconst value = getComputedStyle( document.documentElement ).getPropertyValue( name ).trim();\n\treturn value || undefined;\n}\n\n/**\n * Resolves a XiriColor token to a concrete CSS color usable in echarts options.\n *\n * echarts draws on a canvas, where neither `var(--x)` nor `currentColor` is a\n * valid color — both have to be resolved to a literal first, or the series ends\n * up with no color at all. Unknown tokens fall back to the given fallback.\n */\nexport function resolveColor( color: XiriColor | string | undefined, fallback = '#8b5cf6' ): string {\n\tthemeEpoch(); // track theme changes, see notifyThemeChanged()\n\n\tif ( !color ) return fallback;\n\n\tconst mapped = COLOR_CSS_VAR[ color ];\n\tif ( mapped === undefined ) return fallback;\n\n\tif ( mapped.startsWith( 'var(' ) )\n\t\treturn readCssVar( mapped ) ?? fallback;\n\n\t// \"inherit\" means the surrounding text color, which a canvas cannot inherit.\n\tif ( mapped === 'currentColor' ) {\n\t\tif ( typeof document === 'undefined' ) return fallback;\n\t\treturn getComputedStyle( document.documentElement ).color || fallback;\n\t}\n\n\treturn mapped;\n}\n\n/**\n * Default categorical palette used by charts (line/pie/sankey) to color series\n * when no explicit color is provided. Indexed via `FALLBACK_COLORS[i % length]`.\n */\nexport const FALLBACK_COLORS = [ '#8b5cf6', '#10b981', '#1e88e5', '#fb8c00', '#e53935', '#fbc02d', '#43a047', '#616161' ];\n","/** Escapes characters that would otherwise be interpreted as HTML in echarts tooltip strings. */\nexport function escapeHtml( s: string ): string {\n\treturn String( s ?? '' )\n\t\t.replace( /&/g, '&' )\n\t\t.replace( /</g, '<' )\n\t\t.replace( />/g, '>' )\n\t\t.replace( /\"/g, '"' );\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsClick, XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor } from '../echarts/color';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsCallbackParams, XiriEchartsTooltipParams } from '../echarts/params';\n\nexport type XiriBarChartMode = 'simple' | 'stacked' | 'heatmap';\n\nexport interface XiriBarChartSegment {\n\tvalue: number;\n\tcolor?: XiriColor;\n\tname?: string;\n}\n\nexport interface XiriBarChartBar {\n\tlabel: string;\n\tvalue?: number;\n\tsegments?: XiriBarChartSegment[];\n\tname?: string;\n\turl?: string;\n\ttext?: string; // overrides the on-bar label (when showValues is on)\n}\n\nexport interface XiriBarChartPoint {\n\ttime: number;\n\tvalue: number;\n\tname?: string;\n\turl?: string;\n}\n\nexport interface XiriBarChartSettings {\n\ttitle?: string;\n\tyMin?: number;\n\tyMax?: number;\n\tcolor?: XiriColor;\n\tbars?: XiriBarChartBar[];\n\tpoints?: XiriBarChartPoint[];\n\tcompact?: boolean;\n\tshowValues?: boolean; // show value/text labels on bars\n\tlabelPosition?: 'top' | 'inside'; // default 'top'\n\txLabelRotate?: number; // rotate x-axis labels by degrees (-90..90), 90 = vertical\n}\n\n@Component( {\n\tselector: 'xiri-barchart',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[chartHeight]=\"chartHeight()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t(itemClick)=\"onItemClick($event)\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriBarChartComponent {\n\n\tmode = input<XiriBarChartMode | string>( 'simple' );\n\tsettings = input.required<XiriBarChartSettings>();\n\n\tprivate router = inject( Router );\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\t// Rotierte X-Achsen-Labels brauchen vertikalen Platz. Bei fixer 200px-Höhe würden\n\t// lange, schräg/vertikal gestellte Labels sonst unten abgeschnitten.\n\tchartHeight = computed<string>( () => {\n\t\tif ( this.compact() ) return '200px';\n\t\tconst rot = Math.abs( this.settings().xLabelRotate ?? 0 );\n\t\tif ( rot >= 60 ) return '280px';\n\t\tif ( rot >= 30 ) return '250px';\n\t\treturn '200px';\n\t} );\n\n\tonItemClick( e: XiriEchartsClick ): void {\n\t\tconst s = this.settings();\n\t\tconst coll = this.mode() === 'heatmap' ? s.points : s.bars;\n\t\tconst url = coll?.[ e.dataIndex ]?.url;\n\t\tif ( !url )\n\t\t\treturn;\n\t\tif ( /^https?:\\/\\//.test( url ) )\n\t\t\twindow.open( url, '_blank' );\n\t\telse\n\t\t\tthis.router.navigateByUrl( url );\n\t}\n\n\toption = computed( () => {\n\t\tconst m = this.mode();\n\t\tswitch ( m ) {\n\t\t\tcase 'stacked': return this.stackedOption();\n\t\t\tcase 'heatmap': return this.heatmapOption();\n\t\t\tdefault: return this.simpleOption();\n\t\t}\n\t} );\n\n\t// X-axis labels. Always return a config object — `axisLabel: undefined` suppresses\n\t// the category labels entirely in echarts. interval: 0 forces all labels when rotated\n\t// (they fit at an angle); otherwise echarts thins them automatically to avoid overlap.\n\tprivate xLabelConfig() {\n\t\tconst r = this.settings().xLabelRotate;\n\t\treturn r != null ? { rotate: r, interval: 0 } : { rotate: 0 };\n\t}\n\n\tprivate baseGrid() {\n\t\t// Compact mode: outer card already provides padding — shrink the\n\t\t// echarts grid so we don't get a \"double margin\".\n\t\tif ( this.compact() ) {\n\t\t\treturn { left: 0, right: 0, top: 4, bottom: 0, containLabel: true };\n\t\t}\n\t\t// Wert-Labels stehen über den Balken (position 'top') und fallen NICHT unter\n\t\t// containLabel — ohne zusätzlichen Rand oben werden sie am Canvas-Rand gekappt.\n\t\tconst s = this.settings();\n\t\tconst topLabels = !!s.showValues && s.labelPosition !== 'inside';\n\t\treturn { left: 32, right: 16, top: topLabels ? 34 : 24, bottom: 24, containLabel: true };\n\t}\n\n\tprivate simpleOption() {\n\t\tconst s = this.settings();\n\t\tconst bars = s.bars ?? [];\n\t\tconst color = resolveColor( s.color, '#8b5cf6' );\n\t\treturn {\n\t\t\tgrid: this.baseGrid(),\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'axis',\n\t\t\t\tformatter: ( params: XiriEchartsTooltipParams ) => {\n\t\t\t\t\tconst arr = Array.isArray( params ) ? params : [ params ];\n\t\t\t\t\tif ( !arr.length ) return '';\n\t\t\t\t\tconst p = arr[ 0 ];\n\t\t\t\t\tconst bar = bars[ p.dataIndex ];\n\t\t\t\t\tconst header = bar?.name ?? bar?.label ?? p.axisValueLabel ?? '';\n\t\t\t\t\treturn `<b>${ escapeHtml( header ) }</b><br/>${ p.marker }${ p.value }`;\n\t\t\t\t}\n\t\t\t},\n\t\t\txAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: bars.map( b => b.label ),\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false },\n\t\t\t\taxisLabel: this.xLabelConfig()\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'value',\n\t\t\t\tmin: s.yMin,\n\t\t\t\tmax: s.yMax,\n\t\t\t\tsplitLine: { lineStyle: { color: '#eee' } }\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'bar',\n\t\t\t\tdata: bars.map( b => ( {\n\t\t\t\t\tvalue: b.value ?? 0,\n\t\t\t\t\titemStyle: { cursor: b.url ? 'pointer' : 'default' }\n\t\t\t\t} ) ),\n\t\t\t\titemStyle: { color, borderRadius: [ 3, 3, 0, 0 ] },\n\t\t\t\tbarCategoryGap: '40%',\n\t\t\t\tlabel: {\n\t\t\t\t\tshow: !!s.showValues,\n\t\t\t\t\tposition: s.labelPosition === 'inside' ? 'inside' : 'top',\n\t\t\t\t\tcolor: s.labelPosition === 'inside' ? '#fff' : undefined,\n\t\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => bars[ p.dataIndex ]?.text ?? String( p.value )\n\t\t\t\t}\n\t\t\t} ]\n\t\t};\n\t}\n\n\tprivate stackedOption() {\n\t\tconst s = this.settings();\n\t\tconst bars = s.bars ?? [];\n\t\tconst segCount = Math.max( 0, ...bars.map( b => b.segments?.length ?? 0 ) );\n\n\t\t// Derive a default series name per segment-position from the first bar that has it.\n\t\tconst seriesNames: string[] = [];\n\t\tfor ( let i = 0; i < segCount; i++ ) {\n\t\t\tconst found = bars.find( b => b.segments?.[ i ]?.name )?.segments?.[ i ]?.name;\n\t\t\tseriesNames.push( found ?? '' );\n\t\t}\n\n\t\tconst series: unknown[] = [];\n\t\tfor ( let i = 0; i < segCount; i++ ) {\n\t\t\tseries.push( {\n\t\t\t\ttype: 'bar',\n\t\t\t\tstack: 'total',\n\t\t\t\tname: seriesNames[ i ] || `Segment ${ i + 1 }`,\n\t\t\t\tbarCategoryGap: '40%',\n\t\t\t\tlabel: {\n\t\t\t\t\tshow: !!s.showValues,\n\t\t\t\t\tposition: 'inside',\n\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => ( p.value === 0 ? '' : String( p.value ) )\n\t\t\t\t},\n\t\t\t\tdata: bars.map( b => {\n\t\t\t\t\tconst seg = b.segments?.[ i ];\n\t\t\t\t\tif ( !seg ) return { value: 0, itemStyle: { color: 'transparent' } };\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalue: seg.value,\n\t\t\t\t\t\tname: seg.name ?? seriesNames[ i ] ?? '',\n\t\t\t\t\t\titemStyle: { color: resolveColor( seg.color, '#9e9e9e' ), cursor: b.url ? 'pointer' : 'default' }\n\t\t\t\t\t};\n\t\t\t\t} )\n\t\t\t} );\n\t\t}\n\n\t\treturn {\n\t\t\tgrid: this.baseGrid(),\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'axis',\n\t\t\t\tformatter: ( params: XiriEchartsTooltipParams ) => {\n\t\t\t\t\tconst arr = Array.isArray( params ) ? params : [ params ];\n\t\t\t\t\tif ( !arr.length ) return '';\n\t\t\t\t\tconst idx = arr[ 0 ].dataIndex;\n\t\t\t\t\tconst bar = bars[ idx ];\n\t\t\t\t\tconst header = bar?.name ?? bar?.label ?? '';\n\t\t\t\t\tlet body = '';\n\t\t\t\t\tfor ( const p of arr ) {\n\t\t\t\t\t\tif ( !p.value && p.value !== 0 ) continue;\n\t\t\t\t\t\tif ( p.value === 0 ) continue;\n\t\t\t\t\t\tconst seg = bar?.segments?.[ p.seriesIndex ?? 0 ];\n\t\t\t\t\t\tconst label = seg?.name ?? p.seriesName ?? '';\n\t\t\t\t\t\tbody += `<br/>${ p.marker }${ escapeHtml( label ) }: <b>${ p.value }</b>`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `<b>${ escapeHtml( header ) }</b>${ body }`;\n\t\t\t\t}\n\t\t\t},\n\t\t\txAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: bars.map( b => b.label ),\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false },\n\t\t\t\taxisLabel: this.xLabelConfig()\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'value',\n\t\t\t\tmin: s.yMin,\n\t\t\t\tmax: s.yMax,\n\t\t\t\tsplitLine: { lineStyle: { color: '#eee' } }\n\t\t\t},\n\t\t\tseries\n\t\t};\n\t}\n\n\tprivate heatmapOption() {\n\t\tconst s = this.settings();\n\t\tconst points = s.points ?? [];\n\t\tconst color = resolveColor( s.color, '#8b5cf6' );\n\t\treturn {\n\t\t\tgrid: { ...this.baseGrid(), left: 8, right: 8 },\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'axis',\n\t\t\t\tformatter: ( params: XiriEchartsTooltipParams ) => {\n\t\t\t\t\tconst arr = Array.isArray( params ) ? params : [ params ];\n\t\t\t\t\tif ( !arr.length ) return '';\n\t\t\t\t\tconst p = arr[ 0 ];\n\t\t\t\t\tconst point = points[ p.dataIndex ];\n\t\t\t\t\tconst val = p.value as number[];\n\t\t\t\t\tconst date = new Date( val[ 0 ] ).toLocaleString();\n\t\t\t\t\tconst head = point?.name ? `<b>${ escapeHtml( point.name ) }</b><br/>` : '';\n\t\t\t\t\treturn `${ head }${ escapeHtml( date ) }<br/>${ p.marker }<b>${ val[ 1 ] }</b>`;\n\t\t\t\t}\n\t\t\t},\n\t\t\txAxis: {\n\t\t\t\ttype: 'time',\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false },\n\t\t\t\tsplitLine: { show: false }\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'value',\n\t\t\t\tmin: s.yMin ?? 0,\n\t\t\t\tmax: s.yMax,\n\t\t\t\tshow: false\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'bar',\n\t\t\t\tbarMinWidth: 1,\n\t\t\t\tbarMaxWidth: 3,\n\t\t\t\tdata: points.map( p => ( {\n\t\t\t\t\tvalue: [ p.time, p.value ],\n\t\t\t\t\titemStyle: { cursor: p.url ? 'pointer' : 'default' }\n\t\t\t\t} ) ),\n\t\t\t\titemStyle: { color }\n\t\t\t} ]\n\t\t};\n\t}\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor, FALLBACK_COLORS } from '../echarts/color';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsTooltipParams } from '../echarts/params';\n\nexport interface XiriLineChartLine {\n\tname: string;\n\tvalues: number[];\n\tcolor?: XiriColor;\n\tdashed?: boolean;\n\tarea?: boolean; // fill area below the line\n}\n\nexport interface XiriLineChartSettings {\n\ttitle?: string;\n\txLabels: string[];\n\tlines: XiriLineChartLine[];\n\tyMin?: number;\n\tyMax?: number;\n\tsmooth?: boolean;\n\tcompact?: boolean;\n\txLabelRotate?: number; // rotate x-axis labels by degrees (-90..90), 90 = vertical\n}\n\n@Component( {\n\tselector: 'xiri-linechart',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[chartHeight]=\"chartHeight()\"\n\t\t\t[title]=\"settings().title\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriLineChartComponent {\n\n\tsettings = input.required<XiriLineChartSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\t// Rotierte X-Achsen-Labels brauchen vertikalen Platz — sonst unten abgeschnitten.\n\tchartHeight = computed<string>( () => {\n\t\tif ( this.compact() ) return '200px';\n\t\tconst rot = Math.abs( this.settings().xLabelRotate ?? 0 );\n\t\tif ( rot >= 60 ) return '280px';\n\t\tif ( rot >= 30 ) return '250px';\n\t\treturn '200px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst lines = s.lines ?? [];\n\t\tconst labels = s.xLabels ?? [];\n\n\t\tconst series = lines.map( ( line, i ) => {\n\t\t\tconst color = resolveColor( line.color, FALLBACK_COLORS[ i % FALLBACK_COLORS.length ] );\n\t\t\treturn {\n\t\t\t\ttype: 'line',\n\t\t\t\tname: line.name,\n\t\t\t\tsmooth: !!s.smooth,\n\t\t\t\tsymbol: 'circle',\n\t\t\t\tsymbolSize: 6,\n\t\t\t\tlineStyle: {\n\t\t\t\t\twidth: 2,\n\t\t\t\t\ttype: line.dashed ? 'dashed' : 'solid',\n\t\t\t\t\tcolor,\n\t\t\t\t},\n\t\t\t\titemStyle: { color },\n\t\t\t\tareaStyle: line.area ? { color, opacity: 0.15 } : undefined,\n\t\t\t\tdata: line.values,\n\t\t\t};\n\t\t} );\n\n\t\treturn {\n\t\t\tgrid: this.compact()\n\t\t\t\t? { left: 0, right: 0, top: 4, bottom: 0, containLabel: true }\n\t\t\t\t: { left: 32, right: 16, top: 24, bottom: 24, containLabel: true },\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'axis',\n\t\t\t\tformatter: ( params: XiriEchartsTooltipParams ) => {\n\t\t\t\t\tconst arr = Array.isArray( params ) ? params : [ params ];\n\t\t\t\t\tif ( !arr.length ) return '';\n\t\t\t\t\tconst header = escapeHtml( String( arr[ 0 ].axisValueLabel ?? arr[ 0 ].name ?? '' ) );\n\t\t\t\t\tlet body = '';\n\t\t\t\t\tfor ( const p of arr ) {\n\t\t\t\t\t\tbody += `<br/>${ p.marker }${ escapeHtml( String( p.seriesName ?? '' ) ) }: <b>${ p.value }</b>`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `<b>${ header }</b>${ body }`;\n\t\t\t\t}\n\t\t\t},\n\t\t\tlegend: lines.length > 1 ? { top: 0, right: 0, type: 'scroll' } : undefined,\n\t\t\txAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: labels,\n\t\t\t\tboundaryGap: false,\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false },\n\t\t\t\taxisLabel: s.xLabelRotate != null ? { rotate: s.xLabelRotate, interval: 0 } : { rotate: 0 }\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'value',\n\t\t\t\tmin: s.yMin,\n\t\t\t\tmax: s.yMax,\n\t\t\t\tsplitLine: { lineStyle: { color: '#eee' } }\n\t\t\t},\n\t\t\tseries,\n\t\t};\n\t} );\n}\n\n/** Fallback color rotation when a line has no explicit color. */","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor, FALLBACK_COLORS } from '../echarts/color';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsCallbackParams } from '../echarts/params';\n\nexport interface XiriPieChartSlice {\n\tname: string;\n\tvalue: number;\n\tcolor?: XiriColor;\n}\n\nexport interface XiriPieChartSettings {\n\ttitle?: string;\n\tslices: XiriPieChartSlice[];\n\tdonut?: boolean; // ring instead of full pie\n\tnightingale?: boolean; // rose/nightingale: slice radius scales with value\n\tnightingaleType?: 'radius' | 'area'; // 'radius' (default) or 'area'\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-piechart',\n\ttemplate: `\n\t\t@if (warn()) {\n\t\t\t<div class=\"chart-hint\">Mehr als 4 Segmente erschweren den Vergleich — Balken- oder Tabellendarstellung erwägen.</div>\n\t\t}\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriPieChartComponent {\n\n\tsettings = input.required<XiriPieChartSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\twarn = computed<boolean>( () => ( this.settings().slices ?? [] ).length > 4 );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst slices = s.slices ?? [];\n\t\t// nightingale: smaller inner radius even on full pie so the rose has a visible center\n\t\tconst radius: [ string, string ] = s.donut\n\t\t\t? [ '55%', '78%' ]\n\t\t\t: ( s.nightingale ? [ '20%', '78%' ] : [ '0', '78%' ] );\n\n\t\tconst series: Record<string, unknown> = {\n\t\t\ttype: 'pie',\n\t\t\tradius,\n\t\t\tcenter: [ '50%', '45%' ],\n\t\t\tavoidLabelOverlap: true,\n\t\t\tlabel: {\n\t\t\t\tshow: !s.donut && !this.compact(),\n\t\t\t\tformatter: '{b}\\n{d}%',\n\t\t\t},\n\t\t\tlabelLine: { show: !s.donut && !this.compact() },\n\t\t\tdata: slices.map( ( slice, i ) => ( {\n\t\t\t\tname: slice.name,\n\t\t\t\tvalue: slice.value,\n\t\t\t\titemStyle: { color: resolveColor( slice.color, FALLBACK_COLORS[ i % FALLBACK_COLORS.length ] ) }\n\t\t\t} ) )\n\t\t};\n\t\tif ( s.nightingale ) {\n\t\t\tseries.roseType = s.nightingaleType ?? 'radius';\n\t\t}\n\n\t\treturn {\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'item',\n\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\t\tconst name = escapeHtml( String( p.name ?? '' ) );\n\t\t\t\t\treturn `<b>${ name }</b><br/>${ p.marker }<b>${ p.value }</b> (${ p.percent }%)`;\n\t\t\t\t}\n\t\t\t},\n\t\t\tlegend: { bottom: 0, type: 'scroll' },\n\t\t\tseries: [ series ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor } from '../echarts/color';\n\nexport interface XiriGaugeChartSettings {\n\ttitle?: string;\n\tvalue: number;\n\tmin?: number; // default 0\n\tmax?: number; // default 100\n\tcolor?: XiriColor;\n\tlabel?: string; // detail label below the value (e.g. \"%\", \"MB/s\")\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-gaugechart',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriGaugeChartComponent {\n\n\tsettings = input.required<XiriGaugeChartSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst min = s.min ?? 0;\n\t\tconst max = s.max ?? 100;\n\t\tconst color = resolveColor( s.color, '#8b5cf6' );\n\n\t\treturn {\n\t\t\tseries: [ {\n\t\t\t\ttype: 'gauge',\n\t\t\t\tmin,\n\t\t\t\tmax,\n\t\t\t\tcenter: [ '50%', '60%' ],\n\t\t\t\tradius: this.compact() ? '90%' : '80%',\n\t\t\t\tprogress: {\n\t\t\t\t\tshow: true,\n\t\t\t\t\twidth: 12,\n\t\t\t\t\titemStyle: { color }\n\t\t\t\t},\n\t\t\t\taxisLine: {\n\t\t\t\t\tlineStyle: { width: 12, color: [ [ 1, '#eee' ] ] }\n\t\t\t\t},\n\t\t\t\tpointer: { show: false },\n\t\t\t\taxisTick: { show: !this.compact() },\n\t\t\t\tsplitLine: { show: !this.compact() },\n\t\t\t\taxisLabel: { show: !this.compact(), distance: 18, fontSize: 11 },\n\t\t\t\tanchor: { show: false },\n\t\t\t\ttitle: { show: false },\n\t\t\t\tdetail: {\n\t\t\t\t\tvalueAnimation: true,\n\t\t\t\t\toffsetCenter: [ 0, '15%' ],\n\t\t\t\t\tfontSize: this.compact() ? 18 : 24,\n\t\t\t\t\tfontWeight: 'bold',\n\t\t\t\t\tformatter: s.label ? `{value}\\n{label|${ s.label }}` : '{value}',\n\t\t\t\t\trich: { label: { fontSize: 11, fontWeight: 'normal', color: '#888' } },\n\t\t\t\t\tcolor\n\t\t\t\t},\n\t\t\t\tdata: [ { value: s.value } ]\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor } from '../echarts/color';\n\nexport interface XiriBulletChartSettings {\n\ttitle?: string;\n\tvalue: number;\n\ttarget?: number;\n\tmax?: number; // default: max(value, target) * 1.2\n\tlabel?: string;\n\tcolor?: XiriColor;\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-bulletchart',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriBulletChartComponent {\n\n\tsettings = input.required<XiriBulletChartSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst color = resolveColor( s.color, '#8b5cf6' );\n\t\tconst max = s.max ?? Math.max( s.value, s.target ?? 0 ) * 1.2;\n\t\tconst compact = this.compact();\n\t\tconst valueText = s.label ? `${ s.value } ${ s.label }` : `${ s.value }`;\n\n\t\treturn {\n\t\t\t// right: Platz für das Value-Label; top: Platz für das Ziel-Label über der Linie.\n\t\t\tgrid: { left: 8, right: 56, top: 22, bottom: 8, containLabel: false },\n\t\t\txAxis: { type: 'value', min: 0, max, show: false },\n\t\t\tyAxis: { type: 'category', data: [ '' ], show: false },\n\t\t\tseries: [ {\n\t\t\t\ttype: 'bar',\n\t\t\t\tdata: [ s.value ],\n\t\t\t\tbarWidth: compact ? 14 : 20,\n\t\t\t\titemStyle: { color, borderRadius: 4 },\n\t\t\t\tlabel: {\n\t\t\t\t\tshow: true,\n\t\t\t\t\tposition: 'right',\n\t\t\t\t\tformatter: valueText,\n\t\t\t\t\tfontWeight: 'bold',\n\t\t\t\t\tcolor: '#333'\n\t\t\t\t},\n\t\t\t\tmarkLine: s.target !== undefined ? {\n\t\t\t\t\tsymbol: 'none',\n\t\t\t\t\tprecision: 0,\n\t\t\t\t\tlabel: {\n\t\t\t\t\t\tshow: true,\n\t\t\t\t\t\tposition: 'end',\n\t\t\t\t\t\tformatter: `Ziel ${ s.target }`,\n\t\t\t\t\t\tcolor: '#666',\n\t\t\t\t\t\tfontSize: 11\n\t\t\t\t\t},\n\t\t\t\t\tdata: [ { xAxis: s.target, lineStyle: { color: '#333', width: 2, type: 'solid' } } ]\n\t\t\t\t} : undefined\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsCallbackParams } from '../echarts/params';\n\nexport interface XiriHeatmapCell {\n\tx: number; // index into xLabels\n\ty: number; // index into yLabels\n\tvalue: number;\n\tlabel?: string; // optional override for the cell's display value\n}\n\nexport interface XiriHeatmapSettings {\n\ttitle?: string;\n\txLabels: string[];\n\tyLabels: string[];\n\tcells: XiriHeatmapCell[];\n\tmin?: number;\n\tmax?: number;\n\tcolorRange?: [ string, string ]; // CSS colors for low/high; default light → purple\n\tshowValues?: boolean; // print values inside cells (only readable for small grids)\n\tcompact?: boolean;\n\txLabelRotate?: number; // rotate x-axis labels by degrees (-90..90), 90 = vertical\n}\n\n@Component( {\n\tselector: 'xiri-heatmap',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t[chartHeight]=\"height()\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriHeatmapComponent {\n\n\tsettings = input.required<XiriHeatmapSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\theight = computed<string>( () => {\n\t\tconst s = this.settings();\n\t\tconst rows = s.yLabels.length || 1;\n\t\t// Rotierte X-Labels brauchen zusätzlichen vertikalen Platz unter der Matrix.\n\t\tconst rot = Math.abs( s.xLabelRotate ?? 0 );\n\t\tconst rotExtra = rot >= 60 ? 70 : rot >= 30 ? 50 : 0;\n\t\t// rows*32 für die Zellen + 76 für Titel, X-Achsen-Labels und Rand.\n\t\tconst px = Math.max( 220, rows * 32 + 76 + rotExtra );\n\t\treturn px + 'px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst cells = s.cells ?? [];\n\t\tconst values = cells.map( c => c.value );\n\t\tconst min = s.min ?? Math.min( 0, ...values );\n\t\tconst max = s.max ?? Math.max( 0, ...values );\n\t\tconst [ lowColor, highColor ] = s.colorRange ?? [ '#ede9fe', '#7c3aed' ];\n\n\t\treturn {\n\t\t\tgrid: this.compact()\n\t\t\t\t? { left: 0, right: 0, top: 4, bottom: 0, containLabel: true }\n\t\t\t\t: { left: 32, right: 64, top: 24, bottom: 24, containLabel: true },\n\t\t\ttooltip: {\n\t\t\t\tposition: 'top',\n\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\t\tconst val = p.value as number[];\n\t\t\t\t\tconst x = s.xLabels[ val[ 0 ] ] ?? '';\n\t\t\t\t\tconst y = s.yLabels[ val[ 1 ] ] ?? '';\n\t\t\t\t\treturn `<b>${ escapeHtml( y ) }</b> / <b>${ escapeHtml( x ) }</b><br/>${ p.marker }<b>${ val[ 2 ] }</b>`;\n\t\t\t\t}\n\t\t\t},\n\t\t\txAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: s.xLabels,\n\t\t\t\tsplitArea: { show: true },\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false },\n\t\t\t\taxisLabel: { interval: 0, rotate: s.xLabelRotate ?? 0 }\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: s.yLabels,\n\t\t\t\tsplitArea: { show: true },\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false }\n\t\t\t},\n\t\t\tvisualMap: {\n\t\t\t\tmin,\n\t\t\t\tmax,\n\t\t\t\tcalculable: true,\n\t\t\t\torient: 'vertical',\n\t\t\t\tright: 8,\n\t\t\t\ttop: 'middle',\n\t\t\t\tinRange: { color: [ lowColor, highColor ] },\n\t\t\t\tshow: !this.compact()\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'heatmap',\n\t\t\t\tdata: cells.map( c => [ c.x, c.y, c.value ] ),\n\t\t\t\tlabel: { show: !!s.showValues, formatter: ( p: XiriEchartsCallbackParams ) => String( ( p.value as number[] )[ 2 ] ) },\n\t\t\t\temphasis: { itemStyle: { shadowBlur: 6, shadowColor: 'rgba(0, 0, 0, 0.3)' } }\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsCallbackParams } from '../echarts/params';\n\nexport interface XiriCalendarCell {\n\tdate: string; // 'YYYY-MM-DD'\n\tvalue: number;\n}\n\nexport interface XiriCalendarSettings {\n\ttitle?: string;\n\trange: string | [ string, string ]; // year 'YYYY' | ['YYYY-MM-DD', 'YYYY-MM-DD']\n\tcells: XiriCalendarCell[];\n\tmin?: number;\n\tmax?: number;\n\tcolorRange?: [ string, string ]; // CSS colors for low/high; default light green → dark green (GitHub-like)\n\tcellSize?: number; // cell size in px (default 16, compact 12)\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-calendar',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t[chartHeight]=\"height()\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriCalendarComponent {\n\n\tsettings = input.required<XiriCalendarSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\tprivate cellSize = computed<number>( () => this.settings().cellSize ?? ( this.compact() ? 12 : 16 ) );\n\n\theight = computed<string>( () => {\n\t\t// 7 weekday rows + label space\n\t\tconst px = this.cellSize() * 7 + 60;\n\t\treturn px + 'px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst cells = s.cells ?? [];\n\t\tconst values = cells.map( c => c.value );\n\t\tconst min = s.min ?? Math.min( 0, ...values );\n\t\tconst max = s.max ?? Math.max( 0, ...values );\n\t\tconst [ lowColor, highColor ] = s.colorRange ?? [ '#e6f4ea', '#2e7d32' ];\n\t\tconst sz = this.cellSize();\n\n\t\treturn {\n\t\t\ttooltip: {\n\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\t\tconst val = p.value as [ string, number ];\n\t\t\t\t\tconst date = String( val[ 0 ] );\n\t\t\t\t\tconst v = val[ 1 ];\n\t\t\t\t\treturn `<b>${ escapeHtml( date ) }</b><br/>${ p.marker }<b>${ v }</b>`;\n\t\t\t\t}\n\t\t\t},\n\t\t\tvisualMap: {\n\t\t\t\tmin,\n\t\t\t\tmax,\n\t\t\t\torient: 'horizontal',\n\t\t\t\tleft: 'center',\n\t\t\t\tbottom: 0,\n\t\t\t\tshow: !this.compact(),\n\t\t\t\tinRange: { color: [ lowColor, highColor ] }\n\t\t\t},\n\t\t\tcalendar: {\n\t\t\t\trange: s.range,\n\t\t\t\tcellSize: [ sz, sz ],\n\t\t\t\tsplitLine: { show: false },\n\t\t\t\titemStyle: { borderColor: '#fff', borderWidth: 2 },\n\t\t\t\tyearLabel: { show: false },\n\t\t\t\tdayLabel: { fontSize: 10 },\n\t\t\t\tmonthLabel: { fontSize: 11 },\n\t\t\t\ttop: 24,\n\t\t\t\tleft: 32,\n\t\t\t\tright: 16,\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'heatmap',\n\t\t\t\tcoordinateSystem: 'calendar',\n\t\t\t\tdata: cells.map( c => [ c.date, c.value ] )\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { XiriEchartsCallbackParams } from '../echarts/params';\n\nexport interface XiriTreeNode {\n\tname: string;\n\tvalue?: number;\n\tchildren?: XiriTreeNode[];\n\tcollapsed?: boolean;\n}\n\nexport interface XiriTreeSettings {\n\ttitle?: string;\n\troot: XiriTreeNode;\n\torient?: 'LR' | 'RL' | 'TB' | 'BT'; // default 'LR'\n\tlayout?: 'orthogonal' | 'radial'; // default 'orthogonal'\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-tree',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t[chartHeight]=\"height()\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriTreeComponent {\n\n\tsettings = input.required<XiriTreeSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\theight = computed<string>( () => {\n\t\t// Estimate based on leaf count\n\t\tconst leaves = countLeaves( this.settings().root );\n\t\tconst px = Math.max( 240, leaves * 24 + 80 );\n\t\treturn px + 'px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst orient = s.orient ?? 'LR';\n\t\tconst layout = s.layout ?? 'orthogonal';\n\n\t\treturn {\n\t\t\ttooltip: {\n\t\t\t\ttrigger: 'item',\n\t\t\t\ttriggerOn: 'mousemove',\n\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\t\tconst v = p.data?.value;\n\t\t\t\t\tconst head = `<b>${ escapeText( p.name ?? '' ) }</b>`;\n\t\t\t\t\treturn v != null ? `${ head }<br/>${ p.marker }<b>${ v }</b>` : head;\n\t\t\t\t}\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'tree',\n\t\t\t\tdata: [ s.root ],\n\t\t\t\ttop: 16,\n\t\t\t\tbottom: 16,\n\t\t\t\t// Reserve enough space for leaf labels so they don't get truncated by echarts.\n\t\t\t\tleft: layout === 'radial' ? '5%' : ( orient === 'LR' ? 96 : ( orient === 'RL' ? 16 : 16 ) ),\n\t\t\t\tright: layout === 'radial' ? '5%' : ( orient === 'RL' ? 96 : ( orient === 'LR' ? 96 : 16 ) ),\n\t\t\t\tlayout,\n\t\t\t\torient,\n\t\t\t\tsymbol: 'emptyCircle',\n\t\t\t\tsymbolSize: 7,\n\t\t\t\tinitialTreeDepth: 3,\n\t\t\t\tlabel: {\n\t\t\t\t\tposition: orient === 'TB' ? 'top' : 'left',\n\t\t\t\t\talign: orient === 'LR' ? 'right' : 'center',\n\t\t\t\t\tverticalAlign: 'middle',\n\t\t\t\t\tfontSize: 12,\n\t\t\t\t\toverflow: 'none'\n\t\t\t\t},\n\t\t\t\tleaves: {\n\t\t\t\t\tlabel: {\n\t\t\t\t\t\tposition: orient === 'TB' ? 'bottom' : 'right',\n\t\t\t\t\t\talign: orient === 'LR' ? 'left' : 'center',\n\t\t\t\t\t\toverflow: 'none'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\texpandAndCollapse: true,\n\t\t\t\tanimationDuration: 250,\n\t\t\t\tanimationDurationUpdate: 250\n\t\t\t} ]\n\t\t};\n\t} );\n}\n\nfunction countLeaves( n: XiriTreeNode ): number {\n\tif ( !n.children?.length ) return 1;\n\treturn n.children.reduce( ( sum, c ) => sum + countLeaves( c ), 0 );\n}\n\nfunction escapeText( s: string ): string {\n\treturn String( s ?? '' ).replace( /</g, '<' ).replace( />/g, '>' );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor, FALLBACK_COLORS } from '../echarts/color';\n\nexport interface XiriSankeyNode {\n\tname: string;\n\tcolor?: XiriColor;\n}\n\nexport interface XiriSankeyLink {\n\tsource: string;\n\ttarget: string;\n\tvalue: number;\n}\n\nexport interface XiriSankeySettings {\n\ttitle?: string;\n\tnodes: XiriSankeyNode[];\n\tlinks: XiriSankeyLink[];\n\torient?: 'horizontal' | 'vertical'; // default 'horizontal'\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-sankey',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t[chartHeight]=\"height()\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriSankeyComponent {\n\n\tsettings = input.required<XiriSankeySettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\theight = computed<string>( () => {\n\t\tconst n = this.settings().nodes.length || 1;\n\t\tconst px = Math.max( 280, n * 20 + 80 );\n\t\treturn px + 'px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\treturn {\n\t\t\ttooltip: { trigger: 'item', triggerOn: 'mousemove' },\n\t\t\tseries: [ {\n\t\t\t\ttype: 'sankey',\n\t\t\t\torient: s.orient ?? 'horizontal',\n\t\t\t\ttop: 16,\n\t\t\t\tbottom: 16,\n\t\t\t\tleft: 16,\n\t\t\t\tright: 80,\n\t\t\t\temphasis: { focus: 'adjacency' },\n\t\t\t\tlineStyle: { color: 'gradient', curveness: 0.5 },\n\t\t\t\tlabel: { fontSize: 12 },\n\t\t\t\tdata: s.nodes.map( ( n, i ) => ( {\n\t\t\t\t\tname: n.name,\n\t\t\t\t\titemStyle: { color: resolveColor( n.color, FALLBACK_COLORS[ i % FALLBACK_COLORS.length ] ) }\n\t\t\t\t} ) ),\n\t\t\t\tlinks: s.links\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","import { Component, computed, input } from '@angular/core';\nimport { XiriColor } from '../types/color.type';\nimport { XiriEchartsHostComponent } from '../echarts/echarts-host.component';\nimport { resolveColor } from '../echarts/color';\nimport { escapeHtml } from '../echarts/tooltip';\nimport { XiriEchartsCallbackParams, XiriEchartsRenderItemApi } from '../echarts/params';\n\nexport interface XiriGanttTask {\n\trow: number; // index into rows[]\n\tname: string;\n\tstart: number; // unix milliseconds\n\tend: number; // unix milliseconds\n\tcolor?: XiriColor;\n}\n\nexport interface XiriGanttSettings {\n\ttitle?: string;\n\trows: string[]; // y-axis categories (top to bottom in render order)\n\ttasks: XiriGanttTask[];\n\trangeStart?: number; // optional x-axis start (ms)\n\trangeEnd?: number; // optional x-axis end (ms)\n\tcompact?: boolean;\n}\n\n@Component( {\n\tselector: 'xiri-gantt',\n\ttemplate: `\n\t\t<xiri-echarts-host\n\t\t\t[option]=\"option()\"\n\t\t\t[compact]=\"compact()\"\n\t\t\t[title]=\"settings().title\"\n\t\t\t[chartHeight]=\"height()\">\n\t\t</xiri-echarts-host>\n\t`,\n\timports: [ XiriEchartsHostComponent ]\n} )\nexport class XiriGanttComponent {\n\n\tsettings = input.required<XiriGanttSettings>();\n\n\tcompact = computed<boolean>( () => !!this.settings().compact );\n\n\theight = computed<string>( () => {\n\t\tconst rows = this.settings().rows.length || 1;\n\t\tconst px = Math.max( 220, rows * 36 + 80 );\n\t\treturn px + 'px';\n\t} );\n\n\toption = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst rows = s.rows ?? [];\n\n\t\t// Each datum: [rowIndex, start, end, name, color]\n\t\tconst data = ( s.tasks ?? [] ).map( t => [\n\t\t\tt.row,\n\t\t\tt.start,\n\t\t\tt.end,\n\t\t\tt.name,\n\t\t\tresolveColor( t.color, '#8b5cf6' )\n\t\t] );\n\n\t\tconst renderItem = ( _params: unknown, api: XiriEchartsRenderItemApi ) => {\n\t\t\tconst rowIdx = api.value( 0 );\n\t\t\tconst start = api.coord( [ api.value( 1 ), rowIdx ] );\n\t\t\tconst end = api.coord( [ api.value( 2 ), rowIdx ] );\n\t\t\tconst cellH = api.size( [ 0, 1 ] )[ 1 ];\n\t\t\tconst height = Math.max( 4, cellH * 0.6 );\n\t\t\treturn {\n\t\t\t\ttype: 'rect',\n\t\t\t\ttransition: [ 'shape' ],\n\t\t\t\tshape: {\n\t\t\t\t\tx: start[ 0 ],\n\t\t\t\t\ty: start[ 1 ] - height / 2,\n\t\t\t\t\twidth: Math.max( 1, end[ 0 ] - start[ 0 ] ),\n\t\t\t\t\theight,\n\t\t\t\t\tr: 4\n\t\t\t\t},\n\t\t\t\tstyle: { fill: api.value( 4 ) }\n\t\t\t};\n\t\t};\n\n\t\treturn {\n\t\t\ttooltip: {\n\t\t\t\tformatter: ( p: XiriEchartsCallbackParams ) => {\n\t\t\t\t\tconst v = p.value as [ number, number, number, string, string ];\n\t\t\t\t\tconst fmt = ( ms: number ) => new Date( ms ).toLocaleString();\n\t\t\t\t\tconst row = rows[ v[ 0 ] ] ?? '';\n\t\t\t\t\treturn `<b>${ escapeHtml( v[ 3 ] ) }</b><br/>${ escapeHtml( row ) }<br/>${ escapeHtml( fmt( v[ 1 ] ) ) } → ${ escapeHtml( fmt( v[ 2 ] ) ) }`;\n\t\t\t\t}\n\t\t\t},\n\t\t\tgrid: { left: 8, right: 16, top: 16, bottom: 24, containLabel: true },\n\t\t\txAxis: {\n\t\t\t\ttype: 'time',\n\t\t\t\tmin: s.rangeStart,\n\t\t\t\tmax: s.rangeEnd,\n\t\t\t\tsplitLine: { lineStyle: { color: '#eee' } }\n\t\t\t},\n\t\t\tyAxis: {\n\t\t\t\ttype: 'category',\n\t\t\t\tdata: rows,\n\t\t\t\tinverse: true,\n\t\t\t\tsplitLine: { show: false },\n\t\t\t\taxisLine: { show: false },\n\t\t\t\taxisTick: { show: false }\n\t\t\t},\n\t\t\tseries: [ {\n\t\t\t\ttype: 'custom',\n\t\t\t\tencode: { x: [ 1, 2 ], y: 0 },\n\t\t\t\tclip: true,\n\t\t\t\trenderItem,\n\t\t\t\tdata\n\t\t\t} ]\n\t\t};\n\t} );\n}\n","/**\n * Minimal structural types for the echarts callback params that the xiri chart\n * components read inside tooltip / label / renderItem formatters.\n *\n * echarts is an optional peer dependency and is loaded lazily, so we avoid a\n * static import of its (large) option/param types here and describe only the\n * fields the chart components actually access. The shapes intentionally mirror\n * echarts' `CallbackDataParams` / `CustomSeriesRenderItem*` surfaces.\n */\n\n/** Params object passed to a single-series tooltip / label formatter callback. */\nexport interface XiriEchartsCallbackParams {\n\tcomponentType?: string;\n\tseriesType?: string;\n\tseriesIndex?: number;\n\tseriesName?: string;\n\tdataIndex: number;\n\tname?: string;\n\taxisValueLabel?: string;\n\tmarker?: string;\n\tpercent?: number;\n\tvalue?: unknown;\n\tdata?: { value?: unknown };\n}\n\n/** Params for an 'axis'-trigger tooltip: either a single params object or an array of them. */\nexport type XiriEchartsTooltipParams = XiriEchartsCallbackParams | XiriEchartsCallbackParams[];\n\n/** The `api` object handed to a custom-series `renderItem` callback. */\nexport interface XiriEchartsRenderItemApi {\n\tvalue( dimension: number ): number;\n\tcoord( point: number[] ): number[];\n\tsize( dataSize: number[] ): number[];\n}\n","import { Component, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriButtonlineComponent, XiriButtonlineSettings } from '../buttonline/buttonline.component';\n\nexport interface XiriPageHeaderSettings {\n\ttitle: string\n\tsubtitle?: string\n\ticon?: string\n\ticonColor?: string\n\tbuttons?: XiriButtonlineSettings\n}\n\n@Component( {\n\t selector: 'xiri-page-header',\n\t templateUrl: './page-header.component.html',\n\t styleUrl: './page-header.component.scss',\n\t imports: [ MatIcon, XiriButtonlineComponent ]\n } )\nexport class XiriPageHeaderComponent {\n\n\tsettings = input.required<XiriPageHeaderSettings>();\n}\n","<div class=\"page-header\">\n\t<div class=\"page-header-content\">\n\t\t@if (settings().icon) {\n\t\t\t<div class=\"page-header-icon\" [class]=\"settings().iconColor || 'primary'\">\n\t\t\t\t<mat-icon>{{ settings().icon }}</mat-icon>\n\t\t\t</div>\n\t\t}\n\t\t<div class=\"page-header-text\">\n\t\t\t<h1>{{ settings().title }}</h1>\n\t\t\t@if (settings().subtitle) {\n\t\t\t\t<p>{{ settings().subtitle }}</p>\n\t\t\t}\n\t\t</div>\n\t</div>\n\t@if (settings().buttons) {\n\t\t<xiri-buttonline [settings]=\"settings().buttons!\"></xiri-buttonline>\n\t}\n</div>\n","import { Component, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatDivider } from '@angular/material/divider';\n\nexport interface XiriDividerSettings {\n\ttext?: string\n\ticon?: string\n\tspacing?: 'compact' | 'normal' | 'large'\n}\n\n@Component( {\n\t selector: 'xiri-divider',\n\t templateUrl: './divider.component.html',\n\t styleUrl: './divider.component.scss',\n\t imports: [ MatIcon, MatDivider ]\n } )\nexport class XiriDividerComponent {\n\n\tsettings = input.required<XiriDividerSettings>();\n}\n","<div class=\"xiri-divider\" [class]=\"settings().spacing || 'normal'\">\n\t@if (settings().text || settings().icon) {\n\t\t<mat-divider></mat-divider>\n\t\t<span class=\"divider-label\">\n\t\t\t@if (settings().icon) { <mat-icon>{{ settings().icon }}</mat-icon> }\n\t\t\t@if (settings().text) { {{ settings().text }} }\n\t\t</span>\n\t\t<mat-divider></mat-divider>\n\t} @else {\n\t\t<mat-divider></mat-divider>\n\t}\n</div>\n","import { Component, input } from '@angular/core';\nimport { XiriStatComponent, XiriStatSettings } from '../stat/stat.component';\n\nexport interface XiriStatGridSettings {\n\tstats: XiriStatSettings[]\n\tcolumns?: number\n\ttitle?: string\n}\n\n@Component( {\n\t selector: 'xiri-stat-grid',\n\t templateUrl: './stat-grid.component.html',\n\t styleUrl: './stat-grid.component.scss',\n\t imports: [ XiriStatComponent ]\n } )\nexport class XiriStatGridComponent {\n\n\tsettings = input.required<XiriStatGridSettings>();\n}\n","@if (settings().title) {\n\t<h3 class=\"stat-grid-title\">{{ settings().title }}</h3>\n}\n<div class=\"stat-grid\" [style.--stat-cols]=\"settings().columns || 4\">\n\t@for (stat of settings().stats; track $index) {\n\t\t<xiri-stat [settings]=\"stat\"></xiri-stat>\n\t}\n</div>\n","import { Component, computed, input, output } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { XiriButtonlineComponent, XiriButtonlineSettings } from '../buttonline/buttonline.component';\nimport { XiriSearchComponent } from '../search/search.component';\n\nexport interface XiriToolbarSearchConfig {\n\tplaceholder?: string\n}\n\nexport interface XiriToolbarSettings {\n\ttitle?: string\n\ticon?: string\n\tsearch?: boolean | XiriToolbarSearchConfig\n\tbuttons?: XiriButtonlineSettings\n}\n\n@Component( {\n\t selector: 'xiri-toolbar',\n\t templateUrl: './toolbar.component.html',\n\t styleUrl: './toolbar.component.scss',\n\t imports: [ MatIcon, XiriButtonlineComponent, XiriSearchComponent ]\n } )\nexport class XiriToolbarComponent {\n\n\tsettings = input.required<XiriToolbarSettings>();\n\tfilterData = input<Record<string, unknown> | null | undefined>( undefined );\n\n\tsearchChanged = output<string>();\n\n\tsearchPlaceholder = computed( () => {\n\t\tconst search = this.settings().search;\n\t\tif ( typeof search === 'object' && search?.placeholder ) {\n\t\t\treturn search.placeholder;\n\t\t}\n\t\treturn '';\n\t} );\n}\n","<div class=\"xiri-toolbar\">\n\t@if (settings().icon) {\n\t\t<mat-icon>{{ settings().icon }}</mat-icon>\n\t}\n\t@if (settings().title) {\n\t\t<span class=\"toolbar-title\">{{ settings().title }}</span>\n\t}\n\t<div class=\"toolbar-spacer\"></div>\n\t@if (settings().search) {\n\t\t<xiri-search [placeholder]=\"searchPlaceholder()\" [open]=\"true\" (changed)=\"searchChanged.emit($event)\"></xiri-search>\n\t}\n\t@if (settings().buttons) {\n\t\t<xiri-buttonline [settings]=\"settings().buttons!\" [filterData]=\"filterData()\"></xiri-buttonline>\n\t}\n</div>\n","import { Component, computed, input } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { SafehtmlPipe } from '../pipes/safehtml.pipe';\n\nexport interface XiriDescriptionListItem {\n\tlabel: string\n\tvalue: string\n\ticon?: string\n\tcolor?: string\n\ttype?: 'text' | 'link' | 'html' | 'badge'\n}\n\nexport interface XiriDescriptionListSettings {\n\titems: XiriDescriptionListItem[]\n\tcolumns?: 1 | 2 | 3\n\tlayout?: 'horizontal' | 'stacked'\n}\n\n@Component( {\n\t selector: 'xiri-description-list',\n\t templateUrl: './description-list.component.html',\n\t styleUrl: './description-list.component.scss',\n\t imports: [ MatIcon, SafehtmlPipe ]\n } )\nexport class XiriDescriptionListComponent {\n\n\tsettings = input.required<XiriDescriptionListSettings>();\n\n\tlayoutClass = computed( () => {\n\t\tconst s = this.settings();\n\t\tconst layout = s.layout || 'stacked';\n\t\treturn `${ layout } cols-${ s.columns || 2 }`;\n\t} );\n}\n","<dl class=\"description-list\" [class]=\"layoutClass()\" [style.--dl-cols]=\"settings().columns || 2\">\n\t@for (item of settings().items; track $index) {\n\t\t<div class=\"dl-item\">\n\t\t\t<dt>\n\t\t\t\t@if (item.icon) { <mat-icon [class]=\"item.color || ''\">{{ item.icon }}</mat-icon> }\n\t\t\t\t{{ item.label }}\n\t\t\t</dt>\n\t\t\t<dd>\n\t\t\t\t@switch (item.type) {\n\t\t\t\t\t@case ('link') { <a [href]=\"item.value\" target=\"_blank\" rel=\"noopener\">{{ item.value }}</a> }\n\t\t\t\t\t@case ('html') { <span [innerHTML]=\"item.value | safeHtml\"></span> }\n\t\t\t\t\t@case ('badge') { <span class=\"dl-badge\" [class]=\"item.color || 'primary'\">{{ item.value }}</span> }\n\t\t\t\t\t@default { {{ item.value || '\\u2014' }} }\n\t\t\t\t}\n\t\t\t</dd>\n\t\t</div>\n\t}\n</dl>\n","import { Service, signal, computed, effect, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { notifyThemeChanged } from '../echarts/color';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto';\n\n@Service()\nexport class ThemeService {\n\tprivate readonly platformId = inject(PLATFORM_ID);\n\tprivate readonly isBrowser = isPlatformBrowser(this.platformId);\n\n\t/** Current theme mode setting */\n\tprivate readonly _mode = signal<ThemeMode>('auto');\n\n\t/** Observable theme mode */\n\treadonly mode = this._mode.asReadonly();\n\n\t/** Whether dark mode is currently active (considering auto mode) */\n\treadonly isDark = computed(() => {\n\t\tconst mode = this._mode();\n\t\tif (mode === 'auto') {\n\t\t\treturn this.isBrowser ? this.getSystemPreference() : false;\n\t\t}\n\t\treturn mode === 'dark';\n\t});\n\n\t/** Whether light mode is currently active */\n\treadonly isLight = computed(() => !this.isDark());\n\n\tconstructor() {\n\t\tif (this.isBrowser) {\n\t\t\t// Load saved preference\n\t\t\tconst saved = localStorage.getItem('theme') as ThemeMode | null;\n\t\t\tif (saved && ['light', 'dark', 'auto'].includes(saved)) {\n\t\t\t\tthis._mode.set(saved);\n\t\t\t}\n\n\t\t\t// Apply initial theme\n\t\t\tthis.applyTheme();\n\n\t\t\t// React to mode changes\n\t\t\teffect(() => {\n\t\t\t\tthis.applyTheme();\n\t\t\t});\n\n\t\t\t// Listen for system preference changes\n\t\t\tconst mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\t\t\tmediaQuery.addEventListener('change', () => {\n\t\t\t\tif (this._mode() === 'auto') {\n\t\t\t\t\tthis.applyTheme();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Set the theme mode\n\t * @param mode - 'light', 'dark', or 'auto' (follow system preference)\n\t */\n\tsetTheme(mode: ThemeMode): void {\n\t\tthis._mode.set(mode);\n\t\tif (this.isBrowser) {\n\t\t\tlocalStorage.setItem('theme', mode);\n\t\t}\n\t}\n\n\t/**\n\t * Toggle between light and dark mode\n\t * If currently auto, switches to opposite of current system preference\n\t */\n\ttoggle(): void {\n\t\tconst current = this._mode();\n\t\tif (current === 'auto') {\n\t\t\t// Switch to opposite of current system preference\n\t\t\tthis.setTheme(this.getSystemPreference() ? 'light' : 'dark');\n\t\t} else {\n\t\t\tthis.setTheme(current === 'light' ? 'dark' : 'light');\n\t\t}\n\t}\n\n\t/**\n\t * Reset to auto (system preference)\n\t */\n\tresetToAuto(): void {\n\t\tthis.setTheme('auto');\n\t}\n\n\tprivate getSystemPreference(): boolean {\n\t\tif (!this.isBrowser) return false;\n\t\treturn window.matchMedia('(prefers-color-scheme: dark)').matches;\n\t}\n\n\tprivate applyTheme(): void {\n\t\tif (!this.isBrowser) return;\n\n\t\tconst mode = this._mode();\n\t\tconst root = document.documentElement;\n\n\t\t// Remove existing theme classes\n\t\troot.classList.remove('light-theme', 'dark-theme');\n\n\t\t// Apply theme class based on mode\n\t\tif (mode === 'light') {\n\t\t\troot.classList.add('light-theme');\n\t\t} else if (mode === 'dark') {\n\t\t\troot.classList.add('dark-theme');\n\t\t}\n\t\t// 'auto' mode: no class needed, CSS media query handles it\n\n\t\t// Charts resolve theme colors to literals (a canvas cannot read CSS\n\t\t// variables), so they have to be told to re-resolve.\n\t\tnotifyThemeChanged();\n\t}\n}\n","import { defaultXiriDataServiceConfig, XiriDataServiceConfig } from \"./services/data.service\";\nimport { EnvironmentProviders, makeEnvironmentProviders } from \"@angular/core\";\n\nexport function provideXiriServices(\n\tconfig: Partial<XiriDataServiceConfig>\n): EnvironmentProviders {\n\tconst merged = { ...defaultXiriDataServiceConfig, ...config };\n\t\n\treturn makeEnvironmentProviders( [\n\t\t {\n\t\t\t provide: XiriDataServiceConfig,\n\t\t\t useValue: merged,\n\t\t }\n\t ] );\n}","/*\n * Public API Surface of xiri-ng\n */\n\nexport * from './lib/types/color.type';\nexport { SafehtmlPipe } from \"./lib/pipes/safehtml.pipe\";\nexport { XiriUrlPipe, type XiriUrl } from \"./lib/pipes/url.pipe\";\n\nexport * from \"./lib/formfields/field.interface\";\nexport * from \"./lib/formfields/form-fields.component\";\nexport * from \"./lib/formfields/select/select.directive\";\n\nexport * from \"./lib/raw-table/tabefield.interface\";\nexport * from \"./lib/raw-table/xiri-raw-table.component\";\nexport * from \"./lib/table/table.component\";\n\nexport * from \"./lib/form/form.component\";\nexport * from \"./lib/dialog/dialog.component\";\nexport * from './lib/sidepanel/sidepanel-ref';\nexport * from './lib/sidepanel/sidepanel.component';\nexport * from './lib/sidepanel/sidepanel.service';\nexport * from './lib/query/query.component';\n\nexport * from \"./lib/card/card.component\";\nexport * from './lib/buttonstyle/buttonstyle.component';\nexport * from './lib/button/button.component';\nexport * from \"./lib/buttonline/buttonline.component\";\nexport * from \"./lib/dyncomponent/dyndata.interface\";\nexport * from \"./lib/dyncomponent/dyncomponent.component\";\nexport * from \"./lib/cardlink/cardlink.component\";\nexport * from './lib/links/links.component';\nexport * from \"./lib/alert/alert.component\";\nexport * from './lib/stepper/stepper.component';\nexport * from './lib/done/done.component';\nexport * from './lib/error/error.component';\nexport * from \"./lib/header/header.component\";\nexport * from './lib/list/list.component';\nexport * from './lib/infopoint/infopoint.component';\nexport * from './lib/multiprogress/multiprogress.component';\nexport * from './lib/progress/progress.component';\nexport * from './lib/imagetext/imagetext.component';\nexport * from './lib/search/search.component';\nexport * from './lib/sidenav/sidenav.component';\nexport * from './lib/tabs/tabs.component';\nexport * from './lib/expansion/expansion.component';\n\nexport * from './lib/breadcrumb/breadcrumb.component';\nexport * from './lib/skeleton/skeleton.component';\nexport * from './lib/empty-state/empty-state.component';\nexport * from './lib/status/status.component';\nexport * from './lib/callout/callout.component';\nexport * from './lib/stat/stat.component';\nexport * from './lib/timeline/timeline.component';\nexport * from './lib/barchart/barchart.component';\nexport * from './lib/linechart/linechart.component';\nexport * from './lib/piechart/piechart.component';\nexport * from './lib/gaugechart/gaugechart.component';\nexport * from './lib/bulletchart/bulletchart.component';\nexport * from './lib/heatmap/heatmap.component';\nexport * from './lib/calendar/calendar.component';\nexport * from './lib/tree/tree.component';\nexport * from './lib/sankey/sankey.component';\nexport * from './lib/gantt/gantt.component';\nexport * from './lib/echarts';\n\nexport * from './lib/page-header/page-header.component';\nexport * from './lib/section/section.component';\nexport * from './lib/divider/divider.component';\nexport * from './lib/stat-grid/stat-grid.component';\nexport * from './lib/multi-stat/multi-stat.component';\nexport * from './lib/toolbar/toolbar.component';\nexport * from './lib/description-list/description-list.component';\n\nexport * from './lib/layout/cols.directive';\n\nexport * from './lib/services/data.service';\nexport * from './lib/services/form.service';\nexport * from './lib/services/localStorage.service';\nexport * from './lib/services/sessionStorage.service';\nexport * from './lib/services/theme.service';\nexport * from './lib/services/locale.service';\nexport * from './lib/services/snackbar.service';\nexport * from './lib/services/response-handler.service';\nexport * from './lib/services/download.service';\n\nexport * from './lib/provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["filter","errorMessage","debounceTime","MatOption"],"mappings":"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"}
|