@flusys/ng-auth 6.1.3 → 6.2.1

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.
@@ -3400,10 +3400,8 @@ class LoginPageComponent {
3400
3400
  {{ 'auth.password.label' | translate }}
3401
3401
  </label>
3402
3402
  <div class="mb-4">
3403
- <input
3404
- fInputText
3405
- id="password"
3406
- type="password"
3403
+ <f-password
3404
+ [inputId]="'password'"
3407
3405
  [placeholder]="'auth.password.placeholder' | translate"
3408
3406
  class="w-full"
3409
3407
  [formField]="loginForm.password"
@@ -3574,7 +3572,7 @@ class LoginPageComponent {
3574
3572
  </div>
3575
3573
  </div>
3576
3574
  </div>
3577
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1$1.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: i1$1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1$1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "component", type: AppFloatingConfigurator, selector: "app-floating-configurator" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
3575
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1$1.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: i1$1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1$1.PasswordComponent, selector: "f-password", inputs: ["toggleMask", "feedback", "disabled", "placeholder", "inputId", "invalid", "touched", "inputStyleClass", "styleClass", "style", "ariaDescribedby", "autocomplete", "variant", "size", "fluid", "appendTo", "promptLabel", "weakLabel", "mediumLabel", "strongLabel", "mediumRegex", "strongRegex"], outputs: ["onBlur", "onFocus"] }, { kind: "component", type: i1$1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "component", type: AppFloatingConfigurator, selector: "app-floating-configurator" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
3578
3576
  }
3579
3577
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: LoginPageComponent, decorators: [{
3580
3578
  type: Component,
@@ -3674,10 +3672,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
3674
3672
  {{ 'auth.password.label' | translate }}
3675
3673
  </label>
3676
3674
  <div class="mb-4">
3677
- <input
3678
- fInputText
3679
- id="password"
3680
- type="password"
3675
+ <f-password
3676
+ [inputId]="'password'"
3681
3677
  [placeholder]="'auth.password.placeholder' | translate"
3682
3678
  class="w-full"
3683
3679
  [formField]="loginForm.password"
@@ -4022,16 +4018,33 @@ class ProfilePageComponent {
4022
4018
  };
4023
4019
  }
4024
4020
  parentInjector = inject(Injector);
4021
+ fieldInjectors = new Map();
4025
4022
  getFieldInjector(field) {
4026
- return Injector.create({
4027
- providers: [
4028
- {
4029
- provide: PROFILE_FIELD_CONTEXT,
4030
- useValue: this.getFieldTemplateContext(field),
4031
- },
4032
- ],
4023
+ const cached = this.fieldInjectors.get(field.key);
4024
+ if (cached) {
4025
+ cached.setField(field);
4026
+ return cached.injector;
4027
+ }
4028
+ let currentField = field;
4029
+ const extraFieldsModel = this.extraFieldsModel;
4030
+ const context = {
4031
+ get field() {
4032
+ return currentField;
4033
+ },
4034
+ get value() {
4035
+ return extraFieldsModel()[currentField.key];
4036
+ },
4037
+ updateValue: (value) => this.updateExtraField(currentField.key, value),
4038
+ };
4039
+ const injector = Injector.create({
4040
+ providers: [{ provide: PROFILE_FIELD_CONTEXT, useValue: context }],
4033
4041
  parent: field.injector ?? this.parentInjector,
4034
4042
  });
4043
+ this.fieldInjectors.set(field.key, {
4044
+ injector,
4045
+ setField: (next) => (currentField = next),
4046
+ });
4047
+ return injector;
4035
4048
  }
4036
4049
  passwordModel = signal({
4037
4050
  currentPassword: '',
@@ -4039,12 +4052,6 @@ class ProfilePageComponent {
4039
4052
  confirmPassword: '',
4040
4053
  }, /* @ts-ignore */
4041
4054
  ...(ngDevMode ? [{ debugName: "passwordModel" }] : /* istanbul ignore next */ []));
4042
- visiblePasswords = signal({
4043
- currentPassword: false,
4044
- newPassword: false,
4045
- confirmPassword: false,
4046
- }, /* @ts-ignore */
4047
- ...(ngDevMode ? [{ debugName: "visiblePasswords" }] : /* istanbul ignore next */ []));
4048
4055
  isPasswordLoading = signal(false, /* @ts-ignore */
4049
4056
  ...(ngDevMode ? [{ debugName: "isPasswordLoading" }] : /* istanbul ignore next */ []));
4050
4057
  isPasswordFormValid = computed(() => {
@@ -4245,9 +4252,6 @@ class ProfilePageComponent {
4245
4252
  error: () => { },
4246
4253
  });
4247
4254
  }
4248
- togglePasswordVisibility(field) {
4249
- this.visiblePasswords.update((v) => ({ ...v, [field]: !v[field] }));
4250
- }
4251
4255
  updatePasswordField(field, value) {
4252
4256
  this.passwordModel.update((model) => ({ ...model, [field]: value }));
4253
4257
  }
@@ -4610,91 +4614,45 @@ class ProfilePageComponent {
4610
4614
  <label for="currentPassword" class="font-medium text-color"
4611
4615
  >{{ 'profile.current.password' | translate }} *</label
4612
4616
  >
4613
- <f-iconfield iconPosition="right" class="w-full">
4614
- <input
4615
- fInputText
4616
- fInputPassword
4617
- id="currentPassword"
4618
- name="currentPassword"
4619
- [mask]="!visiblePasswords().currentPassword"
4620
- [ngModel]="passwordModel().currentPassword"
4621
- (ngModelChange)="updatePasswordField('currentPassword', $event)"
4622
- [placeholder]="
4623
- 'profile.current.password.placeholder' | translate
4624
- "
4625
- class="w-full"
4626
- />
4627
- <f-inputicon
4628
- class="cursor-pointer"
4629
- (click)="togglePasswordVisibility('currentPassword')"
4630
- >
4631
- <ui-icon
4632
- [name]="
4633
- visiblePasswords().currentPassword ? 'eye-slash' : 'eye'
4634
- "
4635
- ></ui-icon>
4636
- </f-inputicon>
4637
- </f-iconfield>
4617
+ <f-password
4618
+ [inputId]="'currentPassword'"
4619
+ name="currentPassword"
4620
+ [ngModel]="passwordModel().currentPassword"
4621
+ (ngModelChange)="updatePasswordField('currentPassword', $event)"
4622
+ [placeholder]="'profile.current.password.placeholder' | translate"
4623
+ class="w-full"
4624
+ autocomplete="current-password"
4625
+ />
4638
4626
  </div>
4639
4627
 
4640
4628
  <div class="flex flex-col gap-2">
4641
4629
  <label for="newPassword" class="font-medium text-color"
4642
4630
  >{{ 'profile.new.password' | translate }} *</label
4643
4631
  >
4644
- <f-iconfield iconPosition="right" class="w-full">
4645
- <input
4646
- fInputText
4647
- fInputPassword
4648
- id="newPassword"
4649
- name="newPassword"
4650
- [mask]="!visiblePasswords().newPassword"
4651
- [ngModel]="passwordModel().newPassword"
4652
- (ngModelChange)="updatePasswordField('newPassword', $event)"
4653
- [placeholder]="
4654
- 'shared.min.characters' | translate: { count: 6 }
4655
- "
4656
- class="w-full"
4657
- />
4658
- <f-inputicon
4659
- class="cursor-pointer"
4660
- (click)="togglePasswordVisibility('newPassword')"
4661
- >
4662
- <ui-icon
4663
- [name]="visiblePasswords().newPassword ? 'eye-slash' : 'eye'"
4664
- ></ui-icon>
4665
- </f-inputicon>
4666
- </f-iconfield>
4632
+ <f-password
4633
+ [inputId]="'newPassword'"
4634
+ name="newPassword"
4635
+ [ngModel]="passwordModel().newPassword"
4636
+ (ngModelChange)="updatePasswordField('newPassword', $event)"
4637
+ [placeholder]="'shared.min.characters' | translate: { count: 6 }"
4638
+ class="w-full"
4639
+ autocomplete="new-password"
4640
+ />
4667
4641
  </div>
4668
4642
 
4669
4643
  <div class="flex flex-col gap-2">
4670
4644
  <label for="confirmPassword" class="font-medium text-color"
4671
4645
  >{{ 'profile.confirm.password' | translate }} *</label
4672
4646
  >
4673
- <f-iconfield iconPosition="right" class="w-full">
4674
- <input
4675
- fInputText
4676
- fInputPassword
4677
- id="confirmPassword"
4678
- name="confirmPassword"
4679
- [mask]="!visiblePasswords().confirmPassword"
4680
- [ngModel]="passwordModel().confirmPassword"
4681
- (ngModelChange)="updatePasswordField('confirmPassword', $event)"
4682
- [placeholder]="
4683
- 'profile.confirm.password.placeholder' | translate
4684
- "
4685
- class="w-full"
4686
- />
4687
- <f-inputicon
4688
- class="cursor-pointer"
4689
- (click)="togglePasswordVisibility('confirmPassword')"
4690
- >
4691
- <ui-icon
4692
- [name]="
4693
- visiblePasswords().confirmPassword ? 'eye-slash' : 'eye'
4694
- "
4695
- ></ui-icon>
4696
- </f-inputicon>
4697
- </f-iconfield>
4647
+ <f-password
4648
+ [inputId]="'confirmPassword'"
4649
+ name="confirmPassword"
4650
+ [ngModel]="passwordModel().confirmPassword"
4651
+ (ngModelChange)="updatePasswordField('confirmPassword', $event)"
4652
+ [placeholder]="'profile.confirm.password.placeholder' | translate"
4653
+ class="w-full"
4654
+ autocomplete="new-password"
4655
+ />
4698
4656
  @if (!passwordsMatch()) {
4699
4657
  <small class="text-danger">{{
4700
4658
  'auth.register.passwords.do.not.match' | translate
@@ -4870,7 +4828,7 @@ class ProfilePageComponent {
4870
4828
  }
4871
4829
  </div>
4872
4830
  }
4873
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "component", type: i1$1.AvatarComponent, selector: "f-avatar", inputs: ["label", "icon", "image", "shape", "size", "color", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1$1.SkeletonComponent, selector: "f-skeleton", inputs: ["width", "height", "size", "borderRadius", "shape", "animation", "styleClass"] }, { kind: "component", type: i1$1.TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color", "styleClass", "style"] }, { kind: "component", type: i1$1.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "component", type: i1$1.IconFieldComponent, selector: "f-iconfield", inputs: ["iconPosition", "styleClass"] }, { kind: "component", type: i1$1.InputIconComponent, selector: "f-inputicon", inputs: ["icon", "position", "styleClass", "style"] }, { kind: "directive", type: i1$1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "directive", type: i1$1.InputPasswordDirective, selector: "[fInputPassword]", inputs: ["mask", "toggleMask"], exportAs: ["fInputPassword"] }, { kind: "component", type: i1$1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1$1.TextareaDirective, selector: "[fTextarea]", inputs: ["invalid", "touched", "variant", "fluid", "autoResize"], outputs: ["onResize"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "component", type: FileUploaderComponent, selector: "lib-file-uploader", inputs: ["uploadFile", "uploadMultipleFiles", "acceptTypes", "multiple", "maxFiles", "maxSizeMb", "uploadOptions", "disabled", "showPreview", "autoUpload"], outputs: ["fileUploaded", "filesUploaded", "onError", "fileSelected"] }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
4831
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "component", type: i1$1.AvatarComponent, selector: "f-avatar", inputs: ["label", "icon", "image", "shape", "size", "color", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1$1.SkeletonComponent, selector: "f-skeleton", inputs: ["width", "height", "size", "borderRadius", "shape", "animation", "styleClass"] }, { kind: "component", type: i1$1.TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color", "styleClass", "style"] }, { kind: "component", type: i1$1.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: i1$1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1$1.PasswordComponent, selector: "f-password", inputs: ["toggleMask", "feedback", "disabled", "placeholder", "inputId", "invalid", "touched", "inputStyleClass", "styleClass", "style", "ariaDescribedby", "autocomplete", "variant", "size", "fluid", "appendTo", "promptLabel", "weakLabel", "mediumLabel", "strongLabel", "mediumRegex", "strongRegex"], outputs: ["onBlur", "onFocus"] }, { kind: "component", type: i1$1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1$1.TextareaDirective, selector: "[fTextarea]", inputs: ["invalid", "touched", "variant", "fluid", "autoResize"], outputs: ["onResize"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "component", type: FileUploaderComponent, selector: "lib-file-uploader", inputs: ["uploadFile", "uploadMultipleFiles", "acceptTypes", "multiple", "maxFiles", "maxSizeMb", "uploadOptions", "disabled", "showPreview", "autoUpload"], outputs: ["fileUploaded", "filesUploaded", "onError", "fileSelected"] }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
4874
4832
  }
4875
4833
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ProfilePageComponent, decorators: [{
4876
4834
  type: Component,
@@ -5213,91 +5171,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
5213
5171
  <label for="currentPassword" class="font-medium text-color"
5214
5172
  >{{ 'profile.current.password' | translate }} *</label
5215
5173
  >
5216
- <f-iconfield iconPosition="right" class="w-full">
5217
- <input
5218
- fInputText
5219
- fInputPassword
5220
- id="currentPassword"
5221
- name="currentPassword"
5222
- [mask]="!visiblePasswords().currentPassword"
5223
- [ngModel]="passwordModel().currentPassword"
5224
- (ngModelChange)="updatePasswordField('currentPassword', $event)"
5225
- [placeholder]="
5226
- 'profile.current.password.placeholder' | translate
5227
- "
5228
- class="w-full"
5229
- />
5230
- <f-inputicon
5231
- class="cursor-pointer"
5232
- (click)="togglePasswordVisibility('currentPassword')"
5233
- >
5234
- <ui-icon
5235
- [name]="
5236
- visiblePasswords().currentPassword ? 'eye-slash' : 'eye'
5237
- "
5238
- ></ui-icon>
5239
- </f-inputicon>
5240
- </f-iconfield>
5174
+ <f-password
5175
+ [inputId]="'currentPassword'"
5176
+ name="currentPassword"
5177
+ [ngModel]="passwordModel().currentPassword"
5178
+ (ngModelChange)="updatePasswordField('currentPassword', $event)"
5179
+ [placeholder]="'profile.current.password.placeholder' | translate"
5180
+ class="w-full"
5181
+ autocomplete="current-password"
5182
+ />
5241
5183
  </div>
5242
5184
 
5243
5185
  <div class="flex flex-col gap-2">
5244
5186
  <label for="newPassword" class="font-medium text-color"
5245
5187
  >{{ 'profile.new.password' | translate }} *</label
5246
5188
  >
5247
- <f-iconfield iconPosition="right" class="w-full">
5248
- <input
5249
- fInputText
5250
- fInputPassword
5251
- id="newPassword"
5252
- name="newPassword"
5253
- [mask]="!visiblePasswords().newPassword"
5254
- [ngModel]="passwordModel().newPassword"
5255
- (ngModelChange)="updatePasswordField('newPassword', $event)"
5256
- [placeholder]="
5257
- 'shared.min.characters' | translate: { count: 6 }
5258
- "
5259
- class="w-full"
5260
- />
5261
- <f-inputicon
5262
- class="cursor-pointer"
5263
- (click)="togglePasswordVisibility('newPassword')"
5264
- >
5265
- <ui-icon
5266
- [name]="visiblePasswords().newPassword ? 'eye-slash' : 'eye'"
5267
- ></ui-icon>
5268
- </f-inputicon>
5269
- </f-iconfield>
5189
+ <f-password
5190
+ [inputId]="'newPassword'"
5191
+ name="newPassword"
5192
+ [ngModel]="passwordModel().newPassword"
5193
+ (ngModelChange)="updatePasswordField('newPassword', $event)"
5194
+ [placeholder]="'shared.min.characters' | translate: { count: 6 }"
5195
+ class="w-full"
5196
+ autocomplete="new-password"
5197
+ />
5270
5198
  </div>
5271
5199
 
5272
5200
  <div class="flex flex-col gap-2">
5273
5201
  <label for="confirmPassword" class="font-medium text-color"
5274
5202
  >{{ 'profile.confirm.password' | translate }} *</label
5275
5203
  >
5276
- <f-iconfield iconPosition="right" class="w-full">
5277
- <input
5278
- fInputText
5279
- fInputPassword
5280
- id="confirmPassword"
5281
- name="confirmPassword"
5282
- [mask]="!visiblePasswords().confirmPassword"
5283
- [ngModel]="passwordModel().confirmPassword"
5284
- (ngModelChange)="updatePasswordField('confirmPassword', $event)"
5285
- [placeholder]="
5286
- 'profile.confirm.password.placeholder' | translate
5287
- "
5288
- class="w-full"
5289
- />
5290
- <f-inputicon
5291
- class="cursor-pointer"
5292
- (click)="togglePasswordVisibility('confirmPassword')"
5293
- >
5294
- <ui-icon
5295
- [name]="
5296
- visiblePasswords().confirmPassword ? 'eye-slash' : 'eye'
5297
- "
5298
- ></ui-icon>
5299
- </f-inputicon>
5300
- </f-iconfield>
5204
+ <f-password
5205
+ [inputId]="'confirmPassword'"
5206
+ name="confirmPassword"
5207
+ [ngModel]="passwordModel().confirmPassword"
5208
+ (ngModelChange)="updatePasswordField('confirmPassword', $event)"
5209
+ [placeholder]="'profile.confirm.password.placeholder' | translate"
5210
+ class="w-full"
5211
+ autocomplete="new-password"
5212
+ />
5301
5213
  @if (!passwordsMatch()) {
5302
5214
  <small class="text-danger">{{
5303
5215
  'auth.register.passwords.do.not.match' | translate
@@ -5525,7 +5437,12 @@ class RegisterPageComponent {
5525
5437
  return fields.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));
5526
5438
  }, /* @ts-ignore */
5527
5439
  ...(ngDevMode ? [{ debugName: "extraFields" }] : /* istanbul ignore next */ []));
5528
- extraFieldsModel = signal({}, /* @ts-ignore */
5440
+ extraFieldsModel = signal(this.extraFields().reduce((acc, field) => {
5441
+ if (field.defaultValue !== undefined) {
5442
+ acc[field.key] = field.defaultValue;
5443
+ }
5444
+ return acc;
5445
+ }, {}), /* @ts-ignore */
5529
5446
  ...(ngDevMode ? [{ debugName: "extraFieldsModel" }] : /* istanbul ignore next */ []));
5530
5447
  emailErrorMessage = computed(() => this.validationConfig?.email?.message ??
5531
5448
  this.translate('shared.invalid.email'), /* @ts-ignore */
@@ -5652,16 +5569,33 @@ class RegisterPageComponent {
5652
5569
  };
5653
5570
  }
5654
5571
  parentInjector = inject(Injector);
5572
+ fieldInjectors = new Map();
5655
5573
  getFieldInjector(field) {
5656
- return Injector.create({
5657
- providers: [
5658
- {
5659
- provide: REGISTRATION_FIELD_CONTEXT,
5660
- useValue: this.getFieldTemplateContext(field),
5661
- },
5662
- ],
5574
+ const cached = this.fieldInjectors.get(field.key);
5575
+ if (cached) {
5576
+ cached.setField(field);
5577
+ return cached.injector;
5578
+ }
5579
+ let currentField = field;
5580
+ const extraFieldsModel = this.extraFieldsModel;
5581
+ const context = {
5582
+ get field() {
5583
+ return currentField;
5584
+ },
5585
+ get value() {
5586
+ return extraFieldsModel()[currentField.key] ?? currentField.defaultValue;
5587
+ },
5588
+ updateValue: (value) => this.updateExtraField(currentField.key, value),
5589
+ };
5590
+ const injector = Injector.create({
5591
+ providers: [{ provide: REGISTRATION_FIELD_CONTEXT, useValue: context }],
5663
5592
  parent: field.injector ?? this.parentInjector,
5664
5593
  });
5594
+ this.fieldInjectors.set(field.key, {
5595
+ injector,
5596
+ setField: (next) => (currentField = next),
5597
+ });
5598
+ return injector;
5665
5599
  }
5666
5600
  constructor() {
5667
5601
  effect(() => {
@@ -5865,10 +5799,8 @@ class RegisterPageComponent {
5865
5799
  <label for="password" class="block font-medium mb-2"
5866
5800
  >{{ 'auth.password.label' | translate }} *</label
5867
5801
  >
5868
- <input
5869
- fInputText
5870
- id="password"
5871
- type="password"
5802
+ <f-password
5803
+ [inputId]="'password'"
5872
5804
  [formField]="userForm.password"
5873
5805
  [placeholder]="
5874
5806
  'shared.min.characters'
@@ -5888,10 +5820,8 @@ class RegisterPageComponent {
5888
5820
  <label for="confirmPassword" class="block font-medium mb-2"
5889
5821
  >{{ 'auth.register.confirm.password' | translate }} *</label
5890
5822
  >
5891
- <input
5892
- fInputText
5893
- id="confirmPassword"
5894
- type="password"
5823
+ <f-password
5824
+ [inputId]="'confirmPassword'"
5895
5825
  [formField]="userForm.confirmPassword"
5896
5826
  [placeholder]="
5897
5827
  'auth.register.confirm.password.placeholder' | translate
@@ -6006,13 +5936,29 @@ class RegisterPageComponent {
6006
5936
  class="w-full"
6007
5937
  [options]="field.options ?? []"
6008
5938
  optionValue="value"
6009
- [ngModel]="extraFieldsModel()[field.key] ?? field.defaultValue ?? ''"
5939
+ [ngModel]="
5940
+ extraFieldsModel()[field.key] ??
5941
+ field.defaultValue ??
5942
+ ''
5943
+ "
6010
5944
  [ngModelOptions]="{ standalone: true }"
6011
- (ngModelChange)="updateExtraField(field.key, $event)"
6012
- [placeholder]="field.placeholderKey | translate: null : field.placeholder ?? ('shared.select' | translate)"
5945
+ (ngModelChange)="
5946
+ updateExtraField(field.key, $event)
5947
+ "
5948
+ [placeholder]="
5949
+ field.placeholderKey
5950
+ | translate
5951
+ : null
5952
+ : field.placeholder ??
5953
+ ('shared.select' | translate)
5954
+ "
6013
5955
  >
6014
- <ng-template #item let-opt>{{ opt.labelKey | translate: null : opt.label }}</ng-template>
6015
- <ng-template #selectedItem let-opt>{{ opt.labelKey | translate: null : opt.label }}</ng-template>
5956
+ <ng-template #item let-opt>{{
5957
+ opt.labelKey | translate: null : opt.label
5958
+ }}</ng-template>
5959
+ <ng-template #selectedItem let-opt>{{
5960
+ opt.labelKey | translate: null : opt.label
5961
+ }}</ng-template>
6016
5962
  </f-select>
6017
5963
  }
6018
5964
  @case ('checkbox') {
@@ -6222,7 +6168,9 @@ class RegisterPageComponent {
6222
6168
  @if (isLoading()) {
6223
6169
  <ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
6224
6170
  }
6225
- <span pButtonLabel>{{ 'auth.register.create.account' | translate }}</span>
6171
+ <span pButtonLabel>{{
6172
+ 'auth.register.create.account' | translate
6173
+ }}</span>
6226
6174
  </button>
6227
6175
 
6228
6176
  <div class="flex items-center justify-center mt-4 gap-2">
@@ -6241,16 +6189,19 @@ class RegisterPageComponent {
6241
6189
  </div>
6242
6190
  </div>
6243
6191
  </div>
6244
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1$1.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: i1$1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1$1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1$1.TextareaDirective, selector: "[fTextarea]", inputs: ["invalid", "touched", "variant", "fluid", "autoResize"], outputs: ["onResize"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "component", type: AppFloatingConfigurator, selector: "app-floating-configurator" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
6192
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1$1.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: i1$1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1$1.PasswordComponent, selector: "f-password", inputs: ["toggleMask", "feedback", "disabled", "placeholder", "inputId", "invalid", "touched", "inputStyleClass", "styleClass", "style", "ariaDescribedby", "autocomplete", "variant", "size", "fluid", "appendTo", "promptLabel", "weakLabel", "mediumLabel", "strongLabel", "mediumRegex", "strongRegex"], outputs: ["onBlur", "onFocus"] }, { kind: "component", type: i1$1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1$1.TextareaDirective, selector: "[fTextarea]", inputs: ["invalid", "touched", "variant", "fluid", "autoResize"], outputs: ["onResize"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "component", type: AppFloatingConfigurator, selector: "app-floating-configurator" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
6245
6193
  }
6246
6194
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: RegisterPageComponent, decorators: [{
6247
6195
  type: Component,
6248
6196
  args: [{
6249
6197
  selector: 'lib-register-page',
6250
- imports: [UiModule, AngularModule,
6198
+ imports: [
6199
+ UiModule,
6200
+ AngularModule,
6251
6201
  FormField,
6252
6202
  AppFloatingConfigurator,
6253
- TranslatePipe,],
6203
+ TranslatePipe,
6204
+ ],
6254
6205
  template: `
6255
6206
  <app-floating-configurator />
6256
6207
  <div
@@ -6329,10 +6280,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
6329
6280
  <label for="password" class="block font-medium mb-2"
6330
6281
  >{{ 'auth.password.label' | translate }} *</label
6331
6282
  >
6332
- <input
6333
- fInputText
6334
- id="password"
6335
- type="password"
6283
+ <f-password
6284
+ [inputId]="'password'"
6336
6285
  [formField]="userForm.password"
6337
6286
  [placeholder]="
6338
6287
  'shared.min.characters'
@@ -6352,10 +6301,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
6352
6301
  <label for="confirmPassword" class="block font-medium mb-2"
6353
6302
  >{{ 'auth.register.confirm.password' | translate }} *</label
6354
6303
  >
6355
- <input
6356
- fInputText
6357
- id="confirmPassword"
6358
- type="password"
6304
+ <f-password
6305
+ [inputId]="'confirmPassword'"
6359
6306
  [formField]="userForm.confirmPassword"
6360
6307
  [placeholder]="
6361
6308
  'auth.register.confirm.password.placeholder' | translate
@@ -6470,13 +6417,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
6470
6417
  class="w-full"
6471
6418
  [options]="field.options ?? []"
6472
6419
  optionValue="value"
6473
- [ngModel]="extraFieldsModel()[field.key] ?? field.defaultValue ?? ''"
6420
+ [ngModel]="
6421
+ extraFieldsModel()[field.key] ??
6422
+ field.defaultValue ??
6423
+ ''
6424
+ "
6474
6425
  [ngModelOptions]="{ standalone: true }"
6475
- (ngModelChange)="updateExtraField(field.key, $event)"
6476
- [placeholder]="field.placeholderKey | translate: null : field.placeholder ?? ('shared.select' | translate)"
6426
+ (ngModelChange)="
6427
+ updateExtraField(field.key, $event)
6428
+ "
6429
+ [placeholder]="
6430
+ field.placeholderKey
6431
+ | translate
6432
+ : null
6433
+ : field.placeholder ??
6434
+ ('shared.select' | translate)
6435
+ "
6477
6436
  >
6478
- <ng-template #item let-opt>{{ opt.labelKey | translate: null : opt.label }}</ng-template>
6479
- <ng-template #selectedItem let-opt>{{ opt.labelKey | translate: null : opt.label }}</ng-template>
6437
+ <ng-template #item let-opt>{{
6438
+ opt.labelKey | translate: null : opt.label
6439
+ }}</ng-template>
6440
+ <ng-template #selectedItem let-opt>{{
6441
+ opt.labelKey | translate: null : opt.label
6442
+ }}</ng-template>
6480
6443
  </f-select>
6481
6444
  }
6482
6445
  @case ('checkbox') {
@@ -6686,7 +6649,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
6686
6649
  @if (isLoading()) {
6687
6650
  <ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
6688
6651
  }
6689
- <span pButtonLabel>{{ 'auth.register.create.account' | translate }}</span>
6652
+ <span pButtonLabel>{{
6653
+ 'auth.register.create.account' | translate
6654
+ }}</span>
6690
6655
  </button>
6691
6656
 
6692
6657
  <div class="flex items-center justify-center mt-4 gap-2">
@@ -6845,10 +6810,8 @@ class ResetPasswordPageComponent {
6845
6810
  >
6846
6811
  {{ 'auth.reset.password.new.password' | translate }}
6847
6812
  </label>
6848
- <input
6849
- fInputText
6850
- id="newPassword"
6851
- type="password"
6813
+ <f-password
6814
+ [inputId]="'newPassword'"
6852
6815
  [placeholder]="
6853
6816
  'auth.reset.password.new.password.placeholder' | translate
6854
6817
  "
@@ -6863,10 +6826,8 @@ class ResetPasswordPageComponent {
6863
6826
  >
6864
6827
  {{ 'auth.reset.password.confirm.password' | translate }}
6865
6828
  </label>
6866
- <input
6867
- fInputText
6868
- id="confirmPassword"
6869
- type="password"
6829
+ <f-password
6830
+ [inputId]="'confirmPassword'"
6870
6831
  [placeholder]="
6871
6832
  'auth.reset.password.confirm.password.placeholder'
6872
6833
  | translate
@@ -6963,7 +6924,7 @@ class ResetPasswordPageComponent {
6963
6924
  </div>
6964
6925
  </div>
6965
6926
  </div>
6966
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "directive", type: i1$1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "component", type: AppFloatingConfigurator, selector: "app-floating-configurator" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
6927
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1$1.PasswordComponent, selector: "f-password", inputs: ["toggleMask", "feedback", "disabled", "placeholder", "inputId", "invalid", "touched", "inputStyleClass", "styleClass", "style", "ariaDescribedby", "autocomplete", "variant", "size", "fluid", "appendTo", "promptLabel", "weakLabel", "mediumLabel", "strongLabel", "mediumRegex", "strongRegex"], outputs: ["onBlur", "onFocus"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "component", type: AppFloatingConfigurator, selector: "app-floating-configurator" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
6967
6928
  }
6968
6929
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: ResetPasswordPageComponent, decorators: [{
6969
6930
  type: Component,
@@ -7010,10 +6971,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
7010
6971
  >
7011
6972
  {{ 'auth.reset.password.new.password' | translate }}
7012
6973
  </label>
7013
- <input
7014
- fInputText
7015
- id="newPassword"
7016
- type="password"
6974
+ <f-password
6975
+ [inputId]="'newPassword'"
7017
6976
  [placeholder]="
7018
6977
  'auth.reset.password.new.password.placeholder' | translate
7019
6978
  "
@@ -7028,10 +6987,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
7028
6987
  >
7029
6988
  {{ 'auth.reset.password.confirm.password' | translate }}
7030
6989
  </label>
7031
- <input
7032
- fInputText
7033
- id="confirmPassword"
7034
- type="password"
6990
+ <f-password
6991
+ [inputId]="'confirmPassword'"
7035
6992
  [placeholder]="
7036
6993
  'auth.reset.password.confirm.password.placeholder'
7037
6994
  | translate
@@ -7231,16 +7188,33 @@ class UserFormComponent {
7231
7188
  updateValue: (value) => this.updateExtraField(field.key, value),
7232
7189
  };
7233
7190
  }
7191
+ fieldInjectors = new Map();
7234
7192
  getFieldInjector(field) {
7235
- return Injector.create({
7236
- providers: [
7237
- {
7238
- provide: USER_FORM_FIELD_CONTEXT,
7239
- useValue: this.getFieldTemplateContext(field),
7240
- },
7241
- ],
7193
+ const cached = this.fieldInjectors.get(field.key);
7194
+ if (cached) {
7195
+ cached.setField(field);
7196
+ return cached.injector;
7197
+ }
7198
+ let currentField = field;
7199
+ const extraFieldsModel = this.extraFieldsModel;
7200
+ const context = {
7201
+ get field() {
7202
+ return currentField;
7203
+ },
7204
+ get value() {
7205
+ return extraFieldsModel()[currentField.key];
7206
+ },
7207
+ updateValue: (value) => this.updateExtraField(currentField.key, value),
7208
+ };
7209
+ const injector = Injector.create({
7210
+ providers: [{ provide: USER_FORM_FIELD_CONTEXT, useValue: context }],
7242
7211
  parent: field.injector ?? this.parentInjector,
7243
7212
  });
7213
+ this.fieldInjectors.set(field.key, {
7214
+ injector,
7215
+ setField: (next) => (currentField = next),
7216
+ });
7217
+ return injector;
7244
7218
  }
7245
7219
  isFormValid = computed(() => {
7246
7220
  const model = this.formModel();
@@ -7482,14 +7456,13 @@ class UserFormComponent {
7482
7456
  : '*'
7483
7457
  }}
7484
7458
  </label>
7485
- <input
7486
- fInputText
7487
- id="password"
7488
- type="password"
7459
+ <f-password
7460
+ [inputId]="'password'"
7489
7461
  [formField]="formTree.password"
7490
7462
  [placeholder]="
7491
7463
  'administrative.user.password.placeholder' | translate
7492
7464
  "
7465
+ autocomplete="new-password"
7493
7466
  />
7494
7467
  </div>
7495
7468
 
@@ -7508,7 +7481,8 @@ class UserFormComponent {
7508
7481
  @if (hasExtraFields()) {
7509
7482
  <div class="md:col-span-2 border-t border-surface pt-4 mt-2">
7510
7483
  <div class="text-sm font-medium text-muted-color mb-4">
7511
- <ui-icon name="sliders-h" class="mr-2"></ui-icon>{{ 'profile.additional.info' | translate }}
7484
+ <ui-icon name="sliders-h" class="mr-2"></ui-icon
7485
+ >{{ 'profile.additional.info' | translate }}
7512
7486
  </div>
7513
7487
  @if (isLoadingExtraFields()) {
7514
7488
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
@@ -7603,18 +7577,34 @@ class UserFormComponent {
7603
7577
  optionValue="value"
7604
7578
  [ngModel]="getExtraFieldValue(field.key) ?? ''"
7605
7579
  [ngModelOptions]="{ standalone: true }"
7606
- (ngModelChange)="updateExtraField(field.key, $event)"
7607
- [placeholder]="field.placeholderKey | translate: null : field.placeholder ?? ('shared.select' | translate)"
7580
+ (ngModelChange)="
7581
+ updateExtraField(field.key, $event)
7582
+ "
7583
+ [placeholder]="
7584
+ field.placeholderKey
7585
+ | translate
7586
+ : null
7587
+ : field.placeholder ??
7588
+ ('shared.select' | translate)
7589
+ "
7608
7590
  >
7609
- <ng-template #item let-opt>{{ opt.labelKey | translate: null : opt.label }}</ng-template>
7610
- <ng-template #selectedItem let-opt>{{ opt.labelKey | translate: null : opt.label }}</ng-template>
7591
+ <ng-template #item let-opt>{{
7592
+ opt.labelKey | translate: null : opt.label
7593
+ }}</ng-template>
7594
+ <ng-template #selectedItem let-opt>{{
7595
+ opt.labelKey | translate: null : opt.label
7596
+ }}</ng-template>
7611
7597
  </f-select>
7612
7598
  }
7613
7599
  @case ('checkbox') {
7614
7600
  <f-checkbox
7615
7601
  [inputId]="field.key"
7616
- [checked]="$any(getExtraFieldValue(field.key) ?? false)"
7617
- (onChange)="updateExtraField(field.key, $event.checked)"
7602
+ [checked]="
7603
+ $any(getExtraFieldValue(field.key) ?? false)
7604
+ "
7605
+ (onChange)="
7606
+ updateExtraField(field.key, $event.checked)
7607
+ "
7618
7608
  [label]="
7619
7609
  field.placeholderKey
7620
7610
  | translate
@@ -7655,8 +7645,14 @@ class UserFormComponent {
7655
7645
  }
7656
7646
 
7657
7647
  <div class="flex items-center gap-6 md:col-span-2 pt-4">
7658
- <f-checkbox [formField]="formTree.isActive" [label]="'shared.active' | translate" />
7659
- <f-checkbox [formField]="formTree.emailVerified" [label]="'administrative.user.email.verified' | translate" />
7648
+ <f-checkbox
7649
+ [formField]="formTree.isActive"
7650
+ [label]="'shared.active' | translate"
7651
+ />
7652
+ <f-checkbox
7653
+ [formField]="formTree.emailVerified"
7654
+ [label]="'administrative.user.email.verified' | translate"
7655
+ />
7660
7656
  </div>
7661
7657
 
7662
7658
  @if (companyFeatureEnabled() && !isEditMode()) {
@@ -7693,16 +7689,16 @@ class UserFormComponent {
7693
7689
  @if (isLoading()) {
7694
7690
  <ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
7695
7691
  }
7696
- <span pButtonLabel>{{
7692
+ <span pButtonLabel>{{
7697
7693
  isEditMode()
7698
7694
  ? ('shared.update' | translate)
7699
7695
  : ('shared.create' | translate)
7700
- }}</span>
7696
+ }}</span>
7701
7697
  </button>
7702
7698
  </div>
7703
7699
  </form>
7704
7700
  </f-card>
7705
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1$1.SkeletonComponent, selector: "f-skeleton", inputs: ["width", "height", "size", "borderRadius", "shape", "animation", "styleClass"] }, { kind: "component", type: i1$1.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: i1$1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1$1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1$1.TextareaDirective, selector: "[fTextarea]", inputs: ["invalid", "touched", "variant", "fluid", "autoResize"], outputs: ["onResize"] }, { kind: "component", type: i1$1.CardComponent, selector: "f-card", inputs: ["header", "subheader", "styleClass", "style"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
7701
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1$1.SkeletonComponent, selector: "f-skeleton", inputs: ["width", "height", "size", "borderRadius", "shape", "animation", "styleClass"] }, { kind: "component", type: i1$1.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "readonly", "inputId", "invalid", "indeterminate", "variant", "size", "touched", "styleClass", "style", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "directive", type: i1$1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1$1.PasswordComponent, selector: "f-password", inputs: ["toggleMask", "feedback", "disabled", "placeholder", "inputId", "invalid", "touched", "inputStyleClass", "styleClass", "style", "ariaDescribedby", "autocomplete", "variant", "size", "fluid", "appendTo", "promptLabel", "weakLabel", "mediumLabel", "strongLabel", "mediumRegex", "strongRegex"], outputs: ["onBlur", "onFocus"] }, { kind: "component", type: i1$1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1$1.TextareaDirective, selector: "[fTextarea]", inputs: ["invalid", "touched", "variant", "fluid", "autoResize"], outputs: ["onResize"] }, { kind: "component", type: i1$1.CardComponent, selector: "f-card", inputs: ["header", "subheader", "styleClass", "style"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
7706
7702
  }
7707
7703
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: UserFormComponent, decorators: [{
7708
7704
  type: Component,
@@ -7761,14 +7757,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
7761
7757
  : '*'
7762
7758
  }}
7763
7759
  </label>
7764
- <input
7765
- fInputText
7766
- id="password"
7767
- type="password"
7760
+ <f-password
7761
+ [inputId]="'password'"
7768
7762
  [formField]="formTree.password"
7769
7763
  [placeholder]="
7770
7764
  'administrative.user.password.placeholder' | translate
7771
7765
  "
7766
+ autocomplete="new-password"
7772
7767
  />
7773
7768
  </div>
7774
7769
 
@@ -7787,7 +7782,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
7787
7782
  @if (hasExtraFields()) {
7788
7783
  <div class="md:col-span-2 border-t border-surface pt-4 mt-2">
7789
7784
  <div class="text-sm font-medium text-muted-color mb-4">
7790
- <ui-icon name="sliders-h" class="mr-2"></ui-icon>{{ 'profile.additional.info' | translate }}
7785
+ <ui-icon name="sliders-h" class="mr-2"></ui-icon
7786
+ >{{ 'profile.additional.info' | translate }}
7791
7787
  </div>
7792
7788
  @if (isLoadingExtraFields()) {
7793
7789
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
@@ -7882,18 +7878,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
7882
7878
  optionValue="value"
7883
7879
  [ngModel]="getExtraFieldValue(field.key) ?? ''"
7884
7880
  [ngModelOptions]="{ standalone: true }"
7885
- (ngModelChange)="updateExtraField(field.key, $event)"
7886
- [placeholder]="field.placeholderKey | translate: null : field.placeholder ?? ('shared.select' | translate)"
7881
+ (ngModelChange)="
7882
+ updateExtraField(field.key, $event)
7883
+ "
7884
+ [placeholder]="
7885
+ field.placeholderKey
7886
+ | translate
7887
+ : null
7888
+ : field.placeholder ??
7889
+ ('shared.select' | translate)
7890
+ "
7887
7891
  >
7888
- <ng-template #item let-opt>{{ opt.labelKey | translate: null : opt.label }}</ng-template>
7889
- <ng-template #selectedItem let-opt>{{ opt.labelKey | translate: null : opt.label }}</ng-template>
7892
+ <ng-template #item let-opt>{{
7893
+ opt.labelKey | translate: null : opt.label
7894
+ }}</ng-template>
7895
+ <ng-template #selectedItem let-opt>{{
7896
+ opt.labelKey | translate: null : opt.label
7897
+ }}</ng-template>
7890
7898
  </f-select>
7891
7899
  }
7892
7900
  @case ('checkbox') {
7893
7901
  <f-checkbox
7894
7902
  [inputId]="field.key"
7895
- [checked]="$any(getExtraFieldValue(field.key) ?? false)"
7896
- (onChange)="updateExtraField(field.key, $event.checked)"
7903
+ [checked]="
7904
+ $any(getExtraFieldValue(field.key) ?? false)
7905
+ "
7906
+ (onChange)="
7907
+ updateExtraField(field.key, $event.checked)
7908
+ "
7897
7909
  [label]="
7898
7910
  field.placeholderKey
7899
7911
  | translate
@@ -7934,8 +7946,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
7934
7946
  }
7935
7947
 
7936
7948
  <div class="flex items-center gap-6 md:col-span-2 pt-4">
7937
- <f-checkbox [formField]="formTree.isActive" [label]="'shared.active' | translate" />
7938
- <f-checkbox [formField]="formTree.emailVerified" [label]="'administrative.user.email.verified' | translate" />
7949
+ <f-checkbox
7950
+ [formField]="formTree.isActive"
7951
+ [label]="'shared.active' | translate"
7952
+ />
7953
+ <f-checkbox
7954
+ [formField]="formTree.emailVerified"
7955
+ [label]="'administrative.user.email.verified' | translate"
7956
+ />
7939
7957
  </div>
7940
7958
 
7941
7959
  @if (companyFeatureEnabled() && !isEditMode()) {
@@ -7972,11 +7990,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
7972
7990
  @if (isLoading()) {
7973
7991
  <ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
7974
7992
  }
7975
- <span pButtonLabel>{{
7993
+ <span pButtonLabel>{{
7976
7994
  isEditMode()
7977
7995
  ? ('shared.update' | translate)
7978
7996
  : ('shared.create' | translate)
7979
- }}</span>
7997
+ }}</span>
7980
7998
  </button>
7981
7999
  </div>
7982
8000
  </form>