@arsedizioni/ars-utils 22.5.48 → 22.5.49

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.
@@ -15,7 +15,7 @@ import * as i2 from '@angular/material/input';
15
15
  import { MatInputModule } from '@angular/material/input';
16
16
  import * as i1$1 from '@angular/material/form-field';
17
17
  import { MatFormFieldModule } from '@angular/material/form-field';
18
- import { form, required, email, FormField, FormRoot, maxLength, minLength } from '@angular/forms/signals';
18
+ import { form, required, email, maxLength, FormField, FormRoot, minLength } from '@angular/forms/signals';
19
19
  import { SignalsUtils, notEmpty, otp, password, equals } from '@arsedizioni/ars-utils/core.validators';
20
20
  import * as i3 from '@angular/material/icon';
21
21
  import { MatIconModule } from '@angular/material/icon';
@@ -269,6 +269,7 @@ class CredentialsDialogComponent {
269
269
  const raw = inject(MAT_DIALOG_DATA) ?? {};
270
270
  const data = {
271
271
  appearance: 'fill',
272
+ maxLength: 30,
272
273
  title: 'Informazioni',
273
274
  okCaption: 'Salva',
274
275
  mode: 'email',
@@ -278,6 +279,7 @@ class CredentialsDialogComponent {
278
279
  data.title ??= 'Informazioni';
279
280
  data.okCaption ??= 'Salva';
280
281
  data.mode ??= 'email';
282
+ data.maxLength ??= 30;
281
283
  if (data.mode === 'otp' && !data.message) {
282
284
  data.message = '<div class="small">Inserisci il codice di verifica di 6 cifre che ti abbiamo inviato ora per email<br><span class="x-small">(controlla anche la posta indesiderata)</span>.</div>';
283
285
  }
@@ -299,6 +301,7 @@ class CredentialsDialogComponent {
299
301
  email(p.user, { when: () => this.dialogData().mode === 'email' });
300
302
  required(p.password, { when: () => this.dialogData().mode !== 'otp' });
301
303
  notEmpty(p.password, { when: () => this.dialogData().mode !== 'otp' });
304
+ maxLength(p.password, this.dialogData().maxLength ?? 30);
302
305
  required(p.code, { when: () => this.dialogData().mode === 'otp' });
303
306
  notEmpty(p.code, { when: () => this.dialogData().mode === 'otp' });
304
307
  otp(p.code);
@@ -441,12 +444,12 @@ class ResetPasswordDialogComponent {
441
444
  required(p.password);
442
445
  notEmpty(p.password);
443
446
  minLength(p.password, 10);
444
- maxLength(p.password, 30);
447
+ maxLength(p.password, this.dialogData().maxLength ?? 30);
445
448
  password(p.password);
446
449
  required(p.password2, { when: () => this.dialogData().mode !== 'admin' });
447
450
  notEmpty(p.password2, { when: () => this.dialogData().mode !== 'admin' });
448
451
  minLength(p.password2, 10);
449
- maxLength(p.password2, 30);
452
+ maxLength(p.password2, this.dialogData().maxLength ?? 30);
450
453
  password(p.password2);
451
454
  equals(p.password2, p.password);
452
455
  });
@@ -1 +1 @@
1
- {"version":3,"file":"arsedizioni-ars-utils-ui.dialogs.auth.mjs","sources":["../../../projects/ars-utils/ui.dialogs.auth/otp/otp-input.component.ts","../../../projects/ars-utils/ui.dialogs.auth/otp/otp-input.component.html","../../../projects/ars-utils/ui.dialogs.auth/password-strength/password-strength.component.ts","../../../projects/ars-utils/ui.dialogs.auth/password-strength/password-strength.component.html","../../../projects/ars-utils/ui.dialogs.auth/credentials/credentials-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.auth/credentials/credentials-dialog.component.html","../../../projects/ars-utils/ui.dialogs.auth/reset-password/reset-password-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.auth/reset-password/reset-password-dialog.component.html","../../../projects/ars-utils/ui.dialogs.auth/recover-password/recover-password-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.auth/recover-password/recover-password-dialog.component.html","../../../projects/ars-utils/ui.dialogs.auth/prompt-otp/prompt-otp-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.auth/prompt-otp/prompt-otp-dialog.component.html","../../../projects/ars-utils/ui.dialogs.auth/public_api.ts","../../../projects/ars-utils/ui.dialogs.auth/arsedizioni-ars-utils-ui.dialogs.auth.ts"],"sourcesContent":["import { Component, ElementRef, computed, forwardRef, signal, viewChildren, ChangeDetectionStrategy } from '@angular/core';\nimport { AbstractControl, ControlValueAccessor, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\n\n\n@Component({\n selector: 'otp-input',\n standalone: true,\n templateUrl: './otp-input.component.html',\n styleUrl: './otp-input.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OtpInputComponent),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => OtpInputComponent),\n multi: true,\n },\n ],\n})\nexport class OtpInputComponent implements ControlValueAccessor, Validator {\n /** Signal-based query for all individual OTP digit input elements. */\n readonly otpFields = viewChildren<ElementRef<HTMLInputElement>>('otpField');\n\n /** `true` when every digit slot contains a valid single decimal digit. */\n readonly isValid = computed(() => this.otpArray().every(d => /^\\d$/.test(d)));\n\n /** Array of per-digit values backing the OTP display. */\n readonly otpArray = signal<string[]>(Array(6).fill(''));\n\n /** Whether the control is currently disabled. */\n readonly disabled = signal<boolean>(false);\n\n private onChange: (val: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n // ── ControlValueAccessor ───────────────────────────────────────────────────\n\n /**\n * Writes a new value into the control from the model.\n * @param value - A string of up to 6 digits to pre-fill the OTP fields.\n */\n writeValue(value: string): void {\n const arr = Array(6).fill('');\n if (value) {\n value.split('').forEach((c, i) => {\n if (i < 6) arr[i] = c;\n });\n }\n this.otpArray.set(arr);\n }\n\n /**\n * Registers the callback invoked when the control value changes.\n * @param fn - The callback function.\n */\n registerOnChange(fn: (val: string) => void): void {\n this.onChange = fn;\n }\n\n /**\n * Registers the callback invoked when the control is touched.\n * @param fn - The callback function.\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /**\n * Enables or disables the control.\n * @param isDisabled - `true` to disable all OTP inputs.\n */\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n // ── Validator ──────────────────────────────────────────────────────────────\n\n /**\n * Validates the OTP value: an empty code is left to `required`, while a\n * PARTIAL code (e.g. \"12\") is reported as invalid. Without this, the joined\n * value \"12\" was a non-empty string and `required` let the form submit\n * with an incomplete OTP.\n * @param control - The form control bound to this component.\n * @returns `null` when empty or complete (6 digits), `{ otp: true }` otherwise.\n */\n validate(control: AbstractControl): ValidationErrors | null {\n const value: string = control.value ?? '';\n if (value.length === 0) return null; // let `required` handle emptiness\n return /^\\d{6}$/.test(value) ? null : { otp: true };\n }\n\n /**\n * Marks the control as touched when an OTP field loses focus.\n */\n onBlur(): void {\n this.onTouched();\n }\n\n // ── Event handlers ─────────────────────────────────────────────────────────\n\n /**\n * Blocks non-digit characters before they are inserted.\n * @param event - The `beforeinput` event from the input element.\n */\n onBeforeInput(event: InputEvent): void {\n if (event.data && !/^\\d$/.test(event.data)) {\n event.preventDefault();\n }\n }\n\n/**\n * Handles digit input, sanitizes it, syncs the DOM, updates the OTP array, and advances focus.\n * @param event - The `input` event from the digit field.\n * @param index - Zero-based index of the field that received input.\n */\n onInput(event: Event, index: number): void {\n const input = event.target as HTMLInputElement;\n const val = input.value.replace(/\\D/g, '').slice(-1);\n\n // Force-sync the DOM: [value] won't rewrite it when the model value is unchanged.\n input.value = val;\n\n const arr = [...this.otpArray()];\n arr[index] = val;\n this.otpArray.set(arr);\n\n this.updateModel();\n\n if (val && index < 5) {\n this.focusField(index + 1);\n }\n }\n\n /**\n * Handles the Backspace key by moving focus to the previous field when the current one is empty.\n * @param event - The `keydown` event.\n * @param index - Zero-based index of the field that received the keydown.\n */\n onKeyDown(event: KeyboardEvent, index: number): void {\n if (event.key === 'Backspace' && !this.otpArray()[index] && index > 0) {\n this.focusField(index - 1);\n }\n }\n\n /**\n * Handles paste events by extracting up to 6 digits and distributing them across the OTP fields.\n * @param event - The `ClipboardEvent` from the paste action.\n */\n onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n const pasted = event.clipboardData?.getData('text') ?? '';\n const digits = pasted.replace(/\\D/g, '').slice(0, 6).split('');\n\n if (digits.length > 0) {\n const arr = Array(6).fill('');\n digits.forEach((d, i) => (arr[i] = d));\n this.otpArray.set(arr);\n this.updateModel();\n this.focusField(Math.min(digits.length, 5));\n }\n }\n\n\n \n // ── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Clears every digit field, propagates the empty value to the form model and\n * moves focus back to the first field. Does not mark the control as touched,\n * so no validation error is shown right after the reset.\n */\n clear(): void {\n this.otpArray.set(Array(6).fill(''));\n // Force-sync the DOM: [value] won't rewrite fields whose bound value is unchanged.\n this.otpFields().forEach(f => (f.nativeElement.value = ''));\n this.onChange('');\n this.focusField(0);\n }\n\n /**\n * Moves focus to the OTP field at the given index.\n * @param index - Zero-based index of the target field.\n */\n private focusField(index: number): void {\n const field = this.otpFields()[index];\n field?.nativeElement.focus();\n field?.nativeElement.select();\n }\n\n /**\n * Notifies the form model of the current OTP value and marks the control as touched.\n */\n private updateModel(): void {\n const code = this.otpArray().join('');\n this.onChange(code);\n this.onTouched();\n }\n}\n","<div class=\"otp-container\">\n @for (digit of otpArray(); track $index) {\n <input\n #otpField\n type=\"text\"\n maxlength=\"1\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n autocomplete=\"one-time-code\"\n class=\"otp-box\"\n [value]=\"digit\"\n (beforeinput)=\"onBeforeInput($event)\"\n (input)=\"onInput($event, $index)\"\n (keydown)=\"onKeyDown($event, $index)\"\n (blur)=\"onBlur()\"\n (paste)=\"onPaste($event)\"\n [disabled]=\"disabled()\"\n required\n />\n }\n</div>\n\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PasswordStrength, SystemUtils } from '@arsedizioni/ars-utils/core';\n\nconst DEFAULT_STRENGTH: PasswordStrength = { score: 0, label: '', color: '', suggestions: [], isValid: false };\n\n/**\n * Displays a password-strength indicator for the provided password string.\n * Uses `SystemUtils.calculatePasswordStrength` to derive the score and label.\n */\n@Component({\n selector: 'password-strength',\n templateUrl: './password-strength.component.html',\n styleUrl: './password-strength.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatTooltipModule]\n})\nexport class PasswordStrengthComponent {\n /** The password to evaluate. An empty string renders the default (score 0) state. */\n readonly password = input<string>('');\n\n /**\n * Computed strength result for the current password.\n * Falls back to `DEFAULT_STRENGTH` when the password is empty.\n */\n protected readonly strength = computed<PasswordStrength>(() => {\n const pwd = this.password();\n return pwd ? SystemUtils.calculatePasswordStrength(pwd) : DEFAULT_STRENGTH;\n });\n\n /**\n * CSS class applied to the label element based on the numeric score (1–6 bands).\n * Scores ≤ 2 → `'score-2'`, ≤ 3 → `'score-3'`, etc.\n */\n protected readonly scoreClass = computed<string>(() => {\n const score = this.strength().score;\n if (score <= 2) return 'score-2';\n if (score <= 3) return 'score-3';\n if (score <= 4) return 'score-4';\n if (score <= 5) return 'score-5';\n return 'score-6';\n });\n}\n","<div class=\"wide x-small bold\" style=\"white-space: nowrap; padding-top:4px\" [matTooltip]=\"strength().suggestions?.join('\\n ')\">\r\n <span [class]=\"scoreClass()\">{{strength().label}}</span>\r\n</div>","import { Component, inject, output, signal, ChangeDetectionStrategy } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';\r\nimport { CredentialsDialogResult, FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\r\nimport { DtoUtils, SafeHtmlPipe } from '@arsedizioni/ars-utils/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { email, form, FormField, FormRoot, required } from '@angular/forms/signals';\r\nimport { notEmpty, otp, SignalsUtils } from '@arsedizioni/ars-utils/core.validators';\r\nimport { PasswordStrengthComponent } from '../password-strength/password-strength.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { OtpInputComponent } from '../otp/otp-input.component';\r\n\r\nexport interface CredentialsDialogData {\r\n title?: string;\r\n message?: string;\r\n remember?: boolean;\r\n recoverPassword?: boolean;\r\n recoverPasswordUrl?: string;\r\n user?: string;\r\n okCaption?: string;\r\n mode?: 'email' | 'user' | 'otp';\r\n appearance?: MatFormFieldAppearance;\r\n}\r\n\r\n/**\r\n * Form model of the credentials dialog.\r\n *\r\n * {@link CredentialsDialogResult} is the DTO: every field of it is optional, so it\r\n * cannot back a signal form directly. Here every field is present and holds its empty\r\n * value, and {@link DtoUtils.toPayload} turns the model back into the DTO on the way out.\r\n */\r\ninterface CredentialsForm {\r\n /** The account name or email; `''` when the input is empty. */\r\n user: string;\r\n /** The password; `''` when the input is empty or the dialog is in `otp` mode. */\r\n password: string;\r\n /** Whether the session should be remembered. */\r\n rememberMe: boolean;\r\n /** The 6-digit OTP code; `''` outside `otp` mode. */\r\n code: string;\r\n}\r\n\r\n/** Neutral form model: it declares every field the form owns and its empty value. */\r\nconst _EMPTY_ITEM: CredentialsForm = { user: '', password: '', rememberMe: false, code: '' };\r\n\r\n@Component({\r\n templateUrl: './credentials-dialog.component.html',\r\n styleUrl: './credentials-dialog.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n FormField, FormRoot,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatIconModule,\r\n MatCheckboxModule,\r\n MatDialogActions,\r\n FlexLayoutModule,\r\n MatButtonModule,\r\n MatDialogClose,\r\n PasswordStrengthComponent,\r\n OtpInputComponent,\r\n SafeHtmlPipe,\r\n ],\r\n})\r\nexport class CredentialsDialogComponent {\r\n /** Error text of a field: the message declared in the schema, or the shared fallback. */\r\n protected readonly getErrorMessage = SignalsUtils.getFieldErrorMessage;\r\n\r\n /** Emitted when the user submits the form. Carries the entered credentials. */\r\n readonly done = output<CredentialsDialogResult>();\r\n\r\n /** Emitted when the user requests a password-recovery flow. */\r\n readonly recoveringPassword = output<CredentialsDialogResult>();\r\n\r\n /** Dialog configuration with defaults applied at construction time. */\r\n protected readonly dialogData = signal<CredentialsDialogData>((() => {\r\n const raw = (inject(MAT_DIALOG_DATA) as CredentialsDialogData | null) ?? {};\r\n const data: CredentialsDialogData = {\r\n appearance: 'fill',\r\n title: 'Informazioni',\r\n okCaption: 'Salva',\r\n mode: 'email',\r\n ...raw,\r\n };\r\n data.appearance ??= 'fill';\r\n data.title ??= 'Informazioni';\r\n data.okCaption ??= 'Salva';\r\n data.mode ??= 'email';\r\n if (data.mode === 'otp' && !data.message) {\r\n data.message = '<div class=\"small\">Inserisci il codice di verifica di 6 cifre che ti abbiamo inviato ora per email<br><span class=\"x-small\">(controlla anche la posta indesiderata)</span>.</div>';\r\n }\r\n return data;\r\n })());\r\n\r\n /** Model backing the signal form, pre-filled with the user name from dialog data when provided. */\r\n private readonly model = signal<CredentialsForm>(this.toForm());\r\n\r\n /**\r\n * Builds the form model from the dialog data, which may carry the account name to\r\n * pre-fill.\r\n * @returns A fresh form model.\r\n */\r\n private toForm(): CredentialsForm {\r\n return DtoUtils.toForm(_EMPTY_ITEM, { user: this.dialogData().user });\r\n }\r\n\r\n /**\r\n * Builds the dialog result from the current form model. The fields the active mode\r\n * does not use are left empty by the template and dropped here, so they travel as\r\n * absent instead of as empty strings.\r\n * @returns The credentials to emit through `done` or `recoveringPassword`.\r\n */\r\n private toPayload(): CredentialsDialogResult {\r\n return DtoUtils.toPayload(this.model());\r\n }\r\n\r\n /**\r\n * Signal form for the credentials. Validators follow the active mode: the user\r\n * field is a required email in `email` mode and plain required in `user` mode,\r\n * the password is required outside `otp` mode, and the OTP code is a required\r\n * complete 6-digit code in `otp` mode.\r\n */\r\n protected readonly form = form(this.model, p => {\r\n required(p.user, { when: () => this.dialogData().mode !== 'otp' });\r\n notEmpty(p.user, { when: () => this.dialogData().mode !== 'otp' });\r\n email(p.user, { when: () => this.dialogData().mode === 'email' });\r\n required(p.password, { when: () => this.dialogData().mode !== 'otp' });\r\n notEmpty(p.password, { when: () => this.dialogData().mode !== 'otp' });\r\n required(p.code, { when: () => this.dialogData().mode === 'otp' });\r\n notEmpty(p.code, { when: () => this.dialogData().mode === 'otp' });\r\n otp(p.code);\r\n });\r\n\r\n /** Whether the password field is currently shown as plain text. */\r\n protected readonly showPassword = signal<boolean>(false);\r\n\r\n /**\r\n * Switches the input mode of the dialog at runtime (e.g. from login to OTP).\r\n * Intended to be called from outside via the dialog component reference.\r\n * @param mode - The new input mode (`'email'`, `'user'`, or `'otp'`).\r\n * @param message - Optional new message to display above the form.\r\n */\r\n public changeMode(mode: 'email' | 'user' | 'otp', message?: string): void {\r\n this.dialogData.update(d => ({\r\n ...d,\r\n mode,\r\n message: message ?? d.message,\r\n }));\r\n }\r\n\r\n /**\r\n * Emits the current form result and closes the dialog.\r\n */\r\n protected ok(): void {\r\n this.done.emit(this.toPayload());\r\n }\r\n\r\n /**\r\n * Emits the current form result for the password-recovery flow and optionally\r\n * opens the recovery URL in a new tab.\r\n */\r\n protected recoverPassword(): void {\r\n this.recoveringPassword.emit(this.toPayload());\r\n const url = this.dialogData().recoverPasswordUrl;\r\n if (url) {\r\n window.open(url, '_blank');\r\n }\r\n }\r\n}\r\n","<div class=\"dialog-info\">\n @if (form().invalid()) {\n <span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\n } @else {\n <span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\n }\n</div>\n<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\n<mat-dialog-content class=\"dialog-content\">\n @if (dialogData().message) {\n <div [innerHtml]=\"dialogData().message | safeHtml\" style=\"padding-bottom: 20px;\"></div>\n }\n <form [formRoot]=\"form\" (keyup.enter)=\"!form().invalid() ? ok() : undefined\" novalidate>\n @if(dialogData().mode !== 'otp') {\n @if (dialogData().mode === 'email') {\n <mat-form-field style=\"width: 100%;\" [appearance]=\"dialogData().appearance\">\n <mat-label>Email</mat-label>\n <input type=\"email\" matInput [formField]=\"form.user\" [attr.aria-label]=\"'Email'\">\n @if (form.user().invalid()) {\n <mat-error>{{ getErrorMessage(form.user().errors()) }}</mat-error>\n }\n </mat-form-field>\n } @else if (dialogData().mode === 'user') {\n <mat-form-field style=\"width: 100%;\" [appearance]=\"dialogData().appearance\">\n <mat-label>Utente</mat-label>\n <input matInput [formField]=\"form.user\" [attr.aria-label]=\"'user'\">\n @if (form.user().invalid()) {\n <mat-error>{{ getErrorMessage(form.user().errors()) }}</mat-error>\n }\n </mat-form-field>\n }\n <mat-form-field style=\"width: 100%;\" [appearance]=\"dialogData().appearance\">\n <mat-label>La tua password abilitata</mat-label>\n <input matInput [type]=\"!showPassword() ? 'password' : 'text'\"\n [formField]=\"form.password\" [attr.aria-label]=\"'La tua password abilitata'\" autocomplete=\"on\">\n @if(form.password().value()) {\n <password-strength [password]=\"form.password().value()\"></password-strength>\n }\n <button type=\"button\" mat-icon-button class=\"toolbar-suffix\" matSuffix (click)=\"showPassword.set(!showPassword())\">\n <mat-icon>{{showPassword() ? 'visibility' : 'visibility_off'}}</mat-icon>\n </button>\n <mat-hint>Attento a maiuscole e minuscole</mat-hint>\n @if (form.password().invalid()) {\n <mat-error>{{ getErrorMessage(form.password().errors()) }}</mat-error>\n }\n </mat-form-field>\n @if (dialogData().remember || dialogData().recoverPassword) {\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxFill style=\"margin-top: 20px;\">\n <div>\n @if (dialogData().remember) {\n <mat-checkbox fxFlexAlign=\"center\" [formField]=\"form.rememberMe\"> Ricordami</mat-checkbox>\n }\n </div>\n <div fxLayoutAlign=\"end\">\n @if (dialogData().recoverPassword) {\n <button fxFlexAlign=\"center\" mat-button (click)=\"recoverPassword()\" title=\"Recupero password\"\n >Non riesco ad accedere</button>\n }\n </div>\n </div>\n }\n } @else {\n <otp-input [formField]=\"form.code\"></otp-input>\n }\n </form>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\n <button mat-flat-button [disabled]=\"form().invalid()\" (click)=\"ok()\">{{dialogData().okCaption}}</button>\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\n </div>\n</mat-dialog-actions>\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n output,\r\n signal\r\n} from '@angular/core';\r\nimport { email, form, FormField, FormRoot, maxLength, minLength, required } from '@angular/forms/signals';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { DtoUtils, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { equals, notEmpty, otp, password, SignalsUtils } from '@arsedizioni/ars-utils/core.validators';\r\nimport { PasswordStrengthComponent } from '../password-strength/password-strength.component';\r\nimport { ResetPasswordDialogResult, FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\r\n\r\nimport { ShellService } from '@arsedizioni/ars-utils/ui.shell';\r\nimport { OtpInputComponent } from '../otp/otp-input.component';\r\n\r\nexport type ResetPasswordDialogMode = 'admin' |'old' | 'otp' | 'forgot';\r\n\r\nexport interface ResetPasswordDialogData {\r\n mode: ResetPasswordDialogMode;\r\n userId?: number;\r\n userEmail?: string;\r\n appearance?: MatFormFieldAppearance;\r\n}\r\n\r\n/**\r\n * Form model of the password-reset dialog.\r\n *\r\n * {@link ResetPasswordDialogResult} is the DTO: every field of it is optional, so it\r\n * cannot back a signal form directly. Here every field is present — `userId` included,\r\n * which is carried through untouched — and an absent value becomes `null` for the\r\n * numeric id and `''` for the text fields, the empty states signal forms and the string\r\n * validators work with.\r\n */\r\ninterface ResetPasswordForm {\r\n /** Id of the account whose password is being reset; `null` in the modes that identify it by email. */\r\n userId: number | null;\r\n /** Email of the account; `''` outside the modes that ask for it. */\r\n userEmail: string;\r\n /** The current password, asked for in `old` mode; `''` elsewhere. */\r\n oldPassword: string;\r\n /** The new password. */\r\n password: string;\r\n /** Confirmation of the new password; `''` in `admin` mode, where it is not asked for. */\r\n password2: string;\r\n /** The 6-digit OTP code, asked for in `otp` mode; `''` elsewhere. */\r\n code: string;\r\n}\r\n\r\n/** Neutral form model: it declares every field the form owns and its empty value. */\r\nconst _EMPTY_ITEM: ResetPasswordForm = {\r\n userId: null,\r\n userEmail: '',\r\n oldPassword: '',\r\n password: '',\r\n password2: '',\r\n code: '',\r\n};\r\n\r\n@Component({\r\n templateUrl: './reset-password-dialog.component.html',\r\n styleUrl: './reset-password-dialog.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n FormField, FormRoot,\r\n FlexLayoutModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n PasswordStrengthComponent,\r\n MatIconModule,\r\n MatDialogActions,\r\n MatButtonModule,\r\n MatDialogClose,\r\n OtpInputComponent\r\n ],\r\n})\r\nexport class ResetPasswordDialogComponent {\r\n /** Error text of a field: the message declared in the schema, or the shared fallback. */\r\n protected readonly getErrorMessage = SignalsUtils.getFieldErrorMessage;\r\n\r\n /** Emitted when the user submits the new password. Carries the entered password data. */\r\n readonly done = output<ResetPasswordDialogResult>();\r\n\r\n private readonly dialogService = inject(ShellService);\r\n private readonly dialogRef = inject(MatDialogRef<ResetPasswordDialogComponent>);\r\n\r\n /** Dialog configuration with defaults applied at construction time. */\r\n protected readonly dialogData = signal<ResetPasswordDialogData>((() => {\r\n const raw = (inject(MAT_DIALOG_DATA) as ResetPasswordDialogData | null);\r\n return { mode: 'admin' as ResetPasswordDialogMode, appearance: 'fill' as MatFormFieldAppearance, ...raw };\r\n })());\r\n\r\n /** Model backing the signal form. */\r\n private readonly model = signal<ResetPasswordForm>(this.toForm());\r\n\r\n /**\r\n * Builds the form model from the dialog data, which identifies the account either by\r\n * id or by email depending on the mode.\r\n * @returns A fresh form model.\r\n */\r\n private toForm(): ResetPasswordForm {\r\n const data = this.dialogData();\r\n return DtoUtils.toForm(_EMPTY_ITEM, { userId: data.userId, userEmail: data.userEmail });\r\n }\r\n\r\n /**\r\n * Builds the dialog result from the current form model. The fields the active mode\r\n * does not use are left empty by the template and dropped here, so they travel as\r\n * absent instead of as empty strings.\r\n * @returns The reset data to emit through `done`.\r\n */\r\n private toPayload(): ResetPasswordDialogResult {\r\n return DtoUtils.toPayload(this.model());\r\n }\r\n\r\n /**\r\n * Signal form for the password reset. Validators follow the active mode:\r\n * the email is required in `forgot` mode, the old password in `old` mode,\r\n * a complete 6-digit OTP code in `otp` mode; the new password is always\r\n * required, at least 10 characters and strong enough, and its confirmation\r\n * (required outside `admin` mode) must match it.\r\n */\r\n protected readonly form = form(this.model, p => {\r\n required(p.userEmail, { when: () => this.dialogData().mode === 'forgot' });\r\n notEmpty(p.userEmail, { when: () => this.dialogData().mode === 'forgot' });\r\n email(p.userEmail, { when: () => this.dialogData().mode === 'forgot' });\r\n required(p.oldPassword, { when: () => this.dialogData().mode === 'old' });\r\n notEmpty(p.oldPassword, { when: () => this.dialogData().mode === 'old' });\r\n maxLength(p.oldPassword, 30);\r\n required(p.code, { when: () => this.dialogData().mode === 'otp' });\r\n notEmpty(p.code, { when: () => this.dialogData().mode === 'otp' });\r\n otp(p.code);\r\n required(p.password);\r\n notEmpty(p.password);\r\n minLength(p.password, 10);\r\n maxLength(p.password, 30);\r\n password(p.password);\r\n required(p.password2, { when: () => this.dialogData().mode !== 'admin' });\r\n notEmpty(p.password2, { when: () => this.dialogData().mode !== 'admin' });\r\n minLength(p.password2, 10);\r\n maxLength(p.password2, 30);\r\n password(p.password2);\r\n equals(p.password2, p.password);\r\n });\r\n\r\n /** Whether the old-password field is currently shown as plain text. */\r\n protected readonly showOldPassword = signal<boolean>(false);\r\n\r\n /** Whether the new-password field is currently shown as plain text. */\r\n protected readonly showPassword = signal<boolean>(false);\r\n\r\n /** Whether the confirm-password field is currently shown as plain text. */\r\n protected readonly showPassword2 = signal<boolean>(false);\r\n\r\n constructor() {\r\n const data = this.dialogData();\r\n const requireUserId = data.mode !== 'forgot' && data.mode !== 'otp' && data.mode !== 'old';\r\n if (requireUserId && !data.userId) {\r\n this.dialogRef.close();\r\n this.dialogService.error('Utente non specificato.');\r\n return;\r\n } else if ((data.mode === 'forgot' || data.mode === 'otp' || data.mode === 'old') && !data.userEmail) {\r\n this.dialogRef.close();\r\n this.dialogService.error('Email utente non specificata.');\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Emits the current form result to trigger the password-reset flow.\r\n */\r\n protected ok(): void {\r\n this.done.emit(this.toPayload());\r\n }\r\n\r\n /**\r\n * Generates a random password and populates both password fields with it.\r\n */\r\n protected generatePassword(): void {\r\n const password = SystemUtils.generatePassword();\r\n this.model.update(m => ({ ...m, password, password2: password }));\r\n }\r\n}\r\n","<div class=\"dialog-info\">\r\n @if (form().invalid()) {\r\n <span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\r\n } @else {\r\n <span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\r\n }\r\n</div>\r\n<div mat-dialog-title>Reimposta password</div>\r\n<mat-dialog-content class=\"dialog-content\">\r\n <form [formRoot]=\"form\" novalidate >\r\n @if (dialogData().mode === 'forgot') {\r\n <mat-form-field style=\"width: 100%;\" [appearance]=\"dialogData().appearance\">\r\n <mat-label>Email che hai scelto quando ti sei registrato</mat-label>\r\n <input type=\"email\" matInput [formField]=\"form.userEmail\"\r\n [attr.aria-label]=\"'Email con cui ti sei registrato'\">\r\n @if (form.userEmail().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.userEmail().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else if (dialogData().mode === 'old') {\r\n <mat-form-field style=\"width: 100%;\" [appearance]=\"dialogData().appearance\">\r\n <mat-label>Vecchia password</mat-label>\r\n <input [type]=\"!showOldPassword() ? 'password' : 'text'\" matInput autocomplete=\"on\"\r\n [formField]=\"form.oldPassword\">\r\n <button type=\"button\" mat-icon-button class=\"toolbar-suffix\" matSuffix\r\n (click)=\"showOldPassword.set(!showOldPassword())\">\r\n <mat-icon>{{showOldPassword() ? 'visibility' : 'visibility_off'}}</mat-icon>\r\n </button>\r\n @if(form.oldPassword().value()) {\r\n <password-strength [password]=\"form.oldPassword().value()\"></password-strength>\r\n }\r\n @if (form.oldPassword().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.oldPassword().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else if (dialogData().mode === 'otp') {\r\n <div style=\"font-size: small;\">Inserisci il codice di verifica di 6 cifre che ti abbiamo inviato ora per\r\n email<br><span style=\"font-size:x-small\">(controlla anche la posta indesiderata)</span>.</div>\r\n <otp-input [formField]=\"form.code\"></otp-input>\r\n }\r\n <mat-form-field style=\"width: 100%;\" hintLabel=\"Minimo 10 car. con 1 simbolo e 1 maiuscola\"\r\n [appearance]=\"dialogData().appearance\">\r\n <mat-label>Nuova password</mat-label>\r\n <input [type]=\"!showPassword() ? 'password' : 'text'\" matInput [formField]=\"form.password\">\r\n @if(form.password().value()) {\r\n <password-strength [password]=\"form.password().value()\"></password-strength>\r\n }\r\n <button type=\"button\" mat-icon-button class=\"toolbar-suffix\" matSuffix\r\n (click)=\"showPassword.set(!showPassword())\">\r\n <mat-icon>{{showPassword() ? 'visibility' : 'visibility_off'}}</mat-icon>\r\n </button>\r\n <mat-hint align=\"end\">{{form.password().value()?.length || 0}}/30</mat-hint>\r\n @if (form.password().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.password().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field style=\"width: 100%;\" hintLabel=\"Minimo 10 car. con 1 simbolo e 1 maiuscola\"\r\n [appearance]=\"dialogData().appearance\">\r\n <mat-label>Conferma nuova password</mat-label>\r\n <input [type]=\"!showPassword2() ? 'password' : 'text'\" matInput [formField]=\"form.password2\">\r\n <button type=\"button\" mat-icon-button class=\"toolbar-suffix\" matSuffix\r\n (click)=\"showPassword2.set(!showPassword2())\">\r\n <mat-icon>{{showPassword2() ? 'visibility' : 'visibility_off'}}</mat-icon>\r\n </button>\r\n @if(form.password2().value()) {\r\n <password-strength [password]=\"form.password2().value()\"></password-strength>\r\n }\r\n <mat-hint align=\"end\">{{form.password2().value()?.length || 0}}/30</mat-hint>\r\n @if (form.password2().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.password2().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n </form>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"30\">\r\n @if (dialogData().mode === 'admin') {\r\n <button mat-stroked-button (click)=\"generatePassword()\">Genera</button>\r\n }\r\n </div>\r\n <div fxFlex=\"70\" fxLayoutAlign=\"end\">\r\n <button mat-flat-button [disabled]=\"form().invalid()\" (click)=\"ok()\">Salva</button>\r\n @if (dialogData().mode !== 'forgot') {\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\r\n }\r\n </div>\r\n </div>\r\n</mat-dialog-actions>\r\n","import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\r\nimport { email, form, FormField, FormRoot, maxLength, required } from '@angular/forms/signals';\r\nimport { notEmpty, SignalsUtils } from '@arsedizioni/ars-utils/core.validators';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { DtoUtils } from '@arsedizioni/ars-utils/core';\r\nimport { FlexLayoutModule, RecoverPasswordDialogResult } from '@arsedizioni/ars-utils/ui';\r\n\r\nexport interface RecoverPasswordDialogData {\r\n appearance?: MatFormFieldAppearance;\r\n}\r\n\r\n/**\r\n * Form model of the password-recovery dialog.\r\n *\r\n * {@link RecoverPasswordDialogResult} is the DTO: every field of it is optional, so it\r\n * cannot back a signal form directly. Here every field is present and holds its empty\r\n * value, and {@link DtoUtils.toPayload} turns the model back into the DTO on the way out.\r\n */\r\ninterface RecoverPasswordForm {\r\n /** The email the recovery link is sent to; `''` when the input is empty. */\r\n email: string;\r\n /** Whether the recaptcha challenge has been solved. */\r\n recaptcha: boolean;\r\n}\r\n\r\n/** Neutral form model: it declares every field the form owns and its empty value. */\r\nconst _EMPTY_ITEM: RecoverPasswordForm = { email: '', recaptcha: false };\r\n\r\n@Component({\r\n templateUrl: './recover-password-dialog.component.html',\r\n styleUrl: './recover-password-dialog.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n FormField, FormRoot,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatDialogActions,\r\n FlexLayoutModule,\r\n MatDialogClose,\r\n ],\r\n})\r\nexport class RecoverPasswordDialogComponent {\r\n /** Error text of a field: the message declared in the schema, or the shared fallback. */\r\n protected readonly getErrorMessage = SignalsUtils.getFieldErrorMessage;\r\n\r\n\r\n /** Emitted when the user submits the recovery request. Carries the entered email and recaptcha state. */\r\n readonly done = output<RecoverPasswordDialogResult>();\r\n\r\n /** Dialog configuration with defaults applied at construction time. */\r\n protected readonly dialogData = signal<RecoverPasswordDialogData>({\r\n appearance: 'fill',\r\n ...((inject(MAT_DIALOG_DATA) as RecoverPasswordDialogData | null) ?? {}),\r\n });\r\n\r\n /** Model backing the signal form. */\r\n private readonly model = signal<RecoverPasswordForm>(this.toForm());\r\n\r\n /**\r\n * Builds the form model. The dialog is always opened empty, so the model is the\r\n * neutral one.\r\n * @returns A fresh form model.\r\n */\r\n private toForm(): RecoverPasswordForm {\r\n return DtoUtils.toForm(_EMPTY_ITEM);\r\n }\r\n\r\n /**\r\n * Builds the dialog result from the current form model, dropping the email when it\r\n * was left empty.\r\n * @returns The result to emit through `done`.\r\n */\r\n private toPayload(): RecoverPasswordDialogResult {\r\n return DtoUtils.toPayload(this.model());\r\n }\r\n\r\n /**\r\n * Signal form for the recovery request: the email is required and must be valid.\r\n */\r\n protected readonly form = form(this.model, p => {\r\n required(p.email);\r\n notEmpty(p.email);\r\n email(p.email);\r\n maxLength(p.email, 200);\r\n });\r\n\r\n /**\r\n * Emits the current form result to trigger the password-recovery flow.\r\n */\r\n protected ok(): void {\r\n this.done.emit(this.toPayload());\r\n }\r\n}\r\n","<div class=\"dialog-info\">\n @if (form().invalid()) {\n <span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\n } @else {\n <span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\n }\n</div>\n<div mat-dialog-title>Per quale ragione non sei in grado di effettuare l'accesso?</div>\n<mat-dialog-content class=\"dialog-content\">\n\n <b>1. Ho dimenticato la password</b>\n <p>\n Puoi recuperarla facilmente inserendo l'email a cui la password è collegata. Non è possibile recuperare password\n aziendali (non collegate ad un email).</p>\n <form [formRoot]=\"form\" (keyup.enter)=\"!form().invalid() ? ok() : undefined\" novalidate>\n\n <mat-form-field style=\"width:100%\" [appearance]=\"dialogData().appearance\">\n <mat-label>Email con cui ti sei registrato</mat-label>\n <input type=\"email\" matInput [formField]=\"form.email\" />\n @if (form.email().invalid()) {\n <mat-error>{{ getErrorMessage(form.email().errors()) }}</mat-error>\n }\n </mat-form-field>\n\n <div style=\"margin-top:20px; margin-bottom:20px;\">\n <button type=\"button\" mat-flat-button (click)=\"ok()\" [disabled]=\"form().invalid()\"\n aria-label=\"Recupera password\">Recupera password</button>\n </div>\n </form>\n <p></p>\n <b>2. Il sistema mi dice che la password non è corretta.</b>\n <p>\n E' molto probabile che ci sia stato un difetto di digitazione. Per favore controlla bene che non vi siano spazi non\n richiesti e che la password rispetti perfettamente le maiuscole e minuscole. Nel caso in cui la digitazione fosse\n corretta, verifica che la data del tuo abbonamento non sia scaduta.\n </p>\n <p></p>\n <b>3. Il sistema mi dice che non può accettare connessioni dal mio indirizzo IP</b>\n <p>\n Il tuo abbonamento è stato vincolato ad un indirizzo IP (indirizzo dal quale ti colleghi). Capita sovente che\n questi indirizzi siano cambiati da parte del reparto IT per questioni di sicurezza informatica.\n Per risolvere il problema, contattate il reparto IT e fatevi dire qual'è il nuovo indirizzo IP e comunicatelo ad\n ARS Edizioni Informatiche.\n </p>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\n <button mat-stroked-button [mat-dialog-close]=\"true\" >Chiudi</button>\n </div>\n</mat-dialog-actions>","import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\r\nimport { FlexLayoutModule, PromptDialogData, PromptDialogType, PromptOtpDialogResult } from '@arsedizioni/ars-utils/ui';\r\nimport { ShellService } from '@arsedizioni/ars-utils/ui.shell';\r\nimport { OtpInputComponent } from '../otp/otp-input.component';\r\nimport { form, FormField, FormRoot, required } from '@angular/forms/signals';\r\nimport { notEmpty } from '@arsedizioni/ars-utils/core.validators';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { DtoUtils, SafeHtmlPipe } from '@arsedizioni/ars-utils/core';\r\n\r\n/**\r\n * Form model of the OTP dialog.\r\n *\r\n * {@link PromptOtpDialogResult} is the DTO: it leaves the code out when there is none.\r\n * The form cannot, so the field is always present and holds `''` when empty.\r\n */\r\ninterface PromptOtpForm {\r\n /** The 6-digit OTP code; `''` while the user has not completed it. */\r\n value: string;\r\n}\r\n\r\n/** Neutral form model: it declares every field the form owns and its empty value. */\r\nconst _EMPTY_ITEM: PromptOtpForm = { value: '' };\r\n\r\n@Component({\r\n templateUrl: './prompt-otp-dialog.component.html',\r\n styleUrl: './prompt-otp-dialog.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatDialogTitle, MatDialogContent, FormField, FormRoot, FlexLayoutModule, MatButtonModule, MatIconModule,\r\n MatDialogActions, MatDialogClose, SafeHtmlPipe, OtpInputComponent]\r\n})\r\nexport class PromptOtpDialogComponent {\r\n readonly done = output<PromptOtpDialogResult>();\r\n private readonly dialogService = inject(ShellService);\r\n protected readonly dialogData = signal<PromptDialogData>((() => {\r\n const data: PromptDialogData = inject(MAT_DIALOG_DATA) ?? {};\r\n return {\r\n ...data,\r\n appearance: data.appearance ?? 'fill',\r\n title: data.title ?? 'Conferma la tua identità',\r\n type: data.type ?? PromptDialogType.Default,\r\n okCaption: data.okCaption ?? 'Ok',\r\n cancelCaption: data.cancelCaption ?? 'Annulla',\r\n };\r\n })());\r\n\r\n /** Model backing the signal form. `value` holds the 6-digit OTP code. */\r\n private readonly model = signal<PromptOtpForm>(this.toForm());\r\n\r\n /**\r\n * Builds the form model. The dialog has no incoming value, so the model is the\r\n * neutral one.\r\n * @returns A fresh form model.\r\n */\r\n private toForm(): PromptOtpForm {\r\n return DtoUtils.toForm(_EMPTY_ITEM);\r\n }\r\n\r\n /**\r\n * Builds the dialog result from the current form model, dropping the empty code.\r\n * @returns The result carrying the entered OTP code.\r\n */\r\n private toPayload(): PromptOtpDialogResult {\r\n return DtoUtils.toPayload(this.model());\r\n }\r\n\r\n /**\r\n * Signal form for the OTP code. The code is always required here; the\r\n * \"complete 6 digits\" rule comes from the OtpInputComponent validator,\r\n * honoured through the ControlValueAccessor interop.\r\n */\r\n protected readonly form = form(this.model, p => {\r\n required(p.value);\r\n notEmpty(p.value);\r\n });\r\n\r\n /**\r\n * Validates the form and emits the OTP result, or shows an error if validation fails.\r\n */\r\n protected ok(): void {\r\n if (this.form().invalid()) {\r\n this.form().markAsTouched();\r\n this.dialogService.error('Ci sono degli errori da correggere.');\r\n return;\r\n }\r\n this.done.emit(this.toPayload());\r\n }\r\n}\r\n","<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\r\n<mat-dialog-content class=\"dialog-content\">\r\n @if (dialogData().description) {\r\n <div [innerHtml]=\"dialogData().description | safeHtml\" style=\"padding-bottom: 20px;\"></div>\r\n }\r\n <form [formRoot]=\"form\" novalidate>\r\n <div fxLayout=\"column\" fxLayoutGap=\"32px\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"column\" fxFill>\r\n <otp-input [formField]=\"form.value\"></otp-input>\r\n </div>\r\n <br>\r\n </div>\r\n </form>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button [disabled]=\"form().invalid()\" (click)=\"ok()\">{{dialogData().okCaption}}</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">{{dialogData().cancelCaption}}</button>\r\n </div>\r\n</mat-dialog-actions>\r\n","/*\n * Public API Surface of @arsedizioni/ars-utils/ui.dialogs.auth\n */\nexport * from './otp/otp-input.component';\nexport * from './password-strength/password-strength.component';\nexport * from './credentials/credentials-dialog.component';\nexport * from './reset-password/reset-password-dialog.component';\nexport * from './recover-password/recover-password-dialog.component';\nexport * from './prompt-otp/prompt-otp-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["_EMPTY_ITEM","i5","i1","i2","i3","i4"],"mappings":"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"}
1
+ {"version":3,"file":"arsedizioni-ars-utils-ui.dialogs.auth.mjs","sources":["../../../projects/ars-utils/ui.dialogs.auth/otp/otp-input.component.ts","../../../projects/ars-utils/ui.dialogs.auth/otp/otp-input.component.html","../../../projects/ars-utils/ui.dialogs.auth/password-strength/password-strength.component.ts","../../../projects/ars-utils/ui.dialogs.auth/password-strength/password-strength.component.html","../../../projects/ars-utils/ui.dialogs.auth/credentials/credentials-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.auth/credentials/credentials-dialog.component.html","../../../projects/ars-utils/ui.dialogs.auth/reset-password/reset-password-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.auth/reset-password/reset-password-dialog.component.html","../../../projects/ars-utils/ui.dialogs.auth/recover-password/recover-password-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.auth/recover-password/recover-password-dialog.component.html","../../../projects/ars-utils/ui.dialogs.auth/prompt-otp/prompt-otp-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.auth/prompt-otp/prompt-otp-dialog.component.html","../../../projects/ars-utils/ui.dialogs.auth/public_api.ts","../../../projects/ars-utils/ui.dialogs.auth/arsedizioni-ars-utils-ui.dialogs.auth.ts"],"sourcesContent":["import { Component, ElementRef, computed, forwardRef, signal, viewChildren, ChangeDetectionStrategy } from '@angular/core';\nimport { AbstractControl, ControlValueAccessor, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\n\n\n@Component({\n selector: 'otp-input',\n standalone: true,\n templateUrl: './otp-input.component.html',\n styleUrl: './otp-input.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OtpInputComponent),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => OtpInputComponent),\n multi: true,\n },\n ],\n})\nexport class OtpInputComponent implements ControlValueAccessor, Validator {\n /** Signal-based query for all individual OTP digit input elements. */\n readonly otpFields = viewChildren<ElementRef<HTMLInputElement>>('otpField');\n\n /** `true` when every digit slot contains a valid single decimal digit. */\n readonly isValid = computed(() => this.otpArray().every(d => /^\\d$/.test(d)));\n\n /** Array of per-digit values backing the OTP display. */\n readonly otpArray = signal<string[]>(Array(6).fill(''));\n\n /** Whether the control is currently disabled. */\n readonly disabled = signal<boolean>(false);\n\n private onChange: (val: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n // ── ControlValueAccessor ───────────────────────────────────────────────────\n\n /**\n * Writes a new value into the control from the model.\n * @param value - A string of up to 6 digits to pre-fill the OTP fields.\n */\n writeValue(value: string): void {\n const arr = Array(6).fill('');\n if (value) {\n value.split('').forEach((c, i) => {\n if (i < 6) arr[i] = c;\n });\n }\n this.otpArray.set(arr);\n }\n\n /**\n * Registers the callback invoked when the control value changes.\n * @param fn - The callback function.\n */\n registerOnChange(fn: (val: string) => void): void {\n this.onChange = fn;\n }\n\n /**\n * Registers the callback invoked when the control is touched.\n * @param fn - The callback function.\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /**\n * Enables or disables the control.\n * @param isDisabled - `true` to disable all OTP inputs.\n */\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n\n // ── Validator ──────────────────────────────────────────────────────────────\n\n /**\n * Validates the OTP value: an empty code is left to `required`, while a\n * PARTIAL code (e.g. \"12\") is reported as invalid. Without this, the joined\n * value \"12\" was a non-empty string and `required` let the form submit\n * with an incomplete OTP.\n * @param control - The form control bound to this component.\n * @returns `null` when empty or complete (6 digits), `{ otp: true }` otherwise.\n */\n validate(control: AbstractControl): ValidationErrors | null {\n const value: string = control.value ?? '';\n if (value.length === 0) return null; // let `required` handle emptiness\n return /^\\d{6}$/.test(value) ? null : { otp: true };\n }\n\n /**\n * Marks the control as touched when an OTP field loses focus.\n */\n onBlur(): void {\n this.onTouched();\n }\n\n // ── Event handlers ─────────────────────────────────────────────────────────\n\n /**\n * Blocks non-digit characters before they are inserted.\n * @param event - The `beforeinput` event from the input element.\n */\n onBeforeInput(event: InputEvent): void {\n if (event.data && !/^\\d$/.test(event.data)) {\n event.preventDefault();\n }\n }\n\n/**\n * Handles digit input, sanitizes it, syncs the DOM, updates the OTP array, and advances focus.\n * @param event - The `input` event from the digit field.\n * @param index - Zero-based index of the field that received input.\n */\n onInput(event: Event, index: number): void {\n const input = event.target as HTMLInputElement;\n const val = input.value.replace(/\\D/g, '').slice(-1);\n\n // Force-sync the DOM: [value] won't rewrite it when the model value is unchanged.\n input.value = val;\n\n const arr = [...this.otpArray()];\n arr[index] = val;\n this.otpArray.set(arr);\n\n this.updateModel();\n\n if (val && index < 5) {\n this.focusField(index + 1);\n }\n }\n\n /**\n * Handles the Backspace key by moving focus to the previous field when the current one is empty.\n * @param event - The `keydown` event.\n * @param index - Zero-based index of the field that received the keydown.\n */\n onKeyDown(event: KeyboardEvent, index: number): void {\n if (event.key === 'Backspace' && !this.otpArray()[index] && index > 0) {\n this.focusField(index - 1);\n }\n }\n\n /**\n * Handles paste events by extracting up to 6 digits and distributing them across the OTP fields.\n * @param event - The `ClipboardEvent` from the paste action.\n */\n onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n const pasted = event.clipboardData?.getData('text') ?? '';\n const digits = pasted.replace(/\\D/g, '').slice(0, 6).split('');\n\n if (digits.length > 0) {\n const arr = Array(6).fill('');\n digits.forEach((d, i) => (arr[i] = d));\n this.otpArray.set(arr);\n this.updateModel();\n this.focusField(Math.min(digits.length, 5));\n }\n }\n\n\n \n // ── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Clears every digit field, propagates the empty value to the form model and\n * moves focus back to the first field. Does not mark the control as touched,\n * so no validation error is shown right after the reset.\n */\n clear(): void {\n this.otpArray.set(Array(6).fill(''));\n // Force-sync the DOM: [value] won't rewrite fields whose bound value is unchanged.\n this.otpFields().forEach(f => (f.nativeElement.value = ''));\n this.onChange('');\n this.focusField(0);\n }\n\n /**\n * Moves focus to the OTP field at the given index.\n * @param index - Zero-based index of the target field.\n */\n private focusField(index: number): void {\n const field = this.otpFields()[index];\n field?.nativeElement.focus();\n field?.nativeElement.select();\n }\n\n /**\n * Notifies the form model of the current OTP value and marks the control as touched.\n */\n private updateModel(): void {\n const code = this.otpArray().join('');\n this.onChange(code);\n this.onTouched();\n }\n}\n","<div class=\"otp-container\">\n @for (digit of otpArray(); track $index) {\n <input\n #otpField\n type=\"text\"\n maxlength=\"1\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n autocomplete=\"one-time-code\"\n class=\"otp-box\"\n [value]=\"digit\"\n (beforeinput)=\"onBeforeInput($event)\"\n (input)=\"onInput($event, $index)\"\n (keydown)=\"onKeyDown($event, $index)\"\n (blur)=\"onBlur()\"\n (paste)=\"onPaste($event)\"\n [disabled]=\"disabled()\"\n required\n />\n }\n</div>\n\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PasswordStrength, SystemUtils } from '@arsedizioni/ars-utils/core';\n\nconst DEFAULT_STRENGTH: PasswordStrength = { score: 0, label: '', color: '', suggestions: [], isValid: false };\n\n/**\n * Displays a password-strength indicator for the provided password string.\n * Uses `SystemUtils.calculatePasswordStrength` to derive the score and label.\n */\n@Component({\n selector: 'password-strength',\n templateUrl: './password-strength.component.html',\n styleUrl: './password-strength.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatTooltipModule]\n})\nexport class PasswordStrengthComponent {\n /** The password to evaluate. An empty string renders the default (score 0) state. */\n readonly password = input<string>('');\n\n /**\n * Computed strength result for the current password.\n * Falls back to `DEFAULT_STRENGTH` when the password is empty.\n */\n protected readonly strength = computed<PasswordStrength>(() => {\n const pwd = this.password();\n return pwd ? SystemUtils.calculatePasswordStrength(pwd) : DEFAULT_STRENGTH;\n });\n\n /**\n * CSS class applied to the label element based on the numeric score (1–6 bands).\n * Scores ≤ 2 → `'score-2'`, ≤ 3 → `'score-3'`, etc.\n */\n protected readonly scoreClass = computed<string>(() => {\n const score = this.strength().score;\n if (score <= 2) return 'score-2';\n if (score <= 3) return 'score-3';\n if (score <= 4) return 'score-4';\n if (score <= 5) return 'score-5';\n return 'score-6';\n });\n}\n","<div class=\"wide x-small bold\" style=\"white-space: nowrap; padding-top:4px\" [matTooltip]=\"strength().suggestions?.join('\\n ')\">\r\n <span [class]=\"scoreClass()\">{{strength().label}}</span>\r\n</div>","import { Component, inject, output, signal, ChangeDetectionStrategy } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';\r\nimport { CredentialsDialogResult, FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\r\nimport { DtoUtils, SafeHtmlPipe } from '@arsedizioni/ars-utils/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { email, form, FormField, FormRoot, maxLength, required } from '@angular/forms/signals';\r\nimport { notEmpty, otp, SignalsUtils } from '@arsedizioni/ars-utils/core.validators';\r\nimport { PasswordStrengthComponent } from '../password-strength/password-strength.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { OtpInputComponent } from '../otp/otp-input.component';\r\n\r\nexport interface CredentialsDialogData {\r\n title?: string;\r\n message?: string;\r\n remember?: boolean;\r\n recoverPassword?: boolean;\r\n recoverPasswordUrl?: string;\r\n user?: string;\r\n okCaption?: string;\r\n mode?: 'email' | 'user' | 'otp';\r\n maxLength?: number;\r\n appearance?: MatFormFieldAppearance;\r\n}\r\n\r\n/**\r\n * Form model of the credentials dialog.\r\n *\r\n * {@link CredentialsDialogResult} is the DTO: every field of it is optional, so it\r\n * cannot back a signal form directly. Here every field is present and holds its empty\r\n * value, and {@link DtoUtils.toPayload} turns the model back into the DTO on the way out.\r\n */\r\ninterface CredentialsForm {\r\n /** The account name or email; `''` when the input is empty. */\r\n user: string;\r\n /** The password; `''` when the input is empty or the dialog is in `otp` mode. */\r\n password: string;\r\n /** Whether the session should be remembered. */\r\n rememberMe: boolean;\r\n /** The 6-digit OTP code; `''` outside `otp` mode. */\r\n code: string;\r\n}\r\n\r\n/** Neutral form model: it declares every field the form owns and its empty value. */\r\nconst _EMPTY_ITEM: CredentialsForm = { user: '', password: '', rememberMe: false, code: '' };\r\n\r\n@Component({\r\n templateUrl: './credentials-dialog.component.html',\r\n styleUrl: './credentials-dialog.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n FormField, FormRoot,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatIconModule,\r\n MatCheckboxModule,\r\n MatDialogActions,\r\n FlexLayoutModule,\r\n MatButtonModule,\r\n MatDialogClose,\r\n PasswordStrengthComponent,\r\n OtpInputComponent,\r\n SafeHtmlPipe,\r\n ],\r\n})\r\nexport class CredentialsDialogComponent {\r\n /** Error text of a field: the message declared in the schema, or the shared fallback. */\r\n protected readonly getErrorMessage = SignalsUtils.getFieldErrorMessage;\r\n\r\n /** Emitted when the user submits the form. Carries the entered credentials. */\r\n readonly done = output<CredentialsDialogResult>();\r\n\r\n /** Emitted when the user requests a password-recovery flow. */\r\n readonly recoveringPassword = output<CredentialsDialogResult>();\r\n\r\n /** Dialog configuration with defaults applied at construction time. */\r\n protected readonly dialogData = signal<CredentialsDialogData>((() => {\r\n const raw = (inject(MAT_DIALOG_DATA) as CredentialsDialogData | null) ?? {};\r\n const data: CredentialsDialogData = {\r\n appearance: 'fill',\r\n maxLength: 30,\r\n title: 'Informazioni',\r\n okCaption: 'Salva',\r\n mode: 'email',\r\n ...raw,\r\n };\r\n data.appearance ??= 'fill';\r\n data.title ??= 'Informazioni';\r\n data.okCaption ??= 'Salva';\r\n data.mode ??= 'email';\r\n data.maxLength ??= 30;\r\n if (data.mode === 'otp' && !data.message) {\r\n data.message = '<div class=\"small\">Inserisci il codice di verifica di 6 cifre che ti abbiamo inviato ora per email<br><span class=\"x-small\">(controlla anche la posta indesiderata)</span>.</div>';\r\n }\r\n return data;\r\n })());\r\n\r\n /** Model backing the signal form, pre-filled with the user name from dialog data when provided. */\r\n private readonly model = signal<CredentialsForm>(this.toForm());\r\n\r\n /**\r\n * Builds the form model from the dialog data, which may carry the account name to\r\n * pre-fill.\r\n * @returns A fresh form model.\r\n */\r\n private toForm(): CredentialsForm {\r\n return DtoUtils.toForm(_EMPTY_ITEM, { user: this.dialogData().user });\r\n }\r\n\r\n /**\r\n * Builds the dialog result from the current form model. The fields the active mode\r\n * does not use are left empty by the template and dropped here, so they travel as\r\n * absent instead of as empty strings.\r\n * @returns The credentials to emit through `done` or `recoveringPassword`.\r\n */\r\n private toPayload(): CredentialsDialogResult {\r\n return DtoUtils.toPayload(this.model());\r\n }\r\n\r\n /**\r\n * Signal form for the credentials. Validators follow the active mode: the user\r\n * field is a required email in `email` mode and plain required in `user` mode,\r\n * the password is required outside `otp` mode, and the OTP code is a required\r\n * complete 6-digit code in `otp` mode.\r\n */\r\n protected readonly form = form(this.model, p => {\r\n required(p.user, { when: () => this.dialogData().mode !== 'otp' });\r\n notEmpty(p.user, { when: () => this.dialogData().mode !== 'otp' });\r\n email(p.user, { when: () => this.dialogData().mode === 'email' });\r\n required(p.password, { when: () => this.dialogData().mode !== 'otp' });\r\n notEmpty(p.password, { when: () => this.dialogData().mode !== 'otp' });\r\n maxLength(p.password, this.dialogData().maxLength ?? 30);\r\n required(p.code, { when: () => this.dialogData().mode === 'otp' });\r\n notEmpty(p.code, { when: () => this.dialogData().mode === 'otp' });\r\n otp(p.code);\r\n });\r\n\r\n /** Whether the password field is currently shown as plain text. */\r\n protected readonly showPassword = signal<boolean>(false);\r\n\r\n /**\r\n * Switches the input mode of the dialog at runtime (e.g. from login to OTP).\r\n * Intended to be called from outside via the dialog component reference.\r\n * @param mode - The new input mode (`'email'`, `'user'`, or `'otp'`).\r\n * @param message - Optional new message to display above the form.\r\n */\r\n public changeMode(mode: 'email' | 'user' | 'otp', message?: string): void {\r\n this.dialogData.update(d => ({\r\n ...d,\r\n mode,\r\n message: message ?? d.message,\r\n }));\r\n }\r\n\r\n /**\r\n * Emits the current form result and closes the dialog.\r\n */\r\n protected ok(): void {\r\n this.done.emit(this.toPayload());\r\n }\r\n\r\n /**\r\n * Emits the current form result for the password-recovery flow and optionally\r\n * opens the recovery URL in a new tab.\r\n */\r\n protected recoverPassword(): void {\r\n this.recoveringPassword.emit(this.toPayload());\r\n const url = this.dialogData().recoverPasswordUrl;\r\n if (url) {\r\n window.open(url, '_blank');\r\n }\r\n }\r\n}\r\n","<div class=\"dialog-info\">\n @if (form().invalid()) {\n <span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\n } @else {\n <span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\n }\n</div>\n<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\n<mat-dialog-content class=\"dialog-content\">\n @if (dialogData().message) {\n <div [innerHtml]=\"dialogData().message | safeHtml\" style=\"padding-bottom: 20px;\"></div>\n }\n <form [formRoot]=\"form\" (keyup.enter)=\"!form().invalid() ? ok() : undefined\" novalidate>\n @if(dialogData().mode !== 'otp') {\n @if (dialogData().mode === 'email') {\n <mat-form-field style=\"width: 100%;\" [appearance]=\"dialogData().appearance\">\n <mat-label>Email</mat-label>\n <input type=\"email\" matInput [formField]=\"form.user\" [attr.aria-label]=\"'Email'\">\n @if (form.user().invalid()) {\n <mat-error>{{ getErrorMessage(form.user().errors()) }}</mat-error>\n }\n </mat-form-field>\n } @else if (dialogData().mode === 'user') {\n <mat-form-field style=\"width: 100%;\" [appearance]=\"dialogData().appearance\">\n <mat-label>Utente</mat-label>\n <input matInput [formField]=\"form.user\" [attr.aria-label]=\"'user'\">\n @if (form.user().invalid()) {\n <mat-error>{{ getErrorMessage(form.user().errors()) }}</mat-error>\n }\n </mat-form-field>\n }\n <mat-form-field style=\"width: 100%;\" [appearance]=\"dialogData().appearance\">\n <mat-label>La tua password abilitata</mat-label>\n <input matInput [type]=\"!showPassword() ? 'password' : 'text'\"\n [formField]=\"form.password\" [attr.aria-label]=\"'La tua password abilitata'\" autocomplete=\"on\">\n @if(form.password().value()) {\n <password-strength [password]=\"form.password().value()\"></password-strength>\n }\n <button type=\"button\" mat-icon-button class=\"toolbar-suffix\" matSuffix (click)=\"showPassword.set(!showPassword())\">\n <mat-icon>{{showPassword() ? 'visibility' : 'visibility_off'}}</mat-icon>\n </button>\n <mat-hint>Attento a maiuscole e minuscole</mat-hint>\n @if (form.password().invalid()) {\n <mat-error>{{ getErrorMessage(form.password().errors()) }}</mat-error>\n }\n </mat-form-field>\n @if (dialogData().remember || dialogData().recoverPassword) {\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxFill style=\"margin-top: 20px;\">\n <div>\n @if (dialogData().remember) {\n <mat-checkbox fxFlexAlign=\"center\" [formField]=\"form.rememberMe\"> Ricordami</mat-checkbox>\n }\n </div>\n <div fxLayoutAlign=\"end\">\n @if (dialogData().recoverPassword) {\n <button fxFlexAlign=\"center\" mat-button (click)=\"recoverPassword()\" title=\"Recupero password\"\n >Non riesco ad accedere</button>\n }\n </div>\n </div>\n }\n } @else {\n <otp-input [formField]=\"form.code\"></otp-input>\n }\n </form>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\n <button mat-flat-button [disabled]=\"form().invalid()\" (click)=\"ok()\">{{dialogData().okCaption}}</button>\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\n </div>\n</mat-dialog-actions>\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n output,\r\n signal\r\n} from '@angular/core';\r\nimport { email, form, FormField, FormRoot, maxLength, minLength, required } from '@angular/forms/signals';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { DtoUtils, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { equals, notEmpty, otp, password, SignalsUtils } from '@arsedizioni/ars-utils/core.validators';\r\nimport { PasswordStrengthComponent } from '../password-strength/password-strength.component';\r\nimport { ResetPasswordDialogResult, FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\r\n\r\nimport { ShellService } from '@arsedizioni/ars-utils/ui.shell';\r\nimport { OtpInputComponent } from '../otp/otp-input.component';\r\n\r\nexport type ResetPasswordDialogMode = 'admin' |'old' | 'otp' | 'forgot';\r\n\r\nexport interface ResetPasswordDialogData {\r\n mode: ResetPasswordDialogMode;\r\n maxLength?: number;\r\n userId?: number;\r\n userEmail?: string;\r\n appearance?: MatFormFieldAppearance;\r\n}\r\n\r\n/**\r\n * Form model of the password-reset dialog.\r\n *\r\n * {@link ResetPasswordDialogResult} is the DTO: every field of it is optional, so it\r\n * cannot back a signal form directly. Here every field is present — `userId` included,\r\n * which is carried through untouched — and an absent value becomes `null` for the\r\n * numeric id and `''` for the text fields, the empty states signal forms and the string\r\n * validators work with.\r\n */\r\ninterface ResetPasswordForm {\r\n /** Id of the account whose password is being reset; `null` in the modes that identify it by email. */\r\n userId: number | null;\r\n /** Email of the account; `''` outside the modes that ask for it. */\r\n userEmail: string;\r\n /** The current password, asked for in `old` mode; `''` elsewhere. */\r\n oldPassword: string;\r\n /** The new password. */\r\n password: string;\r\n /** Confirmation of the new password; `''` in `admin` mode, where it is not asked for. */\r\n password2: string;\r\n /** The 6-digit OTP code, asked for in `otp` mode; `''` elsewhere. */\r\n code: string;\r\n}\r\n\r\n/** Neutral form model: it declares every field the form owns and its empty value. */\r\nconst _EMPTY_ITEM: ResetPasswordForm = {\r\n userId: null,\r\n userEmail: '',\r\n oldPassword: '',\r\n password: '',\r\n password2: '',\r\n code: '',\r\n};\r\n\r\n@Component({\r\n templateUrl: './reset-password-dialog.component.html',\r\n styleUrl: './reset-password-dialog.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n FormField, FormRoot,\r\n FlexLayoutModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n PasswordStrengthComponent,\r\n MatIconModule,\r\n MatDialogActions,\r\n MatButtonModule,\r\n MatDialogClose,\r\n OtpInputComponent\r\n ],\r\n})\r\nexport class ResetPasswordDialogComponent {\r\n /** Error text of a field: the message declared in the schema, or the shared fallback. */\r\n protected readonly getErrorMessage = SignalsUtils.getFieldErrorMessage;\r\n\r\n /** Emitted when the user submits the new password. Carries the entered password data. */\r\n readonly done = output<ResetPasswordDialogResult>();\r\n\r\n private readonly dialogService = inject(ShellService);\r\n private readonly dialogRef = inject(MatDialogRef<ResetPasswordDialogComponent>);\r\n\r\n /** Dialog configuration with defaults applied at construction time. */\r\n protected readonly dialogData = signal<ResetPasswordDialogData>((() => {\r\n const raw = (inject(MAT_DIALOG_DATA) as ResetPasswordDialogData | null);\r\n return { mode: 'admin' as ResetPasswordDialogMode, appearance: 'fill' as MatFormFieldAppearance, ...raw };\r\n })());\r\n\r\n /** Model backing the signal form. */\r\n private readonly model = signal<ResetPasswordForm>(this.toForm());\r\n\r\n /**\r\n * Builds the form model from the dialog data, which identifies the account either by\r\n * id or by email depending on the mode.\r\n * @returns A fresh form model.\r\n */\r\n private toForm(): ResetPasswordForm {\r\n const data = this.dialogData();\r\n return DtoUtils.toForm(_EMPTY_ITEM, { userId: data.userId, userEmail: data.userEmail });\r\n }\r\n\r\n /**\r\n * Builds the dialog result from the current form model. The fields the active mode\r\n * does not use are left empty by the template and dropped here, so they travel as\r\n * absent instead of as empty strings.\r\n * @returns The reset data to emit through `done`.\r\n */\r\n private toPayload(): ResetPasswordDialogResult {\r\n return DtoUtils.toPayload(this.model());\r\n }\r\n\r\n /**\r\n * Signal form for the password reset. Validators follow the active mode:\r\n * the email is required in `forgot` mode, the old password in `old` mode,\r\n * a complete 6-digit OTP code in `otp` mode; the new password is always\r\n * required, at least 10 characters and strong enough, and its confirmation\r\n * (required outside `admin` mode) must match it.\r\n */\r\n protected readonly form = form(this.model, p => {\r\n required(p.userEmail, { when: () => this.dialogData().mode === 'forgot' });\r\n notEmpty(p.userEmail, { when: () => this.dialogData().mode === 'forgot' });\r\n email(p.userEmail, { when: () => this.dialogData().mode === 'forgot' });\r\n required(p.oldPassword, { when: () => this.dialogData().mode === 'old' });\r\n notEmpty(p.oldPassword, { when: () => this.dialogData().mode === 'old' });\r\n maxLength(p.oldPassword, 30);\r\n required(p.code, { when: () => this.dialogData().mode === 'otp' });\r\n notEmpty(p.code, { when: () => this.dialogData().mode === 'otp' });\r\n otp(p.code);\r\n required(p.password);\r\n notEmpty(p.password);\r\n minLength(p.password, 10);\r\n maxLength(p.password, this.dialogData().maxLength ?? 30);\r\n password(p.password);\r\n required(p.password2, { when: () => this.dialogData().mode !== 'admin' });\r\n notEmpty(p.password2, { when: () => this.dialogData().mode !== 'admin' });\r\n minLength(p.password2, 10);\r\n maxLength(p.password2, this.dialogData().maxLength ?? 30);\r\n password(p.password2);\r\n equals(p.password2, p.password);\r\n });\r\n\r\n /** Whether the old-password field is currently shown as plain text. */\r\n protected readonly showOldPassword = signal<boolean>(false);\r\n\r\n /** Whether the new-password field is currently shown as plain text. */\r\n protected readonly showPassword = signal<boolean>(false);\r\n\r\n /** Whether the confirm-password field is currently shown as plain text. */\r\n protected readonly showPassword2 = signal<boolean>(false);\r\n\r\n constructor() {\r\n const data = this.dialogData();\r\n const requireUserId = data.mode !== 'forgot' && data.mode !== 'otp' && data.mode !== 'old';\r\n if (requireUserId && !data.userId) {\r\n this.dialogRef.close();\r\n this.dialogService.error('Utente non specificato.');\r\n return;\r\n } else if ((data.mode === 'forgot' || data.mode === 'otp' || data.mode === 'old') && !data.userEmail) {\r\n this.dialogRef.close();\r\n this.dialogService.error('Email utente non specificata.');\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Emits the current form result to trigger the password-reset flow.\r\n */\r\n protected ok(): void {\r\n this.done.emit(this.toPayload());\r\n }\r\n\r\n /**\r\n * Generates a random password and populates both password fields with it.\r\n */\r\n protected generatePassword(): void {\r\n const password = SystemUtils.generatePassword();\r\n this.model.update(m => ({ ...m, password, password2: password }));\r\n }\r\n}\r\n","<div class=\"dialog-info\">\r\n @if (form().invalid()) {\r\n <span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\r\n } @else {\r\n <span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\r\n }\r\n</div>\r\n<div mat-dialog-title>Reimposta password</div>\r\n<mat-dialog-content class=\"dialog-content\">\r\n <form [formRoot]=\"form\" novalidate >\r\n @if (dialogData().mode === 'forgot') {\r\n <mat-form-field style=\"width: 100%;\" [appearance]=\"dialogData().appearance\">\r\n <mat-label>Email che hai scelto quando ti sei registrato</mat-label>\r\n <input type=\"email\" matInput [formField]=\"form.userEmail\"\r\n [attr.aria-label]=\"'Email con cui ti sei registrato'\">\r\n @if (form.userEmail().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.userEmail().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else if (dialogData().mode === 'old') {\r\n <mat-form-field style=\"width: 100%;\" [appearance]=\"dialogData().appearance\">\r\n <mat-label>Vecchia password</mat-label>\r\n <input [type]=\"!showOldPassword() ? 'password' : 'text'\" matInput autocomplete=\"on\"\r\n [formField]=\"form.oldPassword\">\r\n <button type=\"button\" mat-icon-button class=\"toolbar-suffix\" matSuffix\r\n (click)=\"showOldPassword.set(!showOldPassword())\">\r\n <mat-icon>{{showOldPassword() ? 'visibility' : 'visibility_off'}}</mat-icon>\r\n </button>\r\n @if(form.oldPassword().value()) {\r\n <password-strength [password]=\"form.oldPassword().value()\"></password-strength>\r\n }\r\n @if (form.oldPassword().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.oldPassword().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n } @else if (dialogData().mode === 'otp') {\r\n <div style=\"font-size: small;\">Inserisci il codice di verifica di 6 cifre che ti abbiamo inviato ora per\r\n email<br><span style=\"font-size:x-small\">(controlla anche la posta indesiderata)</span>.</div>\r\n <otp-input [formField]=\"form.code\"></otp-input>\r\n }\r\n <mat-form-field style=\"width: 100%;\" hintLabel=\"Minimo 10 car. con 1 simbolo e 1 maiuscola\"\r\n [appearance]=\"dialogData().appearance\">\r\n <mat-label>Nuova password</mat-label>\r\n <input [type]=\"!showPassword() ? 'password' : 'text'\" matInput [formField]=\"form.password\">\r\n @if(form.password().value()) {\r\n <password-strength [password]=\"form.password().value()\"></password-strength>\r\n }\r\n <button type=\"button\" mat-icon-button class=\"toolbar-suffix\" matSuffix\r\n (click)=\"showPassword.set(!showPassword())\">\r\n <mat-icon>{{showPassword() ? 'visibility' : 'visibility_off'}}</mat-icon>\r\n </button>\r\n <mat-hint align=\"end\">{{form.password().value()?.length || 0}}/30</mat-hint>\r\n @if (form.password().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.password().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field style=\"width: 100%;\" hintLabel=\"Minimo 10 car. con 1 simbolo e 1 maiuscola\"\r\n [appearance]=\"dialogData().appearance\">\r\n <mat-label>Conferma nuova password</mat-label>\r\n <input [type]=\"!showPassword2() ? 'password' : 'text'\" matInput [formField]=\"form.password2\">\r\n <button type=\"button\" mat-icon-button class=\"toolbar-suffix\" matSuffix\r\n (click)=\"showPassword2.set(!showPassword2())\">\r\n <mat-icon>{{showPassword2() ? 'visibility' : 'visibility_off'}}</mat-icon>\r\n </button>\r\n @if(form.password2().value()) {\r\n <password-strength [password]=\"form.password2().value()\"></password-strength>\r\n }\r\n <mat-hint align=\"end\">{{form.password2().value()?.length || 0}}/30</mat-hint>\r\n @if (form.password2().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.password2().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n </form>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"30\">\r\n @if (dialogData().mode === 'admin') {\r\n <button mat-stroked-button (click)=\"generatePassword()\">Genera</button>\r\n }\r\n </div>\r\n <div fxFlex=\"70\" fxLayoutAlign=\"end\">\r\n <button mat-flat-button [disabled]=\"form().invalid()\" (click)=\"ok()\">Salva</button>\r\n @if (dialogData().mode !== 'forgot') {\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\r\n }\r\n </div>\r\n </div>\r\n</mat-dialog-actions>\r\n","import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\r\nimport { email, form, FormField, FormRoot, maxLength, required } from '@angular/forms/signals';\r\nimport { notEmpty, SignalsUtils } from '@arsedizioni/ars-utils/core.validators';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { DtoUtils } from '@arsedizioni/ars-utils/core';\r\nimport { FlexLayoutModule, RecoverPasswordDialogResult } from '@arsedizioni/ars-utils/ui';\r\n\r\nexport interface RecoverPasswordDialogData {\r\n appearance?: MatFormFieldAppearance;\r\n}\r\n\r\n/**\r\n * Form model of the password-recovery dialog.\r\n *\r\n * {@link RecoverPasswordDialogResult} is the DTO: every field of it is optional, so it\r\n * cannot back a signal form directly. Here every field is present and holds its empty\r\n * value, and {@link DtoUtils.toPayload} turns the model back into the DTO on the way out.\r\n */\r\ninterface RecoverPasswordForm {\r\n /** The email the recovery link is sent to; `''` when the input is empty. */\r\n email: string;\r\n /** Whether the recaptcha challenge has been solved. */\r\n recaptcha: boolean;\r\n}\r\n\r\n/** Neutral form model: it declares every field the form owns and its empty value. */\r\nconst _EMPTY_ITEM: RecoverPasswordForm = { email: '', recaptcha: false };\r\n\r\n@Component({\r\n templateUrl: './recover-password-dialog.component.html',\r\n styleUrl: './recover-password-dialog.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n FormField, FormRoot,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatButtonModule,\r\n MatDialogActions,\r\n FlexLayoutModule,\r\n MatDialogClose,\r\n ],\r\n})\r\nexport class RecoverPasswordDialogComponent {\r\n /** Error text of a field: the message declared in the schema, or the shared fallback. */\r\n protected readonly getErrorMessage = SignalsUtils.getFieldErrorMessage;\r\n\r\n\r\n /** Emitted when the user submits the recovery request. Carries the entered email and recaptcha state. */\r\n readonly done = output<RecoverPasswordDialogResult>();\r\n\r\n /** Dialog configuration with defaults applied at construction time. */\r\n protected readonly dialogData = signal<RecoverPasswordDialogData>({\r\n appearance: 'fill',\r\n ...((inject(MAT_DIALOG_DATA) as RecoverPasswordDialogData | null) ?? {}),\r\n });\r\n\r\n /** Model backing the signal form. */\r\n private readonly model = signal<RecoverPasswordForm>(this.toForm());\r\n\r\n /**\r\n * Builds the form model. The dialog is always opened empty, so the model is the\r\n * neutral one.\r\n * @returns A fresh form model.\r\n */\r\n private toForm(): RecoverPasswordForm {\r\n return DtoUtils.toForm(_EMPTY_ITEM);\r\n }\r\n\r\n /**\r\n * Builds the dialog result from the current form model, dropping the email when it\r\n * was left empty.\r\n * @returns The result to emit through `done`.\r\n */\r\n private toPayload(): RecoverPasswordDialogResult {\r\n return DtoUtils.toPayload(this.model());\r\n }\r\n\r\n /**\r\n * Signal form for the recovery request: the email is required and must be valid.\r\n */\r\n protected readonly form = form(this.model, p => {\r\n required(p.email);\r\n notEmpty(p.email);\r\n email(p.email);\r\n maxLength(p.email, 200);\r\n });\r\n\r\n /**\r\n * Emits the current form result to trigger the password-recovery flow.\r\n */\r\n protected ok(): void {\r\n this.done.emit(this.toPayload());\r\n }\r\n}\r\n","<div class=\"dialog-info\">\n @if (form().invalid()) {\n <span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\n } @else {\n <span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\n }\n</div>\n<div mat-dialog-title>Per quale ragione non sei in grado di effettuare l'accesso?</div>\n<mat-dialog-content class=\"dialog-content\">\n\n <b>1. Ho dimenticato la password</b>\n <p>\n Puoi recuperarla facilmente inserendo l'email a cui la password è collegata. Non è possibile recuperare password\n aziendali (non collegate ad un email).</p>\n <form [formRoot]=\"form\" (keyup.enter)=\"!form().invalid() ? ok() : undefined\" novalidate>\n\n <mat-form-field style=\"width:100%\" [appearance]=\"dialogData().appearance\">\n <mat-label>Email con cui ti sei registrato</mat-label>\n <input type=\"email\" matInput [formField]=\"form.email\" />\n @if (form.email().invalid()) {\n <mat-error>{{ getErrorMessage(form.email().errors()) }}</mat-error>\n }\n </mat-form-field>\n\n <div style=\"margin-top:20px; margin-bottom:20px;\">\n <button type=\"button\" mat-flat-button (click)=\"ok()\" [disabled]=\"form().invalid()\"\n aria-label=\"Recupera password\">Recupera password</button>\n </div>\n </form>\n <p></p>\n <b>2. Il sistema mi dice che la password non è corretta.</b>\n <p>\n E' molto probabile che ci sia stato un difetto di digitazione. Per favore controlla bene che non vi siano spazi non\n richiesti e che la password rispetti perfettamente le maiuscole e minuscole. Nel caso in cui la digitazione fosse\n corretta, verifica che la data del tuo abbonamento non sia scaduta.\n </p>\n <p></p>\n <b>3. Il sistema mi dice che non può accettare connessioni dal mio indirizzo IP</b>\n <p>\n Il tuo abbonamento è stato vincolato ad un indirizzo IP (indirizzo dal quale ti colleghi). Capita sovente che\n questi indirizzi siano cambiati da parte del reparto IT per questioni di sicurezza informatica.\n Per risolvere il problema, contattate il reparto IT e fatevi dire qual'è il nuovo indirizzo IP e comunicatelo ad\n ARS Edizioni Informatiche.\n </p>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\n <button mat-stroked-button [mat-dialog-close]=\"true\" >Chiudi</button>\n </div>\n</mat-dialog-actions>","import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\r\nimport { FlexLayoutModule, PromptDialogData, PromptDialogType, PromptOtpDialogResult } from '@arsedizioni/ars-utils/ui';\r\nimport { ShellService } from '@arsedizioni/ars-utils/ui.shell';\r\nimport { OtpInputComponent } from '../otp/otp-input.component';\r\nimport { form, FormField, FormRoot, required } from '@angular/forms/signals';\r\nimport { notEmpty } from '@arsedizioni/ars-utils/core.validators';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { DtoUtils, SafeHtmlPipe } from '@arsedizioni/ars-utils/core';\r\n\r\n/**\r\n * Form model of the OTP dialog.\r\n *\r\n * {@link PromptOtpDialogResult} is the DTO: it leaves the code out when there is none.\r\n * The form cannot, so the field is always present and holds `''` when empty.\r\n */\r\ninterface PromptOtpForm {\r\n /** The 6-digit OTP code; `''` while the user has not completed it. */\r\n value: string;\r\n}\r\n\r\n/** Neutral form model: it declares every field the form owns and its empty value. */\r\nconst _EMPTY_ITEM: PromptOtpForm = { value: '' };\r\n\r\n@Component({\r\n templateUrl: './prompt-otp-dialog.component.html',\r\n styleUrl: './prompt-otp-dialog.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatDialogTitle, MatDialogContent, FormField, FormRoot, FlexLayoutModule, MatButtonModule, MatIconModule,\r\n MatDialogActions, MatDialogClose, SafeHtmlPipe, OtpInputComponent]\r\n})\r\nexport class PromptOtpDialogComponent {\r\n readonly done = output<PromptOtpDialogResult>();\r\n private readonly dialogService = inject(ShellService);\r\n protected readonly dialogData = signal<PromptDialogData>((() => {\r\n const data: PromptDialogData = inject(MAT_DIALOG_DATA) ?? {};\r\n return {\r\n ...data,\r\n appearance: data.appearance ?? 'fill',\r\n title: data.title ?? 'Conferma la tua identità',\r\n type: data.type ?? PromptDialogType.Default,\r\n okCaption: data.okCaption ?? 'Ok',\r\n cancelCaption: data.cancelCaption ?? 'Annulla',\r\n };\r\n })());\r\n\r\n /** Model backing the signal form. `value` holds the 6-digit OTP code. */\r\n private readonly model = signal<PromptOtpForm>(this.toForm());\r\n\r\n /**\r\n * Builds the form model. The dialog has no incoming value, so the model is the\r\n * neutral one.\r\n * @returns A fresh form model.\r\n */\r\n private toForm(): PromptOtpForm {\r\n return DtoUtils.toForm(_EMPTY_ITEM);\r\n }\r\n\r\n /**\r\n * Builds the dialog result from the current form model, dropping the empty code.\r\n * @returns The result carrying the entered OTP code.\r\n */\r\n private toPayload(): PromptOtpDialogResult {\r\n return DtoUtils.toPayload(this.model());\r\n }\r\n\r\n /**\r\n * Signal form for the OTP code. The code is always required here; the\r\n * \"complete 6 digits\" rule comes from the OtpInputComponent validator,\r\n * honoured through the ControlValueAccessor interop.\r\n */\r\n protected readonly form = form(this.model, p => {\r\n required(p.value);\r\n notEmpty(p.value);\r\n });\r\n\r\n /**\r\n * Validates the form and emits the OTP result, or shows an error if validation fails.\r\n */\r\n protected ok(): void {\r\n if (this.form().invalid()) {\r\n this.form().markAsTouched();\r\n this.dialogService.error('Ci sono degli errori da correggere.');\r\n return;\r\n }\r\n this.done.emit(this.toPayload());\r\n }\r\n}\r\n","<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\r\n<mat-dialog-content class=\"dialog-content\">\r\n @if (dialogData().description) {\r\n <div [innerHtml]=\"dialogData().description | safeHtml\" style=\"padding-bottom: 20px;\"></div>\r\n }\r\n <form [formRoot]=\"form\" novalidate>\r\n <div fxLayout=\"column\" fxLayoutGap=\"32px\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"column\" fxFill>\r\n <otp-input [formField]=\"form.value\"></otp-input>\r\n </div>\r\n <br>\r\n </div>\r\n </form>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button [disabled]=\"form().invalid()\" (click)=\"ok()\">{{dialogData().okCaption}}</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">{{dialogData().cancelCaption}}</button>\r\n </div>\r\n</mat-dialog-actions>\r\n","/*\n * Public API Surface of @arsedizioni/ars-utils/ui.dialogs.auth\n */\nexport * from './otp/otp-input.component';\nexport * from './password-strength/password-strength.component';\nexport * from './credentials/credentials-dialog.component';\nexport * from './reset-password/reset-password-dialog.component';\nexport * from './recover-password/recover-password-dialog.component';\nexport * from './prompt-otp/prompt-otp-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["_EMPTY_ITEM","i5","i1","i2","i3","i4"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arsedizioni/ars-utils",
3
- "version": "22.5.48",
3
+ "version": "22.5.49",
4
4
  "author": {
5
5
  "email": "software@arsedizioni.it",
6
6
  "name": "Fabio Buscaroli, Alberto Doria"
@@ -122,6 +122,7 @@ interface CredentialsDialogData {
122
122
  user?: string;
123
123
  okCaption?: string;
124
124
  mode?: 'email' | 'user' | 'otp';
125
+ maxLength?: number;
125
126
  appearance?: MatFormFieldAppearance;
126
127
  }
127
128
  /**
@@ -197,6 +198,7 @@ declare class CredentialsDialogComponent {
197
198
  type ResetPasswordDialogMode = 'admin' | 'old' | 'otp' | 'forgot';
198
199
  interface ResetPasswordDialogData {
199
200
  mode: ResetPasswordDialogMode;
201
+ maxLength?: number;
200
202
  userId?: number;
201
203
  userEmail?: string;
202
204
  appearance?: MatFormFieldAppearance;