diff --git a/smp-angular/src/app/user-settings/user-access-tokens/access-token-panel/access-token-panel.component.ts b/smp-angular/src/app/user-settings/user-access-tokens/access-token-panel/access-token-panel.component.ts index 842d0a384b5f91f435f90aff8bd24637cbd62dcd..f290f68eabf2061190e857918fcd1d3271cc33e5 100644 --- a/smp-angular/src/app/user-settings/user-access-tokens/access-token-panel/access-token-panel.component.ts +++ b/smp-angular/src/app/user-settings/user-access-tokens/access-token-panel/access-token-panel.component.ts @@ -1,14 +1,33 @@ import {Component, EventEmitter, Input, Output} from '@angular/core'; import { + AbstractControl, FormBuilder, FormControl, - FormGroup + FormGroup, ValidatorFn } from "@angular/forms"; import {CredentialRo} from "../../../security/credential.model"; import {BeforeLeaveGuard} from "../../../window/sidenav/navigation-on-leave-guard"; import {GlobalLookups} from "../../../common/global-lookups"; +export function notAfterCurrentDateValidator(): ValidatorFn { + return (control: AbstractControl): { [key: string]: any } | null => { + const date = control.value; + const forbidden = date && date > Date.now(); + + return forbidden ? { 'matStartDateInvalid': { value: control.value } } : null; + }; +} + +export function notBeforeCurrentDateValidator(): ValidatorFn { + return (control: AbstractControl): { [key: string]: any } | null => { + const date = control.value; + const forbidden = date && date < Date.now(); + return forbidden ? { 'matEndDateInvalid': { value: control.value } } : null; + }; +} + + @Component({ selector: 'access-token-panel', templateUrl: './access-token-panel.component.html', @@ -24,6 +43,8 @@ export class AccessTokenPanelComponent implements BeforeLeaveGuard { credentialForm: FormGroup; _expanded: boolean = false; + + constructor(private formBuilder: FormBuilder, private globalLookups: GlobalLookups) { this.credentialForm = formBuilder.group({ @@ -31,9 +52,10 @@ export class AccessTokenPanelComponent implements BeforeLeaveGuard { 'name': new FormControl({value: '', disabled: true}), 'active': new FormControl({value: '', disabled: false}), 'description': new FormControl({value: '', disabled: false}), - 'activeFrom': new FormControl({value: '', disabled: false}), - 'expireOn': new FormControl({value: '', disabled: false}) + 'activeFrom': new FormControl({value: '', disabled: false}, [notAfterCurrentDateValidator()]), + 'expireOn': new FormControl({value: '', disabled: false}, [notBeforeCurrentDateValidator()]) }); + } get credential(): CredentialRo { @@ -68,8 +90,21 @@ export class AccessTokenPanelComponent implements BeforeLeaveGuard { onSaveButtonClicked(event: MouseEvent) { this._credential.active = this.credentialForm.controls['active'].value this._credential.description = this.credentialForm.controls['description'].value - this._credential.activeFrom = this.credentialForm.controls['activeFrom'].value - this._credential.expireOn = this.credentialForm.controls['expireOn'].value + let dateFrom = this.credentialForm.controls['activeFrom'].value; + if (dateFrom) { + // make date mutable and the modification + dateFrom = new Date(dateFrom); + dateFrom.setHours(0, 0, 0, 0); + } + this._credential.activeFrom = dateFrom + let dateTo = this.credentialForm.controls['expireOn'].value; + if (dateTo) { + // make date mutable and the modification + dateTo = new Date(dateTo); + dateTo.setHours(0, 0, 0, 0); + } + this._credential.expireOn = dateTo + event?.stopPropagation(); this.onSaveEvent.emit(this._credential); } @@ -79,7 +114,7 @@ export class AccessTokenPanelComponent implements BeforeLeaveGuard { } get sequentialLoginFailureCount(): string { - return this._credential && this._credential.sequentialLoginFailureCount ? + return this._credential?.sequentialLoginFailureCount ? this._credential.sequentialLoginFailureCount + "" : "0"; }