@xiriframework/xiri-ng 0.4.12 → 0.4.14
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 +311 -74
- package/fesm2022/xiriframework-xiri-ng.mjs.map +1 -1
- package/package.json +1 -1
- package/skills/xiri-ng-expert/SKILL.md +1 -0
- package/skills/xiri-ng-expert/references/form-fields.md +22 -10
- package/skills/xiri-ng-expert/references/table.md +3 -0
- package/types/xiriframework-xiri-ng.d.ts +36 -6
- 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/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/services/panel-loader.ts","../../../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-panel.directive.ts","../../../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\t// Zwei Sperrquellen, getrennt gehalten und verodert: Angular ruft beim Control-Setup\n\t// setDisabledState(false) -- callSetDisabledState ist per Default 'always' -- und zwar nach\n\t// dem field-Input. Schlüge das direkt durch, höbe es ein Backend-disabled wieder auf.\n\t// Getrennt, obwohl beide deklarativ sind: sind [field] und [disabled] gleichzeitig gebunden,\n\t// ruft Angular den unveraenderten zweiten Input nicht erneut auf.\n\tprivate fieldDisabled = false;\n\tprivate inputDisabled = false;\n\tprivate controlDisabled = false;\n\n\tget disabled(): boolean {\n\t\treturn this._disabled;\n\t}\n\n\t// Der oeffentliche Input ist dieselbe Quelle wie field.disabled: eine deklarative Sperre, die\n\t// ein setDisabledState(false) beim Control-Setup nicht aufheben darf.\n\tset disabled( value: boolean ) {\n\t\tthis.inputDisabled = value;\n\t\tthis.applyDisabled();\n\t}\n\n\t// Wird bei jedem Sperren UND bei jeder neuen Auswahl hochgezaehlt. Nur beim Sperren zu zaehlen\n\t// wuerde zwei schnell aufeinander folgende Auswahlen nicht trennen: der langsamere Reader der\n\t// ersten Auswahl traegt dann dieselbe Generation und darf trotzdem schreiben.\n\tprivate readGeneration = 0;\n\n\tprivate applyDisabled(): void {\n\t\tconst value = this.fieldDisabled || this.inputDisabled || this.controlDisabled;\n\t\tthis._disabled = value;\n\t\tif ( value )\n\t\t\tthis.readGeneration++;\n\t\tif ( value )\n\t\t\tthis.parts.disable( { emitEvent: false } );\n\t\telse\n\t\t\tthis.parts.enable( { emitEvent: false } );\n\t\tthis.stateChanges.next();\n\t}\n\n\tprivate _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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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.controlDisabled = isDisabled;\n\t\tthis.applyDisabled();\n\t}\n\n\tsetDescribedByIds( ids: string[] ) {\n\t\tthis.describedBy = ids.join( ' ' );\n\t}\n\n\tonContainerClick(): void { /* intentionally empty */ }\n\t\n\t// Ein deaktiviertes `parts` sperrt nur die Anzeige -- der Dateidialog haengt am\n\t// mat-form-field, nicht am Input, und kann beim Sperren schon offen sein. Deshalb hier ein\n\t// eigener Guard und nicht nur einer im Template.\n\tprotected openFileDialog( input: HTMLInputElement ): void {\n\t\tif ( this.disabled )\n\t\t\treturn;\n\t\tinput.click();\n\t}\n\n\tfileChange( event: Event ) {\n\n\t\tif ( this.disabled )\n\t\t\treturn;\n\n\t\t// Der FileReader antwortet asynchron. Wird das Feld waehrend des Lesens gesperrt oder eine\n\t\t// neue Auswahl getroffen, darf der Callback nichts mehr schreiben -- und ein disable/enable\n\t\t// dazwischen darf ihn auch nicht wieder gueltig machen. Deshalb eine Generation statt\n\t\t// eines blossen Guards.\n\t\t//\n\t\t// Direkt hier hochzaehlen, vor jedem Abbruch: auch eine verworfene Auswahl (zu viele\n\t\t// Dateien) muss eine noch laufende vorherige entwerten, sonst schreibt deren Reader in\n\t\t// einen Stand, den der Nutzer gerade ersetzen wollte.\n\t\tconst generation = ++this.readGeneration;\n\n\t\tconst element = event.currentTarget as HTMLInputElement;\n\t\tconst fileList: FileList | null = element.files;\n\n\t\tif ( fileList === null || fileList.length === 0 || fileList.length > 100 )\n\t\t\treturn;\n\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\tif ( generation !== this.readGeneration )\n\t\t\t\t\treturn;\n\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)=\"openFileDialog(fileInput)\">\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\" [disabled]=\"disabled\">\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\" [disabled]=\"disabled\"\n\t (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\t// Zwei Sperrquellen, getrennt gehalten und verodert: Angular ruft beim Control-Setup\n\t// setDisabledState(false) -- callSetDisabledState ist per Default 'always' -- und zwar nach\n\t// dem field-Input. Schlüge das direkt durch, höbe es ein Backend-disabled wieder auf.\n\t// Getrennt, obwohl beide deklarativ sind: sind [field] und [disabled] gleichzeitig gebunden,\n\t// ruft Angular den unveraenderten zweiten Input nicht erneut auf.\n\tprivate fieldDisabled = false;\n\tprivate inputDisabled = false;\n\tprivate controlDisabled = false;\n\n\tget disabled(): boolean {\n\t\treturn this._disabled;\n\t}\n\n\t// Der oeffentliche Input ist dieselbe Quelle wie field.disabled: eine deklarative Sperre, die\n\t// ein setDisabledState(false) beim Control-Setup nicht aufheben darf.\n\tset disabled( value: boolean ) {\n\t\tthis.inputDisabled = value;\n\t\tthis.applyDisabled();\n\t}\n\n\tprivate applyDisabled(): void {\n\t\tconst value = this.fieldDisabled || this.inputDisabled || this.controlDisabled;\n\t\tthis._disabled = value;\n\t\tif ( value )\n\t\t\tthis.parts.disable( { emitEvent: false } );\n\t\telse\n\t\t\tthis.parts.enable( { emitEvent: false } );\n\t\tthis.stateChanges.next();\n\t}\n\n\tprivate _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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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\tif ( this.changeTO )\n\t\t\tclearTimeout( this.changeTO );\n\n\t\tthis.changeTO = setTimeout( () => {\n\t\t\t// Erneut pruefen: zwischen Planung und Callback kann control.disable() gelaufen sein.\n\t\t\t// Ein gesperrtes Feld schreibt nichts nach aussen.\n\t\t\t//\n\t\t\t// _lastValue wird erst hier gesetzt, nicht schon beim Planen. Sonst merkte sich das\n\t\t\t// Feld einen Wert, den das aeussere Control nie bekommen hat: nach einem spaeteren\n\t\t\t// enable() ruft Angular nur setDisabledState(false) und kein writeValue(), runCheck()\n\t\t\t// saehe value === _lastValue und gliche nie wieder ab.\n\t\t\tif ( this.disabled )\n\t\t\t\treturn;\n\n\t\t\tthis._lastValue = val ?? null;\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.controlDisabled = isDisabled;\n\t\tthis.applyDisabled();\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\tuntracked,\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\t// Über setDisabledState gehen, nicht direkt auf `disabled` schreiben: sonst\n\t\t\t\t// überschreibt eine frisch angelegte, enabled Control-Instanz das fieldDisabled\n\t\t\t\t// eines Backend-gesperrten Felds. Das passiert real, weil `track field.id` die\n\t\t\t\t// Kindkomponente behält, während createControl() ein neues Control anlegt.\n\t\t\t\tif ( this._previousControl !== undefined && ngControl.disabled !== null )\n\t\t\t\t\tthis.setDisabledState( ngControl.disabled );\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\t// Ein gesperrtes Feld schreibt nichts nach aussen. Ohne den Guard laeuft nach jedem\n\t\t// control.disable() noch ein _onChange durch -- der Renderlauf, den das Sperren ausloest,\n\t\t// erreicht doCheckLogic() und von dort startChangeValue(). Das aeussere Control bekaeme\n\t\t// also eine zweite setValue-Emission, ausgeloest allein durch einen Zustandswechsel.\n\t\tif ( this.disabled )\n\t\t\treturn;\n\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\t// Der oeffentliche Input ist dieselbe Quelle wie field.disabled: eine deklarative Sperre, die\n\t// ein setDisabledState(false) beim Control-Setup nicht aufheben darf. Er schreibt deshalb\n\t// fieldDisabled und nicht den effektiven Zustand.\n\tset disabled( value: boolean ) {\n\t\tthis.inputDisabled = value;\n\t\tthis.applyDisabled();\n\t}\n\n\tprotected _disabled = signal<boolean>( false );\n\n\t// Zusammengesetzte Feldtypen halten ihre Eingaben in einer eigenen inneren FormGroup, die per\n\t// formControlName gebunden ist. Sie melden sie hier an, damit control.disable() von aussen\n\t// dieselbe Gruppe trifft wie field.disabled. Ohne inneres Control bleibt es undefined.\n\tprotected inner?: AbstractControl;\n\n\t// Zwei Quellen, getrennt gehalten und verodert. Angular ruft beim Control-Setup\n\t// setDisabledState(false) -- callSetDisabledState ist per Default 'always' -- und zwar nach\n\t// dem field-Input. Schlüge das direkt auf `disabled` durch, höbe es ein Backend-disabled\n\t// wieder auf.\n\t//\n\t// controlDisabled ist dabei nicht \"die programmatische Quelle\": XiriFormFieldsComponent\n\t// schreibt Backend-Zustand über applyPatch() und den globalen disabled-Effect ebenfalls auf\n\t// das äussere Control. Auf der Control-Seite gilt last writer wins, wie bisher auch.\n\t// Getrennt, obwohl beide deklarativ sind: sind [field] und [disabled] gleichzeitig gebunden,\n\t// ruft Angular den unveraenderten zweiten Input nicht erneut auf. Mit einem gemeinsamen Flag\n\t// hoebe der zuletzt laufende Setter den anderen auf.\n\tprotected fieldDisabled = false;\n\tprivate inputDisabled = false;\n\tprivate controlDisabled = false;\n\n\tprotected applyDisabled(): void {\n\t\tconst value = this.fieldDisabled || this.inputDisabled || this.controlDisabled;\n\n\t\t// untracked, weil Angular setDisabledState() aus setUpControlValueAccessor heraus ruft --\n\t\t// also waehrend der Template-Auswertung, wo ein Signal-Write sonst NG0600 wirft. Angulars\n\t\t// eigenes FormControl.setValue macht es an derselben Stelle genauso.\n\t\tuntracked( () => this._disabled.set( value ) );\n\n\t\tif ( value )\n\t\t\tthis.inner?.disable( { emitEvent: false } );\n\t\telse\n\t\t\tthis.inner?.enable( { emitEvent: false } );\n\n\t\tthis._changeDetectorRef.markForCheck();\n\t\tthis.stateChanges.next();\n\t}\n\n\tsetDisabledState( isDisabled: boolean ): void {\n\t\tthis.controlDisabled = isDisabled;\n\t\tthis.applyDisabled();\n\t}\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\n\t\t// Meldet die innere Gruppe an XiriFieldMain: control.disable() von aussen muss sie\n\t\t// genauso treffen wie field.disabled.\n\t\tthis.inner = this.parts;\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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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\n\t\t// Meldet die innere Gruppe an XiriFieldMain: control.disable() von aussen muss sie\n\t\t// genauso treffen wie field.disabled.\n\t\tthis.inner = this.parts;\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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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\n\t\t// Meldet die innere Gruppe an XiriFieldMain: control.disable() von aussen muss sie\n\t\t// genauso treffen wie field.disabled.\n\t\tthis.inner = this.parts;\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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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\n\t\t// Meldet das innere Control an XiriFieldMain: control.disable() von aussen muss es\n\t\t// genauso treffen wie field.disabled.\n\t\tthis.inner = this.dateControl;\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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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<!-- ponytail: Suche und Aufklapp-Button bleiben auch gesperrt bedienbar. Beide\n\t\t\t\t\t ändern den Wert nicht, sperren würde nur das Nachschauen behindern. -->\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\" [disabled]=\"disabled\"\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 [disabled]=\"disabled\"\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 { AbstractControl, 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\n\t/** what the panel currently shows — the basis for the select-all toggle */\n\tprivate _filtered: XiriFormFieldSelectOption[] = [];\n\n\tprivate emit( list: XiriFormFieldSelectOption[] ) {\n\t\tthis._filtered = list;\n\t\tthis._filteredValuesSubject.next( list );\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.emit( 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\t// Server kann Optionen liefern, die schon in der Startliste stehen (z. B. eine per addUrl\n\t\t\t\t\t\t// angelegte): nicht doppelt anzeigen.\n\t\t\t\t\t\tconst known = new Set( this._allValues.map( o => o.id ) );\n\t\t\t\t\t\tconst fresh = ( filteredList as XiriFormFieldSelectOption[] ).filter( o => !known.has( o.id ) );\n\t\t\t\t\t\tthis.emit( this._allValues.slice().concat( fresh ) );\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.emit( 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.emit( this._allValues.filter( el => this.predicate()( search, el ) ) );\n\t}\n\t\n\t// ---- select all / none (ngx-mat-select-search toggle-all checkbox) ----\n\t// Contract: \"visible\" = what the panel currently shows (_filtered). Disabled and group\n\t// options are never toggled; already selected disabled options survive a \"none\".\n\n\tprivate selectableIds(): Set<unknown> {\n\t\treturn new Set( this._filtered.filter( o => !o.disabled && !o.isGroup ).map( o => o.id ) );\n\t}\n\n\tprivate static ids( value: unknown ): unknown[] {\n\t\treturn Array.isArray( value ) ? value : [];\n\t}\n\n\t/** false when nothing is selectable — the checkbox is hidden then, otherwise MatCheckbox would stay checked after a no-op click */\n\thasSelectable(): boolean {\n\t\treturn this.selectableIds().size > 0;\n\t}\n\n\tallSelected( value: unknown ): boolean {\n\t\tconst sel = this.selectableIds();\n\t\tconst cur = new Set( XiriSelectDirective.ids( value ) );\n\t\treturn sel.size > 0 && [ ...sel ].every( id => cur.has( id ) );\n\t}\n\n\tsomeSelected( value: unknown ): boolean {\n\t\tconst sel = this.selectableIds();\n\t\tconst cur = new Set( XiriSelectDirective.ids( value ) );\n\t\tconst hits = [ ...sel ].filter( id => cur.has( id ) ).length;\n\t\treturn hits > 0 && hits < sel.size;\n\t}\n\n\ttoggleSelectAll( selectAll: boolean, control: AbstractControl | null ) {\n\t\tif ( !control || control.disabled )\n\t\t\treturn;\n\t\tconst sel = this.selectableIds();\n\t\tconst cur = XiriSelectDirective.ids( control.value );\n\t\tconst next = selectAll\n\t\t\t? cur.concat( [ ...sel ].filter( id => !cur.includes( id ) ) )\n\t\t\t: cur.filter( id => !sel.has( id ) );\n\t\tif ( next.length === cur.length && next.every( ( id, i ) => id === cur[ i ] ) )\n\t\t\treturn;\n\t\tcontrol.setValue( next );\n\t\tcontrol.markAsDirty();\n\t\tcontrol.markAsTouched();\n\t}\n}\n","import { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport {\n\tComponent,\n\tcomputed,\n\tElementRef,\n\tforwardRef,\n\tinput,\n\tsignal,\n\tuntracked,\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\t// Zwei Sperrquellen, verodert. field ist hier ein input(), kein Setter -- die Ableitung\n\t// gehoert deshalb in ein computed. Angular ruft beim Control-Setup setDisabledState(false),\n\t// was ein Backend-disabled sonst wieder aufhoebe.\n\tprivate controlDisabled = signal( false );\n\treadonly disabled = computed( () => !!this.field().disabled || this.controlDisabled() );\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\t// untracked wie bei setDisabledState: Angular ruft writeValue aus\n\t\t// setUpControlValueAccessor, also waehrend der Template-Auswertung. Ohne das wirft ein\n\t\t// Neuaufbau des Formulars mit gleicher Feld-ID NG0600.\n\t\tuntracked( () => this.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\tsetDisabledState( isDisabled: boolean ): void {\n\t\t// untracked: Angular ruft das aus setUpControlValueAccessor, also waehrend der\n\t\t// Template-Auswertung -- ein Signal-Write wuerde dort NG0600 werfen.\n\t\tuntracked( () => this.controlDisabled.set( isDisabled ) );\n\t}\n\n\tadd( event: MatChipInputEvent ): void {\n\t\tif ( this.disabled() ) return;\n\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\t// Auch bei deaktiviertem Grid: hatte ein Chip beim Sperren den Fokus, leitet Material\n\t\t// Delete/Backspace weiter und prueft dabei nur `removable`.\n\t\tif ( this.disabled() ) return;\n\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\t// Ein bereits offenes Autocomplete-Overlay kann nach dem Sperren noch liefern.\n\t\tif ( this.disabled() ) return;\n\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 [disabled]=\"disabled()\">\n\t\t@for (chip of chips(); track chip) {\n\t\t\t<mat-chip-row (removed)=\"remove(chip)\" [class]=\"chipColor(chip)\" [removable]=\"!disabled()\">\n\t\t\t\t{{ displayLabel(chip) }}\n\t\t\t\t<button matChipRemove [disabled]=\"disabled()\" [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 [disabled]=\"disabled()\"\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 {\n\tcatchError,\n\tdistinctUntilChanged,\n\tEMPTY,\n\tfilter,\n\tfinalize,\n\tmap,\n\tmerge,\n\tObservable,\n\tSubject,\n\tswitchMap,\n\ttimer\n} 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 { MatProgressBar } from '@angular/material/progress-bar';\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 { MatDialog } from '@angular/material/dialog';\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 MatProgressBar,\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 dialog = inject( MatDialog );\n\t// Der lazy Import in openAdd() kann nach der Zerstörung auflösen; takeUntilDestroyed greift erst danach.\n\tprivate destroyed = false;\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\t// Läuft gerade ein Reload? Trägt den Fortschrittsbalken über dem Feldblock. Bewusst nur eine\n\t// Anzeige und kein control.disable(): ein deaktiviertes Control fällt aus formGroup.value, und\n\t// genau das lesen xiri-query und xiri-form aus dem formChange.\n\tprotected reloading = signal( 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\tthis.destroyRef.onDestroy( () => this.destroyed = true );\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\t// Der Balken hängt am Trigger-Wechsel, nicht am Request: gesetzt wird vor dem Timer,\n\t\t\t// sonst bliebe die Entprellzeit ohne Rückmeldung. Bei einem zweiten Wechsel bleibt er\n\t\t\t// durchgehend an, weil switchMap den alten Inner-Stream abräumt (finalize -> false),\n\t\t\t// bevor diese Projektion für den neuen läuft (-> true).\n\t\t\tswitchMap( () => {\n\t\t\t\tif ( this.dependentFields().length === 0 )\n\t\t\t\t\treturn EMPTY;\n\t\t\t\tthis.reloading.set( true );\n\t\t\t\treturn timer( 200 ).pipe(\n\t\t\t\t\tswitchMap( () => this.fetchPatches() ),\n\t\t\t\t\tfinalize( () => this.reloading.set( false ) ),\n\t\t\t\t);\n\t\t\t} ),\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\t// \"+\"-Button (field.addUrl): öffnet den Server-Dialog per GET und übernimmt die angelegte Option.\n\tprotected openAdd( id: string ): void {\n\n\t\tconst field = this._fields?.find( f => f.id === id );\n\t\tconst control = this.formGroup.get( id );\n\t\tif ( !field?.addUrl || !control )\n\t\t\treturn;\n\t\tconst url = field.addUrl;\n\n\t\t// Lazy: dialog.component importiert xiri-form-fields, ein statischer Import wäre ein Zyklus.\n\t\timport( '../dialog/dialog.component' ).then( m => {\n\t\t\tif ( this.destroyed || this.formGroup.get( id ) !== control )\n\t\t\t\treturn;\n\t\t\tthis.dialog.open( m.XiriDialogComponent, { data: { type: 'load', url } } )\n\t\t\t\t.afterClosed()\n\t\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t\t.subscribe( ( res: unknown ) => this.addOption( id, control, res ) );\n\t\t} ).catch( err => console.error( 'xiri-form-fields: dialog import failed', err ) );\n\t}\n\n\tprivate addOption( id: string, control: AbstractControl, res: unknown ): void {\n\n\t\tconst field = this._fields?.find( f => f.id === id );\n\t\tconst { done, created } = ( res ?? {} ) as { done?: unknown; created?: unknown };\n\t\t// Das Formular kann inzwischen gewechselt haben (auch mit gleicher Feld-ID): nur ins Control\n\t\t// schreiben, das den Dialog geöffnet hat.\n\t\tif ( !field || this.formGroup.get( id ) !== control || control.disabled || done !== true || !isCreatedOption( created ) )\n\t\t\treturn;\n\t\t// Bei chips sind Strings Freitext, nur Zahlen werden als Option aufgelöst.\n\t\tif ( field.type === 'chips' && typeof created.id !== 'number' )\n\t\t\treturn;\n\n\t\tif ( !collectOptionIds( field.list ?? [] ).has( created.id ) )\n\t\t\tfield.list = [ ...( field.list ?? [] ), { id: created.id, name: created.name } ];\n\n\t\t// Nicht über Array.isArray entscheiden: ein leeres Single-Select startet intern mit [].\n\t\tif ( field.multiple || field.type === 'treeselect' || field.type === 'chips' ) {\n\t\t\tconst current: unknown[] = Array.isArray( control.value ) ? control.value : [];\n\t\t\tif ( !current.includes( created.id ) ) {\n\t\t\t\tcontrol.markAsDirty();\n\t\t\t\tcontrol.setValue( [ ...current, created.id ] );\n\t\t\t}\n\t\t} else if ( control.value !== created.id ) {\n\t\t\tcontrol.markAsDirty();\n\t\t\tcontrol.setValue( created.id );\n\t\t}\n\n\t\tthis.patchedClones.set( id, { ...field } );\n\t\tthis.patchVersion.update( v => v + 1 );\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\t// Hängt bewusst nur an form(). Der Control-Umbau ist ein Seiteneffekt und läuft untracked:\n\t// addControl lässt die FormGroupDirective das neue Control sofort an eine wiederverwendete\n\t// Directive binden (writeValue), und MatSelect schreibt dabei ein Signal im KeyManager -\n\t// in einer Computed wäre das NG0600.\n\tfields = computed( () => {\n\n\t\tconst fields = this.form();\n\t\treturn untracked( () => {\n\n\t\t\tthis._fieldsLoaded = false;\n\t\t\tif ( this._fields !== null ) {\n\t\t\t\tfor ( let i = 0; i != this._fields.length; i++ ) {\n\t\t\t\t\tthis.formGroup.removeControl( this._fields[ i ].id );\n\t\t\t\t}\n\t\t\t\tthis._fields = null;\n\t\t\t}\n\n\t\t\tif ( fields == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tthis._fields = fields;\n\n\t\t\t// Neue Feldliste: alte Render-Kopien und Patch-Stände gehören zum vorherigen Formular.\n\t\t\tthis.formGeneration++;\n\t\t\tthis.patchedClones.clear();\n\t\t\tthis.lastPatch.clear();\n\n\t\t\tconst initialCollapsed = new Set<string>();\n\t\t\tfor ( const f of fields ) {\n\t\t\t\tif ( f.type === 'header' && f.collapsible && f.collapsed )\n\t\t\t\t\tinitialCollapsed.add( f.id );\n\t\t\t}\n\t\t\tthis.collapsedSections.set( initialCollapsed );\n\n\t\t\tthis.createControl();\n\n\t\t\tthis.lastValue = JSON.stringify( this.formGroup.value );\n\t\t\tthis._fieldsLoaded = true;\n\t\t\treturn this._fields;\n\t\t} );\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 = new Set<string | number>() ): 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\nfunction isCreatedOption( value: unknown ): value is { id: number | string; name: string } {\n\tif ( value === null || typeof value !== 'object' )\n\t\treturn false;\n\tconst { id, name } = value as { id?: unknown; name?: unknown };\n\treturn ( typeof id === 'string' || ( typeof id === 'number' && Number.isFinite( id ) ) ) && typeof name === 'string';\n}\n","@if (reloading()) {\n\t<mat-progress-bar class=\"reloadbar\" mode=\"indeterminate\"></mat-progress-bar>\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<div class=\"add-wrap\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t<mat-form-field class=\"add-wrap-control\" [formGroup]=\"formGroup\" floatLabel=\"auto\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t@if (field.search === false && !field.selectAll) {\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 || {}\"\n\t\t\t\t\t\t\t\t [showToggleAllCheckbox]=\"!!field.multiple && !!field.selectAll && xiriSelect.hasSelectable()\"\n\t\t\t\t\t\t\t\t [toggleAllCheckboxChecked]=\"!!field.multiple && !!field.selectAll && xiriSelect.allSelected(formGroup.get(field.id)?.value)\"\n\t\t\t\t\t\t\t\t [toggleAllCheckboxIndeterminate]=\"!!field.multiple && !!field.selectAll && xiriSelect.someSelected(formGroup.get(field.id)?.value)\"\n\t\t\t\t\t\t\t\t (toggleAll)=\"xiriSelect.toggleSelectAll($event, formGroup.get(field.id))\"></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\t@if (field.addUrl) {\n\t\t\t\t\t<button mat-icon-button type=\"button\" class=\"add-option\" aria-label=\"Neu anlegen\"\n\t\t\t\t\t [disabled]=\"disabled() || formGroup.get(field.id)?.disabled\" (click)=\"openAdd(field.id)\"><mat-icon>add</mat-icon></button>\n\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('treeselect') {\n\t\t\t\t<div class=\"treeselect add-wrap\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t<div class=\"add-wrap-control\">\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\t@if (field.addUrl) {\n\t\t\t\t\t<button mat-icon-button type=\"button\" class=\"add-option\" aria-label=\"Neu anlegen\"\n\t\t\t\t\t [disabled]=\"disabled() || formGroup.get(field.id)?.disabled\" (click)=\"openAdd(field.id)\"><mat-icon>add</mat-icon></button>\n\t\t\t\t}\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=\"add-wrap\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-chips class=\"add-wrap-control\" [field]=\"field\" [formControlName]=\"field.id\"></xiri-chips>\n\t\t\t\t\t@if (field.addUrl) {\n\t\t\t\t\t\t<button mat-icon-button type=\"button\" class=\"add-option\" aria-label=\"Neu anlegen\"\n\t\t\t\t\t\t [disabled]=\"disabled() || formGroup.get(field.id)?.disabled\" (click)=\"openAdd(field.id)\"><mat-icon>add</mat-icon></button>\n\t\t\t\t\t}\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\" | \"load\"\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\t// Poll interval of a waiting dialog, in ms — this is what xiri-go sends.\n\tcheckTime?: 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\t// xiri-go sends the poll interval as checkTime; res.time stays as a fallback.\n\t\t\t\tthis.refreshTime = res.checkTime ?? 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\t// Bis zum close(res) darf nichts anderes schließen, sonst geht das Ergebnis (z. B. created) verloren.\n\t\t\tthis.dialogRef.disableClose = true;\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\t// '_blank' and not a fixed window name: a name would make every report replace\n\t\t\t// the previously opened one instead of getting its own tab.\n\t\t\tconst file = window.open( this.dataService.getConfigApi() + this.url, '_blank' );\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' && !done()) {\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, InjectionToken } 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/**\n * Nächstgelegener Panel-Container eines Auslösers: eine xiri-card oder ein mat-expansion-panel (Directive\n * xiriExpansionPanel). Beide stellen sich per Provider bereit; Button und Tabelle injizieren den Token optional\n * und rufen bei refresh:'panel' reloadPanel().\n */\nexport interface XiriPanelHost {\n\treloadPanel(): void;\n}\n\nexport const XIRI_PANEL_HOST = new InjectionToken<XiriPanelHost>( 'XIRI_PANEL_HOST' );\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\tonPanelRefresh?: () => 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.refresh == 'panel' )\n\t\t\tcallbacks?.onPanelRefresh?.();\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, XIRI_PANEL_HOST } 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ächstgelegene Card; null außerhalb einer Card. Ziel für refresh:'panel'.\n\tprivate panelHost = inject( XIRI_PANEL_HOST, { optional: true } );\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, { onPanelRefresh: () => this.refreshPanel() } );\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\t// Ohne umschließende Card: wie eine Card ohne url → Page-Reload.\n\tprivate refreshPanel() {\n\t\tif ( this.panelHost )\n\t\t\tthis.panelHost.reloadPanel();\n\t\telse\n\t\t\tthis.responseHandler.handle( { refresh: 'page' } );\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\t// Hochgezählt bei jedem start()/cancel(): ein verspäteter Save-Fehler öffnet die Zelle nur wieder, wenn seitdem nichts passiert ist.\n\tprivate editSeq = 0;\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\tprivate isRowLive!: ( row: XiriTableRow ) => boolean;\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\tisRowLive: ( row: XiriTableRow ) => boolean;\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\tthis.isRowLive = config.isRowLive;\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\tthis.editSeq++;\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\tthis.editSeq++;\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\tconst seq = this.editSeq;\n\t\tconst snapshot = {\n\t\t\tchips: this.editingChipsValues(),\n\t\t\toptions: this.loadedEditableOptions(),\n\t\t\tcache: new Map( this.optionCache ), // enthält auch nur per editableSearchUrl gefundene Optionen\n\t\t};\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\tif ( this.editSeq !== seq || !this.isRowLive( row ) ) {\n\t\t\t\t\t// User ist schon woanders (Tab, Escape, neue Zelle) oder ein Reload hat die Row ersetzt: nichts kapern, Wert verwerfen\n\t\t\t\t\trow[ column.id ] = originalValue;\n\t\t\t\t\tthis.onDataUpdate();\n\t\t\t\t} else {\n\t\t\t\t\t// Abgelehnten Wert stehen lassen und Zelle wieder öffnen; Escape stellt weiterhin das Original her\n\t\t\t\t\tthis.loadedEditableOptions.set( snapshot.options );\n\t\t\t\t\tthis.editingChipsValues.set( snapshot.chips );\n\t\t\t\t\tthis.editingOriginalValue = originalValue;\n\t\t\t\t\tthis.editingCell.set( { row, field: column.id } );\n\t\t\t\t\tthis.initSearch( column, row );\n\t\t\t\t\tsnapshot.cache.forEach( ( o, k ) => this.optionCache.set( k, o ) ); // nach initSearch, das den Cache leert\n\t\t\t\t\tthis.focus();\n\t\t\t\t}\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\t// Nur weiterspringen, wenn der Save die Zelle nicht (synchron abgelehnt) wieder geöffnet hat\n\t\t\tif ( nextColumn && !this.editingCell() ) {\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, XIRI_PANEL_HOST } 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\t// Eingebettet (z. B. im Expansion-Panel): ohne Elevation, Hintergrund und Außen-Margin.\n\tflat?: 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\t// Nächstgelegene Card; null außerhalb einer Card. Ziel für refresh:'panel' aus eigenen Aktionspfaden.\n\tprivate panelHost = inject( XIRI_PANEL_HOST, { optional: true } );\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\tflat: 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\tisRowLive: ( row ) => this.dataSource.data.includes( row ),\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\t// Gespeicherten Suchtext VOR dem ersten Load wiederherstellen: server-side muss er im ersten\n\t\t// Request stehen, client-side (flach) muss der filter auf der dataSource gesetzt sein.\n\t\t// Sort/Paginator werden erst in setData() restauriert, weil sie die geladene Datenmenge brauchen.\n\t\tconst savedFilter = this.savedState()?.filter;\n\t\tif ( savedFilter ) {\n\t\t\tthis.searchText = savedFilter;\n\t\t\tthis.searchTextInit = savedFilter;\n\t\t\tif ( !this.options.serverSide && !this.tree.enabled )\n\t\t\t\tthis.dataSource.filter = savedFilter;\n\t\t}\n\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 saved = this.savedState();\n\t\t\tif ( !saved )\n\t\t\t\treturn;\n\n\t\t\tif ( saved.sort !== undefined && saved.sortDirection !== undefined )\n\t\t\t\tthis.sort().sort( ( { id: saved.sort, start: saved.sortDirection } ) as MatSortable );\n\t\t\tif ( saved.pageSize !== undefined && saved.pageIndex !== undefined ) {\n\t\t\t\tthis.paginator().pageIndex = saved.pageIndex;\n\t\t\t\tthis.paginator()._changePageSize( saved.pageSize );\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate savedState(): XiriTableSavedState | null {\n\t\tconst stateKey = this.tableStateKey();\n\t\tif ( !this.options.saveState || !stateKey )\n\t\t\treturn null;\n\t\treturn this.sessionStorageService.getTimeout( stateKey, 3600 ) as XiriTableSavedState | null;\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\n\t// Der Header-Streifen ist 51px hoch, grau und hat eine Trennlinie — ohne Inhalt bliebe darüber\n\t// nur eine leere graue Leiste stehen. Reaktiv, weil autoRefresh/lastUpdated erst beim Laden kommen.\n\tget hasHeader(): boolean {\n\t\treturn !!( this.options.reload || this.options.title || this.options.buttons || this.options.search\n\t\t\t|| this.options.saveInput || this.treeEnabled || this.autoRefresh() || this.lastUpdated() );\n\t}\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\t// xiri-button hat refresh:'panel' schon behandelt (Panel-Host oder Page-Fallback) – hier nicht noch einmal.\n\t\tthis.callReturn( event.result, true );\n\t}\n\t\n\tprivate callReturn( result: unknown, fromButton = false ) {\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\tonPanelRefresh: fromButton ? undefined : () => this.refreshPanel(),\n\t\t} );\n\t}\n\n\t// Ohne umschließende Card: wie eine Card ohne url → Page-Reload.\n\tprivate refreshPanel() {\n\t\tif ( this.panelHost )\n\t\t\tthis.panelHost.reloadPanel();\n\t\telse\n\t\t\tthis.responseHandler.handle( { refresh: 'page' } );\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\" [class.mat-elevation-z3]=\"!options.flat\" [class.flat]=\"options.flat\">\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@if (hasHeader) {\n\t\t\t\t<div class=\"header\" [hidden]=\"bulkBarActive\">\n\t\t\t\t\t@if (options.reload) {\n\t\t\t\t\t\t<div class=\"buttons\">\n\t\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\t<mat-icon>autorenew</mat-icon>\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\t@if (autoRefresh()) {\n\t\t\t\t\t\t<div class=\"autorefresh-indicator\" role=\"status\" aria-live=\"polite\"\n\t\t\t\t\t\t matTooltip=\"Tabelle aktualisiert sich automatisch\">\n\t\t\t\t\t\t\t<mat-icon class=\"spin\">sync</mat-icon>\n\t\t\t\t\t\t\t<span>Auto-Refresh aktiv · nächste in {{ countdown() }}s</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\t@if (lastUpdated(); as updated) {\n\t\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\t\tStand {{ updated | date:'HH:mm' }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\t@if (treeEnabled) {\n\t\t\t\t\t\t<div class=\"buttons xiri-tree-actions\">\n\t\t\t\t\t\t\t<button mat-icon-button (click)=\"expandAllNodes()\" color=\"primary\"\n\t\t\t\t\t\t\t matTooltip=\"Alle ausklappen\" aria-label=\"Alle ausklappen\">\n\t\t\t\t\t\t\t\t<mat-icon>unfold_more</mat-icon>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button mat-icon-button (click)=\"collapseAllNodes()\" color=\"primary\"\n\t\t\t\t\t\t\t matTooltip=\"Alle einklappen\" aria-label=\"Alle einklappen\">\n\t\t\t\t\t\t\t\t<mat-icon>unfold_less</mat-icon>\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\t<div class=\"middle\" [class.hasButtons]=\"options.buttons\">{{ options.title }}</div>\n\t\t\t\t\t@if (options.buttons) {\n\t\t\t\t\t\t<xiri-buttonline [settings]=\"options.buttons\" (result)=\"buttonReturn($event)\"\n\t\t\t\t\t\t [filterData]=\"_filterData()\"></xiri-buttonline>\n\t\t\t\t\t}\n\t\t\t\t\t@if (options.search) {\n\t\t\t\t\t\t<xiri-search (changed)=\"searchDo($event)\" [placeholder]=\"''\" [text]=\"searchTextInit\"></xiri-search>\n\t\t\t\t\t}\n\t\t\t\t\t@if (options.saveInput) {\n\t\t\t\t\t\t<div class=\"buttons saveInput\">\n\t\t\t\t\t\t\t<button mat-raised-button (click)=\"saveInputData()\" color=\"primary\">\n\t\t\t\t\t\t\t\t{{ options.saveInput }}\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}\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 { computed, effect, inject, Injector, linkedSignal, signal } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { XiriDataService } from './data.service';\n\n/**\n * Lädt ein Panel (Card, Expansion-Panel) von einer URL und puffert die letzte erfolgreiche Antwort.\n * Gemeinsame Logik der XIRI_PANEL_HOST-Implementierungen; muss im Injection-Context aufgerufen werden.\n *\n * - `raw`: rohe Antwort, nur gelesen, wenn die Resource einen Wert hat (value() wirft im Fehlerzustand).\n * - `loaded`: das Objekt unter `opts.key` der letzten erfolgreichen Antwort. Bleibt bei Reload-Fehler\n * stehen, wird bei url-Wechsel und bei einer erfolgreichen Antwort ohne `opts.key` geleert.\n * - `reloadOrQueue`: lädt neu; läuft der erste Load noch, wird der Reload nachgeholt, sobald er fertig ist.\n */\nexport function createPanelLoader<T extends object>( opts: { url: () => string | undefined; key: string } ) {\n\t// XiriDataService erst beim ersten Request auflösen: Hosts ohne url (statische Card, Shell-Panel) brauchen so\n\t// weiterhin keinen HttpClient-Provider.\n\tconst injector = inject( Injector );\n\t// Signal, kein Boolean: der Effect muss darauf reagieren, wenn es gesetzt wird.\n\tconst pendingReload = signal( false );\n\n\tconst resource = rxResource( {\n\t\tparams: opts.url,\n\t\tstream: ( { params } ) => injector.get( XiriDataService ).post( params, null ),\n\t} );\n\n\tconst errorMsg = computed( () => {\n\t\tconst e = 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\tconst raw = computed<unknown>( () => resource.hasValue() ? resource.value() : undefined );\n\n\t/** Objekt unter `key` in der aktuellen Antwort (Top-Level), sonst null. */\n\tconst response = computed<T | null>( () => {\n\t\tconst r = raw() as Record<string, unknown> | null | undefined;\n\t\tconst c = r && typeof r === 'object' && !Array.isArray( r ) ? r[ opts.key ] : undefined;\n\t\treturn c && typeof c === 'object' && !Array.isArray( c ) ? c as T : null;\n\t} );\n\n\tconst loaded = linkedSignal<{ url: string | undefined; item: T | null; hasValue: boolean }, T | null>( {\n\t\tsource: () => ( { url: opts.url(), item: response(), hasValue: raw() != null } ),\n\t\tcomputation: ( s, prev ) => {\n\t\t\tif ( s.item ) return s.item;\n\t\t\tif ( s.hasValue ) return null;\n\t\t\treturn prev && prev.source.url === s.url ? prev.value : null;\n\t\t},\n\t} );\n\n\t// pendingReload zuerst lesen, damit beide Signale als Abhängigkeit registriert sind.\n\teffect( () => {\n\t\tconst pending = pendingReload();\n\t\tconst loading = resource.isLoading();\n\t\tif ( pending && !loading ) {\n\t\t\tpendingReload.set( false );\n\t\t\tresource.reload();\n\t\t}\n\t} );\n\n\treturn {\n\t\tloading: resource.isLoading,\n\t\terrorMsg,\n\t\traw,\n\t\tloaded,\n\t\t/** Manueller Reload (Reload-Button): kein Doppelstart, solange geladen wird. */\n\t\treload: () => {\n\t\t\tif ( !resource.isLoading() ) resource.reload();\n\t\t},\n\t\t/** refresh:'panel': reload() gibt false zurück, solange der erste Load läuft – dann nachholen. */\n\t\t// ponytail: bei url-Wechsel während pending läuft danach ein Reload zu viel; harmlos.\n\t\treloadOrQueue: () => {\n\t\t\tif ( !resource.reload() ) pendingReload.set( true );\n\t\t},\n\t};\n}\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 { XiriResponseHandlerService, XiriPanelHost, XIRI_PANEL_HOST } from '../services/response-handler.service';\nimport { createPanelLoader } from '../services/panel-loader';\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 { 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\tflat?: boolean // Ohne Schatten/Hintergrund/Radius; Header nur wenn er Inhalt hat.\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\t providers: [ { provide: XIRI_PANEL_HOST, useExisting: forwardRef( () => XiriCardComponent ) } ],\n } )\nexport class XiriCardComponent implements XiriPanelHost {\n\n\tprivate responseHandler = inject( XiriResponseHandlerService );\n\t// Nächste äußere Card (Provider dieser Card übersprungen). Ziel für refresh:'panel', wenn diese Card keine url hat.\n\tprivate parentPanel = inject( XIRI_PANEL_HOST, { optional: true, skipSelf: true } );\n\n\tsettings = input.required<XiriCardSettings>();\n\n\t// Lädt {card: …} von settings().url; puffert die letzte komplette Card (siehe panel-loader.ts).\n\tprivate loader = createPanelLoader<XiriCardSettings>( { url: () => this.settings().url, key: 'card' } );\n\n\t// Bei flat nur rendern, wenn der Header Inhalt hat; sonst bliebe eine leere 32px-Leiste.\n\tshowHeader = computed( () => {\n\t\tconst s = this.card();\n\t\treturn !s.flat || !!( s.header || s.headerSub || s.headerIcon || s.buttonsTop?.buttons?.length\n\t\t\t|| s.collapsible || ( s.reload && s.url ) );\n\t} );\n\n\tisCollapsed = linkedSignal<boolean | undefined, boolean>( {\n\t\tsource: () => this.card().collapsed,\n\t\tcomputation: ( collapsed, previous ) => collapsed ?? previous?.value ?? false,\n\t} );\n\n\tloading = this.loader.loading;\n\terrorMsg = this.loader.errorMsg;\n\tprivate _raw = this.loader.raw;\n\t/** Zuletzt erfolgreich geladene komplette Card ({card: …}); null bei Zeilen-Antworten. */\n\tprivate loadedCard = this.loader.loaded;\n\n\t/** Inhaltszeilen aus einer Nicht-Card-Antwort: {data: rows} → rows, sonst die Antwort selbst. */\n\tprivate _loaded = computed( () => {\n\t\tif ( this.loadedCard() ) return undefined;\n\t\tconst res = this._raw();\n\t\tif ( res == null ) return res;\n\t\treturn ( res as { data?: unknown } ).data ?? res;\n\t} );\n\n\t/** settings(), überlagert von einer nachgeladenen kompletten Card. Inhaltsfelder kommen dann nur aus der Antwort. */\n\tcard = computed<XiriCardSettings>( () => {\n\t\tconst s = this.settings();\n\t\tconst c = this.loadedCard();\n\t\tif ( !c ) return s;\n\t\treturn { ...s, ...c, fields: c.fields, data: c.data, dense: c.dense, components: c.components,\n\t\t\tshowHeader: c.showHeader, forceMinWidth: c.forceMinWidth };\n\t} );\n\n\tcardData = computed( () => this.loadedCard() ? this.loadedCard()!.data : ( this._loaded() ?? this.settings().data ) );\n\n\t/** Skeleton nur, solange noch nie etwas geladen wurde (auch nicht gepuffert) und kein statischer Inhalt da ist. */\n\tshowSkeleton = computed( () => this.loading() && this._raw() == null && !this.loadedCard()\n\t\t&& this.settings().data == null && !( this.settings().components?.length ) );\n\n\thasComponents = computed( () => ( this.card().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.card().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.card().fields,\n\t\t\tdense: this.card().dense,\n\t\t\tforceMinWidth: this.card().forceMinWidth,\n\t\t\tshowHeader: this.card().showHeader,\n\t\t};\n\n\t\tif ( !this.card().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\t/** Klick irgendwo im Header toggelt; Buttons/Links (Collapse, Reload, buttonsTop) behalten ihre eigene Aktion. */\n\tonHeaderClick( event: MouseEvent ): void {\n\t\tif ( !this.card().collapsible ) return;\n\t\tif ( ( event.target as HTMLElement ).closest( 'button, a' ) ) return;\n\t\tthis.toggleCollapse();\n\t}\n\n\treload() {\n\t\tthis.loader.reload();\n\t}\n\n\t/** refresh:'panel' aus Button/Tabelle in dieser Card. Ohne url: äußere Card, sonst Page-Reload. */\n\treloadPanel(): void {\n\t\tif ( !this.settings().url ) {\n\t\t\tif ( this.parentPanel )\n\t\t\t\tthis.parentPanel.reloadPanel();\n\t\t\telse\n\t\t\t\tthis.responseHandler.handle( { refresh: 'page' } );\n\t\t\treturn;\n\t\t}\n\t\tthis.loader.reloadOrQueue();\n\t}\n\n}\n","<mat-card class=\"card mat-mdc-elevation-specific\" [class.mat-elevation-z2]=\"!card().flat\" [class.flat]=\"card().flat\">\n\t@if (showHeader()) {\n\t<mat-card-header (click)=\"onHeaderClick($event)\" [class.collapsible]=\"card().collapsible\">\n\t\t@if (card().headerIcon) {\n\t\t\t<div mat-card-avatar class=\"header-image\">\n\t\t\t\t<mat-icon [class]=\"card().headerIconColor || 'primary'\">{{ card().headerIcon }}</mat-icon>\n\t\t\t</div>\n\t\t}\n\t\t@if (card().header) {\n\t\t\t<mat-card-title [class]=\"{hasHeaderSub: card().headerSub}\">{{ card().header }}</mat-card-title>\n\t\t}\n\t\t@if (card().headerSub) {\n\t\t\t<mat-card-subtitle>{{ card().headerSub }}</mat-card-subtitle>\n\t\t}\n\t\t@if (card().buttonsTop) {\n\t\t\t<xiri-buttonline [settings]=\"card().buttonsTop!\"></xiri-buttonline>\n\t\t}\n\t\t@if (card().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 (card().reload && card().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}\n\t<div class=\"collapse-wrapper\" [class.collapsed]=\"isCollapsed()\">\n\t\t<div class=\"collapse-inner\">\n\t\t\t@if (showSkeleton()) {\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]=\"card().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]=\"card().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 (card().buttonsBottom) {\n\t\t\t\t<mat-card-actions align=\"end\">\n\t\t\t\t\t<xiri-buttonline [settings]=\"card().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\tnoPadding?: 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\" [bodyClass]=\"tab.noPadding ? 'xiri-tab-no-padding' : ''\">\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 { computed, Directive, forwardRef, inject, Injector, input } from '@angular/core';\nimport { XiriResponseHandlerService, XiriPanelHost, XIRI_PANEL_HOST } from '../services/response-handler.service';\nimport { createPanelLoader } from '../services/panel-loader';\nimport { XiriExpansionPanelSettings } from './expansion.component';\n\n/**\n * Macht ein mat-expansion-panel zum Panel-Host für refresh:'panel' und lädt es bei gesetzter url nach.\n * Sitzt als Directive direkt auf dem Material-Panel, damit der Element-Injector des Panels den Token trägt:\n * Header-Buttons und (über ngTemplateOutletInjector) der Inhalt finden so genau dieses Panel.\n */\n@Directive( {\n\t selector: 'mat-expansion-panel[xiriExpansionPanel]',\n\t exportAs: 'xiriExpansionPanel',\n\t providers: [ { provide: XIRI_PANEL_HOST, useExisting: forwardRef( () => XiriExpansionPanelDirective ) } ],\n } )\nexport class XiriExpansionPanelDirective implements XiriPanelHost {\n\n\t/**\n\t * Shell-Settings des Panels aus XiriExpansionSettings.panels. Nicht `required`: der Loader-Effect einer Directive\n\t * läuft in der Host-View und kann vor dem ersten Setzen der Inputs feuern (NG0950) – der leere Default hat keine url.\n\t */\n\tsettings = input<XiriExpansionPanelSettings>( { title: '', data: [] }, { alias: 'xiriExpansionPanel' } );\n\n\t/** Element-Injector des Panels – als ngTemplateOutletInjector für den Inhalt, sonst löst der über die deklarierende View auf. */\n\tinjector = inject( Injector );\n\n\tprivate responseHandler = inject( XiriResponseHandlerService );\n\t// Nächster äußerer Host (z. B. eine url-Card um das Akkordeon). Ziel für refresh:'panel', wenn dieses Panel keine url hat.\n\t// Innerhalb eingebetteter Views überspringt skipSelf Zwischenknoten – ein Reload landet dann höchstens zu grob, nie falsch.\n\tprivate parentPanel = inject( XIRI_PANEL_HOST, { optional: true, skipSelf: true } );\n\n\t// ponytail: lädt beim Init, unabhängig von lazy. Upgrade: params erst setzen, wenn das Panel zum ersten Mal offen war.\n\tprivate loader = createPanelLoader<XiriExpansionPanelSettings>( { url: () => this.settings().url, key: 'panel' } );\n\n\tloading = this.loader.loading;\n\terrorMsg = this.loader.errorMsg;\n\n\t/**\n\t * Shell, überlagert von title/description/icon/buttons/data der letzten Antwort.\n\t * expanded/disabled/lazy/unload bleiben Shell-Werte – sonst klappte ein Reload ohne `expanded` das Panel zu.\n\t */\n\tpanel = computed<XiriExpansionPanelSettings>( () => {\n\t\tconst s = this.settings();\n\t\tconst l = this.loader.loaded();\n\t\tif ( !l ) return s;\n\t\treturn { ...s, title: l.title, description: l.description, icon: l.icon, buttons: l.buttons, data: l.data ?? [] };\n\t} );\n\n\t/** Skeleton nur, solange noch nie etwas geladen wurde (auch nicht gepuffert) und die Shell keinen Inhalt hat. */\n\tshowSkeleton = computed( () => this.loading() && this.loader.raw() == null && !this.loader.loaded()\n\t\t&& !( this.settings().data?.length ) );\n\n\t/** refresh:'panel' aus Header-Button, Inhalt oder Tabelle in diesem Panel. Ohne url: äußerer Host, sonst Page-Reload. */\n\treloadPanel(): void {\n\t\tif ( !this.settings().url ) {\n\t\t\tif ( this.parentPanel )\n\t\t\t\tthis.parentPanel.reloadPanel();\n\t\t\telse\n\t\t\t\tthis.responseHandler.handle( { refresh: 'page' } );\n\t\t\treturn;\n\t\t}\n\t\tthis.loader.reloadOrQueue();\n\t}\n}\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';\nimport { XiriButtonlineComponent, XiriButtonlineSettings } from '../buttonline/buttonline.component';\nimport { XiriSkeletonComponent } from '../skeleton/skeleton.component';\nimport { XiriExpansionPanelDirective } from './expansion-panel.directive';\n\nexport interface XiriExpansionPanelSettings {\n\ttitle: string\n\tdescription?: string\n\ticon?: string\n\tdisabled?: boolean\n\texpanded?: boolean\n\turl?: string // Panel lädt sich von hier (POST null → {panel: …}); Shell hat dann data: []\n\tdata?: XiriDynData[]\n\tbuttons?: XiriButtonlineSettings\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, XiriButtonlineComponent, XiriSkeletonComponent, XiriExpansionPanelDirective ]\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\t// Eine flache Card/Table bringt Rahmen und Innenabstand selbst mit; das Panel halbiert dann\n\t// seinen Seitenabstand links/rechts (siehe .flat-content im SCSS).\n\thasFlatContent( panel: XiriExpansionPanelSettings ): boolean {\n\t\treturn panel.data?.some( d => d.type === 'card'\n\t\t\t? !!( d.data as { flat?: boolean } | undefined )?.flat\n\t\t\t: d.type === 'table' && !!( d.data as { options?: { flat?: boolean } } | undefined )?.options?.flat ) ?? false;\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 $index; let i = $index) {\n\t\t<mat-expansion-panel\n\t\t\t[xiriExpansionPanel]=\"panel\" #p=\"xiriExpansionPanel\"\n\t\t\t[class.flat-content]=\"hasFlatContent(p.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 (p.panel().icon) {\n\t\t\t\t\t<mat-icon>{{ p.panel().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<mat-panel-title>{{ p.panel().title }}</mat-panel-title>\n\t\t\t\t@if (p.panel().description) {\n\t\t\t\t\t<mat-panel-description>{{ p.panel().description }}</mat-panel-description>\n\t\t\t\t}\n\t\t\t\t@if (p.panel().buttons) {\n\t\t\t\t\t<xiri-buttonline class=\"panel-buttons\" [settings]=\"p.panel().buttons!\" [filterData]=\"filterData()\"\n\t\t\t\t\t\t(click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\"></xiri-buttonline>\n\t\t\t\t}\n\t\t\t</mat-expansion-panel-header>\n\n\t\t\t@if (p.showSkeleton()) {\n\t\t\t\t<xiri-skeleton type=\"text\" [lines]=\"3\"></xiri-skeleton>\n\t\t\t} @else if (p.errorMsg()) {\n\t\t\t\t<div class=\"load-error\">{{ p.errorMsg() }}</div>\n\t\t\t} @else if (shouldRenderContent(i, panel)) {\n\t\t\t\t<!-- injector: Element-Injector des Panels, sonst fände ein Button im Inhalt (eingebettete View) das Panel nicht. -->\n\t\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent();\n\t\t\t\t\tcontext: { $implicit: { data: p.panel().data ?? [], filterData: filterData() } };\n\t\t\t\t\tinjector: p.injector\"></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';\nexport * from './lib/expansion/expansion-panel.directive';\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/panel-loader';\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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"}
|
|
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/table/cell.ts","../../../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/formfields/form-state.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/services/panel-loader.ts","../../../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-panel.directive.ts","../../../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\t// Zwei Sperrquellen, getrennt gehalten und verodert: Angular ruft beim Control-Setup\n\t// setDisabledState(false) -- callSetDisabledState ist per Default 'always' -- und zwar nach\n\t// dem field-Input. Schlüge das direkt durch, höbe es ein Backend-disabled wieder auf.\n\t// Getrennt, obwohl beide deklarativ sind: sind [field] und [disabled] gleichzeitig gebunden,\n\t// ruft Angular den unveraenderten zweiten Input nicht erneut auf.\n\tprivate fieldDisabled = false;\n\tprivate inputDisabled = false;\n\tprivate controlDisabled = false;\n\n\tget disabled(): boolean {\n\t\treturn this._disabled;\n\t}\n\n\t// Der oeffentliche Input ist dieselbe Quelle wie field.disabled: eine deklarative Sperre, die\n\t// ein setDisabledState(false) beim Control-Setup nicht aufheben darf.\n\tset disabled( value: boolean ) {\n\t\tthis.inputDisabled = value;\n\t\tthis.applyDisabled();\n\t}\n\n\t// Wird bei jedem Sperren UND bei jeder neuen Auswahl hochgezaehlt. Nur beim Sperren zu zaehlen\n\t// wuerde zwei schnell aufeinander folgende Auswahlen nicht trennen: der langsamere Reader der\n\t// ersten Auswahl traegt dann dieselbe Generation und darf trotzdem schreiben.\n\tprivate readGeneration = 0;\n\n\tprivate applyDisabled(): void {\n\t\tconst value = this.fieldDisabled || this.inputDisabled || this.controlDisabled;\n\t\tthis._disabled = value;\n\t\tif ( value )\n\t\t\tthis.readGeneration++;\n\t\tif ( value )\n\t\t\tthis.parts.disable( { emitEvent: false } );\n\t\telse\n\t\t\tthis.parts.enable( { emitEvent: false } );\n\t\tthis.stateChanges.next();\n\t}\n\n\tprivate _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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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.controlDisabled = isDisabled;\n\t\tthis.applyDisabled();\n\t}\n\n\tsetDescribedByIds( ids: string[] ) {\n\t\tthis.describedBy = ids.join( ' ' );\n\t}\n\n\tonContainerClick(): void { /* intentionally empty */ }\n\t\n\t// Ein deaktiviertes `parts` sperrt nur die Anzeige -- der Dateidialog haengt am\n\t// mat-form-field, nicht am Input, und kann beim Sperren schon offen sein. Deshalb hier ein\n\t// eigener Guard und nicht nur einer im Template.\n\tprotected openFileDialog( input: HTMLInputElement ): void {\n\t\tif ( this.disabled )\n\t\t\treturn;\n\t\tinput.click();\n\t}\n\n\tfileChange( event: Event ) {\n\n\t\tif ( this.disabled )\n\t\t\treturn;\n\n\t\t// Der FileReader antwortet asynchron. Wird das Feld waehrend des Lesens gesperrt oder eine\n\t\t// neue Auswahl getroffen, darf der Callback nichts mehr schreiben -- und ein disable/enable\n\t\t// dazwischen darf ihn auch nicht wieder gueltig machen. Deshalb eine Generation statt\n\t\t// eines blossen Guards.\n\t\t//\n\t\t// Direkt hier hochzaehlen, vor jedem Abbruch: auch eine verworfene Auswahl (zu viele\n\t\t// Dateien) muss eine noch laufende vorherige entwerten, sonst schreibt deren Reader in\n\t\t// einen Stand, den der Nutzer gerade ersetzen wollte.\n\t\tconst generation = ++this.readGeneration;\n\n\t\tconst element = event.currentTarget as HTMLInputElement;\n\t\tconst fileList: FileList | null = element.files;\n\n\t\tif ( fileList === null || fileList.length === 0 || fileList.length > 100 )\n\t\t\treturn;\n\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\tif ( generation !== this.readGeneration )\n\t\t\t\t\treturn;\n\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)=\"openFileDialog(fileInput)\">\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\" [disabled]=\"disabled\">\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\" [disabled]=\"disabled\"\n\t (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\t// Zwei Sperrquellen, getrennt gehalten und verodert: Angular ruft beim Control-Setup\n\t// setDisabledState(false) -- callSetDisabledState ist per Default 'always' -- und zwar nach\n\t// dem field-Input. Schlüge das direkt durch, höbe es ein Backend-disabled wieder auf.\n\t// Getrennt, obwohl beide deklarativ sind: sind [field] und [disabled] gleichzeitig gebunden,\n\t// ruft Angular den unveraenderten zweiten Input nicht erneut auf.\n\tprivate fieldDisabled = false;\n\tprivate inputDisabled = false;\n\tprivate controlDisabled = false;\n\n\tget disabled(): boolean {\n\t\treturn this._disabled;\n\t}\n\n\t// Der oeffentliche Input ist dieselbe Quelle wie field.disabled: eine deklarative Sperre, die\n\t// ein setDisabledState(false) beim Control-Setup nicht aufheben darf.\n\tset disabled( value: boolean ) {\n\t\tthis.inputDisabled = value;\n\t\tthis.applyDisabled();\n\t}\n\n\tprivate applyDisabled(): void {\n\t\tconst value = this.fieldDisabled || this.inputDisabled || this.controlDisabled;\n\t\tthis._disabled = value;\n\t\tif ( value )\n\t\t\tthis.parts.disable( { emitEvent: false } );\n\t\telse\n\t\t\tthis.parts.enable( { emitEvent: false } );\n\t\tthis.stateChanges.next();\n\t}\n\n\tprivate _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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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\tif ( this.changeTO )\n\t\t\tclearTimeout( this.changeTO );\n\n\t\tthis.changeTO = setTimeout( () => {\n\t\t\t// Erneut pruefen: zwischen Planung und Callback kann control.disable() gelaufen sein.\n\t\t\t// Ein gesperrtes Feld schreibt nichts nach aussen.\n\t\t\t//\n\t\t\t// _lastValue wird erst hier gesetzt, nicht schon beim Planen. Sonst merkte sich das\n\t\t\t// Feld einen Wert, den das aeussere Control nie bekommen hat: nach einem spaeteren\n\t\t\t// enable() ruft Angular nur setDisabledState(false) und kein writeValue(), runCheck()\n\t\t\t// saehe value === _lastValue und gliche nie wieder ab.\n\t\t\tif ( this.disabled )\n\t\t\t\treturn;\n\n\t\t\tthis._lastValue = val ?? null;\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.controlDisabled = isDisabled;\n\t\tthis.applyDisabled();\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\tuntracked,\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\t// Über setDisabledState gehen, nicht direkt auf `disabled` schreiben: sonst\n\t\t\t\t// überschreibt eine frisch angelegte, enabled Control-Instanz das fieldDisabled\n\t\t\t\t// eines Backend-gesperrten Felds. Das passiert real, weil `track field.id` die\n\t\t\t\t// Kindkomponente behält, während createControl() ein neues Control anlegt.\n\t\t\t\tif ( this._previousControl !== undefined && ngControl.disabled !== null )\n\t\t\t\t\tthis.setDisabledState( ngControl.disabled );\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\t// Ein gesperrtes Feld schreibt nichts nach aussen. Ohne den Guard laeuft nach jedem\n\t\t// control.disable() noch ein _onChange durch -- der Renderlauf, den das Sperren ausloest,\n\t\t// erreicht doCheckLogic() und von dort startChangeValue(). Das aeussere Control bekaeme\n\t\t// also eine zweite setValue-Emission, ausgeloest allein durch einen Zustandswechsel.\n\t\tif ( this.disabled )\n\t\t\treturn;\n\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\t// Der oeffentliche Input ist dieselbe Quelle wie field.disabled: eine deklarative Sperre, die\n\t// ein setDisabledState(false) beim Control-Setup nicht aufheben darf. Er schreibt deshalb\n\t// fieldDisabled und nicht den effektiven Zustand.\n\tset disabled( value: boolean ) {\n\t\tthis.inputDisabled = value;\n\t\tthis.applyDisabled();\n\t}\n\n\tprotected _disabled = signal<boolean>( false );\n\n\t// Zusammengesetzte Feldtypen halten ihre Eingaben in einer eigenen inneren FormGroup, die per\n\t// formControlName gebunden ist. Sie melden sie hier an, damit control.disable() von aussen\n\t// dieselbe Gruppe trifft wie field.disabled. Ohne inneres Control bleibt es undefined.\n\tprotected inner?: AbstractControl;\n\n\t// Zwei Quellen, getrennt gehalten und verodert. Angular ruft beim Control-Setup\n\t// setDisabledState(false) -- callSetDisabledState ist per Default 'always' -- und zwar nach\n\t// dem field-Input. Schlüge das direkt auf `disabled` durch, höbe es ein Backend-disabled\n\t// wieder auf.\n\t//\n\t// controlDisabled ist dabei nicht \"die programmatische Quelle\": XiriFormFieldsComponent\n\t// schreibt Backend-Zustand über applyPatch() und den globalen disabled-Effect ebenfalls auf\n\t// das äussere Control. Auf der Control-Seite gilt last writer wins, wie bisher auch.\n\t// Getrennt, obwohl beide deklarativ sind: sind [field] und [disabled] gleichzeitig gebunden,\n\t// ruft Angular den unveraenderten zweiten Input nicht erneut auf. Mit einem gemeinsamen Flag\n\t// hoebe der zuletzt laufende Setter den anderen auf.\n\tprotected fieldDisabled = false;\n\tprivate inputDisabled = false;\n\tprivate controlDisabled = false;\n\n\tprotected applyDisabled(): void {\n\t\tconst value = this.fieldDisabled || this.inputDisabled || this.controlDisabled;\n\n\t\t// untracked, weil Angular setDisabledState() aus setUpControlValueAccessor heraus ruft --\n\t\t// also waehrend der Template-Auswertung, wo ein Signal-Write sonst NG0600 wirft. Angulars\n\t\t// eigenes FormControl.setValue macht es an derselben Stelle genauso.\n\t\tuntracked( () => this._disabled.set( value ) );\n\n\t\tif ( value )\n\t\t\tthis.inner?.disable( { emitEvent: false } );\n\t\telse\n\t\t\tthis.inner?.enable( { emitEvent: false } );\n\n\t\tthis._changeDetectorRef.markForCheck();\n\t\tthis.stateChanges.next();\n\t}\n\n\tsetDisabledState( isDisabled: boolean ): void {\n\t\tthis.controlDisabled = isDisabled;\n\t\tthis.applyDisabled();\n\t}\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\n\t\t// Meldet die innere Gruppe an XiriFieldMain: control.disable() von aussen muss sie\n\t\t// genauso treffen wie field.disabled.\n\t\tthis.inner = this.parts;\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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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\n\t\t// Meldet die innere Gruppe an XiriFieldMain: control.disable() von aussen muss sie\n\t\t// genauso treffen wie field.disabled.\n\t\tthis.inner = this.parts;\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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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\n\t\t// Meldet die innere Gruppe an XiriFieldMain: control.disable() von aussen muss sie\n\t\t// genauso treffen wie field.disabled.\n\t\tthis.inner = this.parts;\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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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\n\t\t// Meldet das innere Control an XiriFieldMain: control.disable() von aussen muss es\n\t\t// genauso treffen wie field.disabled.\n\t\tthis.inner = this.dateControl;\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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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.fieldDisabled = !!value.disabled;\n\t\tthis.applyDisabled();\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=\"header\"><span>{{ field.name }}</span></div>\n\t\t<div class=\"search\">\n\t\t\t@if (field.search !== false) {\n\t\t\t\t<!-- ponytail: Suche und Aufklapp-Button bleiben auch gesperrt bedienbar. Beide\n\t\t\t\t ändern den Wert nicht, sperren würde nur das Nachschauen behindern. -->\n\t\t\t\t<xiri-search (changed)=\"searchDo($event)\"></xiri-search>\n\t\t\t}\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\" [disabled]=\"disabled\"\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 [disabled]=\"disabled\"\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 { AbstractControl, 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\n\t/** what the panel currently shows — the basis for the select-all toggle */\n\tprivate _filtered: XiriFormFieldSelectOption[] = [];\n\n\tprivate emit( list: XiriFormFieldSelectOption[] ) {\n\t\tthis._filtered = list;\n\t\tthis._filteredValuesSubject.next( list );\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.emit( 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\t// Server kann Optionen liefern, die schon in der Startliste stehen (z. B. eine per addUrl\n\t\t\t\t\t\t// angelegte): nicht doppelt anzeigen.\n\t\t\t\t\t\tconst known = new Set( this._allValues.map( o => o.id ) );\n\t\t\t\t\t\tconst fresh = ( filteredList as XiriFormFieldSelectOption[] ).filter( o => !known.has( o.id ) );\n\t\t\t\t\t\tthis.emit( this._allValues.slice().concat( fresh ) );\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.emit( 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.emit( this._allValues.filter( el => this.predicate()( search, el ) ) );\n\t}\n\t\n\t// ---- select all / none (ngx-mat-select-search toggle-all checkbox) ----\n\t// Contract: \"visible\" = what the panel currently shows (_filtered). Disabled and group\n\t// options are never toggled; already selected disabled options survive a \"none\".\n\n\tprivate selectableIds(): Set<unknown> {\n\t\treturn new Set( this._filtered.filter( o => !o.disabled && !o.isGroup ).map( o => o.id ) );\n\t}\n\n\tprivate static ids( value: unknown ): unknown[] {\n\t\treturn Array.isArray( value ) ? value : [];\n\t}\n\n\t/** false when nothing is selectable — the checkbox is hidden then, otherwise MatCheckbox would stay checked after a no-op click */\n\thasSelectable(): boolean {\n\t\treturn this.selectableIds().size > 0;\n\t}\n\n\tallSelected( value: unknown ): boolean {\n\t\tconst sel = this.selectableIds();\n\t\tconst cur = new Set( XiriSelectDirective.ids( value ) );\n\t\treturn sel.size > 0 && [ ...sel ].every( id => cur.has( id ) );\n\t}\n\n\tsomeSelected( value: unknown ): boolean {\n\t\tconst sel = this.selectableIds();\n\t\tconst cur = new Set( XiriSelectDirective.ids( value ) );\n\t\tconst hits = [ ...sel ].filter( id => cur.has( id ) ).length;\n\t\treturn hits > 0 && hits < sel.size;\n\t}\n\n\ttoggleSelectAll( selectAll: boolean, control: AbstractControl | null ) {\n\t\tif ( !control || control.disabled )\n\t\t\treturn;\n\t\tconst sel = this.selectableIds();\n\t\tconst cur = XiriSelectDirective.ids( control.value );\n\t\tconst next = selectAll\n\t\t\t? cur.concat( [ ...sel ].filter( id => !cur.includes( id ) ) )\n\t\t\t: cur.filter( id => !sel.has( id ) );\n\t\tif ( next.length === cur.length && next.every( ( id, i ) => id === cur[ i ] ) )\n\t\t\treturn;\n\t\tcontrol.setValue( next );\n\t\tcontrol.markAsDirty();\n\t\tcontrol.markAsTouched();\n\t}\n}\n","import { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport {\n\tComponent,\n\tcomputed,\n\tElementRef,\n\tforwardRef,\n\tinput,\n\tsignal,\n\tuntracked,\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\t// Zwei Sperrquellen, verodert. field ist hier ein input(), kein Setter -- die Ableitung\n\t// gehoert deshalb in ein computed. Angular ruft beim Control-Setup setDisabledState(false),\n\t// was ein Backend-disabled sonst wieder aufhoebe.\n\tprivate controlDisabled = signal( false );\n\treadonly disabled = computed( () => !!this.field().disabled || this.controlDisabled() );\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\t// untracked wie bei setDisabledState: Angular ruft writeValue aus\n\t\t// setUpControlValueAccessor, also waehrend der Template-Auswertung. Ohne das wirft ein\n\t\t// Neuaufbau des Formulars mit gleicher Feld-ID NG0600.\n\t\tuntracked( () => this.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\tsetDisabledState( isDisabled: boolean ): void {\n\t\t// untracked: Angular ruft das aus setUpControlValueAccessor, also waehrend der\n\t\t// Template-Auswertung -- ein Signal-Write wuerde dort NG0600 werfen.\n\t\tuntracked( () => this.controlDisabled.set( isDisabled ) );\n\t}\n\n\tadd( event: MatChipInputEvent ): void {\n\t\tif ( this.disabled() ) return;\n\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\t// Auch bei deaktiviertem Grid: hatte ein Chip beim Sperren den Fokus, leitet Material\n\t\t// Delete/Backspace weiter und prueft dabei nur `removable`.\n\t\tif ( this.disabled() ) return;\n\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\t// Ein bereits offenes Autocomplete-Overlay kann nach dem Sperren noch liefern.\n\t\tif ( this.disabled() ) return;\n\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 [disabled]=\"disabled()\">\n\t\t@for (chip of chips(); track chip) {\n\t\t\t<mat-chip-row (removed)=\"remove(chip)\" [class]=\"chipColor(chip)\" [removable]=\"!disabled()\">\n\t\t\t\t{{ displayLabel(chip) }}\n\t\t\t\t<button matChipRemove [disabled]=\"disabled()\" [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 [disabled]=\"disabled()\"\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 {\n\tcatchError,\n\tdistinctUntilChanged,\n\tEMPTY,\n\tfilter,\n\tfinalize,\n\tmap,\n\tmerge,\n\tObservable,\n\tSubject,\n\tswitchMap,\n\ttimer\n} 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 { MatProgressBar } from '@angular/material/progress-bar';\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 { MatDialog } from '@angular/material/dialog';\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 MatProgressBar,\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 dialog = inject( MatDialog );\n\t// Der lazy Import in openAdd() kann nach der Zerstörung auflösen; takeUntilDestroyed greift erst danach.\n\tprivate destroyed = false;\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\t// Läuft gerade ein Reload? Trägt den Fortschrittsbalken über dem Feldblock. Bewusst nur eine\n\t// Anzeige und kein control.disable(): ein deaktiviertes Control fällt aus formGroup.value, und\n\t// genau das lesen xiri-query und xiri-form aus dem formChange.\n\tprotected reloading = signal( 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\tthis.destroyRef.onDestroy( () => this.destroyed = true );\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\tthis.syncConditionalControls();\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\tthis.syncConditionalControls();\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\t// Der Balken hängt am Trigger-Wechsel, nicht am Request: gesetzt wird vor dem Timer,\n\t\t\t// sonst bliebe die Entprellzeit ohne Rückmeldung. Bei einem zweiten Wechsel bleibt er\n\t\t\t// durchgehend an, weil switchMap den alten Inner-Stream abräumt (finalize -> false),\n\t\t\t// bevor diese Projektion für den neuen läuft (-> true).\n\t\t\tswitchMap( () => {\n\t\t\t\tif ( this.dependentFields().length === 0 )\n\t\t\t\t\treturn EMPTY;\n\t\t\t\tthis.reloading.set( true );\n\t\t\t\treturn timer( 200 ).pipe(\n\t\t\t\t\tswitchMap( () => this.fetchPatches() ),\n\t\t\t\t\tfinalize( () => this.reloading.set( false ) ),\n\t\t\t\t);\n\t\t\t} ),\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\t// \"+\"-Button (field.addUrl): öffnet den Server-Dialog per GET und übernimmt die angelegte Option.\n\tprotected openAdd( id: string ): void {\n\n\t\tconst field = this._fields?.find( f => f.id === id );\n\t\tconst control = this.formGroup.get( id );\n\t\tif ( !field?.addUrl || !control )\n\t\t\treturn;\n\t\tconst url = field.addUrl;\n\n\t\t// Lazy: dialog.component importiert xiri-form-fields, ein statischer Import wäre ein Zyklus.\n\t\timport( '../dialog/dialog.component' ).then( m => {\n\t\t\tif ( this.destroyed || this.formGroup.get( id ) !== control )\n\t\t\t\treturn;\n\t\t\tthis.dialog.open( m.XiriDialogComponent, { data: { type: 'load', url } } )\n\t\t\t\t.afterClosed()\n\t\t\t\t.pipe( takeUntilDestroyed( this.destroyRef ) )\n\t\t\t\t.subscribe( ( res: unknown ) => this.addOption( id, control, res ) );\n\t\t} ).catch( err => console.error( 'xiri-form-fields: dialog import failed', err ) );\n\t}\n\n\tprivate addOption( id: string, control: AbstractControl, res: unknown ): void {\n\n\t\tconst field = this._fields?.find( f => f.id === id );\n\t\tconst { done, created } = ( res ?? {} ) as { done?: unknown; created?: unknown };\n\t\t// Das Formular kann inzwischen gewechselt haben (auch mit gleicher Feld-ID): nur ins Control\n\t\t// schreiben, das den Dialog geöffnet hat.\n\t\tif ( !field || this.formGroup.get( id ) !== control || control.disabled || done !== true || !isCreatedOption( created ) )\n\t\t\treturn;\n\t\t// Bei chips sind Strings Freitext, nur Zahlen werden als Option aufgelöst.\n\t\tif ( field.type === 'chips' && typeof created.id !== 'number' )\n\t\t\treturn;\n\n\t\tif ( !collectOptionIds( field.list ?? [] ).has( created.id ) )\n\t\t\tfield.list = [ ...( field.list ?? [] ), { id: created.id, name: created.name } ];\n\n\t\t// Nicht über Array.isArray entscheiden: ein leeres Single-Select startet intern mit [].\n\t\tif ( field.multiple || field.type === 'treeselect' || field.type === 'chips' ) {\n\t\t\tconst current: unknown[] = Array.isArray( control.value ) ? control.value : [];\n\t\t\tif ( !current.includes( created.id ) ) {\n\t\t\t\tcontrol.markAsDirty();\n\t\t\t\tcontrol.setValue( [ ...current, created.id ] );\n\t\t\t}\n\t\t} else if ( control.value !== created.id ) {\n\t\t\tcontrol.markAsDirty();\n\t\t\tcontrol.setValue( created.id );\n\t\t}\n\n\t\tthis.patchedClones.set( id, { ...field } );\n\t\tthis.patchVersion.update( v => v + 1 );\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\tthis.syncConditionalControls();\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\t// Hängt bewusst nur an form(). Der Control-Umbau ist ein Seiteneffekt und läuft untracked:\n\t// addControl lässt die FormGroupDirective das neue Control sofort an eine wiederverwendete\n\t// Directive binden (writeValue), und MatSelect schreibt dabei ein Signal im KeyManager -\n\t// in einer Computed wäre das NG0600.\n\tfields = computed( () => {\n\n\t\tconst fields = this.form();\n\t\treturn untracked( () => {\n\n\t\t\tthis._fieldsLoaded = false;\n\t\t\tif ( this._fields !== null ) {\n\t\t\t\tfor ( let i = 0; i != this._fields.length; i++ ) {\n\t\t\t\t\tthis.formGroup.removeControl( this._fields[ i ].id );\n\t\t\t\t}\n\t\t\t\tthis._fields = null;\n\t\t\t}\n\n\t\t\tif ( fields == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tthis._fields = fields;\n\n\t\t\t// Neue Feldliste: alte Render-Kopien und Patch-Stände gehören zum vorherigen Formular.\n\t\t\tthis.formGeneration++;\n\t\t\tthis.patchedClones.clear();\n\t\t\tthis.lastPatch.clear();\n\n\t\t\tconst initialCollapsed = new Set<string>();\n\t\t\tfor ( const f of fields ) {\n\t\t\t\tif ( f.type === 'header' && f.collapsible && f.collapsed )\n\t\t\t\t\tinitialCollapsed.add( f.id );\n\t\t\t}\n\t\t\tthis.collapsedSections.set( initialCollapsed );\n\n\t\t\tthis.createControl();\n\t\t\tthis.syncConditionalControls();\n\n\t\t\tthis.lastValue = JSON.stringify( this.formGroup.value );\n\t\t\tthis._fieldsLoaded = true;\n\t\t\treturn this._fields;\n\t\t} );\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\t// Gleich disabled anlegen (Boxed-Value-Form): ein Backend-disabled Feld fällt damit aus\n\t\t\t// formGroup.value und der Validierung, wie bei Patch und showWhen. this.disabled() dazu,\n\t\t\t// weil der Effect nur bei einem Wechsel des Inputs läuft — beim Ersetzen der Feldliste\n\t\t\t// während eines globalen disabled würde die Gruppe sonst wieder bedienbar. Ungeboxt\n\t\t\t// läse Angular einen Objektwert mit value/disabled-Keys selbst als Zustandsbox; `?? null`\n\t\t\t// hält den bisherigen Startwert, den der Default-Parameter ungeboxt aus undefined machte.\n\t\t\tconst control = this.formBuilder.control(\n\t\t\t\t{ value: field.value ?? null, disabled: field.disabled || this.disabled() },\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\treturn this.matchesShowWhen( field );\n\t}\n\n\tprivate matchesShowWhen( field: XiriFormField ): boolean {\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\n\t// Per showWhen versteckte Felder werden disabled: sie fallen aus formGroup.value (der\n\t// Server bekommt keine veralteten Werte) und aus der Validierung (ein verstecktes Pflichtfeld\n\t// blockiert den Submit nicht). Sichtbar gewordene Felder werden wieder enabled - außer sie\n\t// sind vom Backend (field.disabled) oder global (disabled-Input) deaktiviert. Eingeklappte\n\t// Sections zählen nicht als versteckt, deshalb matchesShowWhen statt isFieldVisible.\n\tprivate syncConditionalControls(): void {\n\t\tfor ( const field of this._fields ?? [] ) {\n\t\t\tif ( !field.showWhen )\n\t\t\t\tcontinue;\n\t\t\tconst control = this.formGroup.get( field.id );\n\t\t\tif ( !control )\n\t\t\t\tcontinue;\n\t\t\tconst shouldEnable = this.matchesShowWhen( field ) && !field.disabled && !this.disabled();\n\t\t\tif ( shouldEnable && control.disabled )\n\t\t\t\tcontrol.enable( { emitEvent: false } );\n\t\t\telse if ( !shouldEnable && control.enabled )\n\t\t\t\tcontrol.disable( { emitEvent: false } );\n\t\t}\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 = new Set<string | number>() ): 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\nfunction isCreatedOption( value: unknown ): value is { id: number | string; name: string } {\n\tif ( value === null || typeof value !== 'object' )\n\t\treturn false;\n\tconst { id, name } = value as { id?: unknown; name?: unknown };\n\treturn ( typeof id === 'string' || ( typeof id === 'number' && Number.isFinite( id ) ) ) && typeof name === 'string';\n}\n","@if (reloading()) {\n\t<mat-progress-bar class=\"reloadbar\" mode=\"indeterminate\"></mat-progress-bar>\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<div class=\"add-wrap\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t<mat-form-field class=\"add-wrap-control\" [formGroup]=\"formGroup\" floatLabel=\"auto\">\n\t\t\t\t\t<mat-label>{{ field.name }}</mat-label>\n\t\t\t\t\t@if (field.search === false && !field.selectAll) {\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 || {}\"\n\t\t\t\t\t\t\t\t [showToggleAllCheckbox]=\"!!field.multiple && !!field.selectAll && xiriSelect.hasSelectable()\"\n\t\t\t\t\t\t\t\t [toggleAllCheckboxChecked]=\"!!field.multiple && !!field.selectAll && xiriSelect.allSelected(formGroup.get(field.id)?.value)\"\n\t\t\t\t\t\t\t\t [toggleAllCheckboxIndeterminate]=\"!!field.multiple && !!field.selectAll && xiriSelect.someSelected(formGroup.get(field.id)?.value)\"\n\t\t\t\t\t\t\t\t (toggleAll)=\"xiriSelect.toggleSelectAll($event, formGroup.get(field.id))\"></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\t@if (field.addUrl) {\n\t\t\t\t\t<button mat-icon-button type=\"button\" class=\"add-option\" aria-label=\"Neu anlegen\"\n\t\t\t\t\t [disabled]=\"disabled() || formGroup.get(field.id)?.disabled\" (click)=\"openAdd(field.id)\"><mat-icon>add</mat-icon></button>\n\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case ('treeselect') {\n\t\t\t\t<div class=\"treeselect add-wrap\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t<div class=\"add-wrap-control\">\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\t@if (field.addUrl) {\n\t\t\t\t\t<button mat-icon-button type=\"button\" class=\"add-option\" aria-label=\"Neu anlegen\"\n\t\t\t\t\t [disabled]=\"disabled() || formGroup.get(field.id)?.disabled\" (click)=\"openAdd(field.id)\"><mat-icon>add</mat-icon></button>\n\t\t\t\t}\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=\"add-wrap\" [class]=\"field.class\" [hidden]=\"field.hide\">\n\t\t\t\t\t<xiri-chips class=\"add-wrap-control\" [field]=\"field\" [formControlName]=\"field.id\"></xiri-chips>\n\t\t\t\t\t@if (field.addUrl) {\n\t\t\t\t\t\t<button mat-icon-button type=\"button\" class=\"add-option\" aria-label=\"Neu anlegen\"\n\t\t\t\t\t\t [disabled]=\"disabled() || formGroup.get(field.id)?.disabled\" (click)=\"openAdd(field.id)\"><mat-icon>add</mat-icon></button>\n\t\t\t\t\t}\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 { XiriTagChip } from '../formfields/field.interface';\nimport { XiriTableField } from '../raw-table/tabefield.interface';\nimport type { XiriTableCellValue, XiriTableRow } from './tree.service';\n\n/**\n * Cell object delivered by the Go builder for date, dateTime, timeLength, text2* and *N fields\n * (field JSON: cellObject: 'string'). d is what the format renders (string, [a, b] or [lines…]); v is the\n * raw value in a form that both sorts and edits: ISO date, local ISO datetime, seconds, number.\n * v === null means empty. Further keys are reserved; clients ignore what they do not know.\n */\nexport interface XiriCellObject {\n\td: XiriTableCellValue;\n\tv: string | number | null;\n\t[key: string]: XiriTableCellValue;\n}\n\nexport function isCellObject( cell: XiriTableCellValue ): cell is XiriCellObject {\n\treturn typeof cell === 'object' && cell !== null && !Array.isArray( cell ) && 'd' in cell && 'v' in cell;\n}\n\n/** A cell object for sure: objects pass through, anything else (a server patched a bare value) shows as is and sorts empty. */\nexport function asCellObject( cell: XiriTableCellValue ): XiriCellObject {\n\treturn isCellObject( cell ) ? cell : { d: cell ?? '', v: null };\n}\n\n/** What a cell shows: cell object → d; legacy number tuple → [0]; anything else as is. */\nexport function cellDisplay( cell: XiriTableCellValue, column: XiriTableField | undefined ): XiriTableCellValue {\n\tif ( isCellObject( cell ) )\n\t\treturn cell.d;\n\tif ( column?.format === 'number' && Array.isArray( cell ) )\n\t\treturn cell[ 0 ];\n\treturn cell;\n}\n\n/** Display lines of a text2/textn cell: arrays as they are, nothing for null, a scalar as its single line. */\nexport function cellLines( cell: XiriTableCellValue, column: XiriTableField | undefined ): XiriTableCellValue[] {\n\tconst d = cellDisplay( cell, column );\n\tif ( Array.isArray( d ) )\n\t\treturn d;\n\treturn d === null || d === undefined || d === '' ? [] : [ d ];\n}\n\n/**\n * The value a column sorts (and sums) by. Decided per column, never per row, so one column never\n * mixes numbers and strings — MatTableDataSource would coerce the numbers to strings otherwise.\n * A cellObject cell without a string/number v sorts like an empty cell ('').\n */\nexport function sortValue( row: XiriTableRow, columnId: string, column: XiriTableField | undefined ): string | number {\n\tconst cell = row[ columnId ] as XiriTableCellValue;\n\tif ( column?.cellObject ) {\n\t\tconst v = isCellObject( cell ) ? cell.v : undefined;\n\t\treturn typeof v === 'number' || typeof v === 'string' ? v : '';\n\t}\n\tif ( column?.format === 'number' )\n\t\treturn ( cell as XiriTableCellValue[] )?.[ 1 ] as number;\n\t// ponytail: sort by the first chip's label — without this MatTable compares the raw object\n\t// array, which coerces to \"[object Object],...\" and effectively sorts by chip count.\n\tif ( column?.format === 'chips' )\n\t\treturn ( cell as XiriTagChip[] | null | undefined )?.[ 0 ]?.label ?? '';\n\treturn cell as string | number;\n}\n\n/**\n * Replaces non-object cells of cellObject columns in place (rows built by hand, servers patching bare\n * values). Returns true when something was replaced, so the caller can warn once. A missing cell\n * (undefined — the row simply has no value for the column) is left alone: absent is not malformed.\n */\nexport function normalizeCellObjects( rows: XiriTableRow[], columns: XiriTableField[] ): boolean {\n\tif ( !Array.isArray( rows ) ) return false;\n\tlet replaced = false;\n\tconst objectColumns = columns.filter( c => c.cellObject );\n\tfor ( const row of rows )\n\t\tfor ( const col of objectColumns ) {\n\t\t\tconst cell = row[ col.id ] as XiriTableCellValue;\n\t\t\tif ( cell !== undefined && !isCellObject( cell ) ) {\n\t\t\t\trow[ col.id ] = asCellObject( cell );\n\t\t\t\treplaced = true;\n\t\t\t}\n\t\t}\n\treturn replaced;\n}\n\n/**\n * Turns what a native input or select emits into the canonical v of a cell object: '' → null (cleared),\n * numeric columns (column.cellObject === 'number') → number (garbage → null; the kind comes from the\n * field metadata, so an html text input, string options or an empty v cannot change the type),\n * datetime-local → seconds padded\n * (browsers drop \":00\"). Idempotent: applying it to a canonical v returns that v.\n */\nexport function normalizeEditValue( column: XiriTableField, value: XiriTableCellValue ): string | number | null {\n\tif ( value === null || value === undefined || String( value ).trim() === '' )\n\t\treturn null;\n\tif ( column.cellObject === 'number' ) {\n\t\tconst n = Number( value );\n\t\treturn Number.isFinite( n ) ? n : null;\n\t}\n\tif ( column.inputType === 'datetime-local' && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/.test( String( value ) ) )\n\t\treturn value + ':00';\n\treturn value as string | number;\n}\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';\nimport { cellDisplay, cellLines as cellLinesOf, normalizeCellObjects } from '../table/cell';\nimport type { XiriTableCellValue, XiriTableRow } from '../table/tree.service';\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\n\t\t\tconst rows = this.settings().data as XiriRawTableRow[];\n\t\t\tif ( normalizeCellObjects( rows as XiriTableRow[], this.displayedColumns ) )\n\t\t\t\tconsole.warn( 'xiri-raw-table: cells of cellObject columns must be {d, v} objects; bare values were wrapped' );\n\t\t\tthis.dataSource.data = rows ?? [];\n\t\t} );\n\t}\n\n\tcellText( row: XiriRawTableRow, column: XiriTableField ): unknown {\n\t\treturn cellDisplay( row[ column.id ] as XiriTableCellValue, column );\n\t}\n\n\tcellLines( row: XiriRawTableRow, column: XiriTableField ): unknown[] {\n\t\treturn cellLinesOf( row[ column.id ] as XiriTableCellValue, column );\n\t}\n\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@let lines = cellLines(row, column);\n\t\t\t\t\t\t\t<div>{{ lines[0] }}</div>\n\t\t\t\t\t\t\t<div>{{ lines[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 cellLines(row, column); 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 }}{{ cellText(row, column) }}{{ 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\">{{ cellText(row, column) }}</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","// Was xiri-form, xiri-dialog, xiri-query und xiri-stepper aus einem formChange lesen.\n//\n// Eine FormGroup, deren Controls alle disabled sind, ist bei Angular DISABLED statt VALID\n// (valid false, invalid false) und liefert in `value` den Rohwert aller Controls. Beides ist\n// für die Konsumenten falsch: ein Anzeige-Formular mit OK-Button muss absendbar bleiben, und\n// disabled Controls gehören nie in den Submit — auch nicht die per showWhen versteckten, deren\n// veralteten Wert der Server sonst bindet (er kennt showWhen nicht). INVALID und PENDING\n// bleiben gesperrt.\nexport interface XiriFormChangeLike {\n\tvalid: boolean\n\tdisabled?: boolean\n\tvalue: Record<string, unknown> | null\n}\n\nexport function formState( event: XiriFormChangeLike ): { valid: boolean; value: Record<string, unknown> | null } {\n\tif ( event.disabled === true )\n\t\treturn { valid: true, value: {} };\n\treturn { valid: event.valid, value: event.value };\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\nimport { formState, XiriFormChangeLike } from '../formfields/form-state';\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\" | \"load\"\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\t// Poll interval of a waiting dialog, in ms — this is what xiri-go sends.\n\tcheckTime?: 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\t// xiri-go sends the poll interval as checkTime; res.time stays as a fallback.\n\t\t\t\tthis.refreshTime = res.checkTime ?? 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\t// Bis zum close(res) darf nichts anderes schließen, sonst geht das Ergebnis (z. B. created) verloren.\n\t\t\tthis.dialogRef.disableClose = true;\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\t// '_blank' and not a fixed window name: a name would make every report replace\n\t\t\t// the previously opened one instead of getting its own tab.\n\t\t\tconst file = window.open( this.dataService.getConfigApi() + this.url, '_blank' );\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: XiriFormChangeLike ) {\n\n\t\tconst state = formState( event );\n\t\tthis.formValid.set( state.valid );\n\t\tthis.formValues = state.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' && !done()) {\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, InjectionToken } 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/**\n * Nächstgelegener Panel-Container eines Auslösers: eine xiri-card oder ein mat-expansion-panel (Directive\n * xiriExpansionPanel). Beide stellen sich per Provider bereit; Button und Tabelle injizieren den Token optional\n * und rufen bei refresh:'panel' reloadPanel().\n */\nexport interface XiriPanelHost {\n\treloadPanel(): void;\n}\n\nexport const XIRI_PANEL_HOST = new InjectionToken<XiriPanelHost>( 'XIRI_PANEL_HOST' );\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\tonPanelRefresh?: () => 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.refresh == 'panel' )\n\t\t\tcallbacks?.onPanelRefresh?.();\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, XIRI_PANEL_HOST } 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ächstgelegene Card; null außerhalb einer Card. Ziel für refresh:'panel'.\n\tprivate panelHost = inject( XIRI_PANEL_HOST, { optional: true } );\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, { onPanelRefresh: () => this.refreshPanel() } );\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\t// Ohne umschließende Card: wie eine Card ohne url → Page-Reload.\n\tprivate refreshPanel() {\n\t\tif ( this.panelHost )\n\t\t\tthis.panelHost.reloadPanel();\n\t\telse\n\t\t\tthis.responseHandler.handle( { refresh: 'page' } );\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';\nimport { asCellObject, isCellObject, normalizeEditValue } from './cell';\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.\n// update/id/content only for typing acted (a single-cell update alias) below.\ninterface InlineEditResult {\n\tupdates?: Record<string, XiriTableCellValue>;\n\trefresh?: string; goto?: string; page?: string; table?: string; field?: string;\n\tupdate?: string; id?: unknown; content?: XiriTableCellValue;\n}\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\t// Draft of v while a cellObject cell is edited. The cell itself is never mutated by the editor:\n\t// cancel drops the draft, the server (or the save fallback) replaces the whole cell.\n\t// editStart is the normalised v at start(): \"unchanged\" compares against it, never against the\n\t// live cell, which another save's updates may have patched meanwhile (Tab navigation).\n\tprivate editDraft: string | number | null = null;\n\tprivate editStart: string | number | null = null;\n\tprivate hasUrl!: () => boolean;\n\t// Hochgezählt bei jedem start()/cancel(): ein verspäteter Save-Fehler öffnet die Zelle nur wieder, wenn seitdem nichts passiert ist.\n\tprivate editSeq = 0;\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\tprivate isRowLive!: ( row: XiriTableRow ) => boolean;\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\tisRowLive: ( row: XiriTableRow ) => boolean;\n\t\thasUrl: () => boolean;\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\tthis.isRowLive = config.isRowLive;\n\t\tthis.hasUrl = config.hasUrl;\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\tthis.editSeq++;\n\t\tif ( column.cellObject && !isCellObject( row[ column.id ] as XiriTableCellValue ) )\n\t\t\trow[ column.id ] = asCellObject( row[ column.id ] as XiriTableCellValue );\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.cellObject ) {\n\t\t\tthis.editStart = normalizeEditValue( column, isCellObject( val ) ? val.v : null );\n\t\t\tthis.editDraft = this.editStart;\n\t\t}\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/** Value the inline editor shows: the draft of a cellObject cell while editing, else v, else the cell. */\n\teditValue( row: XiriTableRow, column: XiriTableField ): XiriTableCellValue {\n\t\tconst cell = row[ column.id ] as XiriTableCellValue;\n\t\tif ( column.cellObject )\n\t\t\treturn this.isEditing( row, column.id ) ? this.editDraft : ( isCellObject( cell ) ? cell.v : null );\n\t\treturn cell;\n\t}\n\n\tsetEditValue( row: XiriTableRow, column: XiriTableField, value: XiriTableCellValue ): void {\n\t\tif ( column.cellObject )\n\t\t\t// Raw browser value, kept as is: [ngModel] is one-way, so normalising here (e.g. a leading\n\t\t\t// \"-\" or a trailing \".\" on a numeric column) would write a mangled value back into the input\n\t\t\t// and break typing. Normalisation happens once, in save().\n\t\t\tthis.editDraft = value as string | number | null;\n\t\telse\n\t\t\trow[ column.id ] = value;\n\t}\n\n\t/** compareWith for mat-select: option values are strings, v of a duration cell is a number. */\n\tcompareEditValue( a: unknown, b: unknown ): boolean {\n\t\treturn String( a ?? '' ) === String( b ?? '' );\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\tthis.editSeq++;\n\t\tconst editing = this.editingCell();\n\t\tif ( editing ) {\n\t\t\t// A cellObject cell was never mutated by the editor: restoring it here could revert a\n\t\t\t// patch another save's response applied to it meanwhile (Tab to another cell, whose save\n\t\t\t// then patches this one via updates) — the draft is dropped, the cell is left as is.\n\t\t\tconst column = this.displayedColumns.find( c => c.id === editing.field );\n\t\t\tif ( !column?.cellObject )\n\t\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.editDraft = null;\n\t\tthis.editStart = null;\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\t// Normalised here, not in setEditValue: the draft holds the raw browser value while typing (see\n\t\t// setEditValue), so \"-\" or \"7200.\" are not clobbered mid-edit; only the committed save normalises.\n\t\tconst draft = column.cellObject ? normalizeEditValue( column, this.editDraft ) : null;\n\t\tconst newValue = column.cellObject ? draft : row[ column.id ] as XiriTableCellValue;\n\t\tconst originalValue = column.cellObject ? this.editStart : this.editingOriginalValue;\n\t\tconst seq = this.editSeq;\n\t\tconst snapshot = {\n\t\t\tchips: this.editingChipsValues(),\n\t\t\toptions: this.loadedEditableOptions(),\n\t\t\tcache: new Map( this.optionCache ), // enthält auch nur per editableSearchUrl gefundene Optionen\n\t\t};\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 = column.cellObject\n\t\t\t? draft === originalValue\n\t\t\t: Array.isArray( newValue ) ? JSON.stringify( newValue ) === JSON.stringify( originalValue ) : newValue === originalValue;\n\t\tif ( unchanged ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst value: XiriTableCellValue = column.cellObject\n\t\t\t? draft\n\t\t\t: column.format === 'chips' && Array.isArray( newValue )\n\t\t\t\t? ( newValue as unknown as ChipValue[] ).map( ( c ) => c.label )\n\t\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\tconst cellBefore = row[ column.id ] as XiriTableCellValue;\n\t\t\t\t// Whether the server said anything at all about THIS cell, and whether what it said was\n\t\t\t\t// a real cell object — judged from the raw response, never from a row reference compare\n\t\t\t\t// (another save's response can replace that reference for an unrelated reason meanwhile).\n\t\t\t\tconst ownUpdate = result?.updates ? result.updates[ column.id ] : undefined;\n\t\t\t\tconst isOwnSingleUpdate = ( result?.table === 'update' || result?.update === 'table' )\n\t\t\t\t\t&& result?.id === row.id && result?.field === column.id;\n\t\t\t\tconst hadOwnPatch = ownUpdate !== undefined || isOwnSingleUpdate;\n\t\t\t\tconst patched = ( ownUpdate !== undefined && isCellObject( ownUpdate ) )\n\t\t\t\t\t|| ( isOwnSingleUpdate && isCellObject( result?.content ) );\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\tconst col = this.displayedColumns.find( c => c.id === key );\n\t\t\t\t\t\tif ( col?.cellObject && !isCellObject( updates[ key ] ) )\n\t\t\t\t\t\t\tconsole.warn( `xiri-table: updates.${ key } for a cellObject column is not a {d, v} object; it will sort as empty` );\n\t\t\t\t\t\trow[ key ] = col?.cellObject ? asCellObject( updates[ key ] ) : updates[ key ];\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\t// Let the handler apply refresh/goto/page and single-cell updates (table:update / update:table) first …\n\t\t\t\tthis.onCallReturn( result );\n\t\t\t\tif ( column.cellObject && !patched ) {\n\t\t\t\t\trow[ column.id ] = hadOwnPatch\n\t\t\t\t\t\t// A bare value for this cell (reference changed, but not a real {d, v}): the server\n\t\t\t\t\t\t// already delivered the display, keep it and set v from the draft. No reload needed.\n\t\t\t\t\t\t? { ...asCellObject( row[ column.id ] as XiriTableCellValue ), v: draft }\n\t\t\t\t\t\t// No word from the server about this cell at all: show the draft as text so d never\n\t\t\t\t\t\t// lags behind v; url tables reload below to fetch the real d.\n\t\t\t\t\t\t: { ...asCellObject( cellBefore ), d: draft === null ? '' : String( draft ), v: draft };\n\t\t\t\t}\n\t\t\t\tthis.onDataUpdate();\n\t\t\t\tthis.onSaved( row, column.id );\n\t\t\t\t// A refresh/navigation already replaces or leaves this table; a single-cell update for another\n\t\t\t\t// row/field does not, so the url table still reloads to get d for this cell.\n\t\t\t\tconst acted = !!( result?.refresh || result?.goto || result?.page || result?.table === 'refresh' );\n\t\t\t\tif ( column.cellObject && !patched && !hadOwnPatch && !acted && this.hasUrl() )\n\t\t\t\t\tthis.onCallReturn( { done: true, refresh: 'table' } );\n\t\t\t},\n\t\t\terror: ( err: unknown ) => {\n\t\t\t\tthis.savingCell.set( null );\n\t\t\t\tif ( this.editSeq !== seq || !this.isRowLive( row ) ) {\n\t\t\t\t\t// User ist schon woanders (Tab, Escape, neue Zelle) oder ein Reload hat die Row ersetzt: nichts kapern,\n\t\t\t\t\t// Wert verwerfen. Bei Zellobjekten wurde die Zelle nie verändert, also nichts zurückzusetzen.\n\t\t\t\t\tif ( !column.cellObject )\n\t\t\t\t\t\trow[ column.id ] = originalValue;\n\t\t\t\t\tthis.onDataUpdate();\n\t\t\t\t} else {\n\t\t\t\t\t// Abgelehnten Wert stehen lassen und Zelle wieder öffnen; Escape stellt weiterhin das Original her\n\t\t\t\t\t// (bei Zellobjekten per cancel() nur noch fürs Draft, die Zelle bleibt sowieso unberührt).\n\t\t\t\t\tthis.loadedEditableOptions.set( snapshot.options );\n\t\t\t\t\tthis.editingChipsValues.set( snapshot.chips );\n\t\t\t\t\tthis.editingOriginalValue = originalValue;\n\t\t\t\t\tthis.editingCell.set( { row, field: column.id } );\n\t\t\t\t\tthis.initSearch( column, row );\n\t\t\t\t\tsnapshot.cache.forEach( ( o, k ) => this.optionCache.set( k, o ) ); // nach initSearch, das den Cache leert\n\t\t\t\t\tthis.focus();\n\t\t\t\t}\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\t// Nur weiterspringen, wenn der Save die Zelle nicht (synchron abgelehnt) wieder geöffnet hat\n\t\t\tif ( nextColumn && !this.editingCell() ) {\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 ? this.editValue( row, column ) : 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/** Resolves the value a tree column sorts its siblings by (see sortValue in cell.ts). */\nexport type XiriTreeSortKey = ( row: XiriTableRow ) => string | number;\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, keyOf?: XiriTreeSortKey ): 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 ( keyOf )\n\t\tsortSiblings( roots, keyOf );\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 at every level: numerically when both keys are numbers, otherwise locale-aware by string. */\nexport function sortSiblings( nodes: XiriTreeNode[], keyOf: XiriTreeSortKey ): void {\n\tnodes.sort( ( a, b ) => {\n\t\tconst ka = keyOf( a.row );\n\t\tconst kb = keyOf( b.row );\n\t\tif ( typeof ka === 'number' && typeof kb === 'number' )\n\t\t\treturn ka - kb;\n\t\treturn String( ka ?? '' ).localeCompare( String( kb ?? '' ), undefined, { sensitivity: 'base' } );\n\t} );\n\tfor ( const node of nodes )\n\t\tsortSiblings( node.children, keyOf );\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. keyOf defaults to the raw tree-column value. */\n\tbuild( rows: XiriTableRow[], keyOf: XiriTreeSortKey = row => row[ this.treeColumnId ] as string | number ): void {\n\t\tif ( !this.config )\n\t\t\treturn;\n\n\t\tthis.roots = buildTree( rows, this.config.idField, this.config.parentIdField, keyOf );\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, XIRI_PANEL_HOST } 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 {\n\tasCellObject,\n\tcellDisplay as cellDisplayOf,\n\tcellLines as cellLinesOf,\n\tisCellObject,\n\tnormalizeCellObjects,\n\tsortValue\n} from './cell';\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\t// Eingebettet (z. B. im Expansion-Panel): ohne Elevation, Hintergrund und Außen-Margin.\n\tflat?: 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\t// Nächstgelegene Card; null außerhalb einer Card. Ziel für refresh:'panel' aus eigenen Aktionspfaden.\n\tprivate panelHost = inject( XIRI_PANEL_HOST, { optional: true } );\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\tflat: 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\tconst treeField = this.displayedColumns.find( col => col.id === this.tree.treeColumn );\n\t\t\t\tthis.tree.build( all, row => sortValue( row, this.tree.treeColumn, treeField ) );\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\tisRowLive: ( row ) => this.dataSource.data.includes( row ),\n\t\t\thasUrl: () => !!this.settings().url,\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\tconst value = cellDisplayOf( data[ key ] as XiriTableCellValue, this.displayedColumns.find( c => c.id === key ) );\n\t\t\t\t\treturn currentTerm + value + '◬';\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\t// Gespeicherten Suchtext VOR dem ersten Load wiederherstellen: server-side muss er im ersten\n\t\t// Request stehen, client-side (flach) muss der filter auf der dataSource gesetzt sein.\n\t\t// Sort/Paginator werden erst in setData() restauriert, weil sie die geladene Datenmenge brauchen.\n\t\tconst savedFilter = this.savedState()?.filter;\n\t\tif ( savedFilter ) {\n\t\t\tthis.searchText = savedFilter;\n\t\t\tthis.searchTextInit = savedFilter;\n\t\t\tif ( !this.options.serverSide && !this.tree.enabled )\n\t\t\t\tthis.dataSource.filter = savedFilter;\n\t\t}\n\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 v = sortValue( row, column.id, column );\n\t\t\t\t\t\t\t\t\tsum += typeof v === 'number' ? v : 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\tif ( normalizeCellObjects( data, this.displayedColumns ) )\n\t\t\tconsole.warn( 'xiri-table: cells of cellObject columns must be {d, v} objects; bare values were wrapped and sort as empty' );\n\n\t\tthis._alldata.set( data );\n\n\t\tif ( this._firstData ) {\n\t\t\tthis._firstData = false;\n\n\t\t\tconst saved = this.savedState();\n\t\t\tif ( !saved )\n\t\t\t\treturn;\n\n\t\t\tif ( saved.sort !== undefined && saved.sortDirection !== undefined )\n\t\t\t\tthis.sort().sort( ( { id: saved.sort, start: saved.sortDirection } ) as MatSortable );\n\t\t\tif ( saved.pageSize !== undefined && saved.pageIndex !== undefined ) {\n\t\t\t\tthis.paginator().pageIndex = saved.pageIndex;\n\t\t\t\tthis.paginator()._changePageSize( saved.pageSize );\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate savedState(): XiriTableSavedState | null {\n\t\tconst stateKey = this.tableStateKey();\n\t\tif ( !this.options.saveState || !stateKey )\n\t\t\treturn null;\n\t\treturn this.sessionStorageService.getTimeout( stateKey, 3600 ) as XiriTableSavedState | null;\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\tconst shown = cellDisplayOf( value, column );\n\t\t\tthis.footer[ column.id ] = Array.isArray( shown ) ? shown[ 0 ] : shown;\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\n\t// Der Header-Streifen ist 51px hoch, grau und hat eine Trennlinie — ohne Inhalt bliebe darüber\n\t// nur eine leere graue Leiste stehen. Reaktiv, weil autoRefresh/lastUpdated erst beim Laden kommen.\n\tget hasHeader(): boolean {\n\t\treturn !!( this.options.reload || this.options.title || this.options.buttons || this.options.search\n\t\t\t|| this.options.saveInput || this.treeEnabled || this.autoRefresh() || this.lastUpdated() );\n\t}\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\tconst value = cellDisplayOf( row[ key ] as XiriTableCellValue, this.displayedColumns.find( c => c.id === key ) );\n\t\t\tdataStr += value + '◬';\n\t\t}\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\t\t\tconst cell = row[ k ] as XiriTableCellValue;\n\t\t\tconst value = isCellObject( cell ) ? cell.v : cell;\n\n\t\t\tif ( value === null || value === undefined || value === '' ) {\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\t// xiri-button hat refresh:'panel' schon behandelt (Panel-Host oder Page-Fallback) – hier nicht noch einmal.\n\t\tthis.callReturn( event.result, true );\n\t}\n\t\n\tprivate callReturn( result: unknown, fromButton = false ) {\n\t\tthis.responseHandler.handle( result, {\n\t\t\tonTableRefresh: () => this.reload(),\n\t\t\tonTableUpdate: ( id, field, content ) => this.onTableUpdate( id, field, content as XiriTableCellValue ),\n\t\t\tonPanelRefresh: fromButton ? undefined : () => this.refreshPanel(),\n\t\t} );\n\t}\n\n\tprivate onTableUpdate( id: unknown, field: string, content: XiriTableCellValue ): void {\n\t\tconst i = this.dataSource.data.findIndex( ( x: XiriTableRow ) => x.id === id );\n\t\tif ( i == -1 )\n\t\t\treturn;\n\t\tconst column = this.displayedColumns.find( c => c.id === field );\n\t\tif ( column?.cellObject && !isCellObject( content ) )\n\t\t\tconsole.warn( `xiri-table: update for cellObject column \"${ field }\" is not a {d, v} object; it will sort as empty` );\n\t\tthis.dataSource.data[ i ][ field ] = column?.cellObject ? asCellObject( content ) : content;\n\t\tthis.dataSource._updateChangeSubscription();\n\t}\n\n\t// Ohne umschließende Card: wie eine Card ohne url → Page-Reload.\n\tprivate refreshPanel() {\n\t\tif ( this.panelHost )\n\t\t\tthis.panelHost.reloadPanel();\n\t\telse\n\t\t\tthis.responseHandler.handle( { refresh: 'page' } );\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\teditValue( row: XiriTableRow, column: XiriTableField ): XiriTableCellValue { return this.inlineEdit.editValue( row, column ); }\n\n\tsetEditValue( row: XiriTableRow, column: XiriTableField, value: XiriTableCellValue ): void {\n\t\tthis.inlineEdit.setEditValue( row, column, value );\n\t}\n\n\tcompareEditValue = ( a: unknown, b: unknown ): boolean => this.inlineEdit.compareEditValue( a, b );\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\t// Only input cells take pasted text: other formats carry structured cells (number tuples,\n\t\t\t\t// cell objects, chips), and a pasted string would break their display and sorting.\n\t\t\t\tif ( col.format !== 'input' )\n\t\t\t\t\tcontinue;\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, sortHeaderId ) =>\n\t\t\tsortValue( data, sortHeaderId, this.displayedColumns.find( col => col.id === sortHeaderId ) );\n\t}\n\n\t/** Display part of a cell (see cell.ts); used by every cell template. */\n\tcellText( row: XiriTableRow, column: XiriTableField ): XiriTableCellValue {\n\t\treturn cellDisplayOf( row[ column.id ] as XiriTableCellValue, column );\n\t}\n\n\t/** Display lines of a text2/textn cell. */\n\tcellLines( row: XiriTableRow, column: XiriTableField ): XiriTableCellValue[] {\n\t\treturn cellLinesOf( row[ column.id ] as XiriTableCellValue, column );\n\t}\n}\n","<mat-card class=\"xiritablecard mat-mdc-elevation-specific\" [class.mat-elevation-z3]=\"!options.flat\" [class.flat]=\"options.flat\">\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@if (hasHeader) {\n\t\t\t\t<div class=\"header\" [hidden]=\"bulkBarActive\">\n\t\t\t\t\t@if (options.reload) {\n\t\t\t\t\t\t<div class=\"buttons\">\n\t\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\t<mat-icon>autorenew</mat-icon>\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\t@if (autoRefresh()) {\n\t\t\t\t\t\t<div class=\"autorefresh-indicator\" role=\"status\" aria-live=\"polite\"\n\t\t\t\t\t\t matTooltip=\"Tabelle aktualisiert sich automatisch\">\n\t\t\t\t\t\t\t<mat-icon class=\"spin\">sync</mat-icon>\n\t\t\t\t\t\t\t<span>Auto-Refresh aktiv · nächste in {{ countdown() }}s</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\t@if (lastUpdated(); as updated) {\n\t\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\t\tStand {{ updated | date:'HH:mm' }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\t@if (treeEnabled) {\n\t\t\t\t\t\t<div class=\"buttons xiri-tree-actions\">\n\t\t\t\t\t\t\t<button mat-icon-button (click)=\"expandAllNodes()\" color=\"primary\"\n\t\t\t\t\t\t\t matTooltip=\"Alle ausklappen\" aria-label=\"Alle ausklappen\">\n\t\t\t\t\t\t\t\t<mat-icon>unfold_more</mat-icon>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button mat-icon-button (click)=\"collapseAllNodes()\" color=\"primary\"\n\t\t\t\t\t\t\t matTooltip=\"Alle einklappen\" aria-label=\"Alle einklappen\">\n\t\t\t\t\t\t\t\t<mat-icon>unfold_less</mat-icon>\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\t<div class=\"middle\" [class.hasButtons]=\"options.buttons\">{{ options.title }}</div>\n\t\t\t\t\t@if (options.buttons) {\n\t\t\t\t\t\t<xiri-buttonline [settings]=\"options.buttons\" (result)=\"buttonReturn($event)\"\n\t\t\t\t\t\t [filterData]=\"_filterData()\"></xiri-buttonline>\n\t\t\t\t\t}\n\t\t\t\t\t@if (options.search) {\n\t\t\t\t\t\t<xiri-search (changed)=\"searchDo($event)\" [placeholder]=\"''\" [text]=\"searchTextInit\"></xiri-search>\n\t\t\t\t\t}\n\t\t\t\t\t@if (options.saveInput) {\n\t\t\t\t\t\t<div class=\"buttons saveInput\">\n\t\t\t\t\t\t\t<button mat-raised-button (click)=\"saveInputData()\" color=\"primary\">\n\t\t\t\t\t\t\t\t{{ options.saveInput }}\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}\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]=\"row[ column.id + 'Hint' ] || icon[ 'hint' ] || '' \"\n\t\t\t\t\t\t\t\t\t\t\t [matTooltipDisabled]=\"!( row[ column.id + 'Hint' ] || 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@let lines = cellLines(row, column);\n\t\t\t\t\t\t\t\t\t\t<div>{{ lines[0] }}</div>\n\t\t\t\t\t\t\t\t\t\t<div>{{ lines[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 cellLines(row, column); 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 }}{{ cellText(row, column) }}{{ 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]=\"editValue(row, column)\" (ngModelChange)=\"setEditValue(row, column, $event)\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t [compareWith]=\"compareEditValue\"\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 [type]=\"column.inputType || 'text'\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t [step]=\"column.inputType === 'datetime-local' ? 1 : null\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t [ngModel]=\"editValue(row, column)\" (ngModelChange)=\"setEditValue(row, column, $event)\"\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 }}{{ cellText(row, column) }}{{ 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 }}{{ cellText(row, column) }}{{ 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\nimport { formState } from '../formfields/form-state';\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\tconst state = formState( event );\n\t\tthis.formValid = state.valid;\n\t\tthis.formValues = state.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\nimport { formState } from '../formfields/form-state';\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\t// true, wenn alle Controls disabled sind — dann ist valid false, ohne dass etwas ungültig wäre.\n\tdisabled?: 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\tconst { valid, value } = formState( event );\n\t\tif ( valid )\n\t\t\tstep.data = 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( 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\nimport { formState } from '../formfields/form-state';\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\t// true, wenn alle Controls disabled sind — dann ist valid false, ohne dass etwas ungültig wäre.\n\tdisabled?: 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\t// Die drei Auswertungen (hier, initialer Load, Debounce) müssen übereinstimmen, deshalb\n\t\t// wandert der normalisierte Stand mit ins Ereignis für den Debounce.\n\t\tconst { valid, value } = formState( event );\n\t\tevent = { ...event, valid, value };\n\t\tthis.formValid.set( valid );\n\t\tthis.rawValue.set( value );\n\n\t\tif ( this.extra !== null ) {\n\t\t\tif ( value && typeof value === 'object' )\n\t\t\t\tthis.filterData.set( { ...this.extra, ...value } );\n\t\t\telse\n\t\t\t\tthis.filterData.set( this.extra );\n\t\t} else\n\t\t\tthis.filterData.set( value );\n\n\t\t// Emit immediately on first valid change (for initial load), debounce subsequent changes\n\t\tif ( !this._initialChangeDone && 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 { computed, effect, inject, Injector, linkedSignal, signal } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { XiriDataService } from './data.service';\n\n/**\n * Lädt ein Panel (Card, Expansion-Panel) von einer URL und puffert die letzte erfolgreiche Antwort.\n * Gemeinsame Logik der XIRI_PANEL_HOST-Implementierungen; muss im Injection-Context aufgerufen werden.\n *\n * - `raw`: rohe Antwort, nur gelesen, wenn die Resource einen Wert hat (value() wirft im Fehlerzustand).\n * - `loaded`: das Objekt unter `opts.key` der letzten erfolgreichen Antwort. Bleibt bei Reload-Fehler\n * stehen, wird bei url-Wechsel und bei einer erfolgreichen Antwort ohne `opts.key` geleert.\n * - `reloadOrQueue`: lädt neu; läuft der erste Load noch, wird der Reload nachgeholt, sobald er fertig ist.\n */\nexport function createPanelLoader<T extends object>( opts: { url: () => string | undefined; key: string } ) {\n\t// XiriDataService erst beim ersten Request auflösen: Hosts ohne url (statische Card, Shell-Panel) brauchen so\n\t// weiterhin keinen HttpClient-Provider.\n\tconst injector = inject( Injector );\n\t// Signal, kein Boolean: der Effect muss darauf reagieren, wenn es gesetzt wird.\n\tconst pendingReload = signal( false );\n\n\tconst resource = rxResource( {\n\t\tparams: opts.url,\n\t\tstream: ( { params } ) => injector.get( XiriDataService ).post( params, null ),\n\t} );\n\n\tconst errorMsg = computed( () => {\n\t\tconst e = 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\tconst raw = computed<unknown>( () => resource.hasValue() ? resource.value() : undefined );\n\n\t/** Objekt unter `key` in der aktuellen Antwort (Top-Level), sonst null. */\n\tconst response = computed<T | null>( () => {\n\t\tconst r = raw() as Record<string, unknown> | null | undefined;\n\t\tconst c = r && typeof r === 'object' && !Array.isArray( r ) ? r[ opts.key ] : undefined;\n\t\treturn c && typeof c === 'object' && !Array.isArray( c ) ? c as T : null;\n\t} );\n\n\tconst loaded = linkedSignal<{ url: string | undefined; item: T | null; hasValue: boolean }, T | null>( {\n\t\tsource: () => ( { url: opts.url(), item: response(), hasValue: raw() != null } ),\n\t\tcomputation: ( s, prev ) => {\n\t\t\tif ( s.item ) return s.item;\n\t\t\tif ( s.hasValue ) return null;\n\t\t\treturn prev && prev.source.url === s.url ? prev.value : null;\n\t\t},\n\t} );\n\n\t// pendingReload zuerst lesen, damit beide Signale als Abhängigkeit registriert sind.\n\teffect( () => {\n\t\tconst pending = pendingReload();\n\t\tconst loading = resource.isLoading();\n\t\tif ( pending && !loading ) {\n\t\t\tpendingReload.set( false );\n\t\t\tresource.reload();\n\t\t}\n\t} );\n\n\treturn {\n\t\tloading: resource.isLoading,\n\t\terrorMsg,\n\t\traw,\n\t\tloaded,\n\t\t/** Manueller Reload (Reload-Button): kein Doppelstart, solange geladen wird. */\n\t\treload: () => {\n\t\t\tif ( !resource.isLoading() ) resource.reload();\n\t\t},\n\t\t/** refresh:'panel': reload() gibt false zurück, solange der erste Load läuft – dann nachholen. */\n\t\t// ponytail: bei url-Wechsel während pending läuft danach ein Reload zu viel; harmlos.\n\t\treloadOrQueue: () => {\n\t\t\tif ( !resource.reload() ) pendingReload.set( true );\n\t\t},\n\t};\n}\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 { XiriResponseHandlerService, XiriPanelHost, XIRI_PANEL_HOST } from '../services/response-handler.service';\nimport { createPanelLoader } from '../services/panel-loader';\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 { 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\tflat?: boolean // Ohne Schatten/Hintergrund/Radius; Header nur wenn er Inhalt hat.\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\t providers: [ { provide: XIRI_PANEL_HOST, useExisting: forwardRef( () => XiriCardComponent ) } ],\n } )\nexport class XiriCardComponent implements XiriPanelHost {\n\n\tprivate responseHandler = inject( XiriResponseHandlerService );\n\t// Nächste äußere Card (Provider dieser Card übersprungen). Ziel für refresh:'panel', wenn diese Card keine url hat.\n\tprivate parentPanel = inject( XIRI_PANEL_HOST, { optional: true, skipSelf: true } );\n\n\tsettings = input.required<XiriCardSettings>();\n\n\t// Lädt {card: …} von settings().url; puffert die letzte komplette Card (siehe panel-loader.ts).\n\tprivate loader = createPanelLoader<XiriCardSettings>( { url: () => this.settings().url, key: 'card' } );\n\n\t// Bei flat nur rendern, wenn der Header Inhalt hat; sonst bliebe eine leere 32px-Leiste.\n\tshowHeader = computed( () => {\n\t\tconst s = this.card();\n\t\treturn !s.flat || !!( s.header || s.headerSub || s.headerIcon || s.buttonsTop?.buttons?.length\n\t\t\t|| s.collapsible || ( s.reload && s.url ) );\n\t} );\n\n\tisCollapsed = linkedSignal<boolean | undefined, boolean>( {\n\t\tsource: () => this.card().collapsed,\n\t\tcomputation: ( collapsed, previous ) => collapsed ?? previous?.value ?? false,\n\t} );\n\n\tloading = this.loader.loading;\n\terrorMsg = this.loader.errorMsg;\n\tprivate _raw = this.loader.raw;\n\t/** Zuletzt erfolgreich geladene komplette Card ({card: …}); null bei Zeilen-Antworten. */\n\tprivate loadedCard = this.loader.loaded;\n\n\t/** Inhaltszeilen aus einer Nicht-Card-Antwort: {data: rows} → rows, sonst die Antwort selbst. */\n\tprivate _loaded = computed( () => {\n\t\tif ( this.loadedCard() ) return undefined;\n\t\tconst res = this._raw();\n\t\tif ( res == null ) return res;\n\t\treturn ( res as { data?: unknown } ).data ?? res;\n\t} );\n\n\t/** settings(), überlagert von einer nachgeladenen kompletten Card. Inhaltsfelder kommen dann nur aus der Antwort. */\n\tcard = computed<XiriCardSettings>( () => {\n\t\tconst s = this.settings();\n\t\tconst c = this.loadedCard();\n\t\tif ( !c ) return s;\n\t\treturn { ...s, ...c, fields: c.fields, data: c.data, dense: c.dense, components: c.components,\n\t\t\tshowHeader: c.showHeader, forceMinWidth: c.forceMinWidth };\n\t} );\n\n\tcardData = computed( () => this.loadedCard() ? this.loadedCard()!.data : ( this._loaded() ?? this.settings().data ) );\n\n\t/** Skeleton nur, solange noch nie etwas geladen wurde (auch nicht gepuffert) und kein statischer Inhalt da ist. */\n\tshowSkeleton = computed( () => this.loading() && this._raw() == null && !this.loadedCard()\n\t\t&& this.settings().data == null && !( this.settings().components?.length ) );\n\n\thasComponents = computed( () => ( this.card().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.card().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.card().fields,\n\t\t\tdense: this.card().dense,\n\t\t\tforceMinWidth: this.card().forceMinWidth,\n\t\t\tshowHeader: this.card().showHeader,\n\t\t};\n\n\t\tif ( !this.card().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\t/** Klick irgendwo im Header toggelt; Buttons/Links (Collapse, Reload, buttonsTop) behalten ihre eigene Aktion. */\n\tonHeaderClick( event: MouseEvent ): void {\n\t\tif ( !this.card().collapsible ) return;\n\t\tif ( ( event.target as HTMLElement ).closest( 'button, a' ) ) return;\n\t\tthis.toggleCollapse();\n\t}\n\n\treload() {\n\t\tthis.loader.reload();\n\t}\n\n\t/** refresh:'panel' aus Button/Tabelle in dieser Card. Ohne url: äußere Card, sonst Page-Reload. */\n\treloadPanel(): void {\n\t\tif ( !this.settings().url ) {\n\t\t\tif ( this.parentPanel )\n\t\t\t\tthis.parentPanel.reloadPanel();\n\t\t\telse\n\t\t\t\tthis.responseHandler.handle( { refresh: 'page' } );\n\t\t\treturn;\n\t\t}\n\t\tthis.loader.reloadOrQueue();\n\t}\n\n}\n","<mat-card class=\"card mat-mdc-elevation-specific\" [class.mat-elevation-z2]=\"!card().flat\" [class.flat]=\"card().flat\">\n\t@if (showHeader()) {\n\t<mat-card-header (click)=\"onHeaderClick($event)\" [class.collapsible]=\"card().collapsible\">\n\t\t@if (card().headerIcon) {\n\t\t\t<div mat-card-avatar class=\"header-image\">\n\t\t\t\t<mat-icon [class]=\"card().headerIconColor || 'primary'\">{{ card().headerIcon }}</mat-icon>\n\t\t\t</div>\n\t\t}\n\t\t@if (card().header) {\n\t\t\t<mat-card-title [class]=\"{hasHeaderSub: card().headerSub}\">{{ card().header }}</mat-card-title>\n\t\t}\n\t\t@if (card().headerSub) {\n\t\t\t<mat-card-subtitle>{{ card().headerSub }}</mat-card-subtitle>\n\t\t}\n\t\t@if (card().buttonsTop) {\n\t\t\t<xiri-buttonline [settings]=\"card().buttonsTop!\"></xiri-buttonline>\n\t\t}\n\t\t@if (card().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 (card().reload && card().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}\n\t<div class=\"collapse-wrapper\" [class.collapsed]=\"isCollapsed()\">\n\t\t<div class=\"collapse-inner\">\n\t\t\t@if (showSkeleton()) {\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]=\"card().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]=\"card().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 (card().buttonsBottom) {\n\t\t\t\t<mat-card-actions align=\"end\">\n\t\t\t\t\t<xiri-buttonline [settings]=\"card().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\tnoPadding?: 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\" [bodyClass]=\"tab.noPadding ? 'xiri-tab-no-padding' : ''\">\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 { computed, Directive, forwardRef, inject, Injector, input } from '@angular/core';\nimport { XiriResponseHandlerService, XiriPanelHost, XIRI_PANEL_HOST } from '../services/response-handler.service';\nimport { createPanelLoader } from '../services/panel-loader';\nimport { XiriExpansionPanelSettings } from './expansion.component';\n\n/**\n * Macht ein mat-expansion-panel zum Panel-Host für refresh:'panel' und lädt es bei gesetzter url nach.\n * Sitzt als Directive direkt auf dem Material-Panel, damit der Element-Injector des Panels den Token trägt:\n * Header-Buttons und (über ngTemplateOutletInjector) der Inhalt finden so genau dieses Panel.\n */\n@Directive( {\n\t selector: 'mat-expansion-panel[xiriExpansionPanel]',\n\t exportAs: 'xiriExpansionPanel',\n\t providers: [ { provide: XIRI_PANEL_HOST, useExisting: forwardRef( () => XiriExpansionPanelDirective ) } ],\n } )\nexport class XiriExpansionPanelDirective implements XiriPanelHost {\n\n\t/**\n\t * Shell-Settings des Panels aus XiriExpansionSettings.panels. Nicht `required`: der Loader-Effect einer Directive\n\t * läuft in der Host-View und kann vor dem ersten Setzen der Inputs feuern (NG0950) – der leere Default hat keine url.\n\t */\n\tsettings = input<XiriExpansionPanelSettings>( { title: '', data: [] }, { alias: 'xiriExpansionPanel' } );\n\n\t/** Element-Injector des Panels – als ngTemplateOutletInjector für den Inhalt, sonst löst der über die deklarierende View auf. */\n\tinjector = inject( Injector );\n\n\tprivate responseHandler = inject( XiriResponseHandlerService );\n\t// Nächster äußerer Host (z. B. eine url-Card um das Akkordeon). Ziel für refresh:'panel', wenn dieses Panel keine url hat.\n\t// Innerhalb eingebetteter Views überspringt skipSelf Zwischenknoten – ein Reload landet dann höchstens zu grob, nie falsch.\n\tprivate parentPanel = inject( XIRI_PANEL_HOST, { optional: true, skipSelf: true } );\n\n\t// ponytail: lädt beim Init, unabhängig von lazy. Upgrade: params erst setzen, wenn das Panel zum ersten Mal offen war.\n\tprivate loader = createPanelLoader<XiriExpansionPanelSettings>( { url: () => this.settings().url, key: 'panel' } );\n\n\tloading = this.loader.loading;\n\terrorMsg = this.loader.errorMsg;\n\n\t/**\n\t * Shell, überlagert von title/description/icon/buttons/data der letzten Antwort.\n\t * expanded/disabled/lazy/unload bleiben Shell-Werte – sonst klappte ein Reload ohne `expanded` das Panel zu.\n\t */\n\tpanel = computed<XiriExpansionPanelSettings>( () => {\n\t\tconst s = this.settings();\n\t\tconst l = this.loader.loaded();\n\t\tif ( !l ) return s;\n\t\treturn { ...s, title: l.title, description: l.description, icon: l.icon, buttons: l.buttons, data: l.data ?? [] };\n\t} );\n\n\t/** Skeleton nur, solange noch nie etwas geladen wurde (auch nicht gepuffert) und die Shell keinen Inhalt hat. */\n\tshowSkeleton = computed( () => this.loading() && this.loader.raw() == null && !this.loader.loaded()\n\t\t&& !( this.settings().data?.length ) );\n\n\t/** refresh:'panel' aus Header-Button, Inhalt oder Tabelle in diesem Panel. Ohne url: äußerer Host, sonst Page-Reload. */\n\treloadPanel(): void {\n\t\tif ( !this.settings().url ) {\n\t\t\tif ( this.parentPanel )\n\t\t\t\tthis.parentPanel.reloadPanel();\n\t\t\telse\n\t\t\t\tthis.responseHandler.handle( { refresh: 'page' } );\n\t\t\treturn;\n\t\t}\n\t\tthis.loader.reloadOrQueue();\n\t}\n}\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';\nimport { XiriButtonlineComponent, XiriButtonlineSettings } from '../buttonline/buttonline.component';\nimport { XiriSkeletonComponent } from '../skeleton/skeleton.component';\nimport { XiriExpansionPanelDirective } from './expansion-panel.directive';\n\nexport interface XiriExpansionPanelSettings {\n\ttitle: string\n\tdescription?: string\n\ticon?: string\n\tdisabled?: boolean\n\texpanded?: boolean\n\turl?: string // Panel lädt sich von hier (POST null → {panel: …}); Shell hat dann data: []\n\tdata?: XiriDynData[]\n\tbuttons?: XiriButtonlineSettings\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, XiriButtonlineComponent, XiriSkeletonComponent, XiriExpansionPanelDirective ]\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\t// Eine flache Card/Table bringt Rahmen und Innenabstand selbst mit; das Panel halbiert dann\n\t// seinen Seitenabstand links/rechts (siehe .flat-content im SCSS).\n\thasFlatContent( panel: XiriExpansionPanelSettings ): boolean {\n\t\treturn panel.data?.some( d => d.type === 'card'\n\t\t\t? !!( d.data as { flat?: boolean } | undefined )?.flat\n\t\t\t: d.type === 'table' && !!( d.data as { options?: { flat?: boolean } } | undefined )?.options?.flat ) ?? false;\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 $index; let i = $index) {\n\t\t<mat-expansion-panel\n\t\t\t[xiriExpansionPanel]=\"panel\" #p=\"xiriExpansionPanel\"\n\t\t\t[class.flat-content]=\"hasFlatContent(p.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 (p.panel().icon) {\n\t\t\t\t\t<mat-icon>{{ p.panel().icon }}</mat-icon>\n\t\t\t\t}\n\t\t\t\t<mat-panel-title>{{ p.panel().title }}</mat-panel-title>\n\t\t\t\t@if (p.panel().description) {\n\t\t\t\t\t<mat-panel-description>{{ p.panel().description }}</mat-panel-description>\n\t\t\t\t}\n\t\t\t\t@if (p.panel().buttons) {\n\t\t\t\t\t<xiri-buttonline class=\"panel-buttons\" [settings]=\"p.panel().buttons!\" [filterData]=\"filterData()\"\n\t\t\t\t\t\t(click)=\"$event.stopPropagation()\" (keydown)=\"$event.stopPropagation()\"></xiri-buttonline>\n\t\t\t\t}\n\t\t\t</mat-expansion-panel-header>\n\n\t\t\t@if (p.showSkeleton()) {\n\t\t\t\t<xiri-skeleton type=\"text\" [lines]=\"3\"></xiri-skeleton>\n\t\t\t} @else if (p.errorMsg()) {\n\t\t\t\t<div class=\"load-error\">{{ p.errorMsg() }}</div>\n\t\t\t} @else if (shouldRenderContent(i, panel)) {\n\t\t\t\t<!-- injector: Element-Injector des Panels, sonst fände ein Button im Inhalt (eingebettete View) das Panel nicht. -->\n\t\t\t\t<ng-container *ngTemplateOutlet=\"dyncomponent();\n\t\t\t\t\tcontext: { $implicit: { data: p.panel().data ?? [], filterData: filterData() } };\n\t\t\t\t\tinjector: p.injector\"></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';\nexport * from './lib/expansion/expansion-panel.directive';\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/panel-loader';\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","cellLinesOf","errorMessage","debounceTime","cellDisplayOf","MatOption"],"mappings":"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"}
|