npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@cs3/dynamic-form

v0.0.6

Published

A dynamic form react library

Downloads

8

Readme

Formulario dinámico

Este proyecto consta en que por una serie de parámetros se cree un formulario con distintas validaciones.

Configuración de la lógica del formulario

En un principio la entrada de la configuración está dada por una interfaz: InputProps el cual tiene que ser un listado:


interface  InputProps {

name: string  // id del campo

value: string | number | boolean  // valor inicial

placeholder?: string  // marcador del campo

type: inputTypes  // naturaleza del campo (si es select, checkbox, etc.)

validations: Validation[] // las distintas validaciones que tendrá el campo

label?: string  // etiqueta del campo

typeValue?: 'string' | 'boolean'  // establece el tipo de valor en el esquema del formulario (si se evaluará como string o booleano)

options?: SelectOptions[] | SelectWithRef  // opciones iniciales para los radio button o selects. Como también puede ser una configuración para pedir un listado de opciones para un select

tooltipMsn?: string  // mensaje del tooltip informativo

}

Validations

Las validaciones de los campos constan de la siguiente estructura:


interface  Validation {

// tipo de validation, si es requerida, es email, es requerida cuando..., etc.

type: 'required' | 'isEmail' | 'minLength' | 'isTrue' | 'maxLength' | 'oneOf' | 'requiredWhen' | 'requiredUntil'

value?: string | number | boolean | 'some'// esta opción es requerida para los tipos de validaciones como maxLength, minLength, requiredUntil (si para estas validaciones pones "some" en 'value' entonces dichas validaciones se disparan cuando se detencten un valor x)

message: string  // mensaje que aparece cuando se detecta un error en el diligenciamiento del campo

ref?: string  // esta opción es requerida para los tipos de validaciones que dependen de otros campos en el formulario, como: requiredUntil, requiredWhen, oneOf

}

Distribución de los campos en el formulario

La distribución está dada por una interfaz: FormLayoutConfig la cual es un objeto que consta de la siguiente estructura:


interface  FormLayoutConfig {

numCols: number; // asigna cuantas columnas tendrá el formulario (vease grid)

fields: ItemRowLayout[] // lista de los campos que tiene el formulario

justifyButtons?: "start" | "end" | "center"  // esta opción permite ubicar las acciones en una alineación

}

Fields

Los campos constan de una configuración las cuales asignan su posición en el formulario:


interface  ItemRowLayout {

fieldName: string; // el nombre del campo correspondiente

gridColumn: string; // la columna en la cual se quiere que esté el campo (se puede usar la nomenclatura de css grid-column https://developer.mozilla.org/en-US/docs/Web/CSS/grid-column)

gridRow  // la fila en la cual se quiere que esté el campo (se puede usar la nomenclatura de css grid-column https://developer.mozilla.org/en-US/docs/Web/CSS/grid-row)

}

¿Qué hacer después?

Ya una vez tenida la configuración se procede a ejecutar la en el componente <DynamicForm/>, el cual permite agregar le por parámetro la configuración o una url que pueda contener dicha configuración.

Por URL

Esta es una opción que te permite realizar una petición a cualquier URL y posterior a ella obtener una configuración que permita renderizar el formulario deseado.

Ejemplo: Se podría colocar como props del componente la siguiente URL : http://localhost:8080/task/aws La cual retorna un json el cual tiene como estructura:

{
  "formulary": [
    {
      "type": "number", // es un campo numerico
      "name": "doc", // su id será doc
      "placeholder": "user id", // tendrá un placeholder
      "value": "", // su valor inicial es ""
      "validations": [
        {
          "type": "minLength", // se valida que tenga más de x carácteres
          "value": 3, // en este contexto de la validación debe tener más de 3 carácteres
          "message": "Min. 3 characters" // mensaje que se muestra 
          // cuando se detecta la validación
        },
        {
          "type": "maxLength", // se valida que tenga un máximo de x carácteres
          "value": 8, // en este contexto de la validación debe tener máximo de 8 carácteres
          "message": "Max. 8 characters" // mensaje que se muestra 
          // cuando se detecta la validación
        },
        {
          "type": "required", // el campo es requerido (no debe ser vacio)
          "message": "user id is required"// mensaje que se muestra 
          // cuando se detecta la validación
        }
      ]
    },
    {
      "type": "text",
      "name": "user",
      "label": "Nombre do macaco",
      "placeholder": "Usuario",
      "value": "",
      "validations": [
        {
	     // requerido hasta que otro campo esté diligenciado o tenga un valor en especifico
          "type": "requiredUntil", 
          "message": "llena el otro campo", // mensaje que se muestra 
          // cuando se detecta la validación
          "ref": "doc", // campo al cual se referencia (o sea el cual se tiene que llenar antes)
          "value": "some" // es la validación que se evaluará con respecto al campo
          // referenciado ("ref":"doc"), en este caso el campo doc debe algún valor y ser
          // distinto a ""
        }
      ],
      "tooltipMsn": "<h1>Wagh<h1/>" // tooltip de caracter informativo
    }
  ],
  "formularyLayout": { // distribución de los campos
    "numCols": 2, // este formulario tiene solo 2 columnas [][]
    "justifyButtons": "center", // el botón de subir estará centrado
    "fields": [
      {
        "fieldName": "user", // campo el cual se desea posicionar
        "gridColumn": "1", // el campo user estará en la primera columna [X][]
        "gridRow": "1" // el campo user estará en la primera fila [X][]
      },
      {
        "fieldName": "doc", // campo el cual se desea posicionar
        "gridColumn": "2", // el campo doc estará en la segunda columna [][X]
        "gridRow": "1" // el campo user estará en la primera fila [][X] 
      }
    ]
  }
}

Una vez implementada dicha URL y retorne ya un JSON válido para el sistema se podrá previsualizar el formulario en donde instanciaste el componente

Por configuración

Esta es una opción que te permite realizar una petición a cualquier URL y posterior a ella obtener una configuración que permita renderizar el formulario deseado.

Ejemplo: Se podría crear 2 constantes las cuales tuviesen las configuraciones correspondientes, o sea una que tenga el esquema del formulario y el otro el diseño/distribución de los campos. Se usará el mismo objeto del ejemplo por URL

export const formulary: InputProps[] = [
	{
      "type": "number", // es un campo numerico
      "name": "doc", // su id será doc
      "placeholder": "user id", // tendrá un placeholder
      "value": "", // su valor inicial es ""
      "validations": [
        {
          "type": "minLength", // se valida que tenga más de x carácteres
          "value": 3, // en este contexto de la validación debe tener más de 3 carácteres
          "message": "Min. 3 characters" // mensaje que se muestra 
          // cuando se detecta la validación
        },
        {
          "type": "maxLength", // se valida que tenga un máximo de x carácteres
          "value": 8, // en este contexto de la validación debe tener máximo de 8 carácteres
          "message": "Max. 8 characters" // mensaje que se muestra 
          // cuando se detecta la validación
        },
        {
          "type": "required", // el campo es requerido (no debe ser vacio)
          "message": "user id is required"// mensaje que se muestra 
          // cuando se detecta la validación
        }
      ]
    },
    {
      "type": "text",
      "name": "user",
      "label": "Nombre do macaco",
      "placeholder": "Usuario",
      "value": "",
      "validations": [
        {
	     // requerido hasta que otro campo esté diligenciado o tenga un valor en especifico
          "type": "requiredUntil", 
          "message": "llena el otro campo", // mensaje que se muestra 
          // cuando se detecta la validación
          "ref": "doc", // campo al cual se referencia (o sea el cual se tiene que llenar antes)
          "value": "some" // es la validación que se evaluará con respecto al campo
          // referenciado ("ref":"doc"), en este caso el campo doc debe algún valor y ser
          // distinto a ""
        }
      ],
      "tooltipMsn": "<h1>Wagh<h1/>" // tooltip de caracter informativo
    }
]

export const formularyLayout: FormLayoutConfig  = { 
    "numCols": 2, // este formulario tiene solo 2 columnas [][]
    "justifyButtons": "center", // el botón de subir estará centrado
    "fields": [
      {
        "fieldName": "user", // campo el cual se desea posicionar
        "gridColumn": "1", // el campo user estará en la primera columna [X][]
        "gridRow": "1" // el campo user estará en la primera fila [X][]
      },
      {
        "fieldName": "doc", // campo el cual se desea posicionar
        "gridColumn": "2", // el campo doc estará en la segunda columna [][X]
        "gridRow": "1" // el campo user estará en la primera fila [][X] 
      }
    ]
}

Ya una vez creadas solo sería llamarlas como props del componente <DynamicForm/> y así poder renderizar el formulario.


React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:

  • Configure the top-level parserOptions property like this:
   parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
    project: ['./tsconfig.json', './tsconfig.node.json'],
    tsconfigRootDir: __dirname,
   },
  • Replace plugin:@typescript-eslint/recommended to plugin:@typescript-eslint/recommended-type-checked or plugin:@typescript-eslint/strict-type-checked
  • Optionally add plugin:@typescript-eslint/stylistic-type-checked
  • Install eslint-plugin-react and add plugin:react/recommended & plugin:react/jsx-runtime to the extends list