@updevs/components 1.0.0-alpha.45 → 1.0.0-alpha.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"updevs-components-form.mjs","sources":["../../../../libs/components/form/src/models/enums/dynamic-field.type.ts","../../../../libs/components/form/src/tools/errors-helper.ts","../../../../libs/components/form/src/components/dynamic-field/dynamic-field.component.ts","../../../../libs/components/form/src/components/dynamic-field/dynamic-field.component.html","../../../../libs/components/form/src/form.component.ts","../../../../libs/components/form/src/form.component.html","../../../../libs/components/form/src/upd-form.module.ts","../../../../libs/components/form/src/updevs-components-form.ts"],"sourcesContent":["export enum DynamicFieldType {\n Input = 1,\n Select = 2,\n SelectMultiple = 3,\n Label = 4,\n Checkbox = 5,\n CheckboxGroup = 6,\n Radio = 7,\n RadioGroup = 8,\n TextArea = 9,\n FileUpload = 10,\n MaskedInput = 11\n}\n","import { Injectable, inject } from '@angular/core';\nimport { AbstractControl } from '@angular/forms';\nimport { TextService } from '@updevs/sdk';\nimport { DictionaryType, OptionalType } from '@updevs/sdk/types';\nimport { HashMap } from '@jsverse/transloco';\n\nimport { ValidatorConfig } from '../models/validator-config';\n\n@Injectable()\nexport class ErrorsHelper {\n private errors: DictionaryType<ValidatorConfig> = {\n 'required': { text: 'UpDevs.Form.ErrorMessages.Required' },\n 'requiredTrue': { text: 'UpDevs.Form.ErrorMessages.RequiredTrue' },\n 'generic': { text: 'UpDevs.Form.ErrorMessages.Generic' },\n 'email': { text: 'UpDevs.Form.ErrorMessages.Email' },\n 'max': { text: 'UpDevs.Form.ErrorMessages.Max', defaultErrorParamToShow: 'max' },\n 'min': { text: 'UpDevs.Form.ErrorMessages.Min', defaultErrorParamToShow: 'min' },\n 'maxlength': { text: 'UpDevs.Form.ErrorMessages.MaxLength', defaultErrorParamToShow: 'requiredLength' },\n 'minlength': { text: 'UpDevs.Form.ErrorMessages.MinLength', defaultErrorParamToShow: 'requiredLength' }\n };\n private readonly textService = inject(TextService);\n\n getMessages(control: AbstractControl, customConfig?: DictionaryType<ValidatorConfig>): string[] {\n if (!control.errors) {\n return [];\n }\n\n const errorMessages: string[] = [];\n const genericText = this.textService.getText({ text: this.errors['generic']!.text, isTranslated: false });\n const combinedErrorMessagesList: DictionaryType<ValidatorConfig> = Object.assign({}, this.errors, customConfig || {});\n const controlErrorKeys = Object.keys(control.errors);\n\n controlErrorKeys.forEach(key => {\n const customError = !!control.errors ? control.errors[key] : undefined;\n\n if (!!customError?.errorText) {\n errorMessages.push(this.textService.getText(customError.errorText));\n } else if (key in combinedErrorMessagesList) {\n const config = combinedErrorMessagesList[key]!;\n let params: OptionalType<HashMap>;\n\n if (config.showLength) {\n params = { value: control.value?.length || 0 };\n }\n\n if (!!config.defaultErrorParamToShow) {\n params = { value: control.errors![key][config.defaultErrorParamToShow] };\n }\n\n errorMessages.push(this.textService.getText({ text: config.text, isTranslated: false }, params));\n }\n });\n\n if (controlErrorKeys.length > 0 && errorMessages.length < 1) {\n errorMessages.push(genericText);\n }\n\n return errorMessages;\n }\n}\n","import { Component, OnInit, HostBinding, inject, InputSignal, input, Output, EventEmitter } from '@angular/core';\nimport { FormGroup, FormControl } from '@angular/forms';\nimport { TextModel, TextService } from '@updevs/sdk';\nimport { OptionalType } from '@updevs/sdk/types';\nimport { BaseComponent } from '@updevs/sdk/layout';\nimport { ColumnSizeHelper, HorizontalVerticalType, ValidationStatusType } from '@updevs/components';\nimport { Defaults as SelectDefaults } from '@updevs/components/form-controls/select';\nimport { FileUploadChangedEvent } from '@updevs/components/form-controls/file-upload';\n\nimport { FileUploadFieldModel } from '../../models/file-upload-field.model';\nimport { InputFieldModel } from '../../models/input-field.model';\nimport { MaskedInputFieldModel } from '../../models/masked-input-field.model';\nimport { ErrorsHelper } from '../../tools/errors-helper';\nimport { DynamicFieldType } from '../../models/enums/dynamic-field.type';\nimport { DynamicFieldModel } from '../../models/dynamic-field.model';\nimport { CheckboxFieldModel } from '../../models/checkbox-field.model';\nimport { RadioFieldModel } from '../../models/radio-field.model';\nimport { SelectFieldModel } from '../../models/select-field.model';\nimport { SingleSelectFieldModel } from '../../models/single-select-field.model';\nimport { CheckboxGroupFieldModel } from '../../models/checkbox-group-field.model';\nimport { RadioGroupFieldModel } from '../../models/radio-group-field.model';\nimport { TextareaFieldModel } from '../../models/textarea-field.model';\n\n@Component({\n selector: 'upd-dynamic-field',\n templateUrl: './dynamic-field.component.html',\n styleUrl: './dynamic-field.component.scss'\n})\nexport class DynamicFieldComponent extends BaseComponent implements OnInit {\n @HostBinding('class') wrapperClasses = '';\n\n @Output() readonly submitForm = new EventEmitter<void>();\n\n DynamicFieldType = DynamicFieldType;\n SelectDefaults = SelectDefaults;\n\n formGroup: InputSignal<FormGroup> = input.required();\n field: InputSignal<DynamicFieldModel> = input.required();\n layout: InputSignal<HorizontalVerticalType> = input.required();\n validationStatus?: ValidationStatusType;\n validationStatusDescriptions: TextModel[] = [];\n get formControl(): FormControl {\n return this.formGroup().controls[this.field().name] as FormControl;\n }\n get inputField(): InputFieldModel {\n return this.field() as InputFieldModel;\n }\n get checkboxField(): CheckboxFieldModel {\n return this.field() as CheckboxFieldModel;\n }\n get checkboxGroupField(): CheckboxGroupFieldModel {\n return this.field() as CheckboxGroupFieldModel;\n }\n get radioField(): CheckboxFieldModel {\n return this.field() as RadioFieldModel;\n }\n get radioGroupField(): RadioGroupFieldModel {\n return this.field() as RadioGroupFieldModel;\n }\n get selectField(): SelectFieldModel {\n return this.field() as SelectFieldModel;\n }\n get singleSelectField(): SingleSelectFieldModel {\n return this.field() as SingleSelectFieldModel;\n }\n get textareaField(): TextareaFieldModel {\n return this.field() as TextareaFieldModel;\n }\n get fileUploadField(): FileUploadFieldModel {\n return this.field() as FileUploadFieldModel;\n }\n get maskedField(): MaskedInputFieldModel {\n return this.field() as MaskedInputFieldModel;\n }\n get checkboxGroupOptionsKeys(): string[] {\n return Object.keys(this.checkboxGroupField.options);\n }\n get radioGroupOptionsKeys(): string[] {\n return Object.keys(this.radioGroupField.options);\n }\n get fileNameControl(): OptionalType<FormControl> {\n return !!this.fileUploadField.fileNameFormProperty\n ? this.formGroup().controls[this.fileUploadField.fileNameFormProperty] as FormControl\n : undefined;\n }\n\n readonly textService = inject(TextService);\n\n private readonly errorsHelper = inject(ErrorsHelper);\n\n ngOnInit(): void {\n const statusSub = this.formControl.statusChanges.subscribe(status => {\n if (status === 'INVALID') {\n this.validationStatusDescriptions = this.errorsHelper.getMessages(this.formControl)\n .map(t => ({ text: t, isTranslated: true }));\n this.validationStatus = 'invalid';\n } else {\n this.validationStatusDescriptions = [];\n this.validationStatus = this.field().showValidStatus ? 'valid' : undefined;\n }\n });\n\n this.setupWrapperClasses();\n this.addSubscriptions(statusSub);\n }\n\n onBlur(): void {\n if (this.field().shouldValidateOnBlur) {\n this.formControl.updateValueAndValidity();\n }\n }\n\n setControlValue(value: any): void {\n this.formControl.setValue(value);\n this.formControl.markAsDirty();\n }\n\n getText(textModel?: TextModel): string {\n return this.textService.getText(textModel);\n }\n\n getOptionDescription(key: string, type: 'checkbox' | 'radio'): OptionalType<TextModel> {\n return type === 'checkbox' ? this.checkboxGroupField.options[key] : this.radioGroupField.options[key];\n }\n\n handleFileSelected(event?: FileUploadChangedEvent): void {\n this.formControl.setValue(!!this.fileUploadField.saveAsDataUrl ? event?.dataUrl : event?.file);\n this.formControl.markAsDirty();\n\n if (!!this.fileUploadField.fileNameFormProperty) {\n this.fileNameControl!.setValue(event?.file.name);\n }\n }\n\n onInputEnter(): void {\n if (!!this.inputField.shouldSubmitOnEnter) {\n this.submitForm.next();\n }\n }\n\n private setupWrapperClasses(): void {\n this.wrapperClasses = ColumnSizeHelper.getSizeClasses(this.field().colSize);\n }\n}\n","@switch (field().type) {\n @case (DynamicFieldType.Input) {\n <upd-input [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [layout]=\"layout()\" [isDisabled]=\"field().isDisabled || false\"\n [type]=\"inputField.inputType || 'text'\" [labelColSize]=\"field().labelColSize\" [value]=\"formControl.value\"\n (valueChange)=\"setControlValue($event)\" (blurred)=\"onBlur()\" (keyUpEnter)=\"onInputEnter()\">\n @if (!!inputField.prefix) {\n <ng-template updInputPrepend>\n {{ textService.getText(inputField.prefix) }}\n </ng-template>\n }\n\n @if (!!inputField.suffix) {\n <ng-template updInputAppend>\n {{ textService.getText(inputField.suffix) }}\n </ng-template>\n }\n </upd-input>\n }\n @case (DynamicFieldType.Checkbox) {\n <upd-checkbox [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isDisabled]=\"field().isDisabled || false\" [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n [isSwitch]=\"checkboxField.isSwitch || false\" (changed)=\"setControlValue($event)\"></upd-checkbox>\n }\n @case (DynamicFieldType.CheckboxGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of checkboxGroupOptionsKeys; track option) {\n <upd-checkbox [name]=\"field().name\" [label]=\"getOptionDescription(option, 'checkbox')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\" [isSwitch]=\"checkboxField.isSwitch || false\"\n (changed)=\"setControlValue(option)\"></upd-checkbox>\n }\n }\n @case (DynamicFieldType.Radio) {\n <upd-radio [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isChecked]=\"formControl.value\" [isDisabled]=\"field().isDisabled || false\" [isInline]=\"radioField.isInline || false\"\n (selected)=\"setControlValue($event)\">\n </upd-radio>\n }\n @case (DynamicFieldType.RadioGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of radioGroupOptionsKeys; track option) {\n <upd-radio [name]=\"field().name\" [label]=\"getOptionDescription(option, 'radio')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n (selected)=\"setControlValue(option)\"></upd-radio>\n }\n }\n @case (DynamicFieldType.Select) {\n <upd-select [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\"\n [useSystemStyle]=\"singleSelectField.useSystemStyle || false\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedItem)=\"setControlValue($event?.value)\"></upd-select>\n }\n @case (DynamicFieldType.SelectMultiple) {\n <upd-select-multiple [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedIds)=\"setControlValue($event)\"></upd-select-multiple>\n }\n @case (DynamicFieldType.Label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n @case (DynamicFieldType.TextArea) {\n <upd-textarea [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [value]=\"formControl.value\" [customClasses]=\"textareaField.customClasses\" [wrapperClasses]=\"textareaField.wrapperClasses\"\n [maxLength]=\"textareaField.maxLength\" [rows]=\"textareaField.rows\"\n [displayCharactersCount]=\"textareaField.displayCharactersCount || false\" (valueChange)=\"setControlValue($event)\">\n </upd-textarea>\n }\n @case (DynamicFieldType.FileUpload) {\n <upd-file-upload [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [isDisabled]=\"field().isDisabled || false\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\" [fileName]=\"fileNameControl?.value\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [allowFilesDrop]=\"fileUploadField.allowFilesDrop || false\"\n [title]=\"fileUploadField.title\" [labelColSize]=\"field().labelColSize\" [minFileSize]=\"fileUploadField.minFileSize\"\n [isMultiple]=\"fileUploadField.isMultiple || false\" [allowedExtensions]=\"fileUploadField.allowedExtensions || '*'\"\n [maxFileSize]=\"fileUploadField.maxFileSize\" [layout]=\"layout()\" (fileChanged)=\"handleFileSelected($event)\"></upd-file-upload>\n }\n @case (DynamicFieldType.MaskedInput) {\n <upd-input [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\" [mask]=\"maskedField.mask\"\n [maskConfig]=\"maskedField.maskConfig\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [layout]=\"layout()\"\n [isDisabled]=\"field().isDisabled || false\" [type]=\"inputField.inputType || 'text'\" [labelColSize]=\"field().labelColSize\"\n [value]=\"formControl.value\" (valueChange)=\"setControlValue($event)\" (blurred)=\"onBlur()\" (keyUpEnter)=\"onInputEnter()\">\n @if (!!inputField.prefix) {\n <ng-template updInputPrepend>\n {{ textService.getText(inputField.prefix) }}\n </ng-template>\n }\n\n @if (!!inputField.suffix) {\n <ng-template updInputAppend>\n {{ textService.getText(inputField.suffix) }}\n </ng-template>\n }\n </upd-input>\n }\n}\n","import { Component, effect, EventEmitter, inject, input, InputSignal, model, OnInit, Output } from '@angular/core';\nimport { FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms';\nimport { HorizontalVerticalType } from '@updevs/components';\nimport { TextModel, TextService } from '@updevs/sdk';\nimport { BaseComponent } from '@updevs/sdk/layout';\nimport { OptionalType } from '@updevs/sdk/types';\n\nimport { DynamicFieldType } from './models/enums/dynamic-field.type';\nimport { FileUploadFieldModel } from './models/file-upload-field.model';\nimport { FormRowModel } from './models/form-row.model';\n\n@Component({\n selector: 'upd-form',\n templateUrl: './form.component.html',\n styleUrl: './form.component.scss'\n})\nexport class FormComponent<T> extends BaseComponent implements OnInit {\n @Output() readonly initialized = new EventEmitter<void>();\n @Output() readonly dataLoaded = new EventEmitter<T>(); // TODO: implementar\n @Output() readonly submitted = new EventEmitter<T>();\n\n /**\n * Rows to generate the form.\n */\n rows: InputSignal<FormRowModel[]> = input.required();\n /**\n * Form's layout.\n */\n layout: InputSignal<HorizontalVerticalType> = input<HorizontalVerticalType>('vertical');\n /**\n * Title of the form.\n * Optional.\n */\n title: InputSignal<OptionalType<TextModel>> = input<OptionalType<TextModel>>(undefined);\n /**\n * Whether the actions section will be displayed.\n */\n hasActionsSection = input(true);\n /**\n * Whether the form is contained in a card.\n * If true, it'll display a card as a form wrapper.\n */\n isCard = input(false);\n /**\n * Whether the form is in read only mode, which means no fields can be edited.\n */\n isDisabled = input(false, { transform: (val: boolean | string) => typeof val === 'string' ? val === '' : val });\n /**\n * Whether the form is loading.\n */\n isLoading = input(false); // TODO: implementar\n /**\n * Whether the form is saving.\n */\n isSaving = input(false); // TODO: implementar\n /**\n * Current form data.\n */\n formData = model({} as T);\n formGroup = model(new FormGroup({}));\n get titleText(): string {\n return this.textService.getText(this.title());\n }\n\n readonly textService = inject(TextService);\n\n constructor() {\n super();\n\n effect(() => {\n this.rows();\n this.setupFormGroup();\n });\n }\n\n ngOnInit(): void {\n this.setupFormGroup();\n this.initialized.emit();\n\n const valueChangesSub = this.formGroup().valueChanges.subscribe(() => this.formData.set(this.formGroup().getRawValue() as T));\n\n this.addSubscriptions(valueChangesSub);\n }\n\n submit(): void {\n this.formGroup().markAllAsTouched();\n this.formGroup().updateValueAndValidity();\n Object.values(this.formGroup().controls).forEach(control => (control as FormControl).updateValueAndValidity());\n\n if (this.formGroup().valid) {\n this.submitted.emit(this.formGroup().value as T);\n }\n }\n\n private setupFormGroup(): void {\n const allFields = this.rows().map(r => r.fields).reduce((acc, fields) => acc.concat(fields), []);\n\n allFields.forEach(field => {\n const validators: ValidatorFn[] = field.validators || [];\n\n if (field.isRequired && !validators.includes(Validators.required)) {\n validators.push(Validators.required);\n }\n\n // TODO: handle extra cases, when ready. DateRange, DateTimeRange, TimeRange, etc.\n switch (field.type) {\n case DynamicFieldType.FileUpload:\n this.formGroup().addControl(\n field.name,\n new FormControl({\n value: field.initValue,\n disabled: field.isDisabled || this.isDisabled()\n }, { validators: validators })\n );\n\n const fileNameFormProp = (field as FileUploadFieldModel).fileNameFormProperty;\n\n if (!!fileNameFormProp) {\n this.formGroup().addControl(\n fileNameFormProp,\n new FormControl({\n value: field.initValue,\n disabled: field.isDisabled || this.isDisabled()\n }, { validators: validators })\n );\n }\n\n break;\n default:\n this.formGroup().addControl(\n field.name,\n new FormControl({\n value: field.initValue,\n disabled: field.isDisabled || this.isDisabled()\n }, { validators: validators })\n );\n }\n });\n }\n}\n","<ng-container *transloco=\"let t; prefix: 'UpDevs.Form'\">\n <div [class.card]=\"isCard()\">\n @if (!!titleText) {\n <div [class.card-header]=\"isCard()\">\n <h3 [class.card-title]=\"isCard()\">{{ titleText }}</h3>\n </div>\n }\n <div [class.card-body]=\"isCard()\">\n @for (row of rows(); track row; let isFirst = $first) {\n <div class=\"row\" [class.mt-4]=\"!isFirst\">\n @if (!!row.title) {\n <div class=\"card-title\">{{ textService.getText(row.title) }}</div>\n }\n\n @for (field of row.fields; track field.name) {\n <upd-dynamic-field [layout]=\"layout()\" [field]=\"field\" [formGroup]=\"formGroup()\" (submitForm)=\"submit()\">\n </upd-dynamic-field>\n }\n </div>\n }\n </div>\n\n @if (hasActionsSection()) {\n <div [class.card-footer]=\"isCard()\" [class.mt-4]=\"!isCard()\">\n <upd-button colorStyle=\"primary\" (clicked)=\"submit()\">\n {{ t('Submit') }}\n </upd-button>\n </div>\n }\n </div>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { UpdSdkModule } from '@updevs/sdk';\nimport { UpdButtonModule } from '@updevs/components/button';\nimport { UpdInputModule } from '@updevs/components/form-controls/input';\nimport { UpdCheckboxModule } from '@updevs/components/form-controls/checkbox';\nimport { UpdRadioModule } from '@updevs/components/form-controls/radio';\nimport { UpdDatePickerModule } from '@updevs/components/form-controls/date-picker';\nimport { UpdSelectModule } from '@updevs/components/form-controls/select';\nimport { UpdTextareaModule } from '@updevs/components/form-controls/textarea';\nimport { UpdFileUploadModule } from '@updevs/components/form-controls/file-upload';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\n\nimport * as en from './assets/i18n/en.json';\nimport * as pt from './assets/i18n/pt.json';\nimport { FormComponent } from './form.component';\nimport { DynamicFieldComponent } from './components/dynamic-field/dynamic-field.component';\nimport { ErrorsHelper } from './tools/errors-helper';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n UpdButtonModule,\n TranslocoDirective,\n UpdInputModule,\n UpdCheckboxModule,\n UpdRadioModule,\n UpdDatePickerModule,\n UpdSelectModule,\n UpdTextareaModule,\n UpdFileUploadModule,\n UpdSdkModule\n ],\n declarations: [\n FormComponent,\n DynamicFieldComponent\n ],\n exports: [\n FormComponent\n ],\n providers: [\n ErrorsHelper\n ]\n})\nexport class UpdFormModule {\n constructor(translocoService: TranslocoService) {\n translocoService.setFallbackLangForMissingTranslation({ fallbackLang: 'en' });\n translocoService.setTranslation(en, 'en');\n translocoService.setTranslation(pt, 'pt');\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["SelectDefaults","i1","i2","i3","i4.DynamicFieldComponent","en","pt"],"mappings":"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"}
1
+ {"version":3,"file":"updevs-components-form.mjs","sources":["../../../../libs/components/form/src/models/enums/dynamic-field.type.ts","../../../../libs/components/form/src/tools/errors-helper.ts","../../../../libs/components/form/src/components/dynamic-field/dynamic-field.component.ts","../../../../libs/components/form/src/components/dynamic-field/dynamic-field.component.html","../../../../libs/components/form/src/form.component.ts","../../../../libs/components/form/src/form.component.html","../../../../libs/components/form/src/upd-form.module.ts","../../../../libs/components/form/src/updevs-components-form.ts"],"sourcesContent":["export enum DynamicFieldType {\n Input = 1,\n Select = 2,\n SelectMultiple = 3,\n Label = 4,\n Checkbox = 5,\n CheckboxGroup = 6,\n Radio = 7,\n RadioGroup = 8,\n TextArea = 9,\n FileUpload = 10,\n MaskedInput = 11\n}\n","import { Injectable, inject } from '@angular/core';\nimport { AbstractControl } from '@angular/forms';\nimport { TextService } from '@updevs/sdk';\nimport { DictionaryType, OptionalType } from '@updevs/sdk/types';\nimport { HashMap } from '@jsverse/transloco';\n\nimport { ValidatorConfig } from '../models/validator-config';\n\n@Injectable()\nexport class ErrorsHelper {\n private errors: DictionaryType<ValidatorConfig> = {\n 'required': { text: 'UpDevs.Form.ErrorMessages.Required' },\n 'requiredTrue': { text: 'UpDevs.Form.ErrorMessages.RequiredTrue' },\n 'generic': { text: 'UpDevs.Form.ErrorMessages.Generic' },\n 'email': { text: 'UpDevs.Form.ErrorMessages.Email' },\n 'max': { text: 'UpDevs.Form.ErrorMessages.Max', defaultErrorParamToShow: 'max' },\n 'min': { text: 'UpDevs.Form.ErrorMessages.Min', defaultErrorParamToShow: 'min' },\n 'maxlength': { text: 'UpDevs.Form.ErrorMessages.MaxLength', defaultErrorParamToShow: 'requiredLength' },\n 'minlength': { text: 'UpDevs.Form.ErrorMessages.MinLength', defaultErrorParamToShow: 'requiredLength' }\n };\n private readonly textService = inject(TextService);\n\n getMessages(control: AbstractControl, customConfig?: DictionaryType<ValidatorConfig>): string[] {\n if (!control.errors) {\n return [];\n }\n\n const errorMessages: string[] = [];\n const genericText = this.textService.getText({ text: this.errors['generic']!.text, isTranslated: false });\n const combinedErrorMessagesList: DictionaryType<ValidatorConfig> = Object.assign({}, this.errors, customConfig || {});\n const controlErrorKeys = Object.keys(control.errors);\n\n controlErrorKeys.forEach(key => {\n const customError = !!control.errors ? control.errors[key] : undefined;\n\n if (!!customError?.errorText) {\n errorMessages.push(this.textService.getText(customError.errorText));\n } else if (key in combinedErrorMessagesList) {\n const config = combinedErrorMessagesList[key]!;\n let params: OptionalType<HashMap>;\n\n if (config.showLength) {\n params = { value: control.value?.length || 0 };\n }\n\n if (!!config.defaultErrorParamToShow) {\n params = { value: control.errors![key][config.defaultErrorParamToShow] };\n }\n\n errorMessages.push(this.textService.getText({ text: config.text, isTranslated: false }, params));\n }\n });\n\n if (controlErrorKeys.length > 0 && errorMessages.length < 1) {\n errorMessages.push(genericText);\n }\n\n return errorMessages;\n }\n}\n","import { Component, OnInit, HostBinding, inject, InputSignal, input, Output, EventEmitter } from '@angular/core';\nimport { FormGroup, FormControl } from '@angular/forms';\nimport { TextModel, TextService } from '@updevs/sdk';\nimport { OptionalType } from '@updevs/sdk/types';\nimport { BaseComponent } from '@updevs/sdk/layout';\nimport { ColumnSizeHelper, HorizontalVerticalType, ValidationStatusType } from '@updevs/components';\nimport { Defaults as SelectDefaults } from '@updevs/components/form-controls/select';\nimport { FileUploadChangedEvent } from '@updevs/components/form-controls/file-upload';\n\nimport { FileUploadFieldModel } from '../../models/file-upload-field.model';\nimport { InputFieldModel } from '../../models/input-field.model';\nimport { MaskedInputFieldModel } from '../../models/masked-input-field.model';\nimport { ErrorsHelper } from '../../tools/errors-helper';\nimport { DynamicFieldType } from '../../models/enums/dynamic-field.type';\nimport { DynamicFieldModel } from '../../models/dynamic-field.model';\nimport { CheckboxFieldModel } from '../../models/checkbox-field.model';\nimport { RadioFieldModel } from '../../models/radio-field.model';\nimport { SelectFieldModel } from '../../models/select-field.model';\nimport { SingleSelectFieldModel } from '../../models/single-select-field.model';\nimport { CheckboxGroupFieldModel } from '../../models/checkbox-group-field.model';\nimport { RadioGroupFieldModel } from '../../models/radio-group-field.model';\nimport { TextareaFieldModel } from '../../models/textarea-field.model';\n\n@Component({\n selector: 'upd-dynamic-field',\n templateUrl: './dynamic-field.component.html',\n styleUrl: './dynamic-field.component.scss'\n})\nexport class DynamicFieldComponent extends BaseComponent implements OnInit {\n @HostBinding('class') wrapperClasses = '';\n\n @Output() readonly submitForm = new EventEmitter<void>();\n\n DynamicFieldType = DynamicFieldType;\n SelectDefaults = SelectDefaults;\n\n formGroup: InputSignal<FormGroup> = input.required();\n field: InputSignal<DynamicFieldModel> = input.required();\n layout: InputSignal<HorizontalVerticalType> = input.required();\n validationStatus?: ValidationStatusType;\n validationStatusDescriptions: TextModel[] = [];\n get formControl(): FormControl {\n return this.formGroup().controls[this.field().name] as FormControl;\n }\n get inputField(): InputFieldModel {\n return this.field() as InputFieldModel;\n }\n get checkboxField(): CheckboxFieldModel {\n return this.field() as CheckboxFieldModel;\n }\n get checkboxGroupField(): CheckboxGroupFieldModel {\n return this.field() as CheckboxGroupFieldModel;\n }\n get radioField(): CheckboxFieldModel {\n return this.field() as RadioFieldModel;\n }\n get radioGroupField(): RadioGroupFieldModel {\n return this.field() as RadioGroupFieldModel;\n }\n get selectField(): SelectFieldModel {\n return this.field() as SelectFieldModel;\n }\n get singleSelectField(): SingleSelectFieldModel {\n return this.field() as SingleSelectFieldModel;\n }\n get textareaField(): TextareaFieldModel {\n return this.field() as TextareaFieldModel;\n }\n get fileUploadField(): FileUploadFieldModel {\n return this.field() as FileUploadFieldModel;\n }\n get maskedField(): MaskedInputFieldModel {\n return this.field() as MaskedInputFieldModel;\n }\n get checkboxGroupOptionsKeys(): string[] {\n return Object.keys(this.checkboxGroupField.options);\n }\n get radioGroupOptionsKeys(): string[] {\n return Object.keys(this.radioGroupField.options);\n }\n get fileNameControl(): OptionalType<FormControl> {\n return !!this.fileUploadField.fileNameFormProperty\n ? this.formGroup().controls[this.fileUploadField.fileNameFormProperty] as FormControl\n : undefined;\n }\n\n readonly textService = inject(TextService);\n\n private readonly errorsHelper = inject(ErrorsHelper);\n\n ngOnInit(): void {\n const statusSub = this.formControl.statusChanges.subscribe(status => {\n if (status === 'INVALID') {\n this.validationStatusDescriptions = this.errorsHelper.getMessages(this.formControl)\n .map(t => ({ text: t, isTranslated: true }));\n this.validationStatus = 'invalid';\n } else {\n this.validationStatusDescriptions = [];\n this.validationStatus = this.field().showValidStatus ? 'valid' : undefined;\n }\n });\n\n this.setupWrapperClasses();\n this.addSubscriptions(statusSub);\n }\n\n onBlur(): void {\n if (this.field().shouldValidateOnBlur) {\n this.formControl.updateValueAndValidity();\n }\n }\n\n setControlValue(value: any): void {\n this.formControl.setValue(value);\n this.formControl.markAsDirty();\n }\n\n getText(textModel?: TextModel): string {\n return this.textService.getText(textModel);\n }\n\n getOptionDescription(key: string, type: 'checkbox' | 'radio'): OptionalType<TextModel> {\n return type === 'checkbox' ? this.checkboxGroupField.options[key] : this.radioGroupField.options[key];\n }\n\n handleFileSelected(event?: FileUploadChangedEvent): void {\n this.formControl.setValue(!!this.fileUploadField.saveAsDataUrl ? event?.dataUrl : event?.file);\n this.formControl.markAsDirty();\n\n if (!!this.fileUploadField.fileNameFormProperty) {\n this.fileNameControl!.setValue(event?.file.name);\n }\n }\n\n onInputEnter(): void {\n if (!!this.inputField.shouldSubmitOnEnter) {\n this.submitForm.next();\n }\n }\n\n private setupWrapperClasses(): void {\n this.wrapperClasses = ColumnSizeHelper.getSizeClasses(this.field().colSize);\n }\n}\n","@switch (field().type) {\n @case (DynamicFieldType.Input) {\n <upd-input [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [layout]=\"layout()\" [isDisabled]=\"field().isDisabled || false\"\n [type]=\"inputField.inputType || 'text'\" [labelColSize]=\"field().labelColSize\" [value]=\"formControl.value\"\n (valueChange)=\"setControlValue($event)\" (blurred)=\"onBlur()\" (keyUpEnter)=\"onInputEnter()\">\n @if (!!inputField.prefix) {\n <ng-template updInputPrepend>\n {{ textService.getText(inputField.prefix) }}\n </ng-template>\n }\n\n @if (!!inputField.suffix) {\n <ng-template updInputAppend>\n {{ textService.getText(inputField.suffix) }}\n </ng-template>\n }\n </upd-input>\n }\n @case (DynamicFieldType.Checkbox) {\n <upd-checkbox [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isDisabled]=\"field().isDisabled || false\" [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n [isSwitch]=\"checkboxField.isSwitch || false\" (changed)=\"setControlValue($event)\"></upd-checkbox>\n }\n @case (DynamicFieldType.CheckboxGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of checkboxGroupOptionsKeys; track option) {\n <upd-checkbox [name]=\"field().name\" [label]=\"getOptionDescription(option, 'checkbox')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\" [isSwitch]=\"checkboxField.isSwitch || false\"\n (changed)=\"setControlValue(option)\"></upd-checkbox>\n }\n }\n @case (DynamicFieldType.Radio) {\n <upd-radio [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"true\"\n [isChecked]=\"formControl.value\" [isDisabled]=\"field().isDisabled || false\" [isInline]=\"radioField.isInline || false\"\n (selected)=\"setControlValue($event)\">\n </upd-radio>\n }\n @case (DynamicFieldType.RadioGroup) {\n @if (!!field().label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n\n @for (option of radioGroupOptionsKeys; track option) {\n <upd-radio [name]=\"field().name\" [label]=\"getOptionDescription(option, 'radio')\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [value]=\"option\" [isDisabled]=\"field().isDisabled || false\"\n [isChecked]=\"formControl.value\" [isInline]=\"checkboxField.isInline || false\"\n (selected)=\"setControlValue(option)\"></upd-radio>\n }\n }\n @case (DynamicFieldType.Select) {\n <upd-select [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [hintAsTooltip]=\"field().hintAsTooltip || false\"\n [validationStatus]=\"validationStatus\" [validationStatusDescriptions]=\"validationStatusDescriptions\"\n [useSystemStyle]=\"singleSelectField.useSystemStyle || false\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedItem)=\"setControlValue($event?.value)\"></upd-select>\n }\n @case (DynamicFieldType.SelectMultiple) {\n <upd-select-multiple [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [items]=\"selectField.items\" [layout]=\"layout()\" [labelColSize]=\"field().labelColSize\" [store]=\"selectField.store!\"\n [observable]=\"selectField.observable\" [itemKey]=\"selectField.itemKey\" [itemValue]=\"selectField.itemValue\"\n [dropdownMaxHeight]=\"selectField.dropdownMaxHeight || SelectDefaults.dropdownMaxHeight\"\n [typeaheadDebounce]=\"selectField.typeaheadDebounce || SelectDefaults.typeaheadDebounce\"\n [shouldAutoSearch]=\"selectField.shouldAutoSearch || SelectDefaults.shouldAutoSearch\"\n [shouldCloseOnOutsideClick]=\"selectField.shouldCloseOnOutsideClick || SelectDefaults.shouldCloseOnOutsideClick\"\n (selectedIds)=\"setControlValue($event)\"></upd-select-multiple>\n }\n @case (DynamicFieldType.Label) {\n <label class=\"form-label\">{{ getText(field().label) }}</label>\n }\n @case (DynamicFieldType.TextArea) {\n <upd-textarea [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [isDisabled]=\"field().isDisabled || false\"\n [value]=\"formControl.value\" [customClasses]=\"textareaField.customClasses\" [wrapperClasses]=\"textareaField.wrapperClasses\"\n [maxLength]=\"textareaField.maxLength\" [rows]=\"textareaField.rows\"\n [displayCharactersCount]=\"textareaField.displayCharactersCount || false\" (valueChange)=\"setControlValue($event)\">\n </upd-textarea>\n }\n @case (DynamicFieldType.FileUpload) {\n <upd-file-upload [name]=\"field().name\" [label]=\"field().label\" [hint]=\"field().hint\" [isDisabled]=\"field().isDisabled || false\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\" [fileName]=\"fileNameControl?.value\"\n [validationStatusDescriptions]=\"validationStatusDescriptions\" [allowFilesDrop]=\"fileUploadField.allowFilesDrop || false\"\n [title]=\"fileUploadField.title\" [labelColSize]=\"field().labelColSize\" [minFileSize]=\"fileUploadField.minFileSize\"\n [isMultiple]=\"fileUploadField.isMultiple || false\" [allowedExtensions]=\"fileUploadField.allowedExtensions || '*'\"\n [maxFileSize]=\"fileUploadField.maxFileSize\" [layout]=\"layout()\" (fileChanged)=\"handleFileSelected($event)\"></upd-file-upload>\n }\n @case (DynamicFieldType.MaskedInput) {\n <upd-input [name]=\"field().name\" [label]=\"field().label\" [placeholder]=\"field().placeholder\" [hint]=\"field().hint\"\n [hintAsTooltip]=\"field().hintAsTooltip || false\" [validationStatus]=\"validationStatus\" [mask]=\"maskedField.mask\"\n [maskConfig]=\"maskedField.maskConfig\" [validationStatusDescriptions]=\"validationStatusDescriptions\" [layout]=\"layout()\"\n [isDisabled]=\"field().isDisabled || false\" [type]=\"inputField.inputType || 'text'\" [labelColSize]=\"field().labelColSize\"\n [value]=\"formControl.value\" (valueChange)=\"setControlValue($event)\" (blurred)=\"onBlur()\" (keyUpEnter)=\"onInputEnter()\">\n @if (!!inputField.prefix) {\n <ng-template updInputPrepend>\n {{ textService.getText(inputField.prefix) }}\n </ng-template>\n }\n\n @if (!!inputField.suffix) {\n <ng-template updInputAppend>\n {{ textService.getText(inputField.suffix) }}\n </ng-template>\n }\n </upd-input>\n }\n}\n","import { Component, effect, EventEmitter, inject, input, InputSignal, model, OnInit, Output } from '@angular/core';\nimport { FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms';\nimport { HorizontalVerticalType } from '@updevs/components';\nimport { TextModel, TextService } from '@updevs/sdk';\nimport { BaseComponent } from '@updevs/sdk/layout';\nimport { OptionalType } from '@updevs/sdk/types';\n\nimport { DynamicFieldType } from './models/enums/dynamic-field.type';\nimport { FileUploadFieldModel } from './models/file-upload-field.model';\nimport { FormRowModel } from './models/form-row.model';\n\n@Component({\n selector: 'upd-form',\n templateUrl: './form.component.html',\n styleUrl: './form.component.scss'\n})\nexport class FormComponent<T> extends BaseComponent implements OnInit {\n @Output() readonly initialized = new EventEmitter<void>();\n @Output() readonly dataLoaded = new EventEmitter<T>(); // TODO: implementar\n @Output() readonly submitted = new EventEmitter<T>();\n\n /**\n * Rows to generate the form.\n */\n rows: InputSignal<FormRowModel[]> = input.required();\n /**\n * Form's layout.\n */\n layout: InputSignal<HorizontalVerticalType> = input<HorizontalVerticalType>('vertical');\n /**\n * Title of the form.\n * Optional.\n */\n title: InputSignal<OptionalType<TextModel>> = input<OptionalType<TextModel>>(undefined);\n /**\n * Whether the actions section will be displayed.\n */\n hasActionsSection = input(true);\n /**\n * Whether the form is contained in a card.\n * If true, it'll display a card as a form wrapper.\n */\n isCard = input(false);\n /**\n * Whether the form is in read only mode, which means no fields can be edited.\n */\n isDisabled = input(false, { transform: (val: boolean | string) => typeof val === 'string' ? val === '' : val });\n /**\n * Whether the form is loading.\n */\n isLoading = input(false); // TODO: implementar\n /**\n * Whether the form is saving.\n */\n isSaving = input(false); // TODO: implementar\n /**\n * Current form data.\n */\n formData = model({} as T);\n formGroup = model(new FormGroup({}));\n get titleText(): string {\n return this.textService.getText(this.title());\n }\n\n readonly textService = inject(TextService);\n\n constructor() {\n super();\n\n effect(() => {\n this.rows();\n this.setupFormGroup();\n });\n }\n\n ngOnInit(): void {\n this.setupFormGroup();\n this.initialized.emit();\n\n const valueChangesSub = this.formGroup().valueChanges.subscribe(() => this.formData.set(this.formGroup().getRawValue() as T));\n\n this.addSubscriptions(valueChangesSub);\n }\n\n submit(): void {\n this.formGroup().markAllAsTouched();\n this.formGroup().updateValueAndValidity();\n Object.values(this.formGroup().controls).forEach(control => (control as FormControl).updateValueAndValidity());\n\n if (this.formGroup().valid) {\n this.submitted.emit(this.formGroup().value as T);\n }\n }\n\n private setupFormGroup(): void {\n const allFields = this.rows().map(r => r.fields).reduce((acc, fields) => acc.concat(fields), []);\n\n allFields.forEach(field => {\n const validators: ValidatorFn[] = field.validators || [];\n\n if (field.isRequired && !validators.includes(Validators.required)) {\n validators.push(Validators.required);\n }\n\n // TODO: handle extra cases, when ready. DateRange, DateTimeRange, TimeRange, etc.\n switch (field.type) {\n case DynamicFieldType.FileUpload:\n this.formGroup().addControl(\n field.name,\n new FormControl({\n value: field.initValue,\n disabled: field.isDisabled || this.isDisabled()\n }, { validators: validators })\n );\n\n const fileNameFormProp = (field as FileUploadFieldModel).fileNameFormProperty;\n\n if (!!fileNameFormProp) {\n this.formGroup().addControl(\n fileNameFormProp,\n new FormControl({\n value: field.initValue,\n disabled: field.isDisabled || this.isDisabled()\n }, { validators: validators })\n );\n }\n\n break;\n default:\n this.formGroup().addControl(\n field.name,\n new FormControl({\n value: field.initValue,\n disabled: field.isDisabled || this.isDisabled()\n }, { validators: validators })\n );\n }\n });\n }\n}\n","<ng-container *transloco=\"let t; prefix: 'UpDevs.Form'\">\n <div [class.card]=\"isCard()\">\n @if (!!titleText) {\n <div [class.card-header]=\"isCard()\">\n <h3 [class.card-title]=\"isCard()\">{{ titleText }}</h3>\n </div>\n }\n <div [class.card-body]=\"isCard()\">\n @for (row of rows(); track row; let isFirst = $first) {\n <div class=\"row\" [class.mt-4]=\"!isFirst\">\n @if (!!row.title) {\n <div class=\"card-title col-12\">{{ textService.getText(row.title) }}</div>\n }\n\n @for (field of row.fields; track field.name) {\n <upd-dynamic-field [layout]=\"layout()\" [field]=\"field\" [formGroup]=\"formGroup()\" (submitForm)=\"submit()\">\n </upd-dynamic-field>\n }\n </div>\n }\n </div>\n\n @if (hasActionsSection()) {\n <div [class.card-footer]=\"isCard()\" [class.mt-4]=\"!isCard()\">\n <upd-button colorStyle=\"primary\" (clicked)=\"submit()\">\n {{ t('Submit') }}\n </upd-button>\n </div>\n }\n </div>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { UpdSdkModule } from '@updevs/sdk';\nimport { UpdButtonModule } from '@updevs/components/button';\nimport { UpdInputModule } from '@updevs/components/form-controls/input';\nimport { UpdCheckboxModule } from '@updevs/components/form-controls/checkbox';\nimport { UpdRadioModule } from '@updevs/components/form-controls/radio';\nimport { UpdDatePickerModule } from '@updevs/components/form-controls/date-picker';\nimport { UpdSelectModule } from '@updevs/components/form-controls/select';\nimport { UpdTextareaModule } from '@updevs/components/form-controls/textarea';\nimport { UpdFileUploadModule } from '@updevs/components/form-controls/file-upload';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\n\nimport * as en from './assets/i18n/en.json';\nimport * as pt from './assets/i18n/pt.json';\nimport { FormComponent } from './form.component';\nimport { DynamicFieldComponent } from './components/dynamic-field/dynamic-field.component';\nimport { ErrorsHelper } from './tools/errors-helper';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n UpdButtonModule,\n TranslocoDirective,\n UpdInputModule,\n UpdCheckboxModule,\n UpdRadioModule,\n UpdDatePickerModule,\n UpdSelectModule,\n UpdTextareaModule,\n UpdFileUploadModule,\n UpdSdkModule\n ],\n declarations: [\n FormComponent,\n DynamicFieldComponent\n ],\n exports: [\n FormComponent\n ],\n providers: [\n ErrorsHelper\n ]\n})\nexport class UpdFormModule {\n constructor(translocoService: TranslocoService) {\n translocoService.setFallbackLangForMissingTranslation({ fallbackLang: 'en' });\n translocoService.setTranslation(en, 'en');\n translocoService.setTranslation(pt, 'pt');\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["SelectDefaults","i1","i2","i3","i4.DynamicFieldComponent","en","pt"],"mappings":"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"}
@@ -130,6 +130,10 @@ class HeaderComponent extends BaseComponent {
130
130
  this.nextThemeIcon = computed(() => this.currentPreferences()?.isDarkTheme ? 'sun' : 'moon-stars');
131
131
  this.currentNotificationsIcon = computed(() => this.hasNewNotifications() ? 'bell-ringing' : 'bell');
132
132
  this.hasNewNotifications = computed(() => this.currentNotifications().some(n => !n.dateRead));
133
+ this.userInfo = computed(() => this.securityStorage.getUserInfo());
134
+ this.textService = inject(TextService);
135
+ this.isSidebarMobileOpen = signal(false);
136
+ this.shouldBlinkIfNewNotifications = computed(() => !!this.coreLayoutConfigService.config.shouldBlinkIfNewNotifications);
133
137
  this.languagesOptions = computed(() => {
134
138
  const allLanguagesOptions = [];
135
139
  const availableLanguages = (this.coreLayoutConfigService.config.availableLanguages || {});
@@ -153,12 +157,10 @@ class HeaderComponent extends BaseComponent {
153
157
  }));
154
158
  return userActions;
155
159
  });
156
- this.userInfo = computed(() => this.securityStorage.getUserInfo());
157
160
  this.userIdentification = computed(() => !!this.userInfo() ? this.coreLayoutConfigService.config.getUserName(this.userInfo()) : '');
158
161
  this.userDescription = computed(() => !!this.coreLayoutConfigService.config.getUserDescription
159
162
  ? this.coreLayoutConfigService.config.getUserDescription(this.userInfo())
160
163
  : '');
161
- this.shouldBlinkIfNewNotifications = computed(() => !!this.coreLayoutConfigService.config.shouldBlinkIfNewNotifications);
162
164
  this.latestNotifications = computed(() => {
163
165
  const unreadNotifications = this.currentNotifications()
164
166
  .filter(n => !n.dateRead)
@@ -173,8 +175,12 @@ class HeaderComponent extends BaseComponent {
173
175
  ...readNotifications
174
176
  ].slice(0, this.coreLayoutConfigService.config.numberOfLastNotificationsDisplayed);
175
177
  });
176
- this.textService = inject(TextService);
177
- this.isSidebarMobileOpen = signal(false);
178
+ this.userInitials = computed(() => {
179
+ const firstChar = this.userIdentification().charAt(0);
180
+ const lastSpaceIndex = this.userIdentification().lastIndexOf(' ');
181
+ const firstAfterLastSpace = lastSpaceIndex !== -1 ? this.userIdentification().charAt(lastSpaceIndex + 1) : '';
182
+ return `${firstChar}${firstAfterLastSpace}`;
183
+ });
178
184
  this.securityStorage = inject(SecurityStorage);
179
185
  this.coreLayoutConfigService = inject(UpdCoreLayoutConfigService);
180
186
  this.layoutService = inject(LayoutService);
@@ -230,11 +236,11 @@ class HeaderComponent extends BaseComponent {
230
236
  this.isSidebarMobileOpen.set(!this.isSidebarMobileOpen());
231
237
  }
232
238
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HeaderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
233
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HeaderComponent, selector: "upd-header", inputs: { style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "languageSwitcherRef", first: true, predicate: ["languageSwitcherBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "notificationsRef", first: true, predicate: ["notificationsBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "loggedUserRef", first: true, predicate: ["loggedUserBtn"], descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: i1$2.IconComponent, selector: "upd-icon", inputs: ["model", "wrapperClasses", "color", "colorClass", "removeDefaultClasses", "customClasses", "tablerIcon", "tablerIconWeight", "tablerIconType", "tablerIconSize", "heroIcon", "heroIconSize", "heroIconType"] }, { kind: "component", type: i2.DropdownComponent, selector: "upd-dropdown", inputs: ["items", "header", "isOpen", "shouldCloseOnOutsideClick", "arrowType", "wrapperClasses", "elementsExcludedFromOutsideClick", "minHeight", "maxHeight", "minWidth", "maxWidth", "dropdownReference", "dropdownReferencePosition", "textOverflowStrategy"], outputs: ["isOpenChange", "selectedItem", "checkboxChanged"] }, { kind: "component", type: i3.LinkComponent, selector: "upd-link", inputs: ["href", "target", "customClasses", "isNavigation"], outputs: ["clicked"] }, { kind: "pipe", type: i1$1.TranslocoPipe, name: "transloco" }], encapsulation: i0.ViewEncapsulation.None }); }
239
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HeaderComponent, selector: "upd-header", inputs: { style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "languageSwitcherRef", first: true, predicate: ["languageSwitcherBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "notificationsRef", first: true, predicate: ["notificationsBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "loggedUserRef", first: true, predicate: ["loggedUserBtn"], descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n } @else {\n <span class=\"avatar avatar-sm\">{{ userInitials() }}</span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: i1$2.IconComponent, selector: "upd-icon", inputs: ["model", "wrapperClasses", "color", "colorClass", "removeDefaultClasses", "customClasses", "tablerIcon", "tablerIconWeight", "tablerIconType", "tablerIconSize", "heroIcon", "heroIconSize", "heroIconType"] }, { kind: "component", type: i2.DropdownComponent, selector: "upd-dropdown", inputs: ["items", "header", "isOpen", "shouldCloseOnOutsideClick", "arrowType", "wrapperClasses", "elementsExcludedFromOutsideClick", "minHeight", "maxHeight", "minWidth", "maxWidth", "dropdownReference", "dropdownReferencePosition", "textOverflowStrategy"], outputs: ["isOpenChange", "selectedItem", "checkboxChanged"] }, { kind: "component", type: i3.LinkComponent, selector: "upd-link", inputs: ["href", "target", "customClasses", "isNavigation"], outputs: ["clicked"] }, { kind: "pipe", type: i1$1.TranslocoPipe, name: "transloco" }], encapsulation: i0.ViewEncapsulation.None }); }
234
240
  }
235
241
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HeaderComponent, decorators: [{
236
242
  type: Component,
237
- args: [{ selector: 'upd-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n" }]
243
+ args: [{ selector: 'upd-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n } @else {\n <span class=\"avatar avatar-sm\">{{ userInitials() }}</span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n" }]
238
244
  }], propDecorators: { classes: [{
239
245
  type: HostBinding,
240
246
  args: ['class']