Cat UI
GitHub
  • Comece por aqui
    • 1. Instalação
      • Icones
      • Bootstrap
    • 2. Aplicando Tema
    • 3. Estrutura da aplicação
    • 4. Segurança
      • OpenID (Opcional)
      • Claims (Optional)
  • Menu
    • Sidenav
    • Toolbar
    • Dropdown
    • Tab
  • Exibição de Dados
    • Datatable
    • Componentes Dinâmicos
    • Exportação e Download de Dados
      • .csv
      • .xlsx
      • Visualizar .pdf
      • Download base64
    • Chip
  • Formulário
    • Formulário Dinâmico
    • Lista de Itens
    • Campos Personalizados
    • Stepper
    • Expansive Panel
    • Filtro Sobre Demanda
  • Janelas e Alertas
    • Dialog
    • Confirm
    • Alert
    • Snackbar
    • SideWindow
    • Notifications
    • Tooltip
  • Loaders
    • Spinner
    • Loader Page
  • Botões
    • Button
  • Abstrações
    • ServiceBase
    • ComponentBase
    • CRUDComponentBase
    • FormBase
  • Guias
    • Criando uma Aplicação de CRUD
      • Criando Projeto
      • Estrutura
      • Tela de Login
      • Menu
      • Tela de Adoção
      • Serviço HTTP
      • Lista de Pets
      • Formulário de Cadastro e Edição
      • Excluir Pet
      • Conclusão
Powered by GitBook
On this page
  • API
  • Uso
  • Overview

Was this helpful?

  1. Formulário

Formulário Dinâmico

Construa formulários de forma fácil e objetiva

O Cat Ui utiliza um conceito de builder onde com chamadas de métodos encadeados permitirá a criação de formulários sem a necessidade de HTML e CSS, focando apenas na regra de negócio, garantindo assim, mais produtividade.

API

fieldset

Crie sessões de formulários, onde cada fieldset pussuirá seu builder para a criação dos campos internos a ele

onChange

Cada modificação de qualquer campo no formulário emitirá seu objeto, contendo todos os dados já informados.

onSubmit

Ao realizar um submit no formulário, o mesmo será convertido em um objeto e retornado como parâmetro de uma função, permitindo o envio para meios externos.

generate

Gera as configurações necessárias para a criação do formulário

Uso

import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';

import { CatFormModule } from '@catrx/ui/form';

import { FormExampleComponent } from './form-example.component';

@NgModule({
  declarations: [PageFormComponent],
  imports: [CatFormModule, HttpClientModule]
})
export class PageFormModule {}
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { CatFormListOptions } from '@catrx/ui/form';
import { delay } from 'rxjs/internal/operators/delay';
import { first } from 'rxjs/internal/operators/first';
import { map } from 'rxjs/internal/operators/map';

@Injectable({
  providedIn: 'root',
})
export class FormExampleService {
  constructor(private http: HttpClient) {}

  public getAddressByZipCode(zipcode: string) {
    return this.http
      .get<any>(`https://viacep.com.br/ws/${zipcode}/json`)
      .pipe(first());
  }

  public getUFs() {
    return this.http
      .get<any[]>(
        `https://servicodados.ibge.gov.br/api/v1/localidades/estados`,
        {
          params: { orderBy: 'nome' },
        }
      )
      .pipe(
        delay(2000),
        map((ufs) =>
          ufs.map((uf) => {
            return {
              value: uf.sigla,
              name: uf.sigla,
            } as CatFormListOptions;
          })
        ),
        first()
      );
  }
}
import { AbstractControl } from "@angular/forms";
import { CatFormValidatorResponseFactory } from "@catrx/ui/form";

export function nameValidator(control: AbstractControl) {
  if (!Number.isNaN(parseInt(control.value))) {
    return CatFormValidatorResponseFactory.generate('Este não é um nome válido.');
  }

  return null;
}
import { Component } from '@angular/core';
import { CatFileInterface } from '@catrx/ui/utils';
import {
  CatFormBehavior,
  CatFormService,
} from '@catrx/ui/form';
import { Subject } from 'rxjs/internal/Subject';
import { PageFormService } from './page-form.service';
import { nameValidator } from './validators/name.validator';

@Component({
  templateUrl: 'form-example.component.html',
  styles: [
    `
      form {
        display: block;
        margin: 15px 20px;
      }
    `,
  ],
})
export class FormExampleComponent {
  config = this.formService
    .build()
    .fieldset(
      'Autopreencher funcionário por arquivo',
      'autofillFormByFile',
      (builder) =>
        builder
          .csv('importEmployee', (builder) =>
            builder
              .setModel({
                filename: 'MODELO_IMPORTACAO_FUNCIONARIO',
                model: { name: '', lastname: '' },
              })
              .onChange((data: CatFileInterface, behavior) => {
                const employee = data?.csvContent?.[0];
                if (employee) {
                  behavior
                    .setValues([
                      {
                        name: 'personData.name',
                        value: employee['name'],
                      },
                      {
                        name: 'personData.lastname',
                        value: employee['lastname'],
                      },
                    ])
                    .send();
                }
              })
              .generate()
          )
          .generate()
    )
    .fieldset('Dados Pessoais', 'personData', (builder) =>
      builder
        .text('Nome', 'name', (builder) =>
          builder
            .setHint('Informe <b>TESTE</b> para desbloquear o sobrenome')
            .grid(3)
            .focus()
            .setRequired()
            .setMinLength(5)
            .setValidators([nameValidator])
            .onChange((value, behavior) => {
              if (value === 'teste') {
                behavior.enableFields(['personData.lastname']);
              } else {
                behavior.disableFields(['personData.lastname']);
              }
              behavior.send();
            })
            .generate()
        )
        .text('Sobrenome', 'lastname', (builder) =>
          builder.grid(3).disabled().setRequired().generate()
        )
        .cpf('CPF', 'cpf', (builder) =>
          builder.grid(3).setRequired().generate()
        )
        .date('Data de Nascimento', 'birthDate', (builder) =>
          builder.grid(3).setMax('2002-01-01').setRequired().generate()
        )
        .email('E-mail', 'email', (builder) => builder.grid(6).generate())
        .url('LinkedIn', 'linkedin', (builder) => builder.grid(6).generate())
        .generate()
    )
    .fieldset('Dados Profissionais', 'employeeData', (builder) =>
      builder
        .fieldset('Habilidades', 'skills', (builder) =>
          builder
            .checkbox('NodeJS', 'nodejs', (builder) => builder.generate())
            .checkbox('PHP', 'php', (builder) => builder.generate())
            .checkbox('Angular', 'angular', (builder) => builder.generate())
            .grid(6)
            .isCheckboxGroup()
            .generate()
        )
        .fieldset('Área', 'workArea', (builder) =>
          builder
            .radio('stack', (builder) =>
              builder
                .setOptions([
                  { name: 'FrontEnd', value: 'frontend' },
                  { name: 'BackEnd', value: 'backend' },
                  { name: 'FullStack', value: 'fullstack' },
                ])
                .setValue('backend')
                .generate()
            )
            .grid(6)
            .isCheckboxGroup()
            .generate()
        )
        .file('curriculum', (builder) =>
          builder
            .setIcon('fa-solid fa-paperclip')
            .setBtnText('Anexe o curriculo aqui')
            .setExtensionsAccept(['.pdf'])
            .setRequired()
            .generate()
        )
        .generate()
    )
    .fieldset('Endereço', 'employeeLocation', (builder) =>
      builder
        .text('CEP', 'cep', (builder) =>
          builder
            .grid(3)
            .setMinLength(8)
            .setMaxLength(8)
            .setRequired()
            .onChange((cep, behavior) =>
              this.pageFormService
                .getAddressByZipCode(cep)
                .subscribe((address) => this.fillAddress(address, behavior))
            )
            .generate()
        )
        .text('Logradouro', 'street', (builder) =>
          builder.grid(6).setRequired().setMaxLength(50).generate()
        )
        .text('Bairro', 'district', (builder) =>
          builder.grid(3).setRequired().setMaxLength(30).generate()
        )
        .text('Complemento', 'complement', (builder) =>
          builder.grid(3).setMaxLength(50).generate()
        )
        .number('Número', 'number', (builder) => builder.grid(2).generate())
        .text('Cidade', 'city', (builder) =>
          builder.grid(4).setRequired().setMaxLength(50).generate()
        )
        .autocomplete('Estado', 'state', (builder) =>
          builder
            .setOptions(this.pageFormService.getUFs())
            .grid(3)
            .setRequired()
            .onChange((value) => console.log(value))
            .generate()
        )
        .generate()
    )
    .fieldset('Empresa Contratante', 'empresaContratante', (builder) =>
      builder
        .text('Razão Social', 'corporateName', (builder) =>
          builder
            .grid(6)
            .setRequired()
            .setMaxLength(50)
            .setValidators([nameValidator])
            .generate()
        )
        .text('Nome Fantasia', 'lastname', (builder) =>
          builder.grid(3).setMaxLength(30).generate()
        )
        .cnpj('CNPJ', 'cnpj', (builder) =>
          builder.grid(3).setRequired().generate()
        )
        .generate()
    )
    .fieldset('Dados do Contrato', 'contractData', (builder) =>
      builder
        .time('Hora de Entrada', 'startTime', (builder) =>
          builder
            .grid(3)
            .setMin('08:00:00')
            .setMax('18:00:00')
            .setRequired()
            .generate()
        )
        .datetime('Data/Hora Admissão', 'contractDate', (builder) =>
          builder
            .grid(3)
            .setMin('2022-12-01 00:00')
            .setMax('2022-12-23 23:59')
            .setRequired()
            .generate()
        )
        .generate()
    )
    .fieldset('Dados Bancários', 'bankData', (builder) =>
      builder
        .number('Código do Banco', 'febrabamCode', (builder) =>
          builder.setRequired().setMin(1).setMax(999).grid(3).generate()
        )
        .number('Agência', 'agency', (builder) =>
          builder.setRequired().setMax(999).grid(3).generate()
        )
        .text('Nº da Conta', 'bankNumber', (builder) =>
          builder.setRequired().setMaxLength(8).grid(3).generate()
        )
        .generate()
    )
    .textarea('Descrição', 'description', (builder) =>
      builder.setMaxLength(1000).generate()
    )
    .onSubmit((data) => console.log(data))
    .generate();

  constructor(
    private formService: CatFormService,
    private pageFormService: PageFormService
  ) {}

  private fillAddress(address: any, behavior: CatFormBehavior) {
    behavior
      .setValues([
        {
          name: 'employeeLocation.street',
          value: address.logradouro,
        },
        {
          name: 'employeeLocation.district',
          value: address.bairro,
        },
        {
          name: 'employeeLocation.complement',
          value: address.complemento,
        },
        {
          name: 'employeeLocation.city',
          value: address.localidade,
        },
        {
          name: 'employeeLocation.state',
          value: address.uf,
        },
      ])
      .send();
  }
}
<form [formGroup]="form.dynamicForm" (submit)="form.submit()">
  <cat-form #form [config]="config">
  </cat-form>

  <button type="submit" class="btn btn-primary btn-sm">Enviar</button>
</form>

Overview

PreviousChipNextLista de Itens

Last updated 2 years ago

Was this helpful?

CatUi
Logo