material-dynamic-forms
Version:
¡Crea formularios dinámicos, potentes y configurables en Angular usando Material Design! 🚀
232 lines (173 loc) • 6.76 kB
Markdown
# ✨ material-dynamic-forms
¡Crea formularios dinámicos, potentes y configurables en Angular usando Material Design! 🚀
## ¿Qué es esta librería? 🤔
**material-dynamic-forms** es una herramienta para generar formularios dinámicos en Angular, completamente personalizados desde la configuración, compatibles con Angular Material y preparados para casos de uso avanzados como formularios dependientes, campos dinámicos, validaciones, autocompletados y más.
## Instalación 🛠️
```bash
npm install material-dynamic-forms
```
Agrega el módulo en tu aplicación:
```typescript
import { DynamicFormModule } from 'material-dynamic-forms';
@NgModule({
imports: [
// ...
DynamicFormModule,
],
})
export class AppModule {}
```
## Uso Básico 🚦
```html
<lib-dynamic-form
[fieldGroups]="formularioAgrupado"
[baseUrl]="urlApi"
[isEdit]="modoEdicion"
(changeValueSelected)="onChangeValue($event)">
</lib-dynamic-form>
```
- **fieldGroups**: Arreglo de grupos de campos dinámicos (ver ejemplos abajo).
- **baseUrl**: URL base para consumir APIs de selects dinámicos.
- **isEdit**: Indica si el formulario está en modo edición.
- **changeValueSelected**: Output para escuchar cambios de campos.
## Cómo se define un formulario dinámico 📐
El formulario se define con un array de `IFieldGroup`, donde cada grupo incluye un título, cantidad de columnas y una lista de campos (`IFieldDynamicForm`).
### Ejemplo de definición
```typescript
const formularioAgrupado: IFieldGroup[] = [
{
title: 'Datos Personales',
countColumns: 2,
fields: [
{
label: 'Nombre',
name: 'nombre',
type: eDataType.input,
placeholder: 'Ingrese su nombre',
visible: true,
validation: [Validators.required]
},
{
label: 'Fecha de nacimiento',
name: 'fechaNacimiento',
type: eDataType.date,
visible: true
}
]
}
];
```
## Interfaz de campo (`IFieldDynamicForm`) 🧩
| Propiedad | Tipo | Descripción |
|--------------------------|----------------|-------------|
| `label` | string | Texto visible en el campo |
| `name` | string | Nombre de control (formControlName) |
| `type` | eDataType | Tipo de campo (input, select, date, etc) |
| `placeholder` | string | Texto de ayuda (opcional) |
| `options` | array | Opciones para selects/autocompletes |
| `visible` | boolean | Si el campo se muestra o no |
| `disabled` | boolean | Si el campo está deshabilitado |
| `validation` | ValidatorFn[] | Validaciones Angular (requerido, patrón, etc) |
| `apiUrl` | string | URL para cargar opciones dinámicamente |
| `dependency` | string | Campo del cual depende este campo |
| `valueDependency` | objeto | Dependencia para habilitar según valor de otro campo |
| `externalDependencies` | string[] | Dependencias externas para selects dinámicos |
| `multiple` | boolean | Selección múltiple (en selects) |
| `colspan` | number | Cuántas columnas ocupa el campo |
| ... | ... | ¡Hay muchas más! (ver abajo) |
### Tipos de campo (`eDataType`) 🎛️
- `input`: Campo de texto simple
- `select`: Selector desplegable
- `date`: Selector de fecha
- `checkbox`: Checkbox
- `select_search`: Select con buscador
- `tex_area`: Área de texto
- `button`, `button_toggle`: Botones
- `select_chips`: Select con selección múltiple tipo "chips"
- `select_autocomplete` / `input_autocomplete`: Autocompletes
- ... y más
### Dependencias y dinámicas avanzadas 🔗
Puedes:
- Habilitar/inhabilitar campos según valores de otros (`valueDependency`, `valueExcludeDependency`)
- Consumir APIs para cargar opciones de selects según dependencias o filtros
- Usar funciones para validar rangos de fechas, filtrar fechas válidas, etc.
## Interfaz de grupo (`IFieldGroup`) 🏷️
| Propiedad | Tipo | Descripción |
|---------------------|---------------------|-------------|
| `title` | string | Título del grupo |
| `countColumns` | number | Número de columnas en el grid |
| `fields` | IFieldDynamicForm[] | Lista de campos |
| `isRangeValidator` | boolean | Si aplica validación de rango (opcional) |
## Ejemplo completo 🌟
```typescript
import { eDataType, IFieldGroup } from 'material-dynamic-forms';
const grupos: IFieldGroup[] = [
{
title: 'Información Básica',
countColumns: 2,
fields: [
{
label: 'Correo Electrónico',
name: 'email',
type: eDataType.input,
placeholder: 'ejemplo@correo.com',
visible: true,
validation: [Validators.required, Validators.email]
},
{
label: 'País',
name: 'pais',
type: eDataType.select,
visible: true,
apiUrl: '/api/paises',
options: [],
valueTOShow: 'nombre'
}
]
}
];
```
## Métodos y outputs principales 🧑💻
- **(changeValueSelected)**: Output para reaccionar a cambios en los campos.
- **getForm()**: Método para obtener el `FormGroup` subyacente.
- **externalDependenciesValuesChanged**: Output para detectar cambios en dependencias externas.
## Personalización y buenas prácticas 👩🎨
- Puedes crear validadores personalizados y pasarlos a los campos.
- Usa dependencias entre campos para formularios complejos.
- Aprovecha la integración con Angular Material para una UI consistente.
## API pública (servicio) 🔍
El servicio `DynamicFormService` permite:
- Inicializar formularios (`functionInitComponent`)
- Gestionar dependencias internas y externas
- Extraer valores mapeados del formulario (`functionGetFormValue`)
- Construir URLs dinámicas para selects dependientes
## Publicar en NPM 🚀
Si eres el mantenedor, puedes publicar la librería así:
```bash
ng build dynamic-form
cd dist/dynamic-form
npm publish --access public
```
Asegúrate de tener configurado tu usuario en npm y permisos para publicar.
## Contribuir 🤝
¿Ideas, bugs o mejoras? ¡Tu feedback es bienvenido! Haz un PR o abre un issue en el repo.
## Licencia 📄
MIT
## Créditos y agradecimientos 🙌
Desarrollado con ❤️ por [softcomsas](https://github.com/softcomsas).
> Para ver más ejemplos y documentación, consulta los archivos en la carpeta `/projects/dynamic-form` del repo.