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 🙏

© 2026 – Pkg Stats / Ryan Hefner

primeng-forms-utils

v0.1.1

Published

Angular utility library for dynamic forms built on top of PrimeNG.

Downloads

376

Readme

primeng-forms-utils

Biblioteca utilitaria para Angular + PrimeNG focada em formularios dinamicos.

Objetivo

Centralizar a definicao de campos, validacoes, layout e saida de valor em uma configuracao TypeScript, evitando templates grandes e repetitivos nas paginas Angular.

O que a biblioteca faz

  • monta ou complementa um FormGroup;
  • aplica validacoes declarativas e validadores Angular customizados;
  • renderiza os componentes PrimeNG atuais, como p-select, p-datepicker, pTextarea e p-inputNumber;
  • organiza os campos em grid de 12 colunas responsivo;
  • suporta labels acima ou ao lado do campo;
  • exibe asterisco antes da label quando o campo for obrigatorio;
  • exibe dica rapida por meio de um icone com tooltip;
  • suporta text, number, money, percent, textarea, select, enum, image, date, radio e checkbox;
  • suporta grupos de checkbox com valor em array;
  • suporta upload de imagem com preview local;
  • persiste campos de data como string UTC no FormControl;
  • permite customizar aparencia de campos por configuracao;
  • resolve mensagens de erro via configuracao do campo, traducoes externas e fallback padrao.

O que a biblioteca nao faz

  • nao executa submit;
  • nao persiste dados;
  • nao toma decisoes de negocio;
  • nao faz upload automatico de arquivos.

Componentes principais

  • DynamicFormComponent: componente raiz do formulario.
  • DynamicFieldComponent: adaptador que escolhe qual componente PrimeNG renderizar.
  • DynamicFormBuilderService: cria ou complementa FormGroup.
  • dynamic-field-config.ts: contratos centrais da biblioteca.

Layout padrao

  • o formulario usa grid de 12 colunas;
  • no mobile, cada campo ocupa 12/12;
  • a partir de md, se colSpan nao for informado, o campo ocupa 6/12;
  • quando a soma dos spans ultrapassa 12, o proximo campo quebra para a linha de baixo automaticamente;
  • o espacamento entre campos e 8px.

Aparencia por campo

Cada campo pode receber um bloco opcional appearance para sobrescrever tokens visuais do PrimeNG no proprio campo.

Exemplo:

appearance: {
  borderColor: '#0f766e',
  hoverBorderColor: '#0d9488',
  focusBorderColor: '#0f766e',
  invalidBorderColor: '#dc2626',
  backgroundColor: '#ffffff',
  textColor: '#0f172a',
  placeholderColor: '#64748b',
  focusRingColor: 'rgba(15, 118, 110, 0.18)',
  borderRadius: '0.75rem'
}

Observacoes:

  • hoje essa customizacao cobre principalmente text, textarea e select;
  • a API foi desenhada para crescer para outros componentes sem mudar o contrato do consumidor.

Exemplo

import { FormGroup } from '@angular/forms';
import {
  DynamicErrorTranslations,
  DynamicFieldConfig,
  utcDateNotBeforeTodayValidator
} from 'primeng-forms-utils';

enum UserRole {
  Admin = 'admin',
  Reviewer = 'reviewer',
  User = 'user'
}

const form = new FormGroup({});

const errorTranslations: DynamicErrorTranslations = {
  required: 'Esse campo e obrigatorio.',
  email: 'Informe um e-mail valido.',
  minlength: ({ errorValue }) => `Minimo de ${(errorValue as { requiredLength: number }).requiredLength} caracteres.`,
  maxlength: ({ errorValue }) => `Maximo de ${(errorValue as { requiredLength: number }).requiredLength} caracteres.`,
  min: ({ errorValue }) => `Valor minimo: ${(errorValue as { min: number }).min}.`,
  max: ({ errorValue }) => `Valor maximo: ${(errorValue as { max: number }).max}.`,
  pattern: 'Formato invalido.'
};

const fields: DynamicFieldConfig[] = [
  {
    name: 'name',
    type: 'text',
    label: 'Nome',
    placeholder: 'Informe o nome',
    quickHint: 'Esse nome sera exibido no cadastro principal.',
    appearance: {
      borderColor: '#0f766e',
      hoverBorderColor: '#0d9488',
      focusBorderColor: '#0f766e',
      focusRingColor: 'rgba(15, 118, 110, 0.18)'
    },
    validators: [{ type: 'required' }, { type: 'minLength', value: 3 }]
  },
  {
    name: 'role',
    type: 'enum',
    label: 'Perfil',
    colSpan: 6,
    labelPosition: 'side',
    placeholder: 'Selecione um perfil',
    enumConfig: {
      values: UserRole,
      showIcons: true,
      options: [
        { enumValue: UserRole.Admin, label: 'Administrador', icon: 'pi pi-shield' },
        { enumValue: UserRole.Reviewer, label: 'Revisor', icon: 'pi pi-eye' },
        { enumValue: UserRole.User, label: 'Usuario', icon: 'pi pi-user' }
      ]
    }
  },
  {
    name: 'price',
    type: 'money',
    label: 'Preco',
    colSpan: 6,
    moneyConfig: {
      currency: 'BRL',
      locale: 'pt-BR',
      currencyDisplay: 'symbol',
      minFractionDigits: 2,
      maxFractionDigits: 2
    }
  },
  {
    name: 'startDate',
    type: 'date',
    label: 'Data inicial',
    colSpan: 6,
    dateConfig: {
      dateFormat: 'dd/mm/yy',
      showIcon: true
    },
    controlValidators: [utcDateNotBeforeTodayValidator()]
  },
  {
    name: 'permissions',
    type: 'checkbox',
    label: 'Permissoes',
    colSpan: 6,
    optionLayout: 'vertical',
    initialValue: ['read', 'create'],
    options: [
      { label: 'Ler', value: 'read' },
      { label: 'Criar', value: 'create' },
      { label: 'Remover', value: 'delete' }
    ]
  }
];
<pfu-dynamic-form
  [form]="form"
  [fields]="fields"
  [errorTranslations]="errorTranslations"
/>

Demo visual

Existe um app Angular standalone em demo/README.md para validar visualmente:

  • layout responsivo em grid de 12 colunas;
  • colSpan padrao 6/12 quando nao informado;
  • todos os tipos de campo suportados;
  • customizacao visual por appearance;
  • payload em tempo real e snapshot de submit.

Diretiva de loading

Use a diretiva pfuLoading em qualquer container para sobrepor a area com um painel branco semitransparente e spinner central.

import { LoadingDirective } from 'primeng-forms-utils';
<div [pfuLoading]="isLoading">
  Conteudo do container
</div>

Proximos passos recomendados

  1. Cobrir mais tokens visuais em appearance, inclusive checkbox, radio, datepicker e inputnumber.
  2. Adicionar testes unitarios para builder, layout e rendering condicional.
  3. Publicar snapshots visuais do demo para facilitar revisao em PR.

Documentacao para LLMs

Existe um manual dedicado para implementacao e extensao por outras LLMs em docs/LLM_IMPLEMENTATION_MANUAL.md.