import { OnInit, AfterViewInit, Renderer, ViewContainerRef, ComponentFactoryResolver } from '@angular/core'; import { FormGroup, FormControl } from '@angular/forms'; import { Subject } from 'rxjs/Subject'; import { EvkOption } from '../../form/select/component'; import { EstructureBaseGroupTable } from '../../table/evk-table.component'; import { EstructureBaseFormButton } from '../../form/button/evk-form-button.component'; import { EstructureGeoMap } from '../../form/geomap/component'; import { EstructureBaseSvg } from '../../form/position/component'; import { EstructureText } from '../../form/text/component'; import { BehaviorSubject } from '../../../../../node_modules/rxjs/BehaviorSubject'; import { EstructureBaseFormGroupButton } from '../../form/button/evk-group-button.component'; /** * Componente que construye el formulario. */ export declare class FormConstructorComponent implements AfterViewInit, OnInit { renderer: Renderer; factoryResolver: ComponentFactoryResolver; /** * Metadatos que crean el formulario, es un json en pocas palabras. */ metadata: (EstructureBaseField | EstructureBaseGroupTable | EstructureBaseButton | EstructureBaseFormButton | EstructureBaseFormGroupButton | EstructureBaseInnerHTML | EstructureBaseSvg | EstructureGeoMap | EstructureText)[]; matTooltip: string; /** * FormGroup que manaja al formulario. */ form: FormGroup; /** * Objecto con la información de la sección * (en caso de que el formulario pertenezca a una sección). */ section: any; /** * Evento para hacer visible o esconder el componente. */ visibleSubject: Subject; /** * Indicador de visibilidad del contenedor del formulario * (en caso de pertenecer a una sección). */ visible: boolean; dynamicForm: ViewContainerRef; /** * Subtitulo de la sección. */ subtitle: string; /** * Título de la sección. */ title: string; /** * ## html * ```html * * ``` * * ## ts * ```ts * // Campos simples contenidos en el mismo objeto * // Salida: { campoTexto: 'valor' } * metadata = [ * { * name: 'campoTexto', * label: 'Campo de texto simple', * grid: 'col-md-12', * type: 'text', * onchange: this.myOnChangeHandler.bind(this), * form: this.form, * group: this.form, * control: this.fbuilder.control(''), * }, * ]; * * // Campos contenidos dentro de un objeto anidado * // Salida: { catalogo: { id: 'valorId'} } * metadata = [ * { * name: 'id', * label: 'Select que carga un catalogo', * grid: 'col-md-12', * type: 'select', * optionChange: this.optionChangeSubject, * onchange: this.selectValueChange.bind(this), * form: this.form, * group: this.fbuilder.group({ * id: ['', Validators.required], * }), * formGroupName: 'catalogo' * } * ]; * * // Salida: { * // Campos contenidos en un arreglo de objetos * // atributos: [ * // { * // datoC: 'valor', * // atributo: { * // id: 1 * // } * // }, * // { * // datoC: 'valor', * // atributo: { * // id: 1 * // } * // } * // ] * // } * metadata = [ * { * name: 'datoC', * label: 'Campo de un array en la posición 1', * grid: 'col-md-12', * type: 'text', * onchange: this.inputValueChange.bind(this), * form: this.form, * group: this.fbuilder.array([ * this.fbuilder.group({ * datoC: ['', Validators.required], * atributo: this.fbuilder.group({ * id: 1 * }) * }), * ]), * formArrayName: 'atributos' * }, * { * name: 'datoC', * label: 'Campo de un array en la posición 2', * grid: 'col-md-12', * type: 'text', * onchange: this.inputValueChange.bind(this), * form: this.form, * group: this.fbuilder.array([ * this.fbuilder.group({ * datoC: ['', Validators.required], * atributo: this.fbuilder.group({ * id: 2 * }) * }), * ]), * formArrayName: 'atributos' * }, * ]; * ``` */ constructor(renderer: Renderer, factoryResolver: ComponentFactoryResolver); /** * Inicializa el componente, valida que existan los campos necesarios para su funcionamiento. En caso de no existir manda un error. */ ngOnInit(): void; ngAfterViewInit(): void; private addFields(); addFieldComponent(field: any): void; } /** * Estructura base para la definición de un campo del formulario. */ export interface EstructureBaseField { /** * Nombre del campo en el formulario. */ name: string; /** * Leyenda que aparecera en el formulario. */ label: string; /** * Clase de bootstrap para la alineacion del campo. */ grid?: string; /** * Tipo de campo sus valores pueden ser: 'text', 'textarea', 'date', 'number', 'email', * 'password', 'radio', 'checkbox', 'time'. */ type: string; /** * Es un Subject que indica si es visible o no el campo, es necesario emitir * el valor del cambio para poder ver reflejado el cambio en el formulario. */ visibleSubject?: Subject; /** * Funcion que deseamos ejecutar en caso de cambio. */ onchange?: Function; /** * Subject al que se suscriben los select en caso de tener opciones * asincronas. */ optionChange?: Subject; /** * Form del componete, es necesario para pasar la referencia a los componentes. */ form: FormGroup; /** * Form group o form array que pertenece al control, es necesario inicilizarlo aqui, * dado que se agregara mas adelante al form. */ group: any; /** * Nombre del arreglo al que pertenece, este campo es necesario cuando es el nombre es requerido. */ formArrayName?: string; /** * Cuando no se define el group, se necesita definir el control que almacenara. */ control?: FormControl; /** * Nombre del group al que pertenece. */ formGroupName?: string; /** * Indicador para comprobar si el campo no va vinculado al form. */ noForm?: boolean; /** * Las opciones del select. */ options?: any[]; /** * Los radios del radios group. */ radios?: any[]; /** * Regex para la comprovacion de 7 decimales. */ optDecimal?: boolean; /** * Regex para la comprovacion de la latitud y longitud en el componente numero. */ latRegex?: boolean; /** * Regex para la comprovacion de la longitud en el componente numero. */ longRegex?: boolean; /** * Regex para la comprobacion de numeros enteros. */ intRegex?: boolean; /** * Regex para la comprobacion de 8 digitos con 2 decimales */ digRegex?: string; /** * Limitador de capacidad del campo */ max?: number; /** * Limitador de capacidad minima del campo */ min?: number; minDate?: Date; maxDate?: Date; minDateSubject?: BehaviorSubject; maxDateSubject?: BehaviorSubject; minTime?: string; maxTime?: string; minTimeSubject?: BehaviorSubject; maxTimeSubject?: BehaviorSubject; numReferencia?: boolean; } /** * Estructura base para la definición de un botón. */ export interface EstructureBaseButton { /** * Label del botón. */ label: string; /** * Color tema para el botón. */ color?: string; /** * Handler para el evento click. */ onclick?: Function; /** * Alineación del botón. */ align?: string; } /** * Estructura base para la definición de elemento HTML. */ export interface EstructureBaseInnerHTML { /** * Clase de bootstrap para la alineacion del campo. */ grid?: string; /** * Tipo de campo sus valores pueden ser: 'text', 'textarea', 'date', 'number', 'email', * 'password', 'radio', 'checkbox', 'time'. */ type: 'innerHTML' | string; /** * Clase que devuelve el texto contenido en las etiquetas html. */ innerHTML: string; } export interface EstructureGeoMap { /** * Tipo de campo que trae el valor de la latitud. */ lat: number; /** * Tipo de campo que trae el valor de la longitud. */ lng: number; /** * Label del componente de Geomap. */ label: string; /** * Clase que devuelve el metodo de arrastrar del componente de Geomap. */ draggable: boolean; /** * Subject al que se suscribe el componente de Geomap en caso de tener opciones. * asincronas. */ catchGeomap?: Subject; /** * Funcion que se suscribe al next del componente. */ geomaps?: Function; /** * Tipo de campo que trae el valor de la Keyapi del componente. */ gmapi?: string; /** * Tipo de campo que trae el valor del formulario para generar la consulta concatenada. */ agregarLocalizacion?: string; /** * Clase que devuelve la referencia del componente para poder guardar la informacion. */ referenciaGeo?: { geoComponent: any; }; /** * Subject al que se suscribe el componente de Geomap en caso de tener opciones. * asincronas. */ subjectShow?: Subject; /** * Subject que se suscribe a los cambios de las variables lat y lng */ changeLatLngSubject?: Subject | BehaviorSubject; /** * Handler para el evento click */ onclick?: Function; } export interface EstructureBaseSvg { /** * Estructura de array que trae la estructura del componete de SVG. */ metadata: any[]; /** * Es un Subject que indica si es visible o no el campo, es necesario emitir * el valor del cambio para poder ver reflejado el cambio en el formulario. */ visible: boolean; /** * Subject al que se suscribe el componente de Geomap en caso de tener opciones. * asincronas. */ catchSvgeo: Subject; /** * Funcion que se suscribe al next del componente. */ svgeo?: Function; /** * Clase que devuelve la referencia del componente para poder guardar la informacion. */ referenciaSvg?: { svgComponent: any; }; /** * Subject al que se suscribe el componente de Geomap en caso de tener opciones. * asincronas. */ subjectShow?: Subject; } export interface EstructureText { type?: string; matTooltip?: string; } /** * @ignore * Comprueba si el tipo enviado es de tipo EstructureBaseField * @param object */ export declare function typeOfEstructureBaseField(object: any): object is EstructureBaseField;