grcm-components
Version:
> ⚡ Crea formularios dinámicos en Angular de forma rápida, limpia y reutilizable.
1 lines • 58.3 kB
Source Map (JSON)
{"version":3,"file":"grcm-components.mjs","sources":["../../../projects/grcm-components/src/lib/ui/components/button/grcm-button.component.ts","../../../projects/grcm-components/src/lib/ui/components/button/grcm-button.component.html","../../../projects/grcm-components/src/lib/ui/components/controls/form/interfaces/form-change.interface.ts","../../../projects/grcm-components/src/lib/ui/components/controls/form/utils/createGrcmControl.ts","../../../projects/grcm-components/src/lib/ui/components/controls/control/grcm-control.component.ts","../../../projects/grcm-components/src/lib/ui/components/controls/control/grcm-control.component.html","../../../projects/grcm-components/src/lib/ui/components/controls/form/grcm-form.component.ts","../../../projects/grcm-components/src/lib/ui/components/controls/form/grcm-form.component.html","../../../projects/grcm-components/src/lib/ui/components/controls/form-field/grcm-form-field.component.ts","../../../projects/grcm-components/src/lib/ui/components/controls/form-field/grcm-form-field.component.html","../../../projects/grcm-components/src/lib/ui/components/controls/plain-form-field/grcm-plain-form-field.component.ts","../../../projects/grcm-components/src/lib/ui/components/controls/plain-form-field/grcm-plain-form-field.component.html","../../../projects/grcm-components/src/lib/ui/components/controls/input/grcm-input.component.ts","../../../projects/grcm-components/src/lib/ui/components/controls/input/grcm-input.component.html","../../../projects/grcm-components/src/lib/ui/components/examples/forms/login/example-login.component.ts","../../../projects/grcm-components/src/lib/ui/components/examples/forms/login/example-login.component.html","../../../projects/grcm-components/src/public-api.ts","../../../projects/grcm-components/src/grcm-components.ts"],"sourcesContent":["import { RouterLink } from '@angular/router';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, computed, input, output } from '@angular/core';\r\nimport { GrcmButtonVariants } from './interfaces/button-variants.type';\r\nimport { GrcmButtonType } from './interfaces/button-types.type';\r\nimport { GrcmButtonsSizes } from './interfaces/button-sizes.type';\r\n\r\n@Component({\r\n selector: 'lib-grcm-button',\r\n imports: [CommonModule, RouterLink],\r\n templateUrl: './grcm-button.component.html',\r\n styleUrl: './grcm-button.component.css'\r\n})\r\nexport class GrcmButtonComponent {\r\n\r\n public label = input<string>('');\r\n\r\n public title = input<string>('');\r\n\r\n public disabled = input<boolean>(false);\r\n\r\n public link = input<string | null | undefined>(null);\r\n\r\n public type = input<GrcmButtonType>('button');\r\n\r\n public variant = input<GrcmButtonVariants>('primary');\r\n\r\n public outline = input<boolean>(false);\r\n\r\n public size = input<GrcmButtonsSizes>('default');\r\n\r\n public additionalClasses = input<string>('');\r\n\r\n public icon = input<string>('');\r\n\r\n public submitter = input<string|null>(null);\r\n\r\n public fontSizeIcon = input<1 | 2 | 3 | 4 | 5 | 6>(6);\r\n\r\n public clicked = output();\r\n\r\n protected readonly classes = computed(() => {\r\n return `w-100 btn btn-${(this.outline() ? 'outline-' : '') + this.variant() + (this.size() ? ` btn-${this.size()} ` : ' ') + this.additionalClasses()}`\r\n })\r\n\r\n click() {\r\n this.clicked.emit();\r\n }\r\n\r\n}\r\n","<button [type]=\"type()\" [attr.disabled]=\"disabled() ? 'disabled' : null\" (click)=\"click()\" [title]=\"title()\" [ngClass]=\"classes()\" [routerLink]=\"link()\" [attr.data-submitter]=\"submitter() ? submitter() : null\">\r\n @if (icon()) {\r\n <i [ngClass]=\"'fs-' + fontSizeIcon() + ' bi bi-' + icon()\"></i>\r\n }\r\n {{ label() }}\r\n</button>\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nexport interface GrcmDataFormChange {\r\n field: string,\r\n newValue: any\r\n}\r\n","import { GrcmFormComponentType } from \"../interfaces/form-component-type.interface\";\r\n\r\nexport function createGrcmControl<T, T2>(data: GrcmFormComponentType<T, T2>): GrcmFormComponentType<T, T2> {\r\n return data;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { AfterContentInit, Component, ComponentRef, computed, DestroyRef, forwardRef, inject, Injector, input, isSignal, OnDestroy, OutputEmitterRef, OutputRefSubscription, viewChild, ViewContainerRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { GrcmFormComponent } from '../form/grcm-form.component';\r\nimport { Args } from '../form/interfaces/args.interface';\r\n\r\n@Component({\r\n selector: 'lib-grcm-control',\r\n templateUrl: './grcm-control.component.html',\r\n styleUrl: './grcm-control.component.css',\r\n imports: [CommonModule, ReactiveFormsModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => GrcmControlComponent),\r\n multi: true\r\n }\r\n ],\r\n host: {\r\n '[attr.data-control-id]': 'id()'\r\n }\r\n})\r\nexport class GrcmControlComponent implements AfterContentInit, ControlValueAccessor, OnDestroy {\r\n\r\n private readonly _injector = inject(Injector);\r\n\r\n private readonly _destroyRef = inject(DestroyRef);\r\n\r\n private readonly _container = viewChild('container', { read: ViewContainerRef });\r\n\r\n private readonly _grcmFormComponent = inject(GrcmFormComponent);\r\n\r\n public formControlName = input.required<string>();\r\n\r\n private _componentRef!: ComponentRef<any>;\r\n\r\n private _componentRefFormField!: ComponentRef<any>;\r\n\r\n public readonly id = computed(() => this._grcmFormComponent.identifier() + '_' + this.formControlName())\r\n\r\n private readonly _form = computed(() => this._grcmFormComponent.form())\r\n\r\n private readonly _data = computed(() => this._grcmFormComponent.data().controls[this.formControlName()])\r\n\r\n public readonly control = computed(() => this._form()?.controls[this.formControlName()]);\r\n\r\n private _hasPendingValue = false;\r\n private _hasPendingDisabledValue = false;\r\n\r\n private _pendingValue: any = null;\r\n private _onChange: any = null;\r\n private _onTouched: any = null;\r\n private _pendingDisabled: boolean | null = null;\r\n\r\n ngAfterContentInit(): void {\r\n this.initialize();\r\n }\r\n\r\n private initialize() {\r\n this.createComponents();\r\n this.setInputsOutputs();\r\n this.setClasses();\r\n this.flushPendingControlValueAccessors();\r\n }\r\n\r\n private createComponents() {\r\n const { component, formFieldComponent } = this._data();\r\n const viewContainer = this._container();\r\n if (!formFieldComponent || !viewContainer) return;\r\n viewContainer.clear();\r\n this._componentRefFormField = viewContainer.createComponent(formFieldComponent);\r\n this._componentRefFormField.setInput('control', this.control())\r\n this._componentRefFormField.setInput('id', this.id())\r\n const formFieldInstance = this._componentRefFormField.instance;\r\n formFieldInstance.controlView().clear();\r\n this._componentRef = formFieldInstance.controlView().createComponent(component);\r\n }\r\n\r\n private setInputsOutputs() {\r\n const args = this._data().args;\r\n if (!args) return;\r\n const { control = {}, formField = {}} = args;\r\n const componentRef = this._componentRef;\r\n const componentRefFormField = this._componentRefFormField;\r\n const setInputsOutputs = (args: Partial<Args<any>>, componentRef: ComponentRef<any>) => {\r\n const keys = Object.keys(args);\r\n keys.forEach((argProperty: string) => {\r\n const argValue = args[argProperty];\r\n const componentProperty = componentRef.instance[argProperty];\r\n switch (typeof componentProperty) {\r\n case 'function':\r\n if (isSignal(argValue)) {\r\n const obs = toObservable(argValue, {\r\n injector: this._injector\r\n }).subscribe(() => componentRef.setInput(argProperty, argValue()))\r\n this._destroyRef.onDestroy(() => obs.unsubscribe());\r\n } else {\r\n componentRef.setInput(argProperty, argValue)\r\n }\r\n break;\r\n case 'object':\r\n if (!(componentProperty instanceof OutputEmitterRef)) return;\r\n const subs: OutputRefSubscription = componentProperty.subscribe(argValue)\r\n this._destroyRef.onDestroy(() => subs.unsubscribe())\r\n }\r\n });\r\n }\r\n setInputsOutputs(control, componentRef);\r\n setInputsOutputs(formField, componentRefFormField);\r\n }\r\n\r\n private setClasses() {\r\n const classes = this._data().classes;\r\n if (!classes) return;\r\n const { control, formField } = classes;\r\n if (control) this._componentRef.location.nativeElement.classList = control;\r\n if (formField) this._componentRefFormField.location.nativeElement.classList = formField;\r\n }\r\n\r\n private flushPendingControlValueAccessors() {\r\n const instance = this._componentRef?.instance;\r\n\r\n if (this._hasPendingValue) {\r\n instance.writeValue(this._pendingValue);\r\n this._hasPendingValue = false;\r\n }\r\n\r\n if (this._onChange) {\r\n instance.registerOnChange(this._onChange);\r\n this._onChange = null;\r\n }\r\n\r\n if (this._onTouched) {\r\n instance.registerOnTouched(this._onTouched);\r\n this._onTouched = null;\r\n }\r\n\r\n if (this._hasPendingDisabledValue) {\r\n instance.setDisabledState?.(this._pendingDisabled);\r\n this._hasPendingDisabledValue = false;\r\n }\r\n }\r\n\r\n writeValue(obj: unknown): void {\r\n const instance = this._componentRef?.instance;\r\n\r\n if (instance) {\r\n instance.writeValue(obj);\r\n return;\r\n }\r\n this._hasPendingValue = true;\r\n this._pendingValue = obj;\r\n }\r\n\r\n registerOnChange(fn: Function): void {\r\n const instance = this._componentRef?.instance;\r\n\r\n if (instance) {\r\n instance.registerOnChange(fn);\r\n return;\r\n }\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: Function): void {\r\n const instance = this._componentRef?.instance;\r\n\r\n if (instance) {\r\n instance.registerOnTouched(fn);\r\n return;\r\n }\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n const instance = this._componentRef?.instance;\r\n\r\n if (instance) {\r\n instance?.setDisabledState?.(isDisabled);\r\n return;\r\n }\r\n this._hasPendingDisabledValue = true;\r\n this._pendingDisabled = isDisabled;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._componentRef?.destroy();\r\n this._componentRefFormField?.destroy();\r\n this._container()?.clear();\r\n }\r\n\r\n}\r\n","<ng-container #container></ng-container>\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { AfterViewInit, Component, computed, DestroyRef, inject, input, OnInit, output, signal, TemplateRef, viewChildren, ViewContainerRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { distinctUntilChanged } from 'rxjs';\r\nimport { FormBuilder, FormGroup, ReactiveFormsModule, ValidationErrors } from '@angular/forms';\r\nimport { GrcmDataForm } from './interfaces/data-form.interface';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { GrcmControlComponent } from '../control/grcm-control.component';\r\nimport { ResponseGrcmForm } from './interfaces/response-form.interface';\r\nimport { GrcmDataFormChange } from './interfaces/form-change.interface';\r\nimport { GenericObject } from './interfaces/generic-object.interface';\r\nimport { GrcmFormComponentType } from './interfaces/form-component-type.interface';\r\n\r\n\r\n@Component({\r\n selector: 'lib-grcm-form',\r\n imports: [CommonModule, ReactiveFormsModule, GrcmControlComponent],\r\n templateUrl: './grcm-form.component.html',\r\n styleUrl: './grcm-form.component.css'\r\n})\r\nexport class GrcmFormComponent implements OnInit, AfterViewInit {\r\n\r\n public grcmControls = viewChildren(GrcmControlComponent, { read: ViewContainerRef });\r\n\r\n private readonly _destroyRef = inject(DestroyRef);\r\n\r\n private readonly _formBuilder = inject(FormBuilder);\r\n\r\n public data = input.required<GrcmDataForm>();\r\n\r\n public additionalClasses = computed(() =>\r\n this.data().form.classes || \"\"\r\n );\r\n\r\n public buildForm = output<FormGroup | null>();\r\n\r\n public formSubmit = output<ResponseGrcmForm>();\r\n\r\n public formChange = output<GrcmDataFormChange>();\r\n\r\n private _form = signal<FormGroup | null>(null);\r\n\r\n public readonly form = this._form.asReadonly();\r\n\r\n protected formKeys: string[] = []\r\n\r\n public readonly templates = input<GenericObject<TemplateRef<any>>>({});\r\n\r\n public readonly identifier = computed(() => this.data().form.id);\r\n\r\n public readonly formControlNames = computed(() => Object.keys(this._form()?.controls || {}))\r\n\r\n ngOnInit(): void {\r\n this.initialize();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.buildForm.emit(this.form());\r\n }\r\n\r\n private initialize() {\r\n this.initForm();\r\n this.initSubscriptionsForControlValueChanges();\r\n }\r\n\r\n private initForm() {\r\n const data = this.data();\r\n this._form.set(this._formBuilder.record({}, {\r\n validators: data.form.validators,\r\n asyncValidators: data.form.asyncValidators,\r\n updateOn: data.form.updateOn || 'change'\r\n }));\r\n Object.keys(data.controls).forEach((name) => {\r\n const dataControl = data.controls[name];\r\n this.addControl(name, dataControl);\r\n });\r\n }\r\n\r\n addControl(name: string, control: GrcmFormComponentType<any, any>) {\r\n this._form()?.addControl(name, this._formBuilder.control(control.value, [...control.validators || []], [...control.asyncValidators || []]));\r\n }\r\n\r\n\r\n private initSubscriptionsForControlValueChanges() {\r\n const form = this.form();\r\n if (!form) return;\r\n this.formControlNames().forEach((key: string) => {\r\n if (!this.data().controls[key].valueChangesSubscribe) return;\r\n form.controls[key].valueChanges.pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this._destroyRef)\r\n ).subscribe((value: any) => {\r\n this.formChange.emit({ field: key, newValue: value })\r\n })\r\n });\r\n }\r\n\r\n getErrors(errors: ValidationErrors | null) {\r\n if (!errors) return [];\r\n return Object.keys(errors);\r\n }\r\n\r\n public onSubmit(event: SubmitEvent | null = null) {\r\n const submitter = event?.submitter?.dataset['submitter'] || null;\r\n const form = this.form();\r\n this.markAsTouched();\r\n if (!form || form.invalid) return;\r\n if (form.valid) this.formSubmit.emit({ form, submitter });\r\n }\r\n\r\n private markAsTouched() {\r\n const form = this.form();\r\n form?.markAsTouched();\r\n form?.updateValueAndValidity();\r\n }\r\n\r\n protected getDataForTemplateContext(formControlName: string | null = null) {\r\n const form = this.form();\r\n if (!form) return {};\r\n const data: GenericObject = {\r\n form\r\n };\r\n if (formControlName) {\r\n data['control'] = form.controls[formControlName];\r\n }\r\n return data;\r\n }\r\n\r\n}\r\n","\r\n\r\n<ng-template #renderTemplate let-templateKey let-controlName>\r\n @let tmpl = templates()[templateKey];\r\n @if (tmpl) {\r\n <ng-container *ngTemplateOutlet=\"tmpl; context: getDataForTemplateContext(controlName)\"></ng-container>\r\n }\r\n</ng-template>\r\n\r\n<!-- <ng-container *ngTemplateOutlet=\"renderTemplate; context: {\r\n templateKey: 'before_' + controlName,\r\n controlName: controlName\r\n}\"></ng-container> -->\r\n\r\n@let formInstance = form();\r\n@if (formInstance) {\r\n <form [formGroup]=\"formInstance\" (ngSubmit)=\"onSubmit($event)\" [ngClass]=\"additionalClasses()\" novalidate>\r\n @let beforeFormTemplate = templates()[\"beforeFormTemplate\"];\r\n @if (beforeFormTemplate) {\r\n <ng-container *ngTemplateOutlet=\"beforeFormTemplate; context: getDataForTemplateContext()\"></ng-container>\r\n }\r\n @for (controlName of formControlNames(); track controlName) {\r\n @let beforeControlTemplate = templates()[\"before_\" + controlName];\r\n @if (beforeControlTemplate) {\r\n <ng-container *ngTemplateOutlet=\"beforeControlTemplate; context: getDataForTemplateContext(controlName)\"></ng-container>\r\n }\r\n <lib-grcm-control [formControlName]=\"controlName\" style=\"width: 100%;\"></lib-grcm-control>\r\n @let afterControlTemplate = templates()[\"after_\" + controlName];\r\n @if (afterControlTemplate) {\r\n <ng-container *ngTemplateOutlet=\"afterControlTemplate; context: getDataForTemplateContext(controlName)\"></ng-container>\r\n }\r\n }\r\n @let afterFormTemplate = templates()[\"afterFormTemplate\"];\r\n @if (afterFormTemplate) {\r\n <ng-container *ngTemplateOutlet=\"afterFormTemplate; context: getDataForTemplateContext()\"></ng-container>\r\n }\r\n </form>\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { AbstractControl, FormGroup, Validators } from '@angular/forms';\r\nimport { ChangeDetectionStrategy, Component, DestroyRef, OnDestroy, OnInit, ViewContainerRef, computed, inject, input, signal, viewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { GrcmFormField } from '../form/interfaces/form-field.interface';\r\nimport { GrcmFormComponent } from '../form/grcm-form.component';\r\n\r\n@Component({\r\n selector: 'lib-grcm-form-field',\r\n imports: [CommonModule],\r\n templateUrl: './grcm-form-field.component.html',\r\n styleUrl: './grcm-form-field.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'form-group'\r\n }\r\n})\r\nexport class GrcmFormFieldComponent implements OnInit, GrcmFormField, OnDestroy {\r\n\r\n private readonly _destroyRef = inject(DestroyRef);\r\n\r\n public controlView = viewChild.required('controlView', { read: ViewContainerRef })\r\n\r\n public control = input.required<AbstractControl<any>>();\r\n\r\n public id = input.required<string>();\r\n\r\n private readonly _formComponent = inject(GrcmFormComponent);\r\n\r\n public label = input<string>(\"\");\r\n\r\n private _isRequired = signal(false);\r\n protected readonly isRequired = this._isRequired.asReadonly();\r\n\r\n private _useCompleteLabel = signal(false);\r\n protected readonly useCompleteLabel = this._useCompleteLabel.asReadonly();\r\n\r\n public readonly requiredTag = \"*\";\r\n public readonly optionalTag = \"(Opcional)\";\r\n\r\n protected readonly form = computed(() => this._formComponent.form())\r\n\r\n public readonly completeLabel = computed(() => {\r\n return this.label() + (this.useCompleteLabel() ? (this.isRequired() ? this.requiredTag : this.optionalTag) : \"\");\r\n })\r\n\r\n ngOnInit(): void {\r\n this.initialize();\r\n }\r\n\r\n private initialize() {\r\n this.setIsRequired();\r\n this.initControlStatusChanges();\r\n this.initFormStatusChanges();\r\n }\r\n\r\n private initControlStatusChanges() {\r\n this.control().statusChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\r\n this.setIsRequired();\r\n })\r\n }\r\n\r\n private initFormStatusChanges() {\r\n const form = this._formComponent.form();\r\n if (!form) return;\r\n this.setUseCompleteLabel(form);\r\n form.statusChanges.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\r\n this.setUseCompleteLabel(form);\r\n })\r\n }\r\n\r\n private setUseCompleteLabel(form: FormGroup<any>) {\r\n let requiredControls = 0;\r\n const keys = Object.keys(form.controls);\r\n keys.forEach(key => {\r\n if (this.controlIsRequired(form.controls[key])) requiredControls++;\r\n });\r\n const keysLen = keys.length / 2;\r\n if (this.isRequired() && requiredControls <= keysLen) {\r\n this._useCompleteLabel.set(true)\r\n } else {\r\n this._useCompleteLabel.set(!this.isRequired() && requiredControls > keysLen)\r\n }\r\n }\r\n\r\n setIsRequired() {\r\n this._isRequired.set(this.controlIsRequired(this.control()));\r\n }\r\n\r\n controlIsRequired(control: AbstractControl) {\r\n return control.hasValidator(Validators.required);\r\n }\r\n\r\n getError(errors: any) {\r\n const keys = Object.keys(errors);\r\n if (!keys.length) return '';\r\n const error = keys[0];\r\n const data = errors[keys[0]];\r\n switch (error) {\r\n case 'required':\r\n return 'Este campo es requerido.';\r\n case 'minlength':\r\n return `Tiene que tener como mínimo ${data.requiredLength} caracteres.`;\r\n case 'maxlength':\r\n return `Tiene que tener como máximo ${data.requiredLength} caracteres.`;\r\n case 'pattern':\r\n return 'La contraseña debe contener al menos una letra mayúscula, una minúscula y un símbolo especial.';\r\n default:\r\n return 'Revisa el valor ingresado.'\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.controlView().clear();\r\n }\r\n\r\n}\r\n","@let errors = control().errors;\r\n@let touched = control().touched;\r\n<label [for]=\"id()\" class=\"form-label\">{{ completeLabel() }}</label>\r\n<div class=\"input-group has-validation form-field-invalid d-block\">\r\n <ng-container #controlView></ng-container>\r\n <div class=\"invalid-feedback d-block\">\r\n @if (touched && errors) {\r\n <p>{{ getError(errors) }}<p>\r\n }\r\n </div>\r\n <!-- @else {\r\n <div class=\"valid-feedback d-block\">\r\n Looks good!\r\n </div>\r\n } -->\r\n</div>\r\n","import { Component, input, OnDestroy, viewChild, ViewContainerRef } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { GrcmFormField } from '../form/interfaces/form-field.interface';\r\n\r\n@Component({\r\n selector: 'lib-grcm-plain-form-field',\r\n imports: [],\r\n templateUrl: './grcm-plain-form-field.component.html',\r\n styleUrl: './grcm-plain-form-field.component.css'\r\n})\r\nexport class GrcmPlainFormFieldComponent implements GrcmFormField, OnDestroy {\r\n\r\n public controlView = viewChild.required('controlView', { read: ViewContainerRef })\r\n\r\n public control = input.required<AbstractControl<any>>();\r\n\r\n public id = input.required<string>();\r\n\r\n ngOnDestroy(): void {\r\n this.controlView().clear();\r\n }\r\n\r\n}\r\n","<ng-container #controlView></ng-container>\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { AbstractControl, ControlValueAccessor, FormsModule, NgControlStatus, NgModel, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, computed, inject, input, OnInit, output, signal, DestroyRef, viewChild, ElementRef } from '@angular/core';\r\nimport { Subject, debounceTime } from 'rxjs';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { GrcmFormComponent } from '../form/grcm-form.component';\r\nimport { GrcmControlComponent } from '../control/grcm-control.component';\r\n\r\n@Component({\r\n selector: 'lib-grcm-input',\r\n templateUrl: './grcm-input.component.html',\r\n styles: ``,\r\n imports: [CommonModule, ReactiveFormsModule, FormsModule]\r\n})\r\nexport class GrcmInputComponent implements OnInit, ControlValueAccessor {\r\n\r\n private readonly _grcmFormComponent = inject(GrcmFormComponent);\r\n\r\n protected readonly controlComp = inject(GrcmControlComponent);\r\n\r\n private readonly _destroyRef = inject(DestroyRef);\r\n\r\n public type = input<'text' | 'password'>('text');\r\n\r\n public placeholder = input<string>('');\r\n\r\n public debounceTimer = input<number>(300);\r\n\r\n public icon = input<string>();\r\n\r\n public autocomplete = input<boolean>(true);\r\n\r\n public submitFormOnDebounce = input<boolean>(false);\r\n\r\n public changeValue = output<string>();\r\n\r\n public debounce = output<string>();\r\n\r\n public additionalClasses = input<string|string[]>(\"\");\r\n\r\n public control = computed<AbstractControl<any>|undefined>(() => this.controlComp.control() )\r\n\r\n public id = computed<string>(() => this.controlComp.id())\r\n\r\n private _value = signal<string>(\"\");\r\n protected readonly value = this._value.asReadonly();\r\n\r\n private _disabled = signal<boolean>(false);\r\n protected readonly disabled = this._disabled.asReadonly();\r\n\r\n private _debouncer: Subject<string> = new Subject<string>();\r\n\r\n private _inputRef = viewChild<ElementRef<HTMLInputElement>>(\"input\")\r\n\r\n ngOnInit(): void {\r\n this.initialize();\r\n }\r\n\r\n private initialize() {\r\n this._debouncer\r\n .pipe(\r\n takeUntilDestroyed(this._destroyRef),\r\n debounceTime(this.debounceTimer()),\r\n )\r\n .subscribe( value => {\r\n this.debounce.emit(value);\r\n if (this.submitFormOnDebounce())\r\n this._grcmFormComponent.onSubmit();\r\n });\r\n }\r\n\r\n change( value: string ) {\r\n this._onTouched();\r\n this._onChange(value);\r\n }\r\n\r\n onBlur() {\r\n this._onTouched();\r\n }\r\n\r\n _onChange: Function = () => {};\r\n _onTouched: Function = () => {};\r\n\r\n registerOnChange(fn: Function): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: Function): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n writeValue(value: unknown): void {\r\n if (typeof value === \"string\") this.updateValue(value)\r\n }\r\n\r\n private updateValue(value: string) {\r\n this._value.set(value);\r\n const inputRef = this._inputRef();\r\n if (inputRef) inputRef.nativeElement.value = value;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n }\r\n\r\n}\r\n\r\n","@if (control()) {\r\n @if (icon()) {\r\n <span class=\"input-group-text\">\r\n <i [ngClass]=\"'bi bi-' + icon()\"></i>\r\n </span>\r\n }\r\n @let validator = control()!.validator;\r\n @let valid = control()!.valid;\r\n @let invalid = control()!.invalid;\r\n @let touched = control()!.touched;\r\n <input\r\n [type]=\"type()\"\r\n [placeholder]=\"placeholder()\"\r\n class=\"form-control\"\r\n [class.is-valid]=\"validator && valid && touched\"\r\n [class.is-invalid]=\"validator && invalid && touched\"\r\n (input)=\"change( input.value )\"\r\n [value]=\"value()\"\r\n [id]=\"id()\"\r\n [attr.disabled]=\"disabled() ? 'disabled' : null\"\r\n [attr.autocomplete]=\"autocomplete() ? 'on' : 'off'\"\r\n (blur)=\"onBlur()\"\r\n [ngClass]=\"additionalClasses()\" #input>\r\n}\r\n\r\n\r\n <!--\r\n [class.is-invalid]=\"control().validator && control().invalid && control().touched\" -->\r\n","/* eslint-disable @typescript-eslint/no-unused-vars */\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, output, signal } from '@angular/core';\r\nimport { Validators, FormGroup, ValidationErrors } from '@angular/forms';\r\nimport { GrcmFormFieldComponent } from '../../../controls/form-field/grcm-form-field.component';\r\nimport { GrcmFormComponent } from '../../../controls/form/grcm-form.component';\r\nimport { GrcmDataForm } from '../../../controls/form/interfaces/data-form.interface';\r\nimport { GrcmDataFormChange } from '../../../controls/form/interfaces/form-change.interface';\r\nimport { ResponseGrcmForm } from '../../../controls/form/interfaces/response-form.interface';\r\nimport { createGrcmControl } from '../../../controls/form/utils/createGrcmControl';\r\nimport { GrcmInputComponent } from '../../../controls/input/grcm-input.component';\r\nimport { GrcmButtonComponent } from '../../../button/grcm-button.component';\r\nimport { GrcmUserLoginExample } from './interfaces/grcm-user-login-example.interface';\r\n\r\n\r\n@Component({\r\n selector: 'lib-grcm-example-login',\r\n imports: [CommonModule, GrcmButtonComponent, GrcmFormComponent],\r\n templateUrl: './example-login.component.html',\r\n styleUrl: './example-login.component.css'\r\n})\r\nexport class GrcmExampleLoginComponent {\r\n\r\n private _responseForm = signal<GrcmUserLoginExample|null>(null);\r\n protected readonly responseForm = this._responseForm.asReadonly();\r\n\r\n public submitForm = output<GrcmUserLoginExample>();\r\n\r\n protected dataForm: GrcmDataForm = {\r\n form: {\r\n id: 'login'\r\n },\r\n controls: {\r\n username: createGrcmControl({\r\n component: GrcmInputComponent,\r\n formFieldComponent: GrcmFormFieldComponent,\r\n value: \"\",\r\n validators: [Validators.required, Validators.minLength(3), Validators.maxLength(10)],\r\n args: {\r\n control: {\r\n debounceTimer: 1000,\r\n placeholder: \"Escriba su usuario\",\r\n icon: \"person-circle\",\r\n autocomplete: false,\r\n // debounce: (value: string) => {\r\n // console.log(value)\r\n // }\r\n },\r\n formField: {\r\n label: \"Usuario\"\r\n }\r\n },\r\n classes: {\r\n control: \"input-group\"\r\n }\r\n }),\r\n password: createGrcmControl({\r\n component: GrcmInputComponent,\r\n formFieldComponent: GrcmFormFieldComponent,\r\n value: \"\",\r\n validators: [Validators.required, Validators.minLength(6), Validators.maxLength(15), Validators.pattern('^(?=.*[a-z])(?=.*[A-Z])(?=.*[-_!@#$%^&*(),.?\":{}|<>]).+$')],\r\n args: {\r\n control: {\r\n type: 'password',\r\n placeholder: \"Escriba su contraseña\",\r\n icon: \"lock\",\r\n autocomplete: false,\r\n },\r\n formField: {\r\n label: \"Contraseña\"\r\n }\r\n },\r\n classes: {\r\n control: \"input-group\"\r\n }\r\n }),\r\n }\r\n };\r\n\r\n buildForm(form: FormGroup | null) {\r\n // console.log(form);\r\n }\r\n\r\n onChangeControl(data: GrcmDataFormChange) {\r\n // console.log(data)\r\n }\r\n\r\n onSubmit(data: ResponseGrcmForm) {\r\n const user: GrcmUserLoginExample = {...data.form.value}\r\n this._responseForm.set(user);\r\n this.submitForm.emit(user);\r\n }\r\n\r\n getErrors(errors: ValidationErrors | null) {\r\n console.log({errors})\r\n if (!errors) return [];\r\n return Object.keys(errors);\r\n }\r\n\r\n}\r\n","<lib-grcm-form [data]=\"dataForm\" classes=\"row pb-4\" (buildForm)=\"buildForm($event)\" (formChange)=\"onChangeControl($event)\"\r\n (formSubmit)=\"onSubmit($event)\" [templates]=\"{afterFormTemplate}\">\r\n <!-- <ng-template #before_username>, before_username\r\n nombreeee antes\r\n @if (control.valid) {\r\n VÁLIDO\r\n } @else {\r\n INVÁLIDO\r\n }\r\n </ng-template> -->\r\n <ng-template #afterFormTemplate let-form=\"form\">\r\n <div class=\"invalid-feedback d-block\">\r\n @if (form.errors) {\r\n @for (error of getErrors(form); track $index) {\r\n <p>{{ error }}\r\n <p>\r\n }\r\n }\r\n </div>\r\n <lib-grcm-button label=\"Entrar\" class=\"w-100\" [disabled]=\"form.invalid\" type=\"submit\"></lib-grcm-button>\r\n </ng-template>\r\n</lib-grcm-form>\r\n@if (responseForm()) {\r\n <div class=\"container mt-4\">\r\n <p>Respuesta del formulario</p>\r\n <div class=\"p-2\">\r\n <pre><code class=\"language-javascript\" data-lang=\"js\">{{responseForm() | json }}</code></pre>\r\n </div>\r\n </div>\r\n}\r\n","/*\r\n * Public API Surface of grcm-components\r\n */\r\n\r\n\r\n// UI\r\n\r\n// COMPONENTS\r\n\r\n// BUTTON\r\nexport * from './lib/ui/components/button/interfaces/button-sizes.type';\r\nexport * from './lib/ui/components/button/interfaces/button-types.type';\r\nexport * from './lib/ui/components/button/interfaces/button-variants.type';\r\nexport * from './lib/ui/components/button/grcm-button.component';\r\n\r\n// FORM\r\nexport * from './lib/ui/components/controls/form/interfaces/data-form.interface';\r\nexport * from './lib/ui/components/controls/form/interfaces/form-change.interface';\r\nexport * from './lib/ui/components/controls/form/interfaces/form-field.interface';\r\nexport * from './lib/ui/components/controls/form/interfaces/generic-object.interface';\r\nexport * from './lib/ui/components/controls/form/interfaces/response-form.interface';\r\nexport * from './lib/ui/components/controls/form/interfaces/args.interface';\r\nexport * from './lib/ui/components/controls/form/utils/createGrcmControl';\r\nexport * from './lib/ui/components/controls/form/grcm-form.component';\r\n\r\n// CONTROL\r\nexport * from './lib/ui/components/controls/control/grcm-control.component';\r\n\r\n// FORM-FIELD\r\nexport * from './lib/ui/components/controls/form-field/grcm-form-field.component';\r\n\r\n// PLAIN-FORM-FIELD\r\nexport * from './lib/ui/components/controls/plain-form-field/grcm-plain-form-field.component';\r\n\r\n// INPUT\r\nexport * from './lib/ui/components/controls/input/grcm-input.component';\r\n\r\n// EXAMPLES/FORMS/LOGIN\r\nexport * from './lib/ui/components/examples/forms/login/interfaces/grcm-user-login-example.interface';\r\nexport * from './lib/ui/components/examples/forms/login/example-login.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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