@dbg-riskit/angular-login 20.0.2 → 20.3.0

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.
@@ -1,8 +1,8 @@
1
- import { AsyncPipe } from '@angular/common';
2
1
  import * as i0 from '@angular/core';
3
- import { inject, ChangeDetectorRef, ChangeDetectionStrategy, Component, Directive, HostBinding, Input } from '@angular/core';
2
+ import { inject, signal, ChangeDetectionStrategy, Component, Directive, input } from '@angular/core';
3
+ import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import * as i1 from '@angular/forms';
5
- import { FormsModule } from '@angular/forms';
5
+ import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
6
6
  import { MatButton } from '@angular/material/button';
7
7
  import { MatCard, MatCardActions, MatCardContent, MatCardHeader, MatCardTitle } from '@angular/material/card';
8
8
  import { MatFormField } from '@angular/material/form-field';
@@ -12,70 +12,65 @@ import { MatProgressSpinner } from '@angular/material/progress-spinner';
12
12
  import { AuthRoutingFlowService } from '@dbg-riskit/angular-auth';
13
13
  import { AUTH_PROVIDER, SECONDARY_LOGO } from '@dbg-riskit/angular-common';
14
14
  import { toErrorMessage } from '@dbg-riskit/angular-error';
15
- import { BaseComponent, FlexComponent, FlexSpacerComponent, MessageComponent } from '@dbg-riskit/angular-view';
16
- import { takeUntil, first } from 'rxjs/operators';
15
+ import { RiskFlexComponent, RiskFlexSpacerComponent, RiskMessageComponent } from '@dbg-riskit/angular-view';
16
+ import { switchMap, first } from 'rxjs/operators';
17
17
  import { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
18
18
 
19
- class LoginComponent extends BaseComponent {
20
- constructor() {
21
- super();
22
- this.authProvider = inject(AUTH_PROVIDER);
23
- this.changeDetectorRef = inject(ChangeDetectorRef);
24
- this.authRoutingFlowService = inject(AuthRoutingFlowService);
25
- this.secondaryLogo = inject(SECONDARY_LOGO);
26
- /**
27
- * Control for "login button-to-spinner".
28
- */
29
- this.loggingIn = false;
30
- // Update component state on login status change
31
- this.authProvider.loggedInStream.pipe(takeUntil(this.destroyed)).subscribe(() => this.changeDetectorRef.markForCheck());
32
- }
19
+ class RiskLoginComponent {
33
20
  get isDirectFlow() {
34
21
  return this.authRoutingFlowService.directFlow;
35
22
  }
36
- get authStatus() {
37
- return this.authProvider.loggedIn;
38
- }
39
- get userProfile() {
40
- return this.authProvider.userProfile;
41
- }
42
23
  get logo() {
43
24
  return this.secondaryLogo;
44
25
  }
45
- ngAfterViewInit() {
46
- this.authRoutingFlowService.loginViaService().pipe(takeUntil(this.destroyed)).subscribe(() => {
47
- this.changeDetectorRef.markForCheck();
48
- }, (err) => {
49
- this.errorMessage = toErrorMessage(err).message;
50
- this.changeDetectorRef.markForCheck();
26
+ constructor() {
27
+ this.authProvider = inject(AUTH_PROVIDER);
28
+ this.authRoutingFlowService = inject(AuthRoutingFlowService);
29
+ this.secondaryLogo = inject(SECONDARY_LOGO);
30
+ this.errorMessage = signal(undefined, ...(ngDevMode ? [{ debugName: "errorMessage" }] : []));
31
+ this.loggingIn = signal(false, ...(ngDevMode ? [{ debugName: "loggingIn" }] : []));
32
+ this.loginForm = new FormGroup({
33
+ username: new FormControl(''),
34
+ password: new FormControl('')
35
+ });
36
+ this.authStatus = toSignal(this.authProvider.loggedInStream);
37
+ this.userProfile = signal(undefined, ...(ngDevMode ? [{ debugName: "userProfile" }] : []));
38
+ this.authRoutingFlowService.loginViaService().pipe(takeUntilDestroyed()).subscribe({
39
+ error: (err) => {
40
+ this.errorMessage.set(toErrorMessage(err).message);
41
+ }
42
+ });
43
+ this.authProvider.loggedInStream.pipe(takeUntilDestroyed(), switchMap(() => this.authProvider.userProfile)).subscribe({
44
+ next: (profile) => {
45
+ this.userProfile.set(profile);
46
+ }
51
47
  });
52
48
  }
53
49
  login() {
54
- this.loggingIn = true;
55
- this.authRoutingFlowService.login(this.username, this.password).pipe(first()).subscribe((res) => {
56
- if (!res) {
57
- this.errorMessage = 'Authentication failed. Server did not generate a token.';
50
+ this.loggingIn.set(true);
51
+ const username = this.loginForm.get('username')?.value ?? undefined;
52
+ const password = this.loginForm.get('password')?.value ?? undefined;
53
+ this.authRoutingFlowService.login(username, password).pipe(first()).subscribe({
54
+ next: (res) => {
55
+ if (!res) {
56
+ this.errorMessage.set('Authentication failed. Server did not generate a token.');
57
+ }
58
+ this.loggingIn.set(false);
59
+ },
60
+ error: () => {
61
+ this.loggingIn.set(false);
62
+ this.errorMessage.set('Authentication failed. Is the username and password correct?');
58
63
  }
59
- this.loggingIn = false;
60
- this.changeDetectorRef.markForCheck();
61
- }, () => {
62
- this.loggingIn = false;
63
- this.errorMessage = 'Authentication failed. Is the username and password correct?';
64
- this.changeDetectorRef.markForCheck();
65
64
  });
66
65
  }
67
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: LoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
68
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: LoginComponent, isStandalone: true, selector: "ng-component", host: { properties: { "class.risk-login-form": "true" } }, usesInheritance: true, ngImport: i0, template: "<risk-flex>\n <risk-flex-spacer/>\n\n @if (isDirectFlow) {\n <div>\n @if (authStatus | async) {\n @if (userProfile | async; as user) {\n @if (user?.name) {\n <risk-good [message]=\"'Successfully logged in as ' + user.name + '.'\"/>\n } @else {\n <risk-good [message]=\"'Successfully logged in!'\"/>\n }\n }\n } @else {\n @if (errorMessage) {\n <risk-error [message]=\"errorMessage\"/>\n }\n <form (ngSubmit)=\"login()\" role=\"form\">\n <mat-card>\n <mat-card-header>\n <mat-card-title>Please Sign In</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <mat-form-field class=\"risk-full-width\">\n <input [(ngModel)]=\"username\"\n autofocus\n matInput\n name=\"username\"\n placeholder=\"Username\"\n type=\"text\">\n </mat-form-field>\n <mat-form-field class=\"risk-full-width\">\n <input [(ngModel)]=\"password\"\n matInput\n name=\"password\"\n placeholder=\"Password\"\n type=\"password\">\n </mat-form-field>\n </mat-card-content>\n <mat-card-actions>\n @if (!loggingIn) {\n <button\n color=\"primary\"\n mat-raised-button\n type=\"submit\">\n Sign in\n </button>\n }\n @if (loggingIn) {\n <mat-spinner [diameter]=\"36\"/>\n }\n <risk-flex-spacer/>\n <img [src]=\"logo\" alt=\"Company logo\">\n </mat-card-actions>\n </mat-card>\n </form>\n }\n </div>\n } @else {\n <div>\n @if (!errorMessage) {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-spinner/>\n <div></div>\n </div>\n <h3>Contacting authentication server...</h3>\n } @else {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-icon class=\"risk-login-form-error\" color=\"warn\">error_outline</mat-icon>\n <div></div>\n </div>\n <h3>Failed to authenticate user: {{ errorMessage }}</h3>\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <button (click)=\"login()\"\n color=\"primary\"\n mat-button\n type=\"button\">\n <mat-icon>autorenew</mat-icon>\n Retry\n </button>\n <div></div>\n </div>\n }\n </div>\n }\n\n <risk-flex-spacer/>\n</risk-flex>\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ".risk-flex>div{width:400px;max-width:97vw;max-height:70vh;margin-top:40px}.mat-mdc-card-actions img{margin:3px 0;height:30px}.risk-login-form-flex-wrapper{display:flex}.risk-login-form-flex-wrapper>div{flex:1}.risk-login-form-error{font-size:100px;height:100px;width:100px}h3{text-align:center}input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px white inset}\n"], dependencies: [{ kind: "component", type: FlexComponent, selector: "risk-flex", inputs: ["wrapContent"] }, { kind: "component", type: FlexSpacerComponent, selector: "risk-flex-spacer" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "component", type: MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: MessageComponent, selector: "risk-error, risk-good, risk-info, risk-message, risk-warn, risk-initial-load, risk-no-data, risk-update-failed", inputs: ["message"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
66
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskLoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
67
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RiskLoginComponent, isStandalone: true, selector: "ng-component", host: { properties: { "class.risk-login-form": "true" } }, ngImport: i0, template: "<risk-flex>\n <risk-flex-spacer/>\n\n @if (isDirectFlow) {\n <div>\n @if (authStatus()) {\n @if (userProfile(); as user) {\n @if (user?.name) {\n <risk-good [message]=\"'Successfully logged in as ' + user.name + '.'\"/>\n } @else {\n <risk-good [message]=\"'Successfully logged in!'\"/>\n }\n }\n } @else {\n @if (errorMessage()) {\n <risk-error [message]=\"errorMessage()!\"/>\n }\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"login()\" role=\"form\">\n <mat-card>\n <mat-card-header>\n <mat-card-title>Please Sign In</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <mat-form-field class=\"risk-full-width\">\n <input formControlName=\"username\"\n autofocus\n matInput\n name=\"username\"\n placeholder=\"Username\"\n type=\"text\">\n </mat-form-field>\n <mat-form-field class=\"risk-full-width\">\n <input formControlName=\"password\"\n matInput\n name=\"password\"\n placeholder=\"Password\"\n type=\"password\">\n </mat-form-field>\n </mat-card-content>\n <mat-card-actions>\n @if (!loggingIn()) {\n <button\n color=\"primary\"\n mat-raised-button\n type=\"submit\">\n Sign in\n </button>\n }\n @if (loggingIn()) {\n <mat-spinner [diameter]=\"36\"/>\n }\n <risk-flex-spacer/>\n <img [src]=\"logo\" alt=\"Company logo\">\n </mat-card-actions>\n </mat-card>\n </form>\n }\n </div>\n } @else {\n <div>\n @if (!errorMessage()) {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-spinner/>\n <div></div>\n </div>\n <h3>Contacting authentication server...</h3>\n } @else {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-icon class=\"risk-login-form-error\" color=\"warn\">error_outline</mat-icon>\n <div></div>\n </div>\n <h3>Failed to authenticate user: {{ errorMessage() }}</h3>\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <button (click)=\"login()\"\n color=\"primary\"\n mat-button\n type=\"button\">\n <mat-icon>autorenew</mat-icon>\n Retry\n </button>\n <div></div>\n </div>\n }\n </div>\n }\n\n <risk-flex-spacer/>\n</risk-flex>\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ".risk-flex>div{width:400px;max-width:97vw;max-height:70vh;margin-top:40px}.mat-mdc-card-actions img{margin:3px 0;height:30px}.risk-login-form-flex-wrapper{display:flex}.risk-login-form-flex-wrapper>div{flex:1}.risk-login-form-error{font-size:100px;height:100px;width:100px}h3{text-align:center}input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px white inset}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "component", type: MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: RiskFlexComponent, selector: "risk-flex", inputs: ["wrapContent"] }, { kind: "component", type: RiskFlexSpacerComponent, selector: "risk-flex-spacer" }, { kind: "component", type: RiskMessageComponent, selector: "risk-error, risk-good, risk-info, risk-message, risk-warn, risk-initial-load, risk-no-data, risk-update-failed", inputs: ["message"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
69
68
  }
70
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: LoginComponent, decorators: [{
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskLoginComponent, decorators: [{
71
70
  type: Component,
72
- args: [{ host: {
71
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, host: {
73
72
  '[class.risk-login-form]': 'true'
74
- }, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, imports: [
75
- AsyncPipe,
76
- FlexComponent,
77
- FlexSpacerComponent,
78
- FormsModule,
73
+ }, imports: [
79
74
  MatButton,
80
75
  MatCard,
81
76
  MatCardActions,
@@ -86,15 +81,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
86
81
  MatIcon,
87
82
  MatInput,
88
83
  MatProgressSpinner,
89
- MessageComponent
90
- ], template: "<risk-flex>\n <risk-flex-spacer/>\n\n @if (isDirectFlow) {\n <div>\n @if (authStatus | async) {\n @if (userProfile | async; as user) {\n @if (user?.name) {\n <risk-good [message]=\"'Successfully logged in as ' + user.name + '.'\"/>\n } @else {\n <risk-good [message]=\"'Successfully logged in!'\"/>\n }\n }\n } @else {\n @if (errorMessage) {\n <risk-error [message]=\"errorMessage\"/>\n }\n <form (ngSubmit)=\"login()\" role=\"form\">\n <mat-card>\n <mat-card-header>\n <mat-card-title>Please Sign In</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <mat-form-field class=\"risk-full-width\">\n <input [(ngModel)]=\"username\"\n autofocus\n matInput\n name=\"username\"\n placeholder=\"Username\"\n type=\"text\">\n </mat-form-field>\n <mat-form-field class=\"risk-full-width\">\n <input [(ngModel)]=\"password\"\n matInput\n name=\"password\"\n placeholder=\"Password\"\n type=\"password\">\n </mat-form-field>\n </mat-card-content>\n <mat-card-actions>\n @if (!loggingIn) {\n <button\n color=\"primary\"\n mat-raised-button\n type=\"submit\">\n Sign in\n </button>\n }\n @if (loggingIn) {\n <mat-spinner [diameter]=\"36\"/>\n }\n <risk-flex-spacer/>\n <img [src]=\"logo\" alt=\"Company logo\">\n </mat-card-actions>\n </mat-card>\n </form>\n }\n </div>\n } @else {\n <div>\n @if (!errorMessage) {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-spinner/>\n <div></div>\n </div>\n <h3>Contacting authentication server...</h3>\n } @else {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-icon class=\"risk-login-form-error\" color=\"warn\">error_outline</mat-icon>\n <div></div>\n </div>\n <h3>Failed to authenticate user: {{ errorMessage }}</h3>\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <button (click)=\"login()\"\n color=\"primary\"\n mat-button\n type=\"button\">\n <mat-icon>autorenew</mat-icon>\n Retry\n </button>\n <div></div>\n </div>\n }\n </div>\n }\n\n <risk-flex-spacer/>\n</risk-flex>\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ".risk-flex>div{width:400px;max-width:97vw;max-height:70vh;margin-top:40px}.mat-mdc-card-actions img{margin:3px 0;height:30px}.risk-login-form-flex-wrapper{display:flex}.risk-login-form-flex-wrapper>div{flex:1}.risk-login-form-error{font-size:100px;height:100px;width:100px}h3{text-align:center}input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px white inset}\n"] }]
84
+ ReactiveFormsModule,
85
+ RiskFlexComponent,
86
+ RiskFlexSpacerComponent,
87
+ RiskMessageComponent
88
+ ], template: "<risk-flex>\n <risk-flex-spacer/>\n\n @if (isDirectFlow) {\n <div>\n @if (authStatus()) {\n @if (userProfile(); as user) {\n @if (user?.name) {\n <risk-good [message]=\"'Successfully logged in as ' + user.name + '.'\"/>\n } @else {\n <risk-good [message]=\"'Successfully logged in!'\"/>\n }\n }\n } @else {\n @if (errorMessage()) {\n <risk-error [message]=\"errorMessage()!\"/>\n }\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"login()\" role=\"form\">\n <mat-card>\n <mat-card-header>\n <mat-card-title>Please Sign In</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <mat-form-field class=\"risk-full-width\">\n <input formControlName=\"username\"\n autofocus\n matInput\n name=\"username\"\n placeholder=\"Username\"\n type=\"text\">\n </mat-form-field>\n <mat-form-field class=\"risk-full-width\">\n <input formControlName=\"password\"\n matInput\n name=\"password\"\n placeholder=\"Password\"\n type=\"password\">\n </mat-form-field>\n </mat-card-content>\n <mat-card-actions>\n @if (!loggingIn()) {\n <button\n color=\"primary\"\n mat-raised-button\n type=\"submit\">\n Sign in\n </button>\n }\n @if (loggingIn()) {\n <mat-spinner [diameter]=\"36\"/>\n }\n <risk-flex-spacer/>\n <img [src]=\"logo\" alt=\"Company logo\">\n </mat-card-actions>\n </mat-card>\n </form>\n }\n </div>\n } @else {\n <div>\n @if (!errorMessage()) {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-spinner/>\n <div></div>\n </div>\n <h3>Contacting authentication server...</h3>\n } @else {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-icon class=\"risk-login-form-error\" color=\"warn\">error_outline</mat-icon>\n <div></div>\n </div>\n <h3>Failed to authenticate user: {{ errorMessage() }}</h3>\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <button (click)=\"login()\"\n color=\"primary\"\n mat-button\n type=\"button\">\n <mat-icon>autorenew</mat-icon>\n Retry\n </button>\n <div></div>\n </div>\n }\n </div>\n }\n\n <risk-flex-spacer/>\n</risk-flex>\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ".risk-flex>div{width:400px;max-width:97vw;max-height:70vh;margin-top:40px}.mat-mdc-card-actions img{margin:3px 0;height:30px}.risk-login-form-flex-wrapper{display:flex}.risk-login-form-flex-wrapper>div{flex:1}.risk-login-form-error{font-size:100px;height:100px;width:100px}h3{text-align:center}input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px white inset}\n"] }]
91
89
  }], ctorParameters: () => [] });
92
90
 
93
- class LoginMenuComponentTitleDirective {
94
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: LoginMenuComponentTitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
95
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.12", type: LoginMenuComponentTitleDirective, isStandalone: true, selector: "risk-login-menu-title-horizontal, risk-login-menu-title-vertical", host: { properties: { "class.risk-login-menu-title": "true" } }, ngImport: i0 }); }
91
+ class RiskLoginMenuComponentTitleDirective {
92
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskLoginMenuComponentTitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
93
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: RiskLoginMenuComponentTitleDirective, isStandalone: true, selector: "risk-login-menu-title-horizontal, risk-login-menu-title-vertical", host: { properties: { "class.risk-login-menu-title": "true" } }, ngImport: i0 }); }
96
94
  }
97
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: LoginMenuComponentTitleDirective, decorators: [{
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskLoginMenuComponentTitleDirective, decorators: [{
98
96
  type: Directive,
99
97
  args: [{
100
98
  selector: 'risk-login-menu-title-horizontal, '
@@ -104,11 +102,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
104
102
  }
105
103
  }]
106
104
  }] });
107
- class LoginMenuItemsDirective {
108
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: LoginMenuItemsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
109
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.12", type: LoginMenuItemsDirective, isStandalone: true, selector: "risk-login-menu-before-items-horizontal, risk-login-menu-before-items-vertical,risk-login-menu-after-items-horizontal,risk-login-menu-after-items-vertical", ngImport: i0 }); }
105
+ class RiskLoginMenuItemsDirective {
106
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskLoginMenuItemsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
107
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: RiskLoginMenuItemsDirective, isStandalone: true, selector: "risk-login-menu-before-items-horizontal, risk-login-menu-before-items-vertical,risk-login-menu-after-items-horizontal,risk-login-menu-after-items-vertical", ngImport: i0 }); }
110
108
  }
111
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: LoginMenuItemsDirective, decorators: [{
109
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskLoginMenuItemsDirective, decorators: [{
112
110
  type: Directive,
113
111
  args: [{
114
112
  selector: 'risk-login-menu-before-items-horizontal,'
@@ -117,52 +115,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
117
115
  + 'risk-login-menu-after-items-vertical'
118
116
  }]
119
117
  }] });
120
- class LoginMenuComponent extends BaseComponent {
118
+ class RiskLoginMenuComponent {
121
119
  constructor() {
122
- super();
123
120
  this.authProvider = inject(AUTH_PROVIDER);
124
121
  this.authRoutingFlowService = inject(AuthRoutingFlowService);
125
- this.changeDetectorRef = inject(ChangeDetectorRef);
126
- this.orientation = 'row';
127
- // Update menu state on login status change
128
- this.authProvider.loggedInStream.pipe(takeUntil(this.destroyed)).subscribe(() => this.changeDetectorRef.markForCheck());
129
- }
130
- get isRow() {
131
- return this.orientation === 'row';
132
- }
133
- get isColumn() {
134
- return this.orientation === 'column';
135
- }
136
- get authStatus() {
137
- return this.authProvider.loggedIn;
138
- }
139
- menuClosed() {
140
- this.changeDetectorRef.markForCheck();
122
+ this.orientation = input('row', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
123
+ this.authStatus = toSignal(this.authProvider.loggedInStream);
141
124
  }
142
125
  logout() {
143
126
  this.authRoutingFlowService.logout().pipe(first()).subscribe();
144
127
  }
145
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: LoginMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
146
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: LoginMenuComponent, isStandalone: true, selector: "risk-login-menu", inputs: { orientation: "orientation" }, host: { properties: { "class.risk-login-menu": "true", "class.risk-login-menu-flex-row": "this.isRow", "class.risk-login-menu-flex-column": "this.isColumn" } }, usesInheritance: true, ngImport: i0, template: "@if (orientation === 'row') {\n <mat-menu #loginMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <ng-content select=\"risk-login-menu-before-items-horizontal\"/>\n @if (authStatus | async) {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </button>\n } @else {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>launch</mat-icon>\n Login\n </button>\n }\n <ng-content select=\"risk-login-menu-after-items-horizontal\"/>\n </mat-menu>\n <button #menu=\"matMenuTrigger\"\n (onMenuClose)=\"menuClosed()\"\n [class.risk-menu-open]=\"menu.menuOpen\"\n [matMenuTriggerFor]=\"loginMenu\"\n mat-button\n type=\"button\">\n <ng-content select=\"risk-login-menu-title-horizontal\"/>\n <mat-icon>person</mat-icon>\n </button>\n}\n@if (orientation === 'column') {\n <ng-content select=\"risk-login-menu-title-vertical\"/>\n <ng-content select=\"risk-login-menu-before-items-vertical\"/>\n @if (authStatus | async) {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </a>\n } @else {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>launch</mat-icon>\n Login\n </a>\n }\n <ng-content select=\"risk-login-menu-after-items-vertical\"/>\n}\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ":host{display:flex!important}:host.risk-login-menu-flex-row{flex-direction:row}:host.risk-login-menu-flex-column{flex-direction:column}:host .risk-login-menu-title{font-weight:700;margin:0 5px}\n"], dependencies: [{ kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
128
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskLoginMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
129
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RiskLoginMenuComponent, isStandalone: true, selector: "risk-login-menu", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.risk-login-menu": "true", "class.risk-login-menu-flex-row": "orientation() === \"row\"", "class.risk-login-menu-flex-column": "orientation() === \"column\"" } }, ngImport: i0, template: "@if (orientation() === 'row') {\n <mat-menu #loginMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <ng-content select=\"risk-login-menu-before-items-horizontal\"/>\n @if (authStatus()) {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </button>\n } @else {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>launch</mat-icon>\n Login\n </button>\n }\n <ng-content select=\"risk-login-menu-after-items-horizontal\"/>\n </mat-menu>\n <button #menu=\"matMenuTrigger\"\n [class.risk-menu-open]=\"menu.menuOpen\"\n [matMenuTriggerFor]=\"loginMenu\"\n mat-button\n type=\"button\">\n <ng-content select=\"risk-login-menu-title-horizontal\"/>\n <mat-icon>person</mat-icon>\n </button>\n}\n@if (orientation() === 'column') {\n <ng-content select=\"risk-login-menu-title-vertical\"/>\n <ng-content select=\"risk-login-menu-before-items-vertical\"/>\n @if (authStatus()) {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </a>\n } @else {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>launch</mat-icon>\n Login\n </a>\n }\n <ng-content select=\"risk-login-menu-after-items-vertical\"/>\n}\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ":host{display:flex!important}:host.risk-login-menu-flex-row{flex-direction:row}:host.risk-login-menu-flex-column{flex-direction:column}:host .risk-login-menu-title{font-weight:700;margin:0 5px}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
147
130
  }
148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: LoginMenuComponent, decorators: [{
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskLoginMenuComponent, decorators: [{
149
132
  type: Component,
150
- args: [{ selector: 'risk-login-menu', host: {
151
- '[class.risk-login-menu]': 'true'
152
- }, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, imports: [MatMenu, MatMenuItem, MatIcon, MatButton, MatMenuTrigger, AsyncPipe], template: "@if (orientation === 'row') {\n <mat-menu #loginMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <ng-content select=\"risk-login-menu-before-items-horizontal\"/>\n @if (authStatus | async) {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </button>\n } @else {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>launch</mat-icon>\n Login\n </button>\n }\n <ng-content select=\"risk-login-menu-after-items-horizontal\"/>\n </mat-menu>\n <button #menu=\"matMenuTrigger\"\n (onMenuClose)=\"menuClosed()\"\n [class.risk-menu-open]=\"menu.menuOpen\"\n [matMenuTriggerFor]=\"loginMenu\"\n mat-button\n type=\"button\">\n <ng-content select=\"risk-login-menu-title-horizontal\"/>\n <mat-icon>person</mat-icon>\n </button>\n}\n@if (orientation === 'column') {\n <ng-content select=\"risk-login-menu-title-vertical\"/>\n <ng-content select=\"risk-login-menu-before-items-vertical\"/>\n @if (authStatus | async) {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </a>\n } @else {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>launch</mat-icon>\n Login\n </a>\n }\n <ng-content select=\"risk-login-menu-after-items-vertical\"/>\n}\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ":host{display:flex!important}:host.risk-login-menu-flex-row{flex-direction:row}:host.risk-login-menu-flex-column{flex-direction:column}:host .risk-login-menu-title{font-weight:700;margin:0 5px}\n"] }]
153
- }], ctorParameters: () => [], propDecorators: { orientation: [{
154
- type: Input
155
- }], isRow: [{
156
- type: HostBinding,
157
- args: ['class.risk-login-menu-flex-row']
158
- }], isColumn: [{
159
- type: HostBinding,
160
- args: ['class.risk-login-menu-flex-column']
161
- }] } });
133
+ args: [{ selector: 'risk-login-menu', changeDetection: ChangeDetectionStrategy.OnPush, host: {
134
+ '[class.risk-login-menu]': 'true',
135
+ '[class.risk-login-menu-flex-row]': 'orientation() === "row"',
136
+ '[class.risk-login-menu-flex-column]': 'orientation() === "column"'
137
+ }, imports: [
138
+ MatButton,
139
+ MatIcon,
140
+ MatMenu,
141
+ MatMenuItem,
142
+ MatMenuTrigger
143
+ ], template: "@if (orientation() === 'row') {\n <mat-menu #loginMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <ng-content select=\"risk-login-menu-before-items-horizontal\"/>\n @if (authStatus()) {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </button>\n } @else {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>launch</mat-icon>\n Login\n </button>\n }\n <ng-content select=\"risk-login-menu-after-items-horizontal\"/>\n </mat-menu>\n <button #menu=\"matMenuTrigger\"\n [class.risk-menu-open]=\"menu.menuOpen\"\n [matMenuTriggerFor]=\"loginMenu\"\n mat-button\n type=\"button\">\n <ng-content select=\"risk-login-menu-title-horizontal\"/>\n <mat-icon>person</mat-icon>\n </button>\n}\n@if (orientation() === 'column') {\n <ng-content select=\"risk-login-menu-title-vertical\"/>\n <ng-content select=\"risk-login-menu-before-items-vertical\"/>\n @if (authStatus()) {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </a>\n } @else {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>launch</mat-icon>\n Login\n </a>\n }\n <ng-content select=\"risk-login-menu-after-items-vertical\"/>\n}\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ":host{display:flex!important}:host.risk-login-menu-flex-row{flex-direction:row}:host.risk-login-menu-flex-column{flex-direction:column}:host .risk-login-menu-title{font-weight:700;margin:0 5px}\n"] }]
144
+ }], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }] } });
162
145
 
163
146
  /**
164
147
  * Generated bundle index. Do not edit.
165
148
  */
166
149
 
167
- export { LoginComponent, LoginMenuComponent, LoginMenuComponentTitleDirective, LoginMenuItemsDirective };
150
+ export { RiskLoginComponent, RiskLoginMenuComponent, RiskLoginMenuComponentTitleDirective, RiskLoginMenuItemsDirective };
168
151
  //# sourceMappingURL=dbg-riskit-angular-login.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dbg-riskit-angular-login.mjs","sources":["../../../../pkg/dbg-riskit/angular-login/src/lib/login.component.ts","../../../../pkg/dbg-riskit/angular-login/src/lib/login.component.html","../../../../pkg/dbg-riskit/angular-login/src/lib/login.menu.component.ts","../../../../pkg/dbg-riskit/angular-login/src/lib/login.menu.component.html","../../../../pkg/dbg-riskit/angular-login/src/dbg-riskit-angular-login.ts"],"sourcesContent":["import {AsyncPipe} from '@angular/common';\nimport {AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, inject} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {MatButton} from '@angular/material/button';\nimport {MatCard, MatCardActions, MatCardContent, MatCardHeader, MatCardTitle} from '@angular/material/card';\nimport {MatFormField} from '@angular/material/form-field';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatInput} from '@angular/material/input';\nimport {MatProgressSpinner} from '@angular/material/progress-spinner';\nimport {AuthRoutingFlowService} from '@dbg-riskit/angular-auth';\nimport {AUTH_PROVIDER, SECONDARY_LOGO} from '@dbg-riskit/angular-common';\nimport {ErrorTypes, toErrorMessage} from '@dbg-riskit/angular-error';\nimport {BaseComponent, FlexComponent, FlexSpacerComponent, MessageComponent} from '@dbg-riskit/angular-view';\nimport {AuthProvider, UserInfo} from '@dbg-riskit/common';\nimport {Observable} from 'rxjs';\nimport {first, takeUntil} from 'rxjs/operators';\n\n@Component({\n templateUrl : 'login.component.html',\n styleUrls : [\n '../../../component.scss',\n 'login.component.scss'\n ],\n host : {\n '[class.risk-login-form]': 'true'\n },\n changeDetection : ChangeDetectionStrategy.OnPush,\n preserveWhitespaces: false,\n imports: [\n AsyncPipe,\n FlexComponent,\n FlexSpacerComponent,\n FormsModule,\n MatButton,\n MatCard,\n MatCardActions,\n MatCardContent,\n MatCardHeader,\n MatCardTitle,\n MatFormField,\n MatIcon,\n MatInput,\n MatProgressSpinner,\n MessageComponent\n ]\n})\nexport class LoginComponent extends BaseComponent implements AfterViewInit {\n private readonly authProvider = inject<AuthProvider>(AUTH_PROVIDER);\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n private readonly authRoutingFlowService = inject(AuthRoutingFlowService);\n private readonly secondaryLogo = inject(SECONDARY_LOGO);\n\n /**\n * Error message to be displayed.\n */\n public errorMessage?: string;\n\n /**\n * User name binding.\n */\n public username?: string;\n\n /**\n * Password binding.\n */\n public password?: string;\n\n /**\n * Control for \"login button-to-spinner\".\n */\n public loggingIn = false;\n\n public constructor() {\n super();\n // Update component state on login status change\n this.authProvider.loggedInStream.pipe(\n takeUntil(this.destroyed)\n ).subscribe(() => this.changeDetectorRef.markForCheck());\n }\n\n public get isDirectFlow(): boolean {\n return this.authRoutingFlowService.directFlow;\n }\n\n public get authStatus(): Observable<boolean> {\n return this.authProvider.loggedIn;\n }\n\n public get userProfile(): Observable<UserInfo | undefined> {\n return this.authProvider.userProfile;\n }\n\n public get logo(): string {\n return this.secondaryLogo;\n }\n\n public ngAfterViewInit(): void {\n this.authRoutingFlowService.loginViaService().pipe(\n takeUntil(this.destroyed)\n ).subscribe(\n () => {\n this.changeDetectorRef.markForCheck();\n },\n (err: ErrorTypes) => {\n this.errorMessage = toErrorMessage(err).message;\n this.changeDetectorRef.markForCheck();\n }\n );\n }\n\n public login(): void {\n this.loggingIn = true;\n this.authRoutingFlowService.login(this.username, this.password).pipe(\n first()\n ).subscribe(\n (res: boolean) => {\n if (!res) {\n this.errorMessage = 'Authentication failed. Server did not generate a token.';\n }\n this.loggingIn = false;\n this.changeDetectorRef.markForCheck();\n },\n () => {\n this.loggingIn = false;\n this.errorMessage = 'Authentication failed. Is the username and password correct?';\n this.changeDetectorRef.markForCheck();\n }\n );\n }\n}\n","<risk-flex>\n <risk-flex-spacer/>\n\n @if (isDirectFlow) {\n <div>\n @if (authStatus | async) {\n @if (userProfile | async; as user) {\n @if (user?.name) {\n <risk-good [message]=\"'Successfully logged in as ' + user.name + '.'\"/>\n } @else {\n <risk-good [message]=\"'Successfully logged in!'\"/>\n }\n }\n } @else {\n @if (errorMessage) {\n <risk-error [message]=\"errorMessage\"/>\n }\n <form (ngSubmit)=\"login()\" role=\"form\">\n <mat-card>\n <mat-card-header>\n <mat-card-title>Please Sign In</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <mat-form-field class=\"risk-full-width\">\n <input [(ngModel)]=\"username\"\n autofocus\n matInput\n name=\"username\"\n placeholder=\"Username\"\n type=\"text\">\n </mat-form-field>\n <mat-form-field class=\"risk-full-width\">\n <input [(ngModel)]=\"password\"\n matInput\n name=\"password\"\n placeholder=\"Password\"\n type=\"password\">\n </mat-form-field>\n </mat-card-content>\n <mat-card-actions>\n @if (!loggingIn) {\n <button\n color=\"primary\"\n mat-raised-button\n type=\"submit\">\n Sign in\n </button>\n }\n @if (loggingIn) {\n <mat-spinner [diameter]=\"36\"/>\n }\n <risk-flex-spacer/>\n <img [src]=\"logo\" alt=\"Company logo\">\n </mat-card-actions>\n </mat-card>\n </form>\n }\n </div>\n } @else {\n <div>\n @if (!errorMessage) {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-spinner/>\n <div></div>\n </div>\n <h3>Contacting authentication server...</h3>\n } @else {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-icon class=\"risk-login-form-error\" color=\"warn\">error_outline</mat-icon>\n <div></div>\n </div>\n <h3>Failed to authenticate user: {{ errorMessage }}</h3>\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <button (click)=\"login()\"\n color=\"primary\"\n mat-button\n type=\"button\">\n <mat-icon>autorenew</mat-icon>\n Retry\n </button>\n <div></div>\n </div>\n }\n </div>\n }\n\n <risk-flex-spacer/>\n</risk-flex>\n","import {AsyncPipe} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Directive,\n HostBinding,\n inject,\n Input\n} from '@angular/core';\nimport {MatButton} from '@angular/material/button';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu';\nimport {AuthRoutingFlowService} from '@dbg-riskit/angular-auth';\nimport {AUTH_PROVIDER} from '@dbg-riskit/angular-common';\nimport {BaseComponent} from '@dbg-riskit/angular-view';\nimport {AuthProvider} from '@dbg-riskit/common';\nimport {Observable} from 'rxjs';\nimport {first, takeUntil} from 'rxjs/operators';\n\n@Directive({\n selector: 'risk-login-menu-title-horizontal, '\n + 'risk-login-menu-title-vertical',\n host : {\n '[class.risk-login-menu-title]': 'true'\n }\n})\nexport class LoginMenuComponentTitleDirective {\n}\n\n@Directive({\n selector: 'risk-login-menu-before-items-horizontal,'\n + ' risk-login-menu-before-items-vertical,'\n + 'risk-login-menu-after-items-horizontal,'\n + 'risk-login-menu-after-items-vertical'\n})\nexport class LoginMenuItemsDirective {\n}\n\n@Component({\n selector : 'risk-login-menu',\n templateUrl : 'login.menu.component.html',\n styleUrls : [\n '../../../component.scss',\n 'login.menu.component.scss'\n ],\n host : {\n '[class.risk-login-menu]': 'true'\n },\n changeDetection : ChangeDetectionStrategy.OnPush,\n preserveWhitespaces: false,\n imports : [MatMenu, MatMenuItem, MatIcon, MatButton, MatMenuTrigger, AsyncPipe]\n})\nexport class LoginMenuComponent extends BaseComponent {\n private readonly authProvider = inject<AuthProvider>(AUTH_PROVIDER);\n private readonly authRoutingFlowService = inject(AuthRoutingFlowService);\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n\n @Input()\n public orientation: 'row' | 'column' = 'row';\n\n public constructor() {\n super();\n\n // Update menu state on login status change\n this.authProvider.loggedInStream.pipe(\n takeUntil(this.destroyed)\n ).subscribe(() => this.changeDetectorRef.markForCheck());\n }\n\n @HostBinding('class.risk-login-menu-flex-row')\n public get isRow(): boolean {\n return this.orientation === 'row';\n }\n\n @HostBinding('class.risk-login-menu-flex-column')\n public get isColumn(): boolean {\n return this.orientation === 'column';\n }\n\n public get authStatus(): Observable<boolean> {\n return this.authProvider.loggedIn;\n }\n\n public menuClosed(): void {\n this.changeDetectorRef.markForCheck();\n }\n\n public logout(): void {\n this.authRoutingFlowService.logout().pipe(\n first()\n ).subscribe();\n }\n}\n","@if (orientation === 'row') {\n <mat-menu #loginMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <ng-content select=\"risk-login-menu-before-items-horizontal\"/>\n @if (authStatus | async) {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </button>\n } @else {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>launch</mat-icon>\n Login\n </button>\n }\n <ng-content select=\"risk-login-menu-after-items-horizontal\"/>\n </mat-menu>\n <button #menu=\"matMenuTrigger\"\n (onMenuClose)=\"menuClosed()\"\n [class.risk-menu-open]=\"menu.menuOpen\"\n [matMenuTriggerFor]=\"loginMenu\"\n mat-button\n type=\"button\">\n <ng-content select=\"risk-login-menu-title-horizontal\"/>\n <mat-icon>person</mat-icon>\n </button>\n}\n@if (orientation === 'column') {\n <ng-content select=\"risk-login-menu-title-vertical\"/>\n <ng-content select=\"risk-login-menu-before-items-vertical\"/>\n @if (authStatus | async) {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </a>\n } @else {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>launch</mat-icon>\n Login\n </a>\n }\n <ng-content select=\"risk-login-menu-after-items-vertical\"/>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dbg-riskit-angular-login.mjs","sources":["../../../../pkg/dbg-riskit/angular-login/src/lib/login.component.ts","../../../../pkg/dbg-riskit/angular-login/src/lib/login.component.html","../../../../pkg/dbg-riskit/angular-login/src/lib/login.menu.component.ts","../../../../pkg/dbg-riskit/angular-login/src/lib/login.menu.component.html","../../../../pkg/dbg-riskit/angular-login/src/dbg-riskit-angular-login.ts"],"sourcesContent":["import {ChangeDetectionStrategy, Component, inject, signal} from '@angular/core';\nimport {takeUntilDestroyed, toSignal} from '@angular/core/rxjs-interop';\nimport {FormControl, FormGroup, ReactiveFormsModule} from '@angular/forms';\nimport {MatButton} from '@angular/material/button';\nimport {MatCard, MatCardActions, MatCardContent, MatCardHeader, MatCardTitle} from '@angular/material/card';\nimport {MatFormField} from '@angular/material/form-field';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatInput} from '@angular/material/input';\nimport {MatProgressSpinner} from '@angular/material/progress-spinner';\nimport {AuthRoutingFlowService} from '@dbg-riskit/angular-auth';\nimport {AUTH_PROVIDER, SECONDARY_LOGO} from '@dbg-riskit/angular-common';\nimport {ErrorTypes, toErrorMessage} from '@dbg-riskit/angular-error';\nimport {RiskFlexComponent, RiskFlexSpacerComponent, RiskMessageComponent} from '@dbg-riskit/angular-view';\nimport {AuthProvider, UserInfo} from '@dbg-riskit/common';\nimport {first, switchMap} from 'rxjs/operators';\n\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl : 'login.component.html',\n styleUrls : [\n '../../../component.scss',\n 'login.component.scss'\n ],\n host : {\n '[class.risk-login-form]': 'true'\n },\n imports: [\n MatButton,\n MatCard,\n MatCardActions,\n MatCardContent,\n MatCardHeader,\n MatCardTitle,\n MatFormField,\n MatIcon,\n MatInput,\n MatProgressSpinner,\n ReactiveFormsModule,\n RiskFlexComponent,\n RiskFlexSpacerComponent,\n RiskMessageComponent\n ]\n})\nexport class RiskLoginComponent {\n private readonly authProvider = inject<AuthProvider>(AUTH_PROVIDER);\n private readonly authRoutingFlowService = inject(AuthRoutingFlowService);\n private readonly secondaryLogo = inject(SECONDARY_LOGO);\n\n public readonly errorMessage = signal<string | undefined>(undefined);\n public readonly loggingIn = signal(false);\n\n public readonly loginForm = new FormGroup({\n username: new FormControl(''),\n password: new FormControl('')\n });\n\n public readonly authStatus = toSignal(this.authProvider.loggedInStream);\n public readonly userProfile = signal<UserInfo | undefined>(undefined);\n\n public get isDirectFlow(): boolean {\n return this.authRoutingFlowService.directFlow;\n }\n\n public get logo(): string {\n return this.secondaryLogo;\n }\n\n public constructor() {\n this.authRoutingFlowService.loginViaService().pipe(\n takeUntilDestroyed()\n ).subscribe({\n error: (err: ErrorTypes) => {\n this.errorMessage.set(toErrorMessage(err).message);\n }\n });\n\n this.authProvider.loggedInStream.pipe(\n takeUntilDestroyed(),\n switchMap(() => this.authProvider.userProfile)\n ).subscribe({\n next: (profile) => {\n this.userProfile.set(profile);\n }\n });\n }\n\n public login(): void {\n this.loggingIn.set(true);\n const username = this.loginForm.get('username')?.value ?? undefined;\n const password = this.loginForm.get('password')?.value ?? undefined;\n this.authRoutingFlowService.login(username, password).pipe(\n first()\n ).subscribe({\n next : (res: boolean) => {\n if (!res) {\n this.errorMessage.set('Authentication failed. Server did not generate a token.');\n }\n this.loggingIn.set(false);\n },\n error: () => {\n this.loggingIn.set(false);\n this.errorMessage.set('Authentication failed. Is the username and password correct?');\n }\n });\n }\n}\n","<risk-flex>\n <risk-flex-spacer/>\n\n @if (isDirectFlow) {\n <div>\n @if (authStatus()) {\n @if (userProfile(); as user) {\n @if (user?.name) {\n <risk-good [message]=\"'Successfully logged in as ' + user.name + '.'\"/>\n } @else {\n <risk-good [message]=\"'Successfully logged in!'\"/>\n }\n }\n } @else {\n @if (errorMessage()) {\n <risk-error [message]=\"errorMessage()!\"/>\n }\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"login()\" role=\"form\">\n <mat-card>\n <mat-card-header>\n <mat-card-title>Please Sign In</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <mat-form-field class=\"risk-full-width\">\n <input formControlName=\"username\"\n autofocus\n matInput\n name=\"username\"\n placeholder=\"Username\"\n type=\"text\">\n </mat-form-field>\n <mat-form-field class=\"risk-full-width\">\n <input formControlName=\"password\"\n matInput\n name=\"password\"\n placeholder=\"Password\"\n type=\"password\">\n </mat-form-field>\n </mat-card-content>\n <mat-card-actions>\n @if (!loggingIn()) {\n <button\n color=\"primary\"\n mat-raised-button\n type=\"submit\">\n Sign in\n </button>\n }\n @if (loggingIn()) {\n <mat-spinner [diameter]=\"36\"/>\n }\n <risk-flex-spacer/>\n <img [src]=\"logo\" alt=\"Company logo\">\n </mat-card-actions>\n </mat-card>\n </form>\n }\n </div>\n } @else {\n <div>\n @if (!errorMessage()) {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-spinner/>\n <div></div>\n </div>\n <h3>Contacting authentication server...</h3>\n } @else {\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <mat-icon class=\"risk-login-form-error\" color=\"warn\">error_outline</mat-icon>\n <div></div>\n </div>\n <h3>Failed to authenticate user: {{ errorMessage() }}</h3>\n <div class=\"risk-login-form-flex-wrapper\">\n <div></div>\n <button (click)=\"login()\"\n color=\"primary\"\n mat-button\n type=\"button\">\n <mat-icon>autorenew</mat-icon>\n Retry\n </button>\n <div></div>\n </div>\n }\n </div>\n }\n\n <risk-flex-spacer/>\n</risk-flex>\n","import {ChangeDetectionStrategy, Component, Directive, inject, input} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {MatButton} from '@angular/material/button';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu';\nimport {AuthRoutingFlowService} from '@dbg-riskit/angular-auth';\nimport {AUTH_PROVIDER} from '@dbg-riskit/angular-common';\nimport {AuthProvider} from '@dbg-riskit/common';\nimport {first} from 'rxjs/operators';\n\n@Directive({\n selector: 'risk-login-menu-title-horizontal, '\n + 'risk-login-menu-title-vertical',\n host : {\n '[class.risk-login-menu-title]': 'true'\n }\n})\nexport class RiskLoginMenuComponentTitleDirective {\n}\n\n@Directive({\n selector: 'risk-login-menu-before-items-horizontal,'\n + ' risk-login-menu-before-items-vertical,'\n + 'risk-login-menu-after-items-horizontal,'\n + 'risk-login-menu-after-items-vertical'\n})\nexport class RiskLoginMenuItemsDirective {\n}\n\n@Component({\n selector : 'risk-login-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl : 'login.menu.component.html',\n styleUrls : [\n '../../../component.scss',\n 'login.menu.component.scss'\n ],\n host : {\n '[class.risk-login-menu]' : 'true',\n '[class.risk-login-menu-flex-row]' : 'orientation() === \"row\"',\n '[class.risk-login-menu-flex-column]': 'orientation() === \"column\"'\n },\n imports : [\n MatButton,\n MatIcon,\n MatMenu,\n MatMenuItem,\n MatMenuTrigger\n ]\n})\nexport class RiskLoginMenuComponent {\n private readonly authProvider = inject<AuthProvider>(AUTH_PROVIDER);\n private readonly authRoutingFlowService = inject(AuthRoutingFlowService);\n\n public readonly orientation = input<'row' | 'column'>('row');\n public readonly authStatus = toSignal(this.authProvider.loggedInStream);\n\n public logout(): void {\n this.authRoutingFlowService.logout().pipe(\n first()\n ).subscribe();\n }\n}\n","@if (orientation() === 'row') {\n <mat-menu #loginMenu=\"matMenu\"\n [overlapTrigger]=\"false\">\n <ng-content select=\"risk-login-menu-before-items-horizontal\"/>\n @if (authStatus()) {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </button>\n } @else {\n <button (click)=\"logout()\"\n mat-menu-item\n type=\"button\">\n <mat-icon>launch</mat-icon>\n Login\n </button>\n }\n <ng-content select=\"risk-login-menu-after-items-horizontal\"/>\n </mat-menu>\n <button #menu=\"matMenuTrigger\"\n [class.risk-menu-open]=\"menu.menuOpen\"\n [matMenuTriggerFor]=\"loginMenu\"\n mat-button\n type=\"button\">\n <ng-content select=\"risk-login-menu-title-horizontal\"/>\n <mat-icon>person</mat-icon>\n </button>\n}\n@if (orientation() === 'column') {\n <ng-content select=\"risk-login-menu-title-vertical\"/>\n <ng-content select=\"risk-login-menu-before-items-vertical\"/>\n @if (authStatus()) {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>exit_to_app</mat-icon>\n Logout\n </a>\n } @else {\n <a (click)=\"logout()\"\n mat-button>\n <mat-icon>launch</mat-icon>\n Login\n </a>\n }\n <ng-content select=\"risk-login-menu-after-items-vertical\"/>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,62 +1,43 @@
1
1
  import * as i0 from '@angular/core';
2
- import { AfterViewInit } from '@angular/core';
3
- import { BaseComponent } from '@dbg-riskit/angular-view';
2
+ import { FormGroup, FormControl } from '@angular/forms';
4
3
  import { UserInfo } from '@dbg-riskit/common';
5
- import { Observable } from 'rxjs';
6
4
 
7
- declare class LoginComponent extends BaseComponent implements AfterViewInit {
5
+ declare class RiskLoginComponent {
8
6
  private readonly authProvider;
9
- private readonly changeDetectorRef;
10
7
  private readonly authRoutingFlowService;
11
8
  private readonly secondaryLogo;
12
- /**
13
- * Error message to be displayed.
14
- */
15
- errorMessage?: string;
16
- /**
17
- * User name binding.
18
- */
19
- username?: string;
20
- /**
21
- * Password binding.
22
- */
23
- password?: string;
24
- /**
25
- * Control for "login button-to-spinner".
26
- */
27
- loggingIn: boolean;
28
- constructor();
9
+ readonly errorMessage: i0.WritableSignal<string | undefined>;
10
+ readonly loggingIn: i0.WritableSignal<boolean>;
11
+ readonly loginForm: FormGroup<{
12
+ username: FormControl<string | null>;
13
+ password: FormControl<string | null>;
14
+ }>;
15
+ readonly authStatus: i0.Signal<boolean | undefined>;
16
+ readonly userProfile: i0.WritableSignal<UserInfo | undefined>;
29
17
  get isDirectFlow(): boolean;
30
- get authStatus(): Observable<boolean>;
31
- get userProfile(): Observable<UserInfo | undefined>;
32
18
  get logo(): string;
33
- ngAfterViewInit(): void;
19
+ constructor();
34
20
  login(): void;
35
- static ɵfac: i0.ɵɵFactoryDeclaration<LoginComponent, never>;
36
- static ɵcmp: i0.ɵɵComponentDeclaration<LoginComponent, "ng-component", never, {}, {}, never, never, true, never>;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<RiskLoginComponent, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<RiskLoginComponent, "ng-component", never, {}, {}, never, never, true, never>;
37
23
  }
38
24
 
39
- declare class LoginMenuComponentTitleDirective {
40
- static ɵfac: i0.ɵɵFactoryDeclaration<LoginMenuComponentTitleDirective, never>;
41
- static ɵdir: i0.ɵɵDirectiveDeclaration<LoginMenuComponentTitleDirective, "risk-login-menu-title-horizontal, risk-login-menu-title-vertical", never, {}, {}, never, never, true, never>;
25
+ declare class RiskLoginMenuComponentTitleDirective {
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<RiskLoginMenuComponentTitleDirective, never>;
27
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RiskLoginMenuComponentTitleDirective, "risk-login-menu-title-horizontal, risk-login-menu-title-vertical", never, {}, {}, never, never, true, never>;
42
28
  }
43
- declare class LoginMenuItemsDirective {
44
- static ɵfac: i0.ɵɵFactoryDeclaration<LoginMenuItemsDirective, never>;
45
- static ɵdir: i0.ɵɵDirectiveDeclaration<LoginMenuItemsDirective, "risk-login-menu-before-items-horizontal, risk-login-menu-before-items-vertical,risk-login-menu-after-items-horizontal,risk-login-menu-after-items-vertical", never, {}, {}, never, never, true, never>;
29
+ declare class RiskLoginMenuItemsDirective {
30
+ static ɵfac: i0.ɵɵFactoryDeclaration<RiskLoginMenuItemsDirective, never>;
31
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RiskLoginMenuItemsDirective, "risk-login-menu-before-items-horizontal, risk-login-menu-before-items-vertical,risk-login-menu-after-items-horizontal,risk-login-menu-after-items-vertical", never, {}, {}, never, never, true, never>;
46
32
  }
47
- declare class LoginMenuComponent extends BaseComponent {
33
+ declare class RiskLoginMenuComponent {
48
34
  private readonly authProvider;
49
35
  private readonly authRoutingFlowService;
50
- private readonly changeDetectorRef;
51
- orientation: 'row' | 'column';
52
- constructor();
53
- get isRow(): boolean;
54
- get isColumn(): boolean;
55
- get authStatus(): Observable<boolean>;
56
- menuClosed(): void;
36
+ readonly orientation: i0.InputSignal<"row" | "column">;
37
+ readonly authStatus: i0.Signal<boolean | undefined>;
57
38
  logout(): void;
58
- static ɵfac: i0.ɵɵFactoryDeclaration<LoginMenuComponent, never>;
59
- static ɵcmp: i0.ɵɵComponentDeclaration<LoginMenuComponent, "risk-login-menu", never, { "orientation": { "alias": "orientation"; "required": false; }; }, {}, never, ["risk-login-menu-before-items-horizontal", "risk-login-menu-after-items-horizontal", "risk-login-menu-title-horizontal", "risk-login-menu-title-vertical", "risk-login-menu-before-items-vertical", "risk-login-menu-after-items-vertical"], true, never>;
39
+ static ɵfac: i0.ɵɵFactoryDeclaration<RiskLoginMenuComponent, never>;
40
+ static ɵcmp: i0.ɵɵComponentDeclaration<RiskLoginMenuComponent, "risk-login-menu", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, {}, never, ["risk-login-menu-before-items-horizontal", "risk-login-menu-after-items-horizontal", "risk-login-menu-title-horizontal", "risk-login-menu-title-vertical", "risk-login-menu-before-items-vertical", "risk-login-menu-after-items-vertical"], true, never>;
60
41
  }
61
42
 
62
- export { LoginComponent, LoginMenuComponent, LoginMenuComponentTitleDirective, LoginMenuItemsDirective };
43
+ export { RiskLoginComponent, RiskLoginMenuComponent, RiskLoginMenuComponentTitleDirective, RiskLoginMenuItemsDirective };
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@dbg-riskit/angular-login",
3
- "version": "20.0.2",
3
+ "version": "20.3.0",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "peerDependencies": {
6
- "@angular/core": "^20.3.12",
7
- "@angular/forms": "^20.3.12",
8
- "@angular/router": "^20.3.12",
9
- "@dbg-riskit/common": "~20.0.2",
10
- "@dbg-riskit/angular-auth": "~20.0.2",
11
- "@dbg-riskit/angular-common": "~20.0.2",
12
- "@dbg-riskit/angular-error": "~20.0.2",
13
- "@dbg-riskit/angular-view": "~20.0.2",
6
+ "@angular/core": "^20.3.15",
7
+ "@angular/forms": "^20.3.15",
8
+ "@angular/router": "^20.3.15",
9
+ "@dbg-riskit/common": "~20.3.0",
10
+ "@dbg-riskit/angular-auth": "~20.3.0",
11
+ "@dbg-riskit/angular-common": "~20.3.0",
12
+ "@dbg-riskit/angular-error": "~20.3.0",
13
+ "@dbg-riskit/angular-view": "~20.3.0",
14
14
  "rxjs": "~7.8.2"
15
15
  },
16
16
  "dependencies": {