@dbg-riskit/angular-view
Version:
1 lines • 69.8 kB
Source Map (JSON)
{"version":3,"file":"dbg-riskit-angular-view.mjs","sources":["../../../../pkg/dbg-riskit/angular-view/src/lib/message.component.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/message.component.html","../../../../pkg/dbg-riskit/angular-view/src/lib/date.formatter.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/flex.component.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/flex.spacer.component.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/loader.component.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/message.dialog.component.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/message.dialog.component.html","../../../../pkg/dbg-riskit/angular-view/src/lib/percent.pipe.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/progress.loader.component.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/dialog.service.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/match.media.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/layout.component.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/layout.component.html","../../../../pkg/dbg-riskit/angular-view/src/lib/sub.link.directive.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/link.active.directive.ts","../../../../pkg/dbg-riskit/angular-view/src/lib/toolbar.component.ts","../../../../pkg/dbg-riskit/angular-view/src/dbg-riskit-angular-view.ts"],"sourcesContent":["import {NgClass} from '@angular/common';\nimport {ChangeDetectionStrategy, Component, computed, ElementRef, inject, input, signal} from '@angular/core';\nimport {MatCard, MatCardContent} from '@angular/material/card';\nimport {MatProgressSpinner} from '@angular/material/progress-spinner';\n\nexport const RISK_ERROR_SELECTOR = 'risk-error';\nexport const RISK_GOOD_SELECTOR = 'risk-good';\nexport const RISK_INFO_SELECTOR = 'risk-info';\nexport const RISK_MESSAGE_SELECTOR = 'risk-message';\nexport const RISK_WARN_SELECTOR = 'risk-warn';\n\nexport const RISK_INITIAL_LOAD_SELECTOR = 'risk-initial-load';\nexport const RISK_NO_DATA_SELECTOR = 'risk-no-data';\nexport const RISK_UPDATE_FAILED_SELECTOR = 'risk-update-failed';\n\nexport const COMPONENT_SELECTOR = RISK_ERROR_SELECTOR + ', ' + RISK_GOOD_SELECTOR + ', ' + RISK_INFO_SELECTOR + ', '\n + RISK_MESSAGE_SELECTOR + ', ' + RISK_WARN_SELECTOR + ', '\n + RISK_INITIAL_LOAD_SELECTOR + ', ' + RISK_NO_DATA_SELECTOR + ', '\n + RISK_UPDATE_FAILED_SELECTOR;\n\n@Component({\n selector : COMPONENT_SELECTOR,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl : 'message.component.html',\n styleUrls : [\n '../../../component.scss',\n 'message.component.scss'\n ],\n host : {\n '[class.risk-message]' : 'true',\n '[class.risk-message-error]' : 'color() === \"' + RISK_ERROR_SELECTOR + '\"',\n '[class.risk-message-warn]' : 'color() === \"' + RISK_WARN_SELECTOR + '\"',\n '[class.risk-message-good]' : 'color() === \"' + RISK_GOOD_SELECTOR + '\"',\n '[class.risk-message-info]' : 'color() === \"' + RISK_INFO_SELECTOR + '\"',\n '[class.risk-message-initial-load]': 'initialLoad()',\n '[class.risk-message-no-data]' : 'noData()',\n '[class.risk-message-update-error]': 'updateError()'\n },\n imports : [\n MatCard,\n MatCardContent,\n MatProgressSpinner,\n NgClass\n ]\n})\nexport class RiskMessageComponent {\n\n public readonly message = input<string>();\n\n public readonly initialLoad = computed(() => this.tagName() === RISK_INITIAL_LOAD_SELECTOR);\n public readonly noData = computed(() => this.tagName() === RISK_NO_DATA_SELECTOR);\n public readonly updateError = computed(() => this.tagName() === RISK_UPDATE_FAILED_SELECTOR);\n\n public readonly color = computed<string | null>(() => {\n switch (this.tagName()) {\n case RISK_INFO_SELECTOR:\n case RISK_NO_DATA_SELECTOR:\n return RISK_INFO_SELECTOR;\n case RISK_WARN_SELECTOR:\n case RISK_INITIAL_LOAD_SELECTOR:\n return RISK_WARN_SELECTOR;\n case RISK_ERROR_SELECTOR:\n case RISK_UPDATE_FAILED_SELECTOR:\n return RISK_ERROR_SELECTOR;\n case RISK_GOOD_SELECTOR:\n return RISK_GOOD_SELECTOR;\n default:\n return null;\n }\n });\n\n private readonly tagName = signal('');\n\n public constructor() {\n const elementRef = inject(ElementRef);\n this.tagName.set(elementRef.nativeElement.tagName.toLowerCase());\n }\n}\n","<mat-card [ngClass]=\"color()\">\n <mat-card-content>\n @if (initialLoad()) {\n <mat-spinner [diameter]=\"50\"/>\n Loading...\n }\n @if (noData()) {\n No data available.\n }\n @if (updateError()) {\n Failed to update the data: {{ message() }}.\n }\n @if (!initialLoad() && !noData() && !updateError()) {\n {{ message() }}\n }\n <ng-content/>\n </mat-card-content>\n</mat-card>\n","import {DatePipe} from '@angular/common';\nimport {inject, Injectable, Provider} from '@angular/core';\nimport {provideNativeDateAdapter} from '@angular/material/core';\nimport {DATE_FORMAT} from '@dbg-riskit/angular-common';\n\n@Injectable()\nexport class RiskDateFormatter {\n private readonly format = inject(DATE_FORMAT);\n private readonly datePipe = inject(DatePipe);\n\n public transform(value: Date): string | null {\n return this.datePipe.transform(value, this.format);\n }\n}\n\nexport function provideDateFormatter(format: string): Provider[] {\n return [\n DatePipe,\n RiskDateFormatter,\n ...provideNativeDateAdapter(),\n {\n provide : DATE_FORMAT,\n useValue: format\n }\n ];\n}\n","import {ChangeDetectionStrategy, Component, input} from '@angular/core';\n\n@Component({\n selector : 'risk-flex',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template : '<ng-content />',\n styleUrls : [\n '../../../component.scss',\n 'flex.component.scss'\n ],\n host : {\n '[class.risk-flex]' : '!wrapContent()',\n '[class.risk-flex-wrap]': 'wrapContent()'\n }\n})\nexport class RiskFlexComponent {\n public readonly wrapContent = input(false);\n}\n","import {ChangeDetectionStrategy, Component} from '@angular/core';\n\n@Component({\n selector : 'risk-flex-spacer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template : '',\n styleUrls : [\n '../../../component.scss'\n ],\n host : {\n '[class.risk-flex-spacer]': 'true'\n }\n})\nexport class RiskFlexSpacerComponent {\n}\n","import {ChangeDetectionStrategy, Component, inject} from '@angular/core';\nimport {MatButton} from '@angular/material/button';\nimport {MAT_DIALOG_DATA, MatDialogContent, MatDialogRef} from '@angular/material/dialog';\nimport {MatProgressSpinner} from '@angular/material/progress-spinner';\nimport {RiskDialogComponent} from './dialog.service';\nimport {RiskFlexComponent} from './flex.component';\nimport {RiskFlexSpacerComponent} from './flex.spacer.component';\n\nexport interface RiskLoaderDialogData {\n title?: string;\n cancel?: () => void;\n}\n\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n template : `\n <mat-dialog-content>\n <risk-flex [wrapContent]=\"true\">\n <risk-flex-spacer/>\n <mat-spinner/>\n <risk-flex-spacer/>\n </risk-flex>\n @if (dialogData.title) {\n <risk-flex [wrapContent]=\"true\">\n <risk-flex-spacer/>\n <h3>{{ dialogData.title }}</h3>\n <risk-flex-spacer/>\n </risk-flex>\n }\n @if (dialogData.cancel != null) {\n <risk-flex [wrapContent]=\"true\">\n <risk-flex-spacer/>\n <button mat-button color=\"warn\" (click)=\"dialogData.cancel()\">Cancel</button>\n <risk-flex-spacer/>\n </risk-flex>\n }\n </mat-dialog-content>\n `,\n styles : [\n `\n h3 {\n margin-bottom: 0;\n }`\n ],\n host : {\n '[class.risk-loader-dialog]': 'true'\n },\n imports : [\n MatButton,\n MatDialogContent,\n MatProgressSpinner,\n RiskFlexComponent,\n RiskFlexSpacerComponent\n ]\n})\nexport class RiskLoaderComponent implements RiskDialogComponent<RiskLoaderDialogData, void> {\n private readonly dialogRef = inject<MatDialogRef<RiskLoaderComponent, void>>(MatDialogRef);\n private readonly data = inject<RiskLoaderDialogData>(MAT_DIALOG_DATA);\n\n public get dialogData(): RiskLoaderDialogData {\n return this.data;\n }\n\n public close() {\n this.dialogRef.close();\n }\n}\n","import {ChangeDetectionStrategy, Component, computed, inject} from '@angular/core';\nimport {MatButton} from '@angular/material/button';\nimport {MAT_DIALOG_DATA, MatDialogContent, MatDialogRef} from '@angular/material/dialog';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatColorTheme} from '@dbg-riskit/angular-common';\nimport {RiskDialogComponent} from './dialog.service';\n\nexport interface RiskMessageDialogConfig<R> {\n dialogType: RiskMessageDialogType;\n buttons?: Array<RiskMessageDialogButton<R>>;\n title?: string;\n message: string;\n note?: string;\n icon?: string;\n}\n\nexport type RiskMessageDialogType = 'error' | 'warning' | 'info' | 'success' | 'question';\n\nexport interface RiskMessageDialogButton<R> {\n label: string;\n value?: R;\n primary?: boolean;\n}\n\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl : 'message.dialog.component.html',\n styleUrls : [\n '../../../component.scss',\n 'message.dialog.component.scss'\n ],\n host : {\n '[class.risk-message-dialog]': 'true'\n },\n imports : [\n MatButton,\n MatDialogContent,\n MatIcon\n ]\n})\nexport class RiskMessageDialogComponent<R> implements RiskDialogComponent<RiskMessageDialogConfig<R>, R> {\n readonly dialogRef = inject<MatDialogRef<RiskMessageDialogComponent<R>, R>>(MatDialogRef);\n public readonly dialogData = inject<RiskMessageDialogConfig<R>>(MAT_DIALOG_DATA);\n\n public readonly customIcon = computed(() => this.dialogData.icon);\n\n public readonly dialogType = computed<RiskMessageDialogType>(() => this.dialogData.dialogType || 'info');\n\n public readonly buttons = computed<Array<RiskMessageDialogButton<R>>>(() =>\n this.dialogData.buttons || [{label: 'OK'}]\n );\n\n public readonly color = computed<MatColorTheme>(() => {\n switch (this.dialogType()) {\n case 'error':\n case 'warning':\n return 'warn';\n case 'info':\n case 'question':\n return 'accent';\n case 'success':\n return 'primary';\n }\n return null;\n });\n\n public readonly icon = computed<string>(() => {\n if (this.customIcon()) {\n return this.customIcon()!;\n }\n switch (this.dialogType()) {\n case 'error':\n return 'error';\n case 'warning':\n return 'warning';\n case 'info':\n return 'info';\n case 'question':\n return 'help';\n case 'success':\n return 'check';\n }\n return 'info';\n });\n\n public close(button: RiskMessageDialogButton<R>) {\n this.dialogRef.close(button.value);\n }\n}\n","<mat-dialog-content>\n <div class=\"risk-message-dialog-message\">\n @if (dialogData.title) {\n <h3>\n <mat-icon [color]=\"color()\">{{ icon() }}</mat-icon>\n <strong>{{ dialogData.title }}</strong>\n </h3>\n }\n <h3>\n @if (!dialogData.title) {\n <mat-icon [color]=\"color()\">{{ icon() }}</mat-icon>\n }\n {{ dialogData.message }}\n </h3>\n @if (dialogData.note) {\n <small>NOTE: {{ dialogData.note }}</small>\n }\n </div>\n @for (button of buttons(); track button) {\n <a\n (click)=\"close(button)\"\n [color]=\"button.primary ? color() : null\"\n mat-button>{{ button.label }}</a>\n }\n</mat-dialog-content>\n","import {DecimalPipe} from '@angular/common';\nimport {inject, LOCALE_ID, Pipe, PipeTransform} from '@angular/core';\nimport {Maybe} from '@dbg-riskit/common';\n\n@Pipe({name: 'percent'})\nexport class RiskPercentPipe implements PipeTransform {\n private readonly decimalPipe = new DecimalPipe(inject(LOCALE_ID));\n\n public transform(value: Maybe<number | string>, digits?: string): string | undefined {\n const transformedNumber = this.decimalPipe.transform(value, digits);\n if (transformedNumber) {\n return transformedNumber + '%';\n }\n\n return undefined;\n }\n}\n","import {ChangeDetectionStrategy, Component, computed, inject, PipeTransform, signal} from '@angular/core';\nimport {MatButton} from '@angular/material/button';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {MatProgressSpinner} from '@angular/material/progress-spinner';\nimport {RiskDialogComponent} from './dialog.service';\nimport {RiskFlexComponent} from './flex.component';\nimport {RiskFlexSpacerComponent} from './flex.spacer.component';\nimport {RiskPercentPipe} from './percent.pipe';\n\nexport interface RiskProgressLoaderDialogData {\n title?: string;\n value?: number;\n total?: number;\n valueFormatter?: PipeTransform;\n cancel?: () => void;\n}\n\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n template : `\n @let tot = total();\n @let val = value();\n <risk-flex [wrapContent]=\"true\">\n <risk-flex-spacer/>\n <mat-progress-spinner\n [mode]=\"mode()\"\n [value]=\"(val / (tot || 1)) * 100\"/>\n <risk-flex-spacer/>\n </risk-flex>\n @if (dialogData.title) {\n <risk-flex [wrapContent]=\"true\">\n <risk-flex-spacer/>\n <h3>{{ dialogData.title }}</h3>\n <risk-flex-spacer/>\n </risk-flex>\n }\n <risk-flex [wrapContent]=\"true\">\n <risk-flex-spacer/>\n @if (tot != null && tot > 0) {\n <h5>{{ valueFormatter.transform(val) }}\n /{{ valueFormatter.transform(tot) }}\n - {{ val / tot * 100 | percent:'.1-1' }}</h5>\n } @else {\n <h5>{{ valueFormatter.transform(val) }}</h5>\n }\n <risk-flex-spacer/>\n </risk-flex>\n @if (dialogData.cancel != null) {\n <risk-flex [wrapContent]=\"true\">\n <risk-flex-spacer/>\n <button mat-button color=\"warn\" (click)=\"dialogData.cancel()\">Cancel</button>\n <risk-flex-spacer/>\n </risk-flex>\n }\n `,\n styles : [\n `\n h3 {\n margin-bottom: 0;\n }`\n ],\n host : {\n '[class.risk-progress-loader-dialog]': 'true'\n },\n imports : [\n MatButton,\n MatProgressSpinner,\n RiskFlexComponent,\n RiskFlexSpacerComponent,\n RiskPercentPipe\n ]\n})\nexport class RiskProgressLoaderComponent implements RiskDialogComponent<RiskProgressLoaderDialogData, void> {\n private readonly dialogRef = inject<MatDialogRef<RiskProgressLoaderComponent, void>>(MatDialogRef);\n public readonly dialogData = inject<RiskProgressLoaderDialogData>(MAT_DIALOG_DATA);\n\n public readonly value = signal(this.dialogData.value ?? 0);\n public readonly total = signal(this.dialogData.total);\n\n public readonly mode = computed(() => {\n const totalVal = this.total();\n const valueVal = this.value();\n switch (true) {\n case totalVal == null:\n case totalVal != null && totalVal <= 0:\n case valueVal <= 0:\n case valueVal === totalVal:\n return 'indeterminate';\n default:\n return 'determinate';\n }\n });\n\n public setValue(v: number) {\n this.dialogData.value = v;\n this.value.set(v < 0 ? 0 : v);\n }\n\n public setTotal(v: number | undefined) {\n this.dialogData.total = v;\n this.total.set(v);\n }\n\n public get valueFormatter(): PipeTransform {\n return this.dialogData.valueFormatter || {transform: (data) => data};\n }\n\n public close() {\n this.dialogRef.close();\n }\n}\n","import {inject, Injectable, Type} from '@angular/core';\nimport {MatDialog} from '@angular/material/dialog';\nimport {first} from 'rxjs/operators';\nimport {RiskLoaderComponent, RiskLoaderDialogData as LoaderConfig} from './loader.component';\nimport {\n RiskMessageDialogButton,\n RiskMessageDialogComponent,\n RiskMessageDialogConfig as MessageDialogConfig,\n RiskMessageDialogType\n} from './message.dialog.component';\nimport {\n RiskProgressLoaderComponent,\n RiskProgressLoaderDialogData as ProgressLoaderConfig\n} from './progress.loader.component';\n\nexport interface RiskDialogConfig<T> {\n /** Custom class for the overlay pane. */\n readonly panelClass?: string;\n /** Whether the dialog has a backdrop. */\n readonly hasBackdrop?: boolean;\n /** Custom class for the backdrop, */\n readonly backdropClass?: string;\n /** Whether the user can use escape or clicking outside to close a modal. */\n readonly disableClose?: boolean;\n\n readonly data?: T;\n}\n\nexport interface RiskDialogComponent<T, R = unknown> {\n readonly dialogData: T;\n}\n\n@Injectable({providedIn: 'root'})\nexport class RiskDialogService {\n readonly dialog = inject(MatDialog);\n\n public showWarnDialog(message: string, note?: string) {\n return this.showMessageDialog({\n dialogType: 'warning',\n message,\n note\n });\n }\n\n public showWarnQuestionDialog(destroyCallback: () => void,\n destructiveButtonLabel: string,\n message: string,\n note?: string) {\n return this.showMessageDialog({\n dialogType: 'warning',\n message,\n note,\n buttons : [\n {\n label : destructiveButtonLabel,\n value : true,\n primary: true\n },\n {\n label: 'Cancel',\n value: false\n }\n ],\n answerCallback(result?: boolean) {\n if (result) {\n destroyCallback();\n }\n }\n });\n }\n\n public showErrorDialog(message: string, note?: string) {\n return this.showMessageDialog({\n dialogType: 'error',\n message,\n note\n });\n }\n\n public showInfoDialog(message: string, note?: string) {\n return this.showMessageDialog({\n dialogType: 'info',\n message,\n note\n });\n }\n\n public showSuccessDialog(message: string, note?: string) {\n return this.showMessageDialog({\n dialogType: 'success',\n message,\n note\n });\n }\n\n public showQuestionDialog<R>(buttons: Array<RiskMessageDialogButton<R>>,\n answerCallback: (value?: R) => void,\n message: string,\n note?: string) {\n return this.showMessageDialog({\n dialogType: 'question',\n message,\n note,\n buttons,\n answerCallback\n });\n }\n\n public showMessageDialog<R>(config: {\n dialogType: RiskMessageDialogType;\n buttons?: Array<RiskMessageDialogButton<R>>;\n answerCallback?: (value?: R) => void;\n config?: RiskDialogConfig<undefined>;\n title?: string,\n message: string;\n note?: string;\n icon?: string;\n }) {\n return this.showDialog(RiskMessageDialogComponent, {\n ...config.config,\n data: {\n dialogType: config.dialogType,\n buttons : config.buttons,\n title : config.title,\n message : config.message,\n note : config.note,\n icon : config.icon\n } as MessageDialogConfig<R>\n },\n config.answerCallback);\n }\n\n /* eslint-disable @typescript-eslint/unified-signatures */\n public showLoaderDialog(title: string): RiskLoaderComponent;\n public showLoaderDialog(data: LoaderConfig): RiskLoaderComponent;\n /* eslint-enable */\n public showLoaderDialog(data: string | LoaderConfig): RiskLoaderComponent {\n if (typeof data === 'string') {\n data = {\n title: data\n };\n }\n return this.showDialog(RiskLoaderComponent, {\n disableClose: true,\n hasBackdrop : true,\n data\n });\n }\n\n /* eslint-disable @typescript-eslint/unified-signatures */\n public showProgressLoaderDialog(title: string): RiskProgressLoaderComponent;\n public showProgressLoaderDialog(data: ProgressLoaderConfig): RiskProgressLoaderComponent;\n /* eslint-enable */\n public showProgressLoaderDialog(data: string | ProgressLoaderConfig): RiskProgressLoaderComponent {\n if (typeof data === 'string') {\n data = {\n title: data\n };\n }\n\n return this.showDialog(RiskProgressLoaderComponent, {\n disableClose: true,\n hasBackdrop : true,\n data\n });\n }\n\n /* eslint-disable @typescript-eslint/unified-signatures */\n public showDialog<T extends RiskDialogComponent<D, R>, D, R>(dialogClass: Type<T>): T;\n public showDialog<T extends RiskDialogComponent<D, R>, D, R>(dialogClass: Type<T>,\n config?: RiskDialogConfig<D>): T;\n public showDialog<T extends RiskDialogComponent<D, R>, D, R>(dialogClass: Type<T>,\n callback?: (result?: R) => void): T;\n public showDialog<T extends RiskDialogComponent<D, R>, D, R>(dialogClass: Type<T>,\n config?: RiskDialogConfig<D>,\n callback?: (result?: R) => void): T;\n /* eslint-enable */\n public showDialog<T extends RiskDialogComponent<D, R>, D, R>(dialogClass: Type<T>,\n configOrCallback?: RiskDialogConfig<D>\n | ((result?: R) => void),\n callback?: (result?: R) => void): T {\n let config: RiskDialogConfig<D> | undefined;\n if (typeof configOrCallback === 'function') {\n callback = configOrCallback;\n } else {\n config = configOrCallback;\n }\n const dialogRef = this.dialog.open(dialogClass, config);\n\n dialogRef.afterClosed().pipe(\n first()\n ).subscribe((result?: R) => {\n if (callback) {\n callback(result);\n }\n });\n\n return dialogRef.componentInstance;\n }\n}\n","import {inject, Injectable, NgZone} from '@angular/core';\nimport {CONTENT_TYPE, Logger} from '@dbg-riskit/common';\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {filter} from 'rxjs/operators';\n\n/**\n * Class instances emitted [to observers] for each mql notification\n */\nexport class MediaChange {\n public constructor(public readonly mediaQuery = 'all') {\n }\n}\n\n/**\n * MediaMonitor configures listeners to mediaQuery changes and publishes an Observable facade to\n * convert mediaQuery change callbacks to subscriber notifications. These notifications will be\n * performed within the ng Zone to trigger change detections and component updates.\n *\n * NOTE: both mediaQuery activations and de-activations are announced in notifications\n */\n@Injectable({providedIn: 'root'})\nexport class MatchMedia {\n protected readonly ngZone = inject(NgZone);\n private readonly logger = inject(Logger);\n\n protected readonly _registry: Map<string, MediaQueryList>;\n protected readonly _source: BehaviorSubject<MediaChange>;\n protected readonly _observable$: Observable<MediaChange>;\n\n public constructor() {\n this._registry = new Map<string, MediaQueryList>();\n this._source = new BehaviorSubject<MediaChange>(new MediaChange());\n this._observable$ = this._source.asObservable();\n }\n\n /**\n * For the specified mediaQuery?\n */\n public isActive(mediaQuery: string): boolean {\n if (this._registry.has(mediaQuery)) {\n const mql = this._registry.get(mediaQuery);\n return mql!.matches;\n }\n return false;\n }\n\n /**\n * External observers can watch for all (or a specific) mql changes.\n * Typically used by the MediaQueryAdaptor; optionally available to components\n * who wish to use the MediaMonitor as mediaMonitor$ observable service.\n *\n * NOTE: if a mediaQuery is not specified, then ALL mediaQuery activations will\n * be announced.\n */\n public observe(mediaQuery?: string): Observable<MediaChange> {\n this.registerQuery(mediaQuery);\n\n return this._observable$.pipe(\n filter((change: MediaChange) => {\n return mediaQuery ? (change.mediaQuery === mediaQuery) : true;\n })\n );\n }\n\n /**\n * Based on the BreakPointRegistry provider, register internal listeners for each unique\n * mediaQuery. Each listener emits specific MediaChange data to observers\n */\n private registerQuery(mediaQuery?: string | string[]) {\n const list = normalizeQuery(mediaQuery);\n\n if (list.length > 0) {\n prepareQueryCSS(list, this.logger);\n\n list.forEach((query) => {\n let mql = this._registry.get(query);\n const onMQLEvent = () => {\n this.ngZone.run(() => {\n const change = new MediaChange(query);\n this._source.next(change);\n });\n };\n\n if (!mql) {\n mql = this._buildMQL(query);\n mql.addEventListener('change', onMQLEvent);\n this._registry.set(query, mql);\n }\n\n if (mql.matches) {\n onMQLEvent(); // Announce activate range for initial subscribers\n }\n });\n }\n }\n\n /**\n * Call window.matchMedia() to build a MediaQueryList; which\n * supports 0..n listeners for activation/deactivation\n */\n protected _buildMQL(query: string): MediaQueryList {\n const canListen = !!window.matchMedia('all').addEventListener;\n return canListen ? window.matchMedia(query) : {\n matches : query === 'all' || query === '',\n media : query,\n addListener : () => undefined,\n addEventListener : () => undefined,\n removeListener : () => undefined,\n removeEventListener: () => undefined,\n dispatchEvent : () => false,\n onchange : () => undefined\n } as MediaQueryList;\n }\n}\n\n/**\n * Private global registry for all dynamically-created, injected style tags\n * @see prepare(query)\n */\nconst ALL_STYLES: { [key: string]: HTMLStyleElement } = {};\n\n/**\n * For Webkit engines that only trigger the MediaQueryList Listener\n * when there is at least one CSS selector for the respective media query.\n *\n * @param mediaQueries string[] The mediaQueries used to create a faux CSS selector\n *\n */\nfunction prepareQueryCSS(mediaQueries: string[], logger: Logger) {\n const list = mediaQueries.filter((it) => !ALL_STYLES[it]);\n if (list.length > 0) {\n const query = list.join(', ');\n try {\n const style: HTMLStyleElement = document.createElement('style');\n\n style.setAttribute('type', CONTENT_TYPE.TEXT_CSS);\n // Older IEs\n if (!(style as any).styleSheet) {\n const cssText = `/*\n @angular/flex-layout - workaround for possible browser quirk with mediaQuery listeners\n see http://bit.ly/2sd4HMP\n*/\n@media ${query} {.fx-query-test{ }}`;\n style.appendChild(document.createTextNode(cssText));\n }\n\n document.getElementsByTagName('head')[0].appendChild(style);\n\n // Store in private global registry\n list.forEach((mq) => ALL_STYLES[mq] = style);\n\n } catch (e) {\n logger.error(e);\n }\n }\n}\n\n/**\n * Always convert to unique list of queries; for iteration in ::registerQuery()\n */\nfunction normalizeQuery(mediaQuery?: string | string[]): string[] {\n return (typeof mediaQuery === 'undefined') ? [] :\n (typeof mediaQuery === 'string') ? [mediaQuery] : unique(mediaQuery);\n}\n\n/**\n * Filter duplicate mediaQueries in the list\n */\nfunction unique(list: string[]): string[] {\n const seen: { [key: string]: boolean } = {};\n return list.filter((item) => {\n return seen.hasOwnProperty(item) ? false : (seen[item] = true);\n });\n}\n","import {ChangeDetectionStrategy, Component, Directive, effect, inject, input, Signal, signal} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {MatIconButton} from '@angular/material/button';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatSidenav, MatSidenavContainer} from '@angular/material/sidenav';\nimport {MatToolbar} from '@angular/material/toolbar';\nimport {AUTH_PROVIDER, MAIN_LOGO} from '@dbg-riskit/angular-common';\nimport {AuthProvider} from '@dbg-riskit/common';\nimport {RiskFlexSpacerComponent} from './flex.spacer.component';\nimport {MatchMedia} from './match.media';\n\nconst SMALL_SCREEN_MEDIA_QUERY = (width: number) => `screen and (max-width:${width}px)`;\n\n@Directive({\n selector: 'risk-layout-vertical',\n host : {\n '[class.risk-layout-vertical]': 'true'\n }\n})\nexport class RiskLayoutVerticalDirective {\n}\n\n@Directive({\n selector: 'risk-layout-vertical-title',\n host : {\n '[class.risk-layout-vertical-title]': 'true'\n }\n})\nexport class RiskLayoutVerticalTitleDirective {\n}\n\n@Directive({\n selector: 'risk-layout-vertical-icon',\n host : {\n '[class.risk-layout-vertical-icon]': 'true'\n }\n})\nexport class RiskLayoutVerticalIconDirective {\n}\n\n@Directive({\n selector: 'risk-layout-horizontal',\n host : {\n '[class.mat-toolbar-row]': 'true',\n '[class.mat-toolbar-single-row]': 'true',\n '[class.risk-layout-horizontal]': 'true'\n }\n})\nexport class RiskLayoutHorizontalDirective {\n}\n\n@Directive({\n selector: 'risk-layout-footer',\n host : {\n '[class.risk-layout-footer]': 'true'\n }\n})\nexport class RiskLayoutFooterDirective {\n}\n\n@Component({\n selector : 'risk-layout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl : 'layout.component.html',\n styleUrls : [\n '../../../component.scss',\n 'layout.component.scss'\n ],\n host : {\n '[class.risk-layout]': 'true'\n },\n imports : [\n MatIcon,\n MatIconButton,\n MatSidenav,\n MatSidenavContainer,\n MatToolbar,\n RiskFlexSpacerComponent\n ]\n})\nexport class RiskLayoutComponent {\n private readonly authProvider = inject<AuthProvider>(AUTH_PROVIDER, {optional: true});\n private readonly mainLogo = inject(MAIN_LOGO);\n private readonly matchMedia = inject(MatchMedia);\n\n public readonly smallScreenMenuVisible = input(true);\n\n public readonly smallScreenWidth = input(600);\n public readonly footerVisible = input(true);\n public readonly toolbarBackgroundColor = input<string>();\n public readonly backgroundColor = input<string>();\n\n public readonly authStatus: Signal<boolean>;\n public readonly mediaSmall = signal(false);\n\n public constructor() {\n this.authStatus = this.authProvider == null\n ? signal(true)\n : toSignal(this.authProvider.loggedInStream, {initialValue: false});\n\n effect((onCleanup) => {\n const query = SMALL_SCREEN_MEDIA_QUERY(this.smallScreenWidth());\n\n const subscription = this.matchMedia.observe(query).subscribe(() => {\n this.mediaSmall.set(this.matchMedia.isActive(query));\n });\n\n onCleanup(() => subscription.unsubscribe());\n });\n }\n\n public get logo(): string {\n return this.mainLogo;\n }\n\n public closeSideNav(sidenav: MatSidenav): void {\n if (!this.authStatus()) {\n sidenav.close();\n }\n }\n}\n","<mat-toolbar [style.backgroundColor]=\"toolbarBackgroundColor()\"\n class=\"mat-elevation-z2\">\n <div class=\"risk-layout-logo\">\n <img [src]=\"logo\" alt=\"Company logo\">\n </div>\n\n @if (authStatus()) {\n @if (!mediaSmall()) {\n <ng-content select=\"[menu-horizontal], risk-layout-horizontal > *\"/>\n }\n @if (mediaSmall()) {\n <ng-content select=\"[menu-vertical-title], risk-layout-vertical-title > *\"/>\n <risk-flex-spacer/>\n <ng-content select=\"[menu-vertical-icon], risk-layout-vertical-icon > *\"/>\n @if (smallScreenMenuVisible()) {\n <button (click)=\"sidenav.toggle()\"\n mat-icon-button\n type=\"button\"\n >\n <mat-icon>menu</mat-icon>\n </button>\n }\n }\n }\n</mat-toolbar>\n\n<mat-sidenav-container [class.risk-layout-with-footer]=\"footerVisible()\"\n [style.backgroundColor]=\"backgroundColor()\">\n <mat-sidenav #sidenav=\"matSidenav\" (click)=\"closeSideNav(sidenav)\">\n <ng-content select=\"[menu-vertical], risk-layout-vertical > *\"/>\n </mat-sidenav>\n\n <div class=\"risk-layout-content\">\n <ng-content/>\n </div>\n</mat-sidenav-container>\n\n@if (footerVisible()) {\n <div class=\"risk-layout-footer\">\n <ng-content select=\"risk-layout-footer > *\"/>\n </div>\n}\n","import {Directive, inject, input} from '@angular/core';\nimport {ActivatedRoute, Router, UrlTree} from '@angular/router';\n\n@Directive({selector: '[riskSubLink]'})\nexport class RiskSubLinkDirective {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n\n public readonly riskSubLink = input.required<unknown[] | string>();\n\n public get urlTree(): UrlTree {\n const value = this.riskSubLink();\n let commands: unknown[];\n if (value == null) {\n commands = [];\n } else {\n commands = Array.isArray(value) ? value : [value];\n }\n return this.router.createUrlTree(commands, {\n relativeTo: this.route\n });\n }\n}\n","import {computed, contentChildren, Directive, effect, ElementRef, inject, input, Renderer2} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {NavigationEnd, Router, RouterLink} from '@angular/router';\nimport {filter} from 'rxjs/operators';\nimport {RiskSubLinkDirective} from './sub.link.directive';\n\n@Directive({\n selector: '[riskLinkActive]',\n exportAs: 'riskLinkActive'\n})\nexport class RiskLinkActiveDirective {\n private readonly router = inject(Router);\n private readonly element = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n\n private readonly selfRouterLink = inject(RouterLink, {\n self : true,\n optional: true\n });\n private readonly selfSubLink = inject(RiskSubLinkDirective, {\n self : true,\n optional: true\n });\n\n public readonly links = contentChildren(RouterLink, {descendants: true});\n public readonly subLinks = contentChildren(RiskSubLinkDirective, {descendants: true});\n\n // Classes to toggle\n private classes = computed<string[]>(() => {\n const value = this.menuLinkActive();\n const classes = Array.isArray(value) ? value : value.split(' ');\n return classes.filter((c) => !!c);\n });\n\n // TODO: Find more signal-native way to do this when available\n private readonly routerNavigated = toSignal(\n this.router.events.pipe(\n filter(e => e instanceof NavigationEnd)\n )\n );\n\n public readonly menuLinkActive = input.required<string[] | string>({alias: 'riskLinkActive'});\n public readonly riskLinkActiveOptions = input<{ exact: boolean }>({exact: false}, {alias: 'riskLinkActiveOptions'});\n\n public readonly isActive = computed(() => {\n // Track all reactive dependencies\n this.routerNavigated();\n\n if (!this.router.navigated) {\n return false;\n }\n\n const activeFn = (link: RouterLink | RiskSubLinkDirective | null) =>\n link?.urlTree ? this.router.isActive(link.urlTree, this.riskLinkActiveOptions().exact) : false;\n const selfActive = activeFn(this.selfRouterLink)\n || activeFn(this.selfSubLink);\n const descendantActive = this.links().some(activeFn)\n || this.subLinks().some(activeFn);\n return selfActive\n || descendantActive;\n });\n\n public constructor() {\n effect(() => {\n const active = this.isActive();\n const classList = this.classes();\n\n classList.forEach(c => {\n if (active) {\n this.renderer.addClass(this.element.nativeElement, c);\n } else {\n this.renderer.removeClass(this.element.nativeElement, c);\n }\n });\n });\n }\n\n}\n","import {ChangeDetectionStrategy, Component} from '@angular/core';\nimport {MatToolbar} from '@angular/material/toolbar';\n\n@Component({\n selector : 'risk-toolbar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template : '<mat-toolbar class=\"mat-elevation-z1\"><ng-content /></mat-toolbar>',\n styleUrls : [\n '../../../component.scss',\n 'toolbar.component.scss'\n ],\n host : {\n '[class.risk-toolbar]': 'true'\n },\n imports : [MatToolbar]\n})\nexport class RiskToolbarComponent {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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