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

avnt-react-orm

v1.1.1

Published

Um pacote React com TypeScript

Downloads

183

Readme

avnt-react-orm

npm version Bitbucket issues

O avnt-react-orm é um pacote poderoso e flexível projetado para simplificar o gerenciamento de estado e a manipulação de dados em aplicações React. Ele fornece uma estrutura organizada e intuitiva para trabalhar com modelos, controladores e provedores, facilitando operações CRUD, gerenciamento de formulários e validações.

Características

  • Estrutura organizada para gerenciamento de dados em React
  • Implementação de controladores para lógica de negócios e manipulação de estado
  • Modelos para representação e interação com dados
  • Gerenciamento simplificado de formulários para criação e edição de registros
  • Interface similar a ORM para interação com dados
  • Suporte a relacionamentos entre modelos
  • Sistema de validação integrado
  • Flexibilidade para trabalhar com diferentes backends e APIs

Instalação

Para instalar o avnt-react-orm em seu projeto, use um dos seguintes comandos:

npm install avnt-react-orm

ou

yarn add avnt-react-orm

Uso Básico

Criando um Modelo

import { ModelBase } from 'avnt-react-orm';
import { Attributes } from '@/types/attributes';

export class Usuario extends ModelBase {
  collection = 'usuarios';

  attributes: Attributes<Usuario> = {
    id: { name: 'id', value: '' },
    nome: { name: 'nome', value: '' },
    email: { name: 'email', value: '' },
    documento: { name: 'documento', value: '' },
    senha: { name: 'senha', value: '' },
  };

  fillable = ['nome', 'email', 'documento', 'senha'];
}

Criando um Controlador

import { ControllerBase } from 'avnt-react-orm';
import { Usuario } from './models/Usuario';
import { FieldData } from '@/interfaces/field';
import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod';

export class UsuarioController extends ControllerBase<Usuario> {
  constructor() {
    super(new Usuario());
  }

  settings = {
    fields: {
      nome: { 
        removeDescriptionField: true,
        label: 'Nome', 
        type: 'text', 
        showWhen: ['store', 'update'],
        component: props => <YourTextComponent { ...props } /> 
      } as FieldData,
      documento: { 
        label: 'CPF', 
        type: 'text', 
        showWhen: ['store', 'update'],
        component: props => <YourCPFComponent { ...props } /> 
      } as FieldData,
      email: { 
        label: 'E-mail', 
        type: 'email', 
        showWhen: ['store', 'update'], 
        disabledWhen: ['update'],
        component: props => <YourEmailComponent { ...props } /> 
      } as FieldData,
      senha: { 
        label: 'Senha', 
        type: 'password',
        showWhen: ['store'], 
        component: props => <YourPasswordComponent { ...props } /> 
      } as FieldData,
    },

    // Schema padrão (usado em create e update)
    schema: z.object({
      nome: z.string().min(1, 'Nome é obrigatório'),
      email: z.string().email('E-mail inválido'),
      documento: z.string().regex(/^\d{3}\.\d{3}\.\d{3}-\d{2}$/, 'CPF inválido'),
      senha: z.string().min(8, 'A senha deve ter pelo menos 8 caracteres')
    }),

    // Use isso quando precisar sobrescrever o schema padrão para páginas específicas
    create: {
      schema: z.object({
        nome: z.string().min(1, 'Nome é obrigatório'),
        email: z.string().email('E-mail inválido'),
        documento: z.string().regex(/^\d{3}\.\d{3}\.\d{3}-\d{2}$/, 'CPF inválido'),
        senha: z.string().min(8, 'A senha deve ter pelo menos 8 caracteres')
      })
    },
    update: {
      schema: z.object({
        nome: z.string().min(1, 'Nome é obrigatório'),
        documento: z.string().regex(/^\d{3}\.\d{3}\.\d{3}-\d{2}$/, 'CPF inválido')
      })
    }
    // Defina configurações para outros tipos de página conforme necessário
  };

  getResolver(pageType?: 'create' | 'update') {
    const schema = pageType ? this.settings[pageType].schema : this.settings.schema;
    return zodResolver(schema);
  }
}

Usando o PageProvider em um Componente React

import React from 'react';
import { PageProvider } from 'avnt-react-orm';
import { UsuarioController } from './controllers/UsuarioController';

const FormUsuario = () => {
  const usuarioController = new UsuarioController();
  
  const provedor = new PageProvider({
    resource: 'usuarios',
    resources: { usuarios: usuarioController },
    onLoad: () => {
      // Lógica de carregamento personalizada
    },
    onSearch: (termosBusca, instancia) => {
      // Lógica de busca personalizada
      return instancia;
    },
    onAction: (instancia) => {
      // Lógica de ação personalizada
      return instancia;
    },
  });

  provedor.subscribe((instancia) => {
    // Reaja às atualizações do provedor
  });

  const { register, handleSubmit, formState: { errors } } = useForm({
    resolver: usuarioController.getResolver('create')
  });

  const onSubmit = (data) => {
    // Lógica de submissão do formulário
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {/* Renderize seus campos de formulário aqui */}
      <button type="submit">Enviar</button>
    </form>
  );
};

export default FormUsuario;

Conceitos Principais

Modelos

Modelos representam a estrutura de dados da sua aplicação. Eles definem atributos, relacionamentos e regras de negócio específicas para cada tipo de dado. Os modelos utilizam a interface ModelInterface e o tipo Attributes para definir sua estrutura.

Controladores

Controladores gerenciam a lógica de negócios e o estado da aplicação. Eles implementam a interface ControllerInterface, que inclui métodos para operações CRUD, gerenciamento de estado e manipulação de campos. Os controladores também definem schemas de validação e configurações de campos.

Provedores

Provedores lidam com a conexão entre seus componentes React e os controladores. Eles gerenciam parâmetros de URL, ações e atualizações de estado.

Campos

Campos são definidos usando a interface FieldData e representam a estrutura de formulários e interfaces de usuário. Eles fornecem uma maneira fácil de gerar e validar formulários dinamicamente, com suporte para diferentes tipos de páginas e condições de exibição.

Tipos Importantes

  • ControllerState: Representa o estado atual do controlador ('draft' | 'initialized' | 'error' | 'processing' | 'inuse').
  • PageType: Define os tipos de páginas suportados pelo sistema.
  • Filter: Interface para definir filtros de dados.

Recursos Avançados

  • Relacionamentos: Defina e gerencie relacionamentos entre diferentes modelos.
  • Validação: Implemente regras de validação personalizadas para seus dados usando Zod ou outras bibliotecas.
  • Acesso a atributos baseado em proxy: Acesse e modifique atributos do modelo diretamente.
  • Operações CRUD automáticas: Utilize métodos integrados para criar, ler, atualizar e excluir registros.
  • Filtros: Use a interface Filter para implementar filtragem avançada de dados.
  • Componentes de campo personalizados: Defina componentes React personalizados para cada campo.
  • Schemas de validação específicos por página: Configure schemas de validação diferentes para páginas de criação e atualização.

Licença

Este projeto está licenciado sob a Licença MIT.

Suporte

Se você encontrar algum problema ou tiver alguma dúvida, por favor, abra uma issue no repositório do projeto: avnt-sistemas/react-orm — Bitbucket