Compare commits

..

27 commits

Author SHA1 Message Date
af5246f5cc fix(Deploy): Ajustes para deploy 2025-10-15 16:31:32 -03:00
0e552b457e [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 15:29:58 -03:00
68cff2650c [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 15:20:28 -03:00
321e3092b7 [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 15:10:21 -03:00
858043697e [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 14:56:40 -03:00
4f3be03f3b [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 14:55:08 -03:00
f3f1329c3e [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 14:49:07 -03:00
f7f3225c88 [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 14:43:26 -03:00
e96be65cee [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 14:37:10 -03:00
4c5ba20534 [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 14:26:32 -03:00
bbc22ab916 [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 14:21:47 -03:00
9c0d58e745 [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 13:10:50 -03:00
a0e76d035c [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 13:05:19 -03:00
1efb9aba94 [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 13:01:20 -03:00
449340c7b4 [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 12:59:52 -03:00
dd028fd38e [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 12:56:55 -03:00
f10de65f74 [MVPTN-80] deploy(Docker): Ajuste de API de requisição 2025-09-29 12:28:47 -03:00
a65a5f78d3 [MVPTN-80] deploy(Docker): Ajuste de dockerfile 2025-09-29 11:13:40 -03:00
3007182f7b [MVPTN-80] deploy(Dockerfile): Ajustado docker file para desenvolvimento 2025-09-29 08:56:41 -03:00
d27384b716 Merge branch 'release(MVP)' into homologacao 2025-09-26 17:48:25 -03:00
d89be6c078 Merge branch 'release(MVP)' into homologacao 2025-09-22 16:56:18 -03:00
aa333d89f4 Teste de Deploy 2025-09-18 09:10:46 -03:00
9101dba83c Merge branch 'release(MVP)' into homologacao 2025-09-17 12:52:42 -03:00
0fd8349c5d fix(Dockerfile): Ajuste de dockerfile para realizar o build da aplicação 2025-09-17 12:12:47 -03:00
a0c8420ced Forçando commit do app.json mesmo ignorado 2025-09-17 12:02:42 -03:00
db993dba9f Merge branch 'release(MVP)' into homologacao 2025-09-17 11:57:58 -03:00
8d476bada0 fix(Config): Ajuste no config de homologação 2025-09-15 15:29:58 -03:00
1102 changed files with 5729 additions and 38771 deletions

View file

@ -1,117 +0,0 @@
{
"folders": [{ "path": "D:/IIS/Orius/app" }],
"settings": {
// === GERAL ===
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "explicit",
},
"editor.formatOnPaste": false,
"editor.formatOnType": false,
"editor.minimap.enabled": false,
"files.trimTrailingWhitespace": true,
"files.autoSave": "onFocusChange",
"telemetry.telemetryLevel": "off",
"update.mode": "manual",
// === PERFORMANCE ===
"files.watcherExclude": {
"**/node_modules/**": true,
"**/dist/**": true,
"**/build/**": true,
"**/.next/**": true,
"**/.git/**": true,
},
"search.exclude": {
"**/node_modules": true,
"**/dist": true,
"**/.next": true,
"**/.git": true,
},
// === FRONTEND ===
"editor.defaultFormatter": "esbenp.prettier-vscode",
"eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"],
"[typescript]": {
"editor.defaultFormatter": "vscode.typescript-language-features",
},
"[typescriptreact]": {
"editor.defaultFormatter": "vscode.typescript-language-features",
},
// === TAILWIND ===
"files.associations": {
"*.css": "tailwindcss",
},
"tailwindCSS.includeLanguages": {
"plaintext": "html",
"javascript": "javascript",
"typescriptreact": "typescriptreact",
},
// === TERMINAIS ===
"terminal.integrated.profiles.windows": {
"Next.js Dev": {
"path": "cmd.exe",
"args": ["/k", "cd D:\\IIS\\Orius\\app && npm run dev"],
},
"Build & Preview": {
"path": "cmd.exe",
"args": ["/k", "cd D:\\IIS\\Orius\\app && npm run build && npm run start"],
},
"Git Bash": {
"path": "C:\\Program Files\\Git\\bin\\bash.exe",
},
},
"terminal.integrated.defaultProfile.windows": "Git Bash",
// === GIT ===
"git.enabled": true,
"git.autorefresh": false,
"git.fetchOnPull": true,
"git.confirmSync": false,
// === VISUAL ===
"workbench.colorTheme": "Default Dark Modern",
"window.zoomLevel": 0,
"breadcrumbs.enabled": true,
"explorer.compactFolders": false,
// === MISC ===
"files.exclude": {
"**/.DS_Store": true,
"**/*.log": true,
},
},
"launch": {
"version": "0.2.0",
"configurations": [
{
"name": "Next.js: Debug Development Server",
"type": "node",
"request": "launch",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev"],
"cwd": "${workspaceFolder}",
"port": 9229,
},
],
},
"extensions": {
"recommendations": [
// === FRONTEND CORE ===
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"bradlc.vscode-tailwindcss",
"ms-vscode.vscode-typescript-next",
// === DEV EXPERIENCE ===
"formulahendry.code-runner",
"streetsidesoftware.code-spell-checker",
"eamodio.gitlens",
"mhutchie.git-graph",
"donjayamanne.githistory",
],
},
}

View file

@ -1,9 +0,0 @@
{
"semi": true,
"trailingComma": "all",
"singleQuote": true,
"printWidth": 100,
"tabWidth": 2,
"arrowParens": "always",
"plugins": ["prettier-plugin-tailwindcss"]
}

View file

@ -1,59 +1,33 @@
# ============================
# STAGE 1 Build
# ============================
FROM node:20-alpine AS builder
# ===========================
# 1º Estágio - Base
# ===========================
FROM node:20-alpine AS base
# Define diretório de trabalho
WORKDIR /app
# Copia pacotes e instala dependências
COPY package*.json ./
RUN npm ci
# Instala dependências básicas do sistema (útil para pacotes nativos, ex: sharp)
RUN apk add --no-cache libc6-compat bash
# Copia o restante do código
# ===========================
# 2º Estágio - Desenvolvimento
# ===========================
FROM base AS dev
# Define variável de ambiente para desenvolvimento
ENV NODE_ENV=development
# Copia apenas arquivos de dependências primeiro para otimizar o cache
COPY package*.json ./
# Instala TODAS as dependências (inclusive devDependencies)
RUN npm install
# Copia todo o código do projeto
COPY . .
# ---------- Variáveis de build ----------
# Estas variáveis são usadas pelo Next.js durante o "build"
# para embutir no bundle do frontend.
ARG NEXT_PUBLIC_ORIUS_APP_STATE
ARG NEXT_PUBLIC_ORIUS_APP_API_URL
ARG NEXT_PUBLIC_ORIUS_APP_API_PREFIX
ARG NEXT_PUBLIC_ORIUS_APP_API_CONTENT_TYPE
ENV NEXT_PUBLIC_ORIUS_APP_STATE=$NEXT_PUBLIC_ORIUS_APP_STATE
ENV NEXT_PUBLIC_ORIUS_APP_API_URL=$NEXT_PUBLIC_ORIUS_APP_API_URL
ENV NEXT_PUBLIC_ORIUS_APP_API_PREFIX=$NEXT_PUBLIC_ORIUS_APP_API_PREFIX
ENV NEXT_PUBLIC_ORIUS_APP_API_CONTENT_TYPE=$NEXT_PUBLIC_ORIUS_APP_API_CONTENT_TYPE
# ---------- Build ----------
ENV NODE_ENV=production
RUN npm run build
# ============================
# STAGE 2 Runner (standalone)
# ============================
FROM node:20-alpine AS runner
WORKDIR /app
# ---------- Variáveis em runtime ----------
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
# Copia apenas o necessário do build
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
COPY --from=builder /app/package*.json ./
# ---------- Corrige permissões ----------
RUN addgroup -S nodejs && adduser -S nextjs -G nodejs \
&& mkdir -p .next/cache/images \
&& chown -R nextjs:nodejs /app
USER nextjs
# Expõe a porta padrão do Next.js
EXPOSE 3000
# ---------- Executa o servidor ----------
CMD ["node", "server.js"]
# Ativa recarga automática e debug
CMD ["npm", "run", "dev"]

22
Dockerfile-bkp Normal file
View file

@ -0,0 +1,22 @@
# Use uma imagem Node.js completa para o desenvolvimento
FROM node:20-alpine
# Define o diretório de trabalho no container
WORKDIR /app
# Copia os arquivos de configuração do projeto
COPY package.json package-lock.json ./
# Instala todas as dependências do projeto
# Isso é necessário para o modo de desenvolvimento, pois o build não pré-compila os arquivos.
RUN npm install
# Copia o restante do código da sua aplicação
COPY . .
# Expõe a porta de desenvolvimento padrão do Next.js
EXPOSE 3000
# Define o comando para iniciar a aplicação em modo de desenvolvimento
# Isso ativará o servidor de desenvolvimento e a recarga automática
CMD ["npm", "run", "dev"]

41
Dockerfile-producao Normal file
View file

@ -0,0 +1,41 @@
# Etapa 1: Construir a aplicação
FROM node:20-alpine AS builder
# Define o diretório de trabalho
WORKDIR /app
# Copia os arquivos de configuração do pacote
COPY package.json package-lock.json ./
# Instala as dependências do projeto
RUN npm install
# Copia todo o código da aplicação para o container
COPY . .
# Constrói a aplicação com o output 'standalone'
RUN npm run build
# Etapa 2: Executar a aplicação
# Usa uma imagem Node.js leve
FROM node:20-alpine AS runner
# Define o diretório de trabalho
WORKDIR /app
# Copia o diretório 'standalone' da etapa de build, que já contém o servidor e as dependências
# O diretório 'standalone' é a pasta .next/standalone gerada pela configuração 'output: standalone'
COPY --from=builder /app/.next/standalone ./
# Copia os arquivos públicos
COPY --from=builder /app/public ./public
# Copia os arquivos estáticos gerados pelo build. É aqui que os arquivos CSS e JS ficam.
COPY --from=builder /app/.next/static ./.next/static
# Expõe a porta padrão do Next.js
EXPOSE 3000
# Define o comando para iniciar a aplicação
# O 'start' do package.json não é necessário, o próprio servidor standalone já está no container
CMD ["node", "server.js"]

View file

@ -1,58 +1 @@
# saas_app
Criar envlocal para usar variaveis de ambiente no em desenvolvimento
NEXT_PUBLIC_ORIUS_APP_STATE=GO
NEXT_PUBLIC_ORIUS_APP_API_URL=<http://localhost:8000/>
NEXT_PUBLIC_ORIUS_APP_API_PREFIX=api/v1/
NEXT_PUBLIC_ORIUS_APP_API_CONTENT_TYPE=application/json
## Modo Debug
Abra Run → Add Configuration… → Attach to Node.js
Configure:
{
"name": "Attach Next.js (9230)",
"type": "node",
"request": "attach",
"port": 9230,
"restart": true,
"smartStep": true,
"skipFiles": ["<node_internals>/**"]
}
npm run dev:debug
## onlyoffice
docker run -i -t -d -p 8081:80 --restart=always -e JWT_ENABLED=false onlyoffice/documentserver
## next em rede
```
npx next dev -H 0.0.0.0
```
```
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"dev:lan": "next dev -H 0.0.0.0" <-- Adicione esta linha
},
```
Como acessar no outro dispositivo
Descubra seu IP Local:
No Windows (seu caso), abra um terminal (CMD ou PowerShell) e digite:
Bash
ipconfig
Procure por Endereço IPv4 (geralmente começa com 192.168.x.x ou 10.0.x.x).
Acesse no navegador: No celular ou outro computador, digite: http://SEU_IP_AQUI:3000
Exemplo: <http://192.168.0.15:3000>

23
eslint.config.js Normal file
View file

@ -0,0 +1,23 @@
import next from "eslint-config-next";
import importPlugin from "eslint-plugin-import";
export default [
next,
{
plugins: {
import: importPlugin
},
rules: {
"import/order": [
"error",
{
groups: ["builtin", "external", "internal", ["parent", "sibling", "index"]],
"newlines-between": "always",
alphabetize: { order: "asc", caseInsensitive: true }
}
],
"semi": ["error", "always"],
"quotes": ["error", "double"]
}
}
];

View file

@ -1,70 +0,0 @@
import js from '@eslint/js';
import reactPlugin from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import jsxA11y from 'eslint-plugin-jsx-a11y';
import importPlugin from 'eslint-plugin-import';
import tseslint from 'typescript-eslint';
export default [
js.configs.recommended,
...tseslint.configs.recommended,
{
files: ['**/*.ts', '**/*.tsx'],
ignores: ['node_modules/**', '.next/**', 'out/**', 'dist/**'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
parser: tseslint.parser,
parserOptions: {
project: './tsconfig.json',
},
globals: {
React: true,
JSX: true,
},
},
plugins: {
react: reactPlugin,
'react-hooks': reactHooks,
'jsx-a11y': jsxA11y,
import: importPlugin,
},
settings: {
react: { version: 'detect' },
'import/resolver': {
typescript: {
alwaysTryTypes: true,
project: './tsconfig.json',
},
node: {
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
},
},
rules: {
'react/react-in-jsx-scope': 'off',
'react/jsx-uses-react': 'off',
'react/jsx-uses-vars': 'warn',
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'warn',
'import/order': [
'error',
{
groups: [['builtin', 'external'], ['internal'], ['parent', 'sibling', 'index']],
pathGroups: [
{
pattern: '@/**',
group: 'internal',
position: 'after',
},
],
alphabetize: { order: 'asc', caseInsensitive: true },
'newlines-between': 'always',
},
],
'import/no-duplicates': 'error',
'import/newline-after-import': ['error', { count: 1 }],
'no-unused-vars': 'warn',
},
},
];

View file

@ -1,17 +1,8 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
// Gera build autônomo para rodar com "node server.js"
output: 'standalone',
// Configurações gerais
reactStrictMode: true,
poweredByHeader: false,
compress: true,
// Desativa verificações no build de produção
eslint: { ignoreDuringBuilds: true },
typescript: { ignoreBuildErrors: true },
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
// Isso gera um diretório otimizado que inclui tudo o que a aplicação precisa para rodar
output: "standalone",
};
module.exports = nextConfig;
export default nextConfig;

2889
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -4,17 +4,14 @@
"version": "25.9.1",
"private": true,
"scripts": {
"dev": "next dev",
"dev:debug": "cross-env NEXT_USE_TURBOPACK=0 NODE_OPTIONS=\"--inspect=9230\" next dev",
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
"lint": "next lint",
"postinstall": "shx mkdir -p public/libs && shx cp -r node_modules/tinymce public/libs/tinymce"
"lint": "next lint"
},
"dependencies": {
"@faker-js/faker": "^10.0.0",
"@hookform/resolvers": "^5.2.1",
"@onlyoffice/document-editor-react": "^2.1.1",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-avatar": "^1.1.10",
"@radix-ui/react-checkbox": "^1.3.3",
@ -23,25 +20,15 @@
"@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-progress": "^1.1.7",
"@radix-ui/react-radio-group": "^1.3.8",
"@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-select": "^2.2.6",
"@radix-ui/react-separator": "^1.1.8",
"@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-switch": "^1.2.6",
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-separator": "^1.1.7",
"@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-tooltip": "^1.2.8",
"@tanstack/react-table": "^8.21.3",
"@tinymce/tinymce-react": "^6.3.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"cookies-next": "^6.1.0",
"date-fns": "^3.6.0",
"faker-js": "^1.0.0",
"framer-motion": "^12.23.24",
"input-otp": "^1.4.2",
"js-cookie": "^3.0.5",
"jsonwebtoken": "^9.0.2",
"jwt-decode": "^4.0.0",
@ -51,39 +38,23 @@
"react": "19.1.0",
"react-dom": "19.1.0",
"react-hook-form": "^7.62.0",
"react-masked-text": "^1.0.5",
"recharts": "^3.3.0",
"sonner": "^2.0.7",
"tailwind-merge": "^3.3.1",
"tinymce": "^8.1.2",
"zod": "^4.0.17"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.12.0",
"@tailwindcss/postcss": "^4",
"@types/date-fns": "^2.5.3",
"@types/js-cookie": "^3.0.6",
"@types/jsonwebtoken": "^9.0.10",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"@typescript-eslint/eslint-plugin": "^8.46.1",
"@typescript-eslint/parser": "^8.46.1",
"cross-env": "^10.1.0",
"eslint": "^9.38.0",
"eslint-config-prettier": "^10.1.8",
"eslint-import-resolver-typescript": "^4.4.4",
"eslint-config-next": "^15.5.4",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^7.0.0",
"eslint-plugin-unused-imports": "^4.2.0",
"prettier": "^3.6.2",
"prettier-plugin-tailwindcss": "^0.6.14",
"shx": "^0.4.0",
"tailwindcss": "^4",
"tw-animate-css": "^1.3.7",
"typescript": "5.9.3",
"typescript-eslint": "^8.46.1"
"typescript": "^5"
}
}

View file

@ -1,5 +1,5 @@
const config = {
plugins: ['@tailwindcss/postcss'],
plugins: ["@tailwindcss/postcss"],
};
export default config;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Binary file not shown.

View file

@ -1,6 +1,6 @@
'use server';
"use server";
import { cookies } from 'next/headers';
import { cookies } from "next/headers";
/**
* Função para obter tokens do lado servidorde acordo com o nome informado

View file

@ -1,5 +1,4 @@
import appConfig from '@/config/app.json';
import appConfig from "../../config/app.json";
export default class Json {
static execute() {
return appConfig;

View file

@ -1,5 +1,5 @@
export default function GetSigla(data: string): string {
if (!data) return '';
if (!data) return "";
// Remove espaços extras no início e no fim e divide em palavras
const palavras = data.trim().split(/\s+/);
@ -10,5 +10,5 @@ export default function GetSigla(data: string): string {
}
// Duas ou mais palavras → retorna a primeira letra de cada
return palavras.map((palavra) => palavra.charAt(0).toUpperCase()).join('');
return palavras.map((palavra) => palavra.charAt(0).toUpperCase()).join("");
}

View file

@ -1,9 +1,9 @@
'use server';
"use server";
import { cookies } from 'next/headers';
import { cookies } from "next/headers";
export default async function TokenGet() {
const cookieStore = await cookies();
const token = cookieStore.get('access_token');
const token = cookieStore.get("access_token");
return token?.value;
}

View file

@ -0,0 +1,7 @@
export default function empty(data: any) {
if (!data || !data === null || !data === undefined) {
return true;
}
return false;
}

View file

@ -1,10 +1,14 @@
import withClientErrorHandlerInterface from './withClientErrorHandlerInterface';
import withClientErrorHandlerInterface from "./withClientErrorHandlerInterface";
/**
* Códigos de erro que começam com 6, são do front entd, na ordem do alfabeto o F de frontend é a sexta letra
*/
export function withClientErrorHandler<T extends (...args: any[]) => Promise<any>>(action: T) {
return async (...args: Parameters<T>): Promise<withClientErrorHandlerInterface> => {
export function withClientErrorHandler<
T extends (...args: any[]) => Promise<any>,
>(action: T) {
return async (
...args: Parameters<T>
): Promise<withClientErrorHandlerInterface> => {
try {
// Executa a função definida
const data = await action(...args);
@ -15,7 +19,7 @@ export function withClientErrorHandler<T extends (...args: any[]) => Promise<any
// Retorna o erro de execuçãformatado
return {
status: 600,
message: error?.message || 'Erro interno do servidor',
message: error?.message || "Erro interno do servidor",
data: error,
};
}

View file

@ -0,0 +1,51 @@
"use client";
import { useEffect } from "react";
import { useParams } from "next/navigation";
import { Card, CardContent } from "@/components/ui/card";
import { useGUsuarioReadHooks } from "@/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioReadHooks";
import Usuario from "@/app/(protected)/(administrativo)/_interfaces/GUsuarioInterface";
import Loading from "@/app/_components/loading/loading";
export default function UsuarioDetalhes() {
const params = useParams();
const { usuario, fetchUsuario } = useGUsuarioReadHooks();
useEffect(() => {
if (params.id) {
fetchUsuario({ usuario_id: Number(params.id) } as Usuario);
}
console.log("pagina", usuario);
}, []);
if (!usuario) return <Loading type={1} />;
return (
<div>
<Card>
<CardContent>
<div className="mb-4 grid gap-4 grid-cols-4">
<div>
<div className="text-2xl font-semibold">Nome</div>
<div className="text-xl">{usuario?.nome_completo}</div>
</div>
<div>
<div className="text-2xl font-semibold">CPF</div>
<div className="text-xl">{usuario?.cpf}</div>
</div>
<div>
<div className="text-2xl font-semibold">Função</div>
<div className="text-xl">{usuario?.funcao}</div>
</div>
<div>
<div className="text-2xl font-semibold">Email</div>
<div className="text-xl">{usuario?.email}</div>
</div>
</div>
</CardContent>
</Card>
</div>
);
}

View file

@ -0,0 +1,127 @@
"use client";
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from "react-hook-form";
import { z } from "zod";
import { Input } from "@/components/ui/input";
import { GUsuarioSchema } from "../../../_schemas/GUsuarioSchema";
import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card";
import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/components/ui/form";
import { useGUsuarioSaveHook } from "../../../_hooks/g_usuario/useGUsuarioSaveHook";
type FormValues = z.infer<typeof GUsuarioSchema>;
export default function UsuarioFormularioPage() {
const { usuario, saveUsuario } = useGUsuarioSaveHook();
const form = useForm<FormValues>({
resolver: zodResolver(GUsuarioSchema),
defaultValues: {
login: "",
nome_completo: "",
funcao: "",
email: "",
cpf: "",
},
});
async function onSubmit(values: FormValues) {
saveUsuario(values);
}
return (
<div>
<Card>
<CardContent>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
<FormField
control={form.control}
name="login"
render={({ field }) => (
<FormItem>
<FormLabel>Login</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="nome_completo"
render={({ field }) => (
<FormItem>
<FormLabel>Nome Completo</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="funcao"
render={({ field }) => (
<FormItem>
<FormLabel>Função</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="cpf"
render={({ field }) => (
<FormItem>
<FormLabel>Cpf</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit">Salvar</Button>
</form>
</Form>
</CardContent>
</Card>
</div>
);
}

View file

@ -0,0 +1,88 @@
"use client";
import { Card, CardContent } from "@/components/ui/card";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import Usuario from "../../_interfaces/GUsuarioInterface";
import { Button } from "@/components/ui/button";
import Link from "next/link";
import { useGUsuarioIndexHook } from "../../_hooks/g_usuario/useGUsuarioIndexHook";
import { useEffect } from "react";
import Loading from "@/app/_components/loading/loading";
export default function UsuarioPage() {
const { usuarios, fetchUsuarios } = useGUsuarioIndexHook();
useEffect(() => {
fetchUsuarios();
}, []);
if (!usuarios) return <Loading type={2} />;
return (
<div>
<Card>
<CardContent>
<div className="grid grid-cols-2">
<div className="text-2xl font-semibold">Usuarios</div>
<div className="text-right">
<Button asChild>
<Link href="/usuarios/formulario">+ Usuário</Link>
</Button>
</div>
</div>
<Table>
<TableHeader>
<TableRow>
<TableHead className="text-center">#</TableHead>
<TableHead>Situação</TableHead>
<TableHead>CPF</TableHead>
<TableHead>Login / Sigla / Nome</TableHead>
<TableHead>Função</TableHead>
<TableHead></TableHead>
<TableHead></TableHead>
</TableRow>
</TableHeader>
<TableBody>
{usuarios.map((usuario: Usuario) => (
<TableRow key={usuario.usuario_id} className="cursor-pointer">
<TableCell className="text-center">
{usuario.usuario_id}
</TableCell>
<TableCell className="font-medium">
{usuario.situacao}
</TableCell>
<TableCell className="font-medium">{usuario.cpf}</TableCell>
<TableCell>
<div className="font-semibold text-xs">
{usuario.login} - {usuario.sigla}
</div>
<div className="text-base">{usuario.nome_completo}</div>
</TableCell>
<TableCell>
<div className="text-base">{usuario.funcao}</div>
</TableCell>
<TableCell>
<Button asChild>
<Link href={`/usuarios/${usuario.usuario_id}/detalhes`}>
Detalhes
</Link>
</Button>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</CardContent>
</Card>
</div>
);
}

View file

@ -1,7 +1,7 @@
'use server';
"use server";
import API from '@/shared/services/api/Api';
import { Methods } from '@/shared/services/api/enums/ApiMethodEnum';
import API from "@/services/api/Api";
import { Methods } from "@/services/api/enums/ApiMethodEnum";
export default async function GUsuarioDeleteData(usuarioId: number) {
const api = new API();

View file

@ -0,0 +1,15 @@
"use server";
import API from "@/services/api/Api";
import { Methods } from "@/services/api/enums/ApiMethodEnum";
export default async function GUsuarioIndexData() {
const api = new API();
const response = await api.send({
method: Methods.GET,
endpoint: `administrativo/g_usuario/`,
});
return response;
}

View file

@ -1,7 +1,7 @@
'use server';
"use server";
import API from '@/shared/services/api/Api';
import { Methods } from '@/shared/services/api/enums/ApiMethodEnum';
import { Methods } from "@/services/api/enums/ApiMethodEnum";
import API from "@/services/api/Api";
export default async function GUsuarioLoginData(form: any) {
const api = new API();

View file

@ -1,7 +1,7 @@
'use server';
"use server";
import API from '@/shared/services/api/Api';
import { Methods } from '@/shared/services/api/enums/ApiMethodEnum';
import API from "@/services/api/Api";
import { Methods } from "@/services/api/enums/ApiMethodEnum";
export default async function GUsuarioReadData(usuarioId: number) {
const api = new API();

View file

@ -1,7 +1,7 @@
'use server';
"use server";
import API from '@/shared/services/api/Api';
import { Methods } from '@/shared/services/api/enums/ApiMethodEnum';
import API from "@/services/api/Api";
import { Methods } from "@/services/api/enums/ApiMethodEnum";
export default async function GUsuarioSaveData(form: any) {
const api = new API();

View file

@ -0,0 +1,23 @@
"use client";
import { useState } from "react";
import Usuario from "../../_interfaces/GUsuarioInterface";
import GUsuarioIndex from "../../_services/g_usuario/GUsuarioIndex";
import { useResponse } from "@/app/_response/ResponseContext";
export const useGUsuarioIndexHook = () => {
const { setResponse } = useResponse();
const [usuarios, setUsuarios] = useState<Usuario[] | null>(null);
const fetchUsuarios = async () => {
const response = await GUsuarioIndex();
setUsuarios(response.data);
// Define os dados do componente de resposta (toast, modal, etc)
setResponse(response);
};
return { usuarios, fetchUsuarios };
};

View file

@ -0,0 +1,11 @@
"use client";
import GUsuarioLogoutService from "../../_services/g_usuario/GUsuarioLogoutService";
export const useGUsuarioLogoutHook = () => {
const logoutUsuario = async () => {
await GUsuarioLogoutService("access_token");
};
return { logoutUsuario };
};

View file

@ -1,11 +1,9 @@
'use client';
"use client";
import { useState } from 'react';
import { useResponse } from '@/shared/components/response/ResponseContext';
import Usuario from '@/packages/administrativo/interfaces/GUsuario/GUsuarioInterface';
import GUsuarioRead from '@/packages/administrativo/services/GUsuario/GUsuarioRead';
import { useState } from "react";
import Usuario from "../../_interfaces/GUsuarioInterface";
import GUsuarioRead from "../../_services/g_usuario/GUsuarioRead";
import { useResponse } from "@/app/_response/ResponseContext";
export const useGUsuarioReadHooks = () => {
const { setResponse } = useResponse();
@ -14,7 +12,10 @@ export const useGUsuarioReadHooks = () => {
const fetchUsuario = async (Usuario: Usuario) => {
const response = await GUsuarioRead(Usuario.usuario_id);
console.log("hook", response.data);
setUsuario(response.data);
setResponse(response);
};

View file

@ -1,11 +1,9 @@
'use client';
"use client";
import { useState } from 'react';
import { useResponse } from '@/shared/components/response/ResponseContext';
import Usuario from '@/packages/administrativo/interfaces/GUsuario/GUsuarioInterface';
import GUsuarioSave from '@/packages/administrativo/services/GUsuario/GUsuarioSave';
import { useState } from "react";
import Usuario from "../../_interfaces/GUsuarioInterface";
import GUsuarioSave from "../../_services/g_usuario/GUsuarioSave";
import { useResponse } from "@/app/_response/ResponseContext";
export const useGUsuarioSaveHook = () => {
const { setResponse } = useResponse();

View file

@ -0,0 +1,6 @@
import { z } from "zod";
export const GUsuarioLoginSchema = z.object({
login: z.string().min(1, "O campo deve ser preenchido"),
senha_api: z.string().min(1, "O campo deve ser preenchido"),
});

View file

@ -1,4 +1,4 @@
import { z } from 'zod';
import { z } from "zod";
export const GUsuarioSchema = z.object({
trocarsenha: z.string().optional(),

View file

@ -0,0 +1,9 @@
"use server";
import GUsuarioIndexData from "../../_data/g_usuario/GUsuarioIndexData";
export default async function GUsuarioIndex() {
const response = await GUsuarioIndexData();
return response;
}

View file

@ -0,0 +1,34 @@
"use server";
import { cookies } from "next/headers";
import GUsuarioLoginData from "../../_data/g_usuario/GUsuarioLoginData";
import { redirect } from "next/navigation";
export default async function GUsuarioLoginService(form: any) {
// Obtem a resposta da requisição
const response = await GUsuarioLoginData(form);
// Verifica se localizou o usuário
if (response.data.usuario_id <= 0) {
return {
code: 404,
message: "Não foi localizado o usuário",
};
}
// Importação do manipulador de cookies
const cookieStore = await cookies();
// Cria um novo cookie
cookieStore.set("access_token", response.data.token, {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
sameSite: "strict",
path: "/",
maxAge: 60 * 60 * 24,
});
// Redireciona para a págian desejada
redirect("/servicos");
}

View file

@ -0,0 +1,15 @@
"use server";
import { cookies } from "next/headers";
import { redirect } from "next/navigation";
export default async function GUsuarioLogoutService(token: string) {
const cookieStore = await cookies();
cookieStore.set(token, "", {
expires: new Date(0),
path: "/",
});
redirect("/login");
}

View file

@ -0,0 +1,22 @@
"use server";
import GUsuarioReadData from "../../_data/g_usuario/GUsuarioReadData";
export default async function GUsuarioRead(usuarioId: number) {
// Verifica se o id informado é válido
if (usuarioId <= 0) {
return {
code: 400,
message: "Usuário informado inválido",
};
}
try {
const response = await GUsuarioReadData(usuarioId);
console.log("service", response);
return response;
} catch (error) {
console.log(error);
return error;
}
}

View file

@ -0,0 +1,7 @@
"use server";
import GUsuarioSaveData from "../../_data/g_usuario/GUsuarioSaveData";
export default async function GUsuarioSave(form: any) {
return await GUsuarioSaveData(form);
}

View file

@ -1,5 +0,0 @@
import TTBAndamentoServicoIndex from '@/packages/administrativo/components/TTBAndamentoServico/TTBAndamentoServicoIndex';
export default function TAtoParteTipo() {
return <TTBAndamentoServicoIndex />;
}

View file

@ -1,5 +0,0 @@
import TAtoParteTipoIndex from '@/packages/administrativo/components/TAtoParteTipo/TAtoParteTipoIndex';
export default function TAtoParteTipo() {
return <TAtoParteTipoIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import GTBBairroIndex from '@/packages/administrativo/components/GTBBairro/GTBBairroIndex';
export default function GCidadePage() {
return <GTBBairroIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import GCartorioIndex from '@/packages/administrativo/components/GCartorio/GCartorioIndex';
export default function GCartorioPage() {
return <GCartorioIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import TCensecTipoNaturezaIndex from '@/packages/administrativo/components/TCensecTipoNatureza/TCensecTipoNaturezaIndex';
export default function TCensecTipoNaturezaPage() {
return <TCensecTipoNaturezaIndex />;
}

View file

@ -1,3 +0,0 @@
export default function TCensecPage() {
return <div></div>;
}

View file

@ -1,7 +0,0 @@
'use client';
import TCensecQualidadeIndex from '@/packages/administrativo/components/TCensecQualidade/TCensecQualidadeIndex';
export default function TCensecQualidadePage() {
return <TCensecQualidadeIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import TCensecIndex from '@/packages/administrativo/components/TCensec/TCensecIndex';
export default function GTBEstadoCivilPage() {
return <TCensecIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import TCensecNaturezaLitigioIndex from '@/packages/administrativo/components/TCensecNaturezaLitigio/TCensecNaturezaLitigioIndex';
export default function GCidadePage() {
return <TCensecNaturezaLitigioIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import TCensecQualidadeIndex from '@/packages/administrativo/components/TCensecQualidade/TCensecQualidadeIndex';
export default function GTBEstadoCivilPage() {
return <TCensecQualidadeIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import TCensecTipoAtoIndex from '@/packages/administrativo/components/TCensecTipoAto/TCensecTipoAtoIndex';
export default function GTBEstadoCivilPage() {
return <TCensecTipoAtoIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import GCidadeIndex from '@/packages/administrativo/components/GCidade/GCidadeIndex';
export default function GCidadePage() {
return <GCidadeIndex />;
}

View file

@ -1,5 +0,0 @@
import GCalculoIndex from '@/packages/administrativo/components/GCalculo/GCalculoIndex';
export default function GEmolumentoPeriodoPage() {
return <GCalculoIndex />;
}

View file

@ -1,16 +0,0 @@
'use client';
import { useParams } from 'next/navigation';
import GEmolumentoItemIndex from '@/packages/administrativo/components/GEmolumentoItem/GEmolumentoItemIndex';
export default function GGramaticaPage() {
const params = useParams();
return (
<GEmolumentoItemIndex
emolumento_id={Number(params.emolumentoId)}
emolumento_periodo_id={Number(params.emolumentoPeriodoId)}
/>
);
}

View file

@ -1,5 +0,0 @@
import GEmolumentoIndex from '@/packages/administrativo/components/GEmolumento/GEmolumentoIndex';
export default function GEmolumentoPeriodoPage() {
return <GEmolumentoIndex />;
}

View file

@ -1,5 +0,0 @@
import GEmolumentoPeriodoIndex from '@/packages/administrativo/components/GEmolumentoPeriodo/GEmolumentoPeriodoIndex';
export default function GEmolumentoPeriodoPage() {
return <GEmolumentoPeriodoIndex />;
}

View file

@ -1,5 +0,0 @@
import GGramaticaIndex from '@/packages/administrativo/components/GGramatica/GGramaticaIndex';
export default function GGramaticaPage() {
return <GGramaticaIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import TImovelDashboard from '@/packages/administrativo/components/TImovel/TImovelDashboard';
export default function TImovelDashboardPage() {
return <TImovelDashboard />;
}

View file

@ -1,13 +0,0 @@
'use client';
import TImovelIndex from '@/packages/administrativo/components/TImovel/TImovelIndex';
export default function TImovelRuralPage() {
return (
<TImovelIndex
pageTitle="Imóveis Rurais"
pageDescription="Gerenciamento de imóveis rurais"
tipoClasse={3}
/>
);
}

View file

@ -1,7 +0,0 @@
'use client';
import GTBTipoLogradouroIndex from '@/packages/administrativo/components/GTBTipoLogradouro/GTBTipoLogradouroIndex';
export default function GMedidaTipoPage() {
return <GTBTipoLogradouroIndex />;
}

View file

@ -1,13 +0,0 @@
'use client';
import TImovelIndex from '@/packages/administrativo/components/TImovel/TImovelIndex';
export default function TImovelUrbanoPage() {
return (
<TImovelIndex
pageTitle="Imóveis Urbanos"
pageDescription="Gerenciamento de imóveis urbanos"
tipoClasse={1}
/>
);
}

View file

@ -1,7 +0,0 @@
'use client';
import GMedidaTipoIndex from '@/packages/administrativo/components/GMedidaTipo/GMedidaTipoIndex';
export default function GMedidaTipoPage() {
return <GMedidaTipoIndex />;
}

View file

@ -1,5 +0,0 @@
import GNaturezaIndex from '@/packages/administrativo/components/GNatureza/GNaturezaIndex';
export default function GNaturezaPage() {
return <GNaturezaIndex sistema_id={2} />;
}

View file

@ -1,7 +0,0 @@
'use client';
import TPessoaDashboard from '@/packages/administrativo/components/TPessoa/TPessoaDashboard';
export default function TPessoaDashboardPage() {
return <TPessoaDashboard />;
}

View file

@ -1,7 +0,0 @@
'use client';
import GTBEstadoCivilIndex from '@/packages/administrativo/components/GTBEstadoCivil/GTBEstadoCivilIndex';
export default function GTBEstadoCivilPage() {
return <GTBEstadoCivilIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import TPessoaFisicaIndex from '@/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaIndex';
export default function TPessoaFisica() {
return <TPessoaFisicaIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import TPessoaJuridicaIndex from '@/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaIndex';
export default function TPessoaFisica() {
return <TPessoaJuridicaIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import GTBProfissaoIndex from '@/packages/administrativo/components/GTBProfissao/GTBProfissaoIndex';
export default function GTBEstadoCivilPage() {
return <GTBProfissaoIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import GTBRegimeBensIndex from '@/packages/administrativo/components/GTBRegimeBens/GTBRegimeBensIndex';
export default function GTBRegimeBensPage() {
return <GTBRegimeBensIndex />;
}

View file

@ -1,7 +0,0 @@
'use client';
import GTBRegimeComunhaoIndex from '@/packages/administrativo/components/GTBRegimeComunhao/GTBRegimeComunhaoIndex';
export default function GTBRegimeBensPage() {
return <GTBRegimeComunhaoIndex />;
}

View file

@ -1,5 +0,0 @@
import TTBReconhecimentoTipoIndex from '@/packages/administrativo/components/TTBReconhecimentoTipo/TTBReconhecimentoTipoIndex';
export default function TAtoParteTipo() {
return <TTBReconhecimentoTipoIndex />;
}

View file

@ -1,5 +0,0 @@
import GSeloGrupoIndex from '@/packages/administrativo/components/GSeloGrupo/GSeloGrupoIndex';
export default function GSeloGrupoPage() {
return <GSeloGrupoIndex />;
}

View file

@ -1,5 +0,0 @@
import TServicoTipoIndex from '@/packages/administrativo/components/TServicoTipo/TServicoTipoIndex';
export default function TServicoTipoPage() {
return <TServicoTipoIndex />;
}

View file

@ -1,5 +0,0 @@
import GNaturezaTituloIndex from '@/packages/administrativo/components/GNaturezaTitulo/GNaturezaTituloIndex';
export default function GNaturezaPage() {
return <GNaturezaTituloIndex sistema_id={2} />;
}

View file

@ -1,31 +1,38 @@
'use client';
"use client";
import { useEffect, useState, useCallback } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { Card, CardContent } from '@/components/ui/card';
import GCidadeForm from '@/packages/administrativo/components/GCidade/GCidadeForm';
import GCidadeTable from '@/packages/administrativo/components/GCidade/GCidadeTable';
import { useGCidadeReadHook } from '@/packages/administrativo/hooks/GCidade/useGCidadeReadHook';
import { useGCidadeRemoveHook } from '@/packages/administrativo/hooks/GCidade/useGCidadeRemoveHook';
import { useGCidadeSaveHook } from '@/packages/administrativo/hooks/GCidade/useGCidadeSaveHook';
import GCidadeInterface from '@/packages/administrativo/interfaces/GCidade/GCidadeInterface';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import Header from '@/shared/components/structure/Header';
import Loading from "@/app/_components/loading/loading";
import GCidadeTable from "../../_components/g_cidade/GCidadeTable";
import GCidadeForm from "../../_components/g_cidade/GCidadeForm";
export default function GCidadeIndex() {
import { useGCidadeReadHook } from "../../_hooks/g_cidade/useGCidadeReadHook";
import { useGCidadeSaveHook } from "../../_hooks/g_cidade/useGCidadeSaveHook";
import { useGCidadeRemoveHook } from "../../_hooks/g_cidade/useGCidadeRemoveHook";
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import GCidadeInterface from "../../_interfaces/GCidadeInterface";
import Header from "@/app/_components/structure/Header";
export default function GCidadePage() {
// Hooks para leitura e salvamento
const { gCidade, fetchGCidade } = useGCidadeReadHook();
const { saveGCidade } = useGCidadeSaveHook();
const { removeGCidade } = useGCidadeRemoveHook();
// Estados
const [selectedCidade, setSelectedCidade] = useState<GCidadeInterface | null>(null);
const [selectedCidade, setSelectedCidade] = useState<GCidadeInterface | null>(
null,
);
const [isFormOpen, setIsFormOpen] = useState(false);
// Estado para saber qual item será deletado
const [itemToDelete, setItemToDelete] = useState<GCidadeInterface | null>(null);
const [itemToDelete, setItemToDelete] = useState<GCidadeInterface | null>(
null,
);
/**
* Hook do modal de confirmação
@ -48,7 +55,7 @@ export default function GCidadeIndex() {
/**
* Fecha o formulário e limpa o andamento selecionado
*/
const handleCloseForm = useCallback((_: null, __: boolean) => {
const handleCloseForm = useCallback(() => {
setSelectedCidade(null);
setIsFormOpen(false);
}, []);
@ -119,9 +126,9 @@ export default function GCidadeIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'Cidades'}
description={'Gerenciamento de Cidades'}
buttonText={'Nova Cidade'}
title={"Cidades"}
description={"Gerenciamento de Cidades"}
buttonText={"Nova Cidade"}
buttonAction={() => {
handleOpenForm(null);
}}
@ -130,7 +137,11 @@ export default function GCidadeIndex() {
{/* Tabela de andamentos */}
<Card>
<CardContent>
<GCidadeTable data={gCidade} onEdit={handleOpenForm} onDelete={handleConfirmDelete} />
<GCidadeTable
data={gCidade}
onEdit={handleOpenForm}
onDelete={handleConfirmDelete}
/>
</CardContent>
</Card>

View file

@ -1,28 +1,30 @@
'use client';
"use client";
import { useCallback, useEffect, useState } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import { useResponse } from "@/app/_response/ResponseContext";
import { Card, CardContent } from '@/components/ui/card';
import { useGMedidaTipoReadHook } from '@/packages/administrativo/hooks/GMedidaTipo/useGMedidaTipoReadHook';
import { useGMedidaTipoRemoveHook } from '@/packages/administrativo/hooks/GMedidaTipo/useGMedidaTipoRemoveHook';
import { useGMedidaTipoSaveHook } from '@/packages/administrativo/hooks/GMedidaTipo/useGMedidaTipoSaveHook';
import { GMedidaTipoInterface } from '@/packages/administrativo/interfaces/GMedidaTipo/GMedidaTipoInterface';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import { useResponse } from '@/shared/components/response/ResponseContext';
import Header from '@/shared/components/structure/Header';
import Header from "@/app/_components/structure/Header";
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import Loading from "@/app/_components/loading/loading";
import GMedidaTipoTable from "../../_components/g_medidatipo/GMedidaTipoTable";
import GMedidaTipoForm from "../../_components/g_medidatipo/GMedidaTipoForm";
import GMedidaTipoForm from './GMedidaTipoForm';
import GMedidaTipoTable from './GMedidaTipoTable';
import { useGMedidaTipoReadHook } from "../../_hooks/g_medidatipo/useGMedidaTipoReadHook";
import { useGMedidaTipoSaveHook } from "../../_hooks/g_medidatipo/useGMedidaTipoSaveHook";
import { useGMedidaTipoRemoveHook } from "../../_hooks/g_medidatipo/useGMedidaTipoRemoveHook";
import { GMedidaTipoInterface } from "../../_interfaces/GMedidaTipoInterface";
import { SituacoesEnum } from "@/enums/SituacoesEnum";
const initialMedidaTipo: GMedidaTipoInterface = {
medida_tipo_id: 0,
sigla: '',
descricao: '',
sigla: "",
descricao: "",
};
export default function GMedidaTipoIndex() {
export default function GMedidaTipoPage() {
// Controle de exibição de respostas
const { setResponse } = useResponse();
@ -35,12 +37,19 @@ export default function GMedidaTipoIndex() {
const { removeGMedidaTipo } = useGMedidaTipoRemoveHook();
// Estado para controlar o formulário e o item selecionado
const [selectedMedidaTipo, setSelectedMedidaTipo] = useState<GMedidaTipoInterface | null>(null);
const [selectedMedidaTipo, setSelectedMedidaTipo] =
useState<GMedidaTipoInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
const [itemToDelete, setItemToDelete] = useState<GMedidaTipoInterface | null>(null);
const [itemToDelete, setItemToDelete] = useState<GMedidaTipoInterface | null>(
null,
);
// Hook para o modal de confirmação
const { isOpen: isConfirmOpen, openDialog: openConfirmDialog, handleCancel } = useConfirmDialog();
const {
isOpen: isConfirmOpen,
openDialog: openConfirmDialog,
handleCancel,
} = useConfirmDialog();
// Ações do formulário
const handleOpenForm = useCallback((data: GMedidaTipoInterface | null) => {
@ -81,7 +90,7 @@ export default function GMedidaTipoIndex() {
// Define os dados da resposta visual
setResponse({
status: 400,
message: 'Não foi informado um registro para exclusão',
message: "Não foi informado um registro para exclusão",
});
return;
}
@ -105,11 +114,11 @@ export default function GMedidaTipoIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'Tipos de Medida'}
description={'Gerenciamento de tipos de medida'}
buttonText={'Novo Tipo de Medida'}
buttonAction={() => {
handleOpenForm(null);
title={"Tipos de Medida"}
description={"Gerenciamento de tipos de medida"}
buttonText={"Novo Tipo de Medida"}
buttonAction={(data) => {
handleOpenForm((data = initialMedidaTipo));
}}
/>

View file

@ -1,30 +1,31 @@
'use client';
"use client";
import { useCallback, useEffect, useState } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import { useResponse } from "@/app/_response/ResponseContext";
import { Card, CardContent } from '@/components/ui/card';
import { useGTBBairroReadHook } from '@/packages/administrativo/hooks/GTBBairro/useGTBBairroReadHook';
import { useGTBBairroRemoveHook } from '@/packages/administrativo/hooks/GTBBairro/useGTBBairroRemoveHook';
import { useGTBBairroSaveHook } from '@/packages/administrativo/hooks/GTBBairro/useGTBBairroSaveHook';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import { useResponse } from '@/shared/components/response/ResponseContext';
import Header from '@/shared/components/structure/Header';
import { SituacoesEnum } from '@/shared/enums/SituacoesEnum';
import Header from "@/app/_components/structure/Header";
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import Loading from "@/app/_components/loading/loading";
import GTBBairroTable from "../../_components/g_tb_bairro/GTBBairroTable";
import GTBBairroForm from "../../_components/g_tb_bairro/GTBBairroForm";
import { GTBBairroInterface } from '@/packages/administrativo/interfaces/GTBBairro/GTBBairroInterface';
import GTBBairroForm from './GTBBairroForm';
import GTBBairroTable from './GTBBairroTable';
import { useGTBBairroReadHook } from "../../_hooks/g_tb_bairro/useGTBBairroReadHook";
import { useGTBBairroSaveHook } from "../../_hooks/g_tb_bairro/useGTBBairroSaveHook";
import { useGTBBairroRemoveHook } from "../../_hooks/g_tb_bairro/useGTBBairroRemoveHook";
import { GTBBairroInterface } from "../../_interfaces/GTBBairroInterface";
import { SituacoesEnum } from "@/enums/SituacoesEnum";
const initialBairro: GTBBairroInterface = {
sistema_id: null,
tb_bairro_id: 0,
descricao: '',
descricao: "",
situacao: SituacoesEnum.A,
};
export default function GTBBairroIndex() {
export default function GTBBairroPage() {
// Controle de exibição de respostas
const { setResponse } = useResponse();
@ -39,10 +40,16 @@ export default function GTBBairroIndex() {
// Estado para controlar o formulário e item selecionado
const [selectedBairro, setBairro] = useState<GTBBairroInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
const [itemToDelete, setItemToDelete] = useState<GTBBairroInterface | null>(null);
const [itemToDelete, setItemToDelete] = useState<GTBBairroInterface | null>(
null,
);
// Hook para o modal de confirmação
const { isOpen: isConfirmOpen, openDialog: openConfirmDialog, handleCancel } = useConfirmDialog();
const {
isOpen: isConfirmOpen,
openDialog: openConfirmDialog,
handleCancel,
} = useConfirmDialog();
// Ações do formulário
const handleOpenForm = useCallback((data: GTBBairroInterface | null) => {
@ -87,7 +94,7 @@ export default function GTBBairroIndex() {
// Define os dados da resposta visual
setResponse({
status: 400,
message: 'Não foi informado um registro para exclusão',
message: "Não foi informado um registro para exclusão",
});
return;
}
@ -120,18 +127,22 @@ export default function GTBBairroIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'Bairros'}
description={'Gerenciamento de Bairros'}
buttonText={'Novo Bairro'}
buttonAction={() => {
handleOpenForm(null);
title={"Bairros"}
description={"Gerenciamento de Bairros"}
buttonText={"Novo Bairro"}
buttonAction={(data) => {
handleOpenForm((data = initialBairro));
}}
/>
{/* Tabela de Bairros */}
<Card>
<CardContent>
<GTBBairroTable data={gTBBairro} onEdit={handleOpenForm} onDelete={handleConfirmDelete} />
<GTBBairroTable
data={gTBBairro}
onEdit={handleOpenForm}
onDelete={handleConfirmDelete}
/>
</CardContent>
</Card>

View file

@ -1,29 +1,30 @@
'use client';
"use client";
import { useCallback, useEffect, useState } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import { Card, CardContent } from '@/components/ui/card';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import { useResponse } from '@/shared/components/response/ResponseContext';
import Header from '@/shared/components/structure/Header';
import Header from "@/app/_components/structure/Header";
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import Loading from "@/app/_components/loading/loading";
import GTBEstadoCivilTable from "../../_components/g_tb_estadocivil/GTBEstadoCivilTable";
import GTBEstadoCivilForm from "../../_components/g_tb_estadocivil/GTBEstadoCivilForm";
import { useGTBEstadoCivilReadHook } from '@/packages/administrativo/hooks/GTBEstadoCivil/useGTBEstadoCivilReadHook';
import { useGTBEstadoCivilRemoveHook } from '@/packages/administrativo/hooks/GTBEstadoCivil/useGTBEstadoCivilRemoveHook';
import { useGTBEstadoCivilSaveHook } from '@/packages/administrativo/hooks/GTBEstadoCivil/useGTBEstadoCivilSaveHook';
import { GTBEstadoCivilInterface } from '@/packages/administrativo/interfaces/GTBEstadoCivil/GTBEstadoCivilInterface';
import GTBEstadoCivilForm from './GTBEstadoCivilForm';
import GTBEstadoCivilTable from './GTBEstadoCivilTable';
import { useGTBEstadoCivilReadHook } from "../../_hooks/g_tb_estadocivil/useGTBEstadoCivilReadHook";
import { useGTBEstadoCivilSaveHook } from "../../_hooks/g_tb_estadocivil/useGTBEstadoCivilSaveHook";
import { useGTBEstadoCivilRemoveHook } from "../../_hooks/g_tb_estadocivil/useGTBEstadoCivilRemoveHook";
import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface";
import { useResponse } from "@/app/_response/ResponseContext";
const initalEstadoCivil: GTBEstadoCivilInterface = {
tb_estadocivil_id: 0,
sistema_id: 0,
descricao: '',
situacao: 'A',
descricao: "",
situacao: "A",
};
export default function GTBEstadoCivilIndex() {
export default function TBEstadoCivilPage() {
// Controle de exibição de respostas
const { setResponse } = useResponse();
@ -36,14 +37,18 @@ export default function GTBEstadoCivilIndex() {
const { removeGTBEstadoCivil } = useGTBEstadoCivilRemoveHook();
// Estado para controlar o formulário e item selecionado
const [selectedEstadoCivil, setSelectedEstadoCivil] = useState<GTBEstadoCivilInterface | null>(
null,
);
const [selectedEstadoCivil, setSelectedEstadoCivil] =
useState<GTBEstadoCivilInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
const [itemToDelete, setItemToDelete] = useState<GTBEstadoCivilInterface | null>(null);
const [itemToDelete, setItemToDelete] =
useState<GTBEstadoCivilInterface | null>(null);
// Hook para o modal de confirmação
const { isOpen: isConfirmOpen, openDialog: openConfirmDialog, handleCancel } = useConfirmDialog();
const {
isOpen: isConfirmOpen,
openDialog: openConfirmDialog,
handleCancel,
} = useConfirmDialog();
// Ações do formulário
const handleOpenForm = useCallback((data: GTBEstadoCivilInterface | null) => {
@ -83,7 +88,7 @@ export default function GTBEstadoCivilIndex() {
// Define os dados da resposta visual
setResponse({
status: 400,
message: 'Não foi informado um registro para exclusão',
message: "Não foi informado um registro para exclusão",
});
return;
}
@ -106,11 +111,11 @@ export default function GTBEstadoCivilIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'Estados Civis'}
description={'Gerenciamento de Estados Civis'}
buttonText={'Novo Estado Civil'}
buttonAction={() => {
handleOpenForm(null);
title={"Estados Civis"}
description={"Gerenciamento de Estados Civis"}
buttonText={"Novo Estado Civil"}
buttonAction={(data) => {
handleOpenForm((data = initalEstadoCivil));
}}
/>

View file

@ -1,32 +1,36 @@
'use client';
"use client";
import { useCallback, useEffect, useState } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { Card, CardContent } from '@/components/ui/card';
import { useGTBProfissaoReadHook } from '@/packages/administrativo/hooks/GTBProfissao/useGTBProfissaoReadHook';
import { useGTBProfissaoRemoveHook } from '@/packages/administrativo/hooks/GTBProfissao/useGTBProfissaoRemoveHook';
import { useGTBProfissaoSaveHook } from '@/packages/administrativo/hooks/GTBProfissao/useGTBProfissaoSaveHook';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import Header from '@/shared/components/structure/Header';
import Loading from "@/app/_components/loading/loading";
import GTBProfissaoTable from "../../_components/g_tb_profissao/GTBProfissaoTable";
import GTBProfissaoForm from "../../_components/g_tb_profissao/GTBProfissaoForm";
import GTBProfissaoInterface from '@/packages/administrativo/interfaces/GTBProfissao/GTBProfissaoInterface';
import GTBProfissaoForm from './GTBProfissaoForm';
import GTBProfissaoTable from './GTBProfissaoTable';
import { useGTBProfissaoReadHook } from "../../_hooks/g_tb_profissao/useGTBProfissaoReadHook";
import { useGTBProfissaoSaveHook } from "../../_hooks/g_tb_profissao/useGTBProfissaoSaveHook";
import { useGTBProfissaoRemoveHook } from "../../_hooks/g_tb_profissao/useGTBProfissaoRemoveHook";
export default function GTBProfissaoIndex() {
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import GTBProfissaoInterface from "../../_interfaces/GTBProfissaoInterface";
import Header from "@/app/_components/structure/Header";
export default function TTBAndamentoServico() {
// Hooks para leitura e salvamento
const { gTBProfissao, fetchGTBProfissao } = useGTBProfissaoReadHook();
const { saveGTBProfissao } = useGTBProfissaoSaveHook();
const { removeGTBProfissao } = useGTBProfissaoRemoveHook();
// Estados
const [selectedAndamento, setSelectedAndamento] = useState<GTBProfissaoInterface | null>(null);
const [selectedAndamento, setSelectedAndamento] =
useState<GTBProfissaoInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
// Estado para saber qual item será deletado
const [itemToDelete, setItemToDelete] = useState<GTBProfissaoInterface | null>(null);
const [itemToDelete, setItemToDelete] =
useState<GTBProfissaoInterface | null>(null);
/**
* Hook do modal de confirmação
@ -120,9 +124,9 @@ export default function GTBProfissaoIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'Profissões'}
description={'Gerenciamento de Profissões'}
buttonText={'Nova Profissão'}
title={"Profissões"}
description={"Gerenciamento de Profissões"}
buttonText={"Nova Profissão"}
buttonAction={() => {
handleOpenForm(null);
}}

View file

@ -1,32 +1,36 @@
'use client';
"use client";
import { useCallback, useEffect, useState } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { Card, CardContent } from '@/components/ui/card';
import GTBRegimeBensForm from '@/packages/administrativo/components/GTBRegimeBens/GTBRegimeBensForm';
import GTBRegimeBensTable from '@/packages/administrativo/components/GTBRegimeBens/GTBRegimeBensTable';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import Header from '@/shared/components/structure/Header';
import Loading from "@/app/_components/loading/loading";
import GTBRegimeBensTable from "../../_components/g_tb_regimebens/GTBRegimeBensTable";
import GTBRegimeBensForm from "../../_components/g_tb_regimebens/GTBRegimeBensForm";
import { useGTBRegimeBensReadHook } from '@/packages/administrativo/hooks/GTBRegimeBens/useGTBRegimeBensReadHook';
import { useGTBRegimeBensRemoveHook } from '@/packages/administrativo/hooks/GTBRegimeBens/useGTBRegimeBensRemoveHook';
import { useGTBRegimeBensSaveHook } from '@/packages/administrativo/hooks/GTBRegimeBens/useGTBRegimeBensSaveHook';
import GTBRegimeBensInterface from '@/packages/administrativo/interfaces/GTBRegimeBens/GTBRegimeBensInterface';
import { useGTBRegimeBensReadHook } from "../../_hooks/g_tb_regimebens/useGTBRegimeBensReadHook";
import { useGTBRegimeBensSaveHook } from "../../_hooks/g_tb_regimebens/useGTBRegimeBensSaveHook";
import { useGTBRegimeBensRemoveHook } from "../../_hooks/g_tb_regimebens/useGTBRegimeBensRemoveHook";
export default function GTBRegimeBensIndex() {
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import GTBRegimeBensInterface from "../../_interfaces/GTBRegimeBensInterface";
import Header from "@/app/_components/structure/Header";
export default function TTBAndamentoServico() {
// Hooks para leitura e salvamento
const { gTBRegimeBens, fetchGTBRegimeBens } = useGTBRegimeBensReadHook();
const { saveGTBRegimeComunhao } = useGTBRegimeBensSaveHook();
const { removeGTBRegimeComunhao } = useGTBRegimeBensRemoveHook();
// Estados
const [selectedAndamento, setSelectedAndamento] = useState<GTBRegimeBensInterface | null>(null);
const [selectedAndamento, setSelectedAndamento] =
useState<GTBRegimeBensInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
// Estado para saber qual item será deletado
const [itemToDelete, setItemToDelete] = useState<GTBRegimeBensInterface | null>(null);
const [itemToDelete, setItemToDelete] =
useState<GTBRegimeBensInterface | null>(null);
/**
* Hook do modal de confirmação
@ -120,9 +124,9 @@ export default function GTBRegimeBensIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'Regimes de Bens'}
description={'Gerenciamento de Regimes de Bens'}
buttonText={'Novo Regime'}
title={"Regimes de Bens"}
description={"Gerenciamento de Regimes de Bens"}
buttonText={"Novo Regime"}
buttonAction={() => {
handleOpenForm(null);
}}

View file

@ -1,34 +1,37 @@
'use client';
"use client";
import { useCallback, useEffect, useState } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { Card, CardContent } from '@/components/ui/card';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import Header from '@/shared/components/structure/Header';
import Loading from "@/app/_components/loading/loading";
import GTBRegimeComunhaoTable from "../../_components/g_tb_regimecomunhao/GTBRegimeComunhaoTable";
import GTBRegimeComunhaoForm from "../../_components/g_tb_regimecomunhao/GTBRegimeComunhaoForm";
import { useGTBRegimeComunhaoReadHook } from '@/packages/administrativo/hooks/GTBRegimeComunhao/useGTBRegimeComunhaoReadHook';
import { useGTBRegimeComunhaoRemoveHook } from '@/packages/administrativo/hooks/GTBRegimeComunhao/useGTBRegimeComunhaoRemoveHook';
import { useGTBRegimeComunhaoSaveHook } from '@/packages/administrativo/hooks/GTBRegimeComunhao/useGTBRegimeComunhaoSaveHook';
import GTBRegimeComunhaoInterface from '@/packages/administrativo/interfaces/GTBRegimeComunhao/GTBRegimeComunhaoInterface';
import GTBRegimeComunhaoForm from './GTBRegimeComunhaoForm';
import GTBRegimeComunhaoTable from './GTBRegimeComunhaoTable';
import { useGTBRegimeComunhaoReadHook } from "../../_hooks/g_tb_regimecomunhao/useGTBRegimeComunhaoReadHook";
import { useGTBRegimeComunhaoSaveHook } from "../../_hooks/g_tb_regimecomunhao/useGTBRegimeComunhaoSaveHook";
import { useGTBRegimeComunhaoRemoveHook } from "../../_hooks/g_tb_regimecomunhao/useGTBRegimeComunhaoRemoveHook";
export default function GTBRegimeComunhaoIndex() {
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import GTBRegimeComunhaoInterface from "../../_interfaces/GTBRegimeComunhaoInterface";
import Header from "@/app/_components/structure/Header";
export default function TTBAndamentoServico() {
// Hooks para leitura e salvamento
const { gTBRegimeComunhao, fetchGTBRegimeComunhao } = useGTBRegimeComunhaoReadHook();
const { gTBRegimeComunhao, fetchGTBRegimeComunhao } =
useGTBRegimeComunhaoReadHook();
const { saveGTBRegimeComunhao } = useGTBRegimeComunhaoSaveHook();
const { removeGTBRegimeComunhao } = useGTBRegimeComunhaoRemoveHook();
// Estados
const [selectedAndamento, setSelectedAndamento] = useState<GTBRegimeComunhaoInterface | null>(
null,
);
const [selectedAndamento, setSelectedAndamento] =
useState<GTBRegimeComunhaoInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
// Estado para saber qual item será deletado
const [itemToDelete, setItemToDelete] = useState<GTBRegimeComunhaoInterface | null>(null);
const [itemToDelete, setItemToDelete] =
useState<GTBRegimeComunhaoInterface | null>(null);
/**
* Hook do modal de confirmação
@ -43,10 +46,13 @@ export default function GTBRegimeComunhaoIndex() {
/**
* Abre o formulário no modo de edição ou criação
*/
const handleOpenForm = useCallback((data: GTBRegimeComunhaoInterface | null) => {
setSelectedAndamento(data);
setIsFormOpen(true);
}, []);
const handleOpenForm = useCallback(
(data: GTBRegimeComunhaoInterface | null) => {
setSelectedAndamento(data);
setIsFormOpen(true);
},
[],
);
/**
* Fecha o formulário e limpa o andamento selecionado
@ -122,9 +128,9 @@ export default function GTBRegimeComunhaoIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'Regimes de Comunhão'}
description={'Gerenciamento de Regimes de Comunhão'}
buttonText={'Novo Regime'}
title={"Regimes de Comunhão"}
description={"Gerenciamento de Regimes de Comunhão"}
buttonText={"Novo Regime"}
buttonAction={() => {
handleOpenForm(null);
}}

View file

@ -1,22 +1,24 @@
'use client';
"use client";
import { useCallback, useEffect, useState } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import { Card, CardContent } from '@/components/ui/card';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import { useResponse } from '@/shared/components/response/ResponseContext';
import Header from '@/shared/components/structure/Header';
import Header from "@/app/_components/structure/Header";
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import Loading from "@/app/_components/loading/loading";
import GTBTipoLogradouroTable from "../../_components/g_tb_tipologradouro/GTBTipoLogradouroTable";
import GTBTipoLogradouroForm from "../../_components/g_tb_tipologradouro/GTBTipoLogradouroForm";
import { useGTBTipoLogradouroReadHook } from '@/packages/administrativo/hooks/GTBTipoLogradouro/useGTBTipoLogradouroReadHook';
import { useGTBTipoLogradouroRemoveHook } from '@/packages/administrativo/hooks/GTBTipoLogradouro/useGTBTipoLogradouroRemoveHook';
import { useGTBTipoLogradouroSaveHook } from '@/packages/administrativo/hooks/GTBTipoLogradouro/useGTBTipoLogradouroSaveHook';
import { GTBTipoLogradouroInterface } from '@/packages/administrativo/interfaces/GTBTipoLogradouro/GTBTipoLogradouroInterface';
import GTBTipoLogradouroForm from './GTBTipoLogradouroForm';
import GTBTipoLogradouroTable from './GTBTipoLogradouroTable';
import { useGTBTipoLogradouroReadHook } from "../../_hooks/g_tb_tipologradouro/useGTBTipoLogradouroReadHook";
import { useGTBTipoLogradouroSaveHook } from "../../_hooks/g_tb_tipologradouro/useGTBTipoLogradouroSaveHook";
import { useGTBTipoLogradouroRemoveHook } from "../../_hooks/g_tb_tipologradouro/useGTBTipoLogradouroRemoveHook";
export default function GTBTipoLogradouroIndex() {
import { GTBTipoLogradouroInterface } from "../../_interfaces/GTBTipoLogradouroInterface";
import { useResponse } from "@/app/_response/ResponseContext";
export default function TTBAndamentoServico() {
// Controle de exibição de respostas
const { setResponse } = useResponse();
@ -24,31 +26,39 @@ export default function GTBTipoLogradouroIndex() {
const [buttonIsLoading, setButtonIsLoading] = useState(false);
// Hooks para leitura e salvamento
const { gTBTipoLogradouro, fetchGTBTipoLogradouro } = useGTBTipoLogradouroReadHook();
const { gTBTipoLogradouro, fetchGTBTipoLogradouro } =
useGTBTipoLogradouroReadHook();
const { saveGTBTipoLogradouro } = useGTBTipoLogradouroSaveHook();
const { removeGTBTipoLogradouro } = useGTBTipoLogradouroRemoveHook();
// Estados
const [selectedTipoLogradouro, setTipoLogradouro] = useState<GTBTipoLogradouroInterface | null>(
null,
);
const [selectedTipoLogradouro, setTipoLogradouro] =
useState<GTBTipoLogradouroInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
// Estado para saber qual item será deletado
const [itemToDelete, setItemToDelete] = useState<GTBTipoLogradouroInterface | null>(null);
const [itemToDelete, setItemToDelete] =
useState<GTBTipoLogradouroInterface | null>(null);
/**
* Hook do modal de confirmação
*/
const { isOpen: isConfirmOpen, openDialog: openConfirmDialog, handleCancel } = useConfirmDialog();
const {
isOpen: isConfirmOpen,
openDialog: openConfirmDialog,
handleCancel,
} = useConfirmDialog();
/**
* Abre o formulário no modo de edição ou criação
*/
const handleOpenForm = useCallback((data: GTBTipoLogradouroInterface | null) => {
setTipoLogradouro(data);
setIsFormOpen(true);
}, []);
const handleOpenForm = useCallback(
(data: GTBTipoLogradouroInterface | null) => {
setTipoLogradouro(data);
setIsFormOpen(true);
},
[],
);
/**
* Fecha o formulário e limpa o andamento selecionado
@ -101,7 +111,7 @@ export default function GTBTipoLogradouroIndex() {
// Define os dados da resposta visual
setResponse({
status: 400,
message: 'Não foi informado um registro para exclusão',
message: "Não foi informado um registro para exclusão",
});
return;
}
@ -137,9 +147,9 @@ export default function GTBTipoLogradouroIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'Tipos de Logradouros'}
description={'Gerenciamento de tipos de Logradouros'}
buttonText={'Novo Tipo'}
title={"Tipos de Logradouros"}
description={"Gerenciamento de tipos de Logradouros"}
buttonText={"Novo Tipo"}
buttonAction={() => {
handleOpenForm(null);
}}

View file

@ -1,21 +1,23 @@
'use client';
"use client";
import { useCallback, useEffect, useState } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { Card, CardContent } from '@/components/ui/card';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import Header from '@/shared/components/structure/Header';
import Loading from "@/app/_components/loading/loading";
import TCensecTable from "../../_components/t_censec/TCensecTable";
import TCensecForm from "../../_components/t_censec/TCensecForm";
import { useTCensecDeleteHook } from '@/packages/administrativo/hooks/TCensec/useTCensecDeleteHook';
import { useTCensecReadHook } from '@/packages/administrativo/hooks/TCensec/useTCensecReadHook';
import { useTCensecSaveHook } from '@/packages/administrativo/hooks/TCensec/useTCensecSaveHook';
import TCensecInterface from '@/packages/administrativo/interfaces/TCensec/TCensecInterface';
import TCensecForm from './TCensecForm';
import TCensecTable from './TCensecTable';
import { useTCensecReadHook } from "../../_hooks/t_censec/useTCensecReadHook";
import { useTCensecSaveHook } from "../../_hooks/t_censec/useTCensecSaveHook";
import { useTCensecDeleteHook } from "../../_hooks/t_censec/useTCensecDeleteHook";
export default function TCensecIndex() {
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import TCensecInterface from "../../_interfaces/TCensecInterface";
import Header from "@/app/_components/structure/Header";
export default function TTBAndamentoServico() {
// Controle de estado do botão
const [buttonIsLoading, setButtonIsLoading] = useState(false);
@ -25,11 +27,14 @@ export default function TCensecIndex() {
const { deleteTCensec } = useTCensecDeleteHook();
// Estados
const [selectedAndamento, setSelectedAndamento] = useState<TCensecInterface | null>(null);
const [selectedAndamento, setSelectedAndamento] =
useState<TCensecInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
// Estado para saber qual item será deletado
const [itemToDelete, setItemToDelete] = useState<TCensecInterface | null>(null);
const [itemToDelete, setItemToDelete] = useState<TCensecInterface | null>(
null,
);
/**
* Hook do modal de confirmação
@ -129,9 +134,9 @@ export default function TCensecIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'CENSEC'}
description={'Gerenciamento de Centrais'}
buttonText={'Nova Central'}
title={"CENSEC"}
description={"Gerenciamento de Centrais"}
buttonText={"Nova Central"}
buttonAction={() => {
handleOpenForm(null);
}}
@ -140,7 +145,11 @@ export default function TCensecIndex() {
{/* Tabela de andamentos */}
<Card>
<CardContent>
<TCensecTable data={tCensec} onEdit={handleOpenForm} onDelete={handleConfirmDelete} />
<TCensecTable
data={tCensec}
onEdit={handleOpenForm}
onDelete={handleConfirmDelete}
/>
</CardContent>
</Card>

View file

@ -1,29 +1,31 @@
'use client';
"use client";
import { useCallback, useEffect, useState } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import { useResponse } from "@/app/_response/ResponseContext";
import { Card, CardContent } from '@/components/ui/card';
import { useTCensecNaturezaLitigioReadHook } from '@/packages/administrativo/hooks/TCensecNaturezaLitigio/useTCensecNaturezaLitigioReadHook';
import { useTCensecNaturezaLitigioRemoveHook } from '@/packages/administrativo/hooks/TCensecNaturezaLitigio/useTCensecNaturezaLitigioRemoveHook';
import { useTCensecNaturezaLitigioSaveHook } from '@/packages/administrativo/hooks/TCensecNaturezaLitigio/useTCensecNaturezaLitigioSaveHook';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import { useResponse } from '@/shared/components/response/ResponseContext';
import Header from '@/shared/components/structure/Header';
import { SituacoesEnum } from '@/shared/enums/SituacoesEnum';
import Header from "@/app/_components/structure/Header";
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import Loading from "@/app/_components/loading/loading";
import { TCensecNaturezaLitigioInterface } from '@/packages/administrativo/interfaces/TCensecNaturezaLitigio/TCensecNaturezaLitigioInterface';
import TCensecNaturezaLitigioForm from './TCensecNaturezaLitigioForm';
import TCensecNaturezaLitigioTable from './TCensecNaturezaLitigioTable';
import TCensecNaturezaLitigioTable from "../../_components/t_censecnaturezalitigio/TCensecNaturezaLitigioTable";
import TCensecNaturezaLitigioForm from "../../_components/t_censecnaturezalitigio/TCensecNaturezaLitigioForm";
import { useTCensecNaturezaLitigioReadHook } from "../../_hooks/t_censecnaturezalitigio/useTCensecNaturezaLitigioReadHook";
import { useTCensecNaturezaLitigioSaveHook } from "../../_hooks/t_censecnaturezalitigio/useTCensecNaturezaLitigioSaveHook";
import { useTCensecNaturezaLitigioRemoveHook } from "../../_hooks/t_censecnaturezalitigio/useTCensecNaturezaLitigioRemoveHook";
import { TCensecNaturezaLitigioInterface } from "../../_interfaces/TCensecNaturezaLitigioInterface";
import { SituacoesEnum } from "@/enums/SituacoesEnum";
const initialCensecNaturezaLitigio: TCensecNaturezaLitigioInterface = {
censec_naturezalitigio_id: 0,
descricao: '',
descricao: "",
situacao: SituacoesEnum.A,
};
export default function TCensecNaturezaLitigioIndex() {
export default function TCensecNaturezaLitigioPage() {
// Controle de exibição de respostas
const { setResponse } = useResponse();
@ -34,21 +36,31 @@ export default function TCensecNaturezaLitigioIndex() {
const { tCensecNaturezaLitigio, fetchTCensecNaturezaLitigio } =
useTCensecNaturezaLitigioReadHook();
const { saveTCensecNaturezaLitigio } = useTCensecNaturezaLitigioSaveHook();
const { removeTCensecNaturezaLitigio } = useTCensecNaturezaLitigioRemoveHook();
const { removeTCensecNaturezaLitigio } =
useTCensecNaturezaLitigioRemoveHook();
// Estados
const [selectedItem, setSelectedItem] = useState<TCensecNaturezaLitigioInterface | null>(null);
const [selectedItem, setSelectedItem] =
useState<TCensecNaturezaLitigioInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
const [itemToDelete, setItemToDelete] = useState<TCensecNaturezaLitigioInterface | null>(null);
const [itemToDelete, setItemToDelete] =
useState<TCensecNaturezaLitigioInterface | null>(null);
// Modal de confirmação
const { isOpen: isConfirmOpen, openDialog: openConfirmDialog, handleCancel } = useConfirmDialog();
const {
isOpen: isConfirmOpen,
openDialog: openConfirmDialog,
handleCancel,
} = useConfirmDialog();
// Abrir formulário (criação ou edição)
const handleOpenForm = useCallback((item: TCensecNaturezaLitigioInterface | null) => {
setSelectedItem(item);
setIsFormOpen(true);
}, []);
const handleOpenForm = useCallback(
(item: TCensecNaturezaLitigioInterface | null) => {
setSelectedItem(item);
setIsFormOpen(true);
},
[],
);
// Fechar formulário
const handleCloseForm = useCallback(() => {
@ -84,7 +96,7 @@ export default function TCensecNaturezaLitigioIndex() {
// Define os dados da resposta visual
setResponse({
status: 400,
message: 'Não foi informado um registro para exclusão',
message: "Não foi informado um registro para exclusão",
});
return;
}
@ -109,12 +121,12 @@ export default function TCensecNaturezaLitigioIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'Natureza do Litígio'}
description={'Gerenciamento de Naturezas do Litígio'}
buttonText={'Nova Natureza'}
buttonAction={() => {
handleOpenForm(null);
}}
title={"Natureza do Litígio"}
description={"Gerenciamento de Naturezas do Litígio"}
buttonText={"Nova Natureza"}
buttonAction={(data) =>
handleOpenForm((data = initialCensecNaturezaLitigio))
}
/>
{/* Tabela */}

View file

@ -1,13 +1,14 @@
'use client';
"use client";
import { useParams } from 'next/navigation';
import { useEffect, useState } from 'react';
import { useEffect, useState } from "react";
import { useParams } from "next/navigation";
import MainEditor from '@/components/MainEditor';
import { Card, CardContent } from '@/components/ui/card';
import { useTMinutaReadHook } from '@/packages/administrativo/hooks/TMinuta/useTMinutaReadHook';
import { TMinutaInterface } from '@/packages/administrativo/interfaces/TMinuta/TMinutaInterface';
import Loading from '@/shared/components/loading/loading';
import { Card, CardContent } from "@/components/ui/card";
import MainEditor from "@/components/MainEditor";
import Loading from "@/app/_components/loading/loading";
import { useTMinutaReadHook } from "../../../../_hooks/t_minuta/useTMinutaReadHook";
import { TMinutaInterface } from "../../../../_interfaces/TMinutaInterface";
export default function TMinutaDetalhes() {
const params = useParams();
@ -41,14 +42,16 @@ export default function TMinutaDetalhes() {
<div>
<Card>
<CardContent>
<div className="mb-4 grid grid-cols-2 gap-4">
<div className="mb-4 grid gap-4 grid-cols-2">
<div>
<div className="text-2xl font-semibold">Descrição</div>
<div className="text-xl">{tMinuta.descricao}</div>
</div>
<div>
<div className="text-2xl font-semibold">Situação</div>
<div className="text-xl">{tMinuta.situacao === 'A' ? 'Ativo' : 'Inativo'}</div>
<div className="text-xl">
{tMinuta.situacao === "A" ? "Ativo" : "Inativo"}
</div>
</div>
<div className="col-span-2">
<div className="text-2xl font-semibold">Texto</div>
@ -56,10 +59,10 @@ export default function TMinutaDetalhes() {
initialValue={editorContent} // Passa o conteúdo do editor
onEditorChange={handleEditorChange} // Função que atualiza o estado
margins={{
top: '2',
bottom: '2',
left: '2',
right: '2',
top: "2",
bottom: "2",
left: "2",
right: "2",
}}
size={{ width: 794, height: 1123 }} // Você pode ajustar o tamanho aqui
/>

View file

@ -1,14 +1,12 @@
'use client';
"use client";
import { zodResolver } from '@hookform/resolvers/zod';
import { useEffect } from 'react';
import { useForm, Controller } from 'react-hook-form';
import z from 'zod';
import z from "zod";
import { useEffect } from "react";
import { useForm, Controller } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import MainEditor from '@/components/MainEditor';
import { Button } from '@/components/ui/button';
import { Card, CardContent } from '@/components/ui/card';
import { Checkbox } from '@/components/ui/checkbox';
import { Button } from "@/components/ui/button";
import { Checkbox } from "@/components/ui/checkbox";
import {
Form,
FormControl,
@ -16,11 +14,14 @@ import {
FormItem,
FormLabel,
FormMessage,
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { useTMinutaSaveHook } from '@/packages/administrativo/hooks/TMinuta/useTMinutaSaveHook';
import { TMinutaSchema } from '@/packages/administrativo/schemas/TMinuta/TMinutaSchema';
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import MainEditor from "@/components/MainEditor";
import { TMinutaSchema } from "../../../_schemas/TMinutaSchema";
import { useTMinutaSaveHook } from "../../../_hooks/t_minuta/useTMinutaSaveHook";
import { Card, CardContent } from "@/components/ui/card";
type FormValues = z.infer<typeof TMinutaSchema>;
@ -31,9 +32,9 @@ export default function TMinutaForm() {
resolver: zodResolver(TMinutaSchema),
defaultValues: {
natureza_id: undefined,
descricao: '',
situacao: 'A',
texto: '',
descricao: "",
situacao: "A",
texto: "",
},
});
@ -55,7 +56,10 @@ export default function TMinutaForm() {
<FormItem>
<FormLabel>Descrição</FormLabel>
<FormControl>
<Input {...field} placeholder="Digite a descrição da minuta" />
<Input
{...field}
placeholder="Digite a descrição da minuta"
/>
</FormControl>
<FormMessage />
</FormItem>
@ -69,10 +73,12 @@ export default function TMinutaForm() {
render={({ field }) => (
<div className="flex items-center space-x-2">
<Checkbox
checked={field.value === 'A'}
onCheckedChange={(checked) => field.onChange(checked ? 'A' : 'I')}
checked={field.value === "A"}
onCheckedChange={(checked) =>
field.onChange(checked ? "A" : "I")
}
/>
<Label>{field.value === 'A' ? 'Ativo' : 'Inativo'}</Label>
<Label>{field.value === "A" ? "Ativo" : "Inativo"}</Label>
</div>
)}
/>
@ -84,13 +90,13 @@ export default function TMinutaForm() {
render={({ field }) => (
<div>
<MainEditor
initialValue={field.value || ''}
initialValue={field.value || ""}
onEditorChange={field.onChange}
margins={{ top: '0', bottom: '0', left: '0', right: '0' }}
margins={{ top: "0", bottom: "0", left: "0", right: "0" }}
size={{ width: 794, height: 1123 }}
/>
{form.formState.errors.texto && (
<p className="mt-2 text-sm text-red-500">
<p className="text-sm text-red-500 mt-2">
{form.formState.errors.texto.message}
</p>
)}

View file

@ -1,19 +1,22 @@
'use client';
"use client";
import { useEffect, useState, useCallback } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import { Card, CardContent } from '@/components/ui/card';
import TMinutaForm from '@/packages/administrativo/components/TMinuta/TMinutaForm';
import TMinutaTable from '@/packages/administrativo/components/TMinuta/TMinutaTable';
import { useTMinutaIndexHook } from '@/packages/administrativo/hooks/TMinuta/useTMinutaIndexHook';
import { useTMinutaReadHook } from '@/packages/administrativo/hooks/TMinuta/useTMinutaReadHook';
import { useTMinutaRemoveHook } from '@/packages/administrativo/hooks/TMinuta/useTMinutaRemoveHook';
import { useTMinutaSaveHook } from '@/packages/administrativo/hooks/TMinuta/useTMinutaSaveHook';
import { TMinutaInterface } from '@/packages/administrativo/interfaces/TMinuta/TMinutaInterface';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import Header from '@/shared/components/structure/Header';
import Header from "@/app/_components/structure/Header";
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import Loading from "@/app/_components/loading/loading";
import TMinutaTable from "../../_components/t_minuta/TMinutaTable";
import TMinutaForm from "../../_components/t_minuta/TMinutaForm";
import { useTMinutaReadHook } from "../../_hooks/t_minuta/useTMinutaReadHook";
import { useTMinutaSaveHook } from "../../_hooks/t_minuta/useTMinutaSaveHook";
import { useTMinutaRemoveHook } from "../../_hooks/t_minuta/useTMinutaRemoveHook";
import { TMinutaInterface } from "../../_interfaces/TMinutaInterface";
import { useTMinutaIndexHook } from "../../_hooks/t_minuta/useTMinutaIndexHook";
export default function TMinutaPage() {
// Hooks de leitura e escrita
@ -22,9 +25,13 @@ export default function TMinutaPage() {
const { removeTMinuta } = useTMinutaRemoveHook();
// Estados
const [selectedMinuta, setSelectedMinuta] = useState<TMinutaInterface | null>(null);
const [selectedMinuta, setSelectedMinuta] = useState<TMinutaInterface | null>(
null,
);
const [isFormOpen, setIsFormOpen] = useState(false);
const [itemToDelete, setItemToDelete] = useState<TMinutaInterface | null>(null);
const [itemToDelete, setItemToDelete] = useState<TMinutaInterface | null>(
null,
);
// Hook de confirmação
const {
@ -82,7 +89,11 @@ export default function TMinutaPage() {
{/* Tabela */}
<Card>
<CardContent>
<TMinutaTable data={tMinuta} onEdit={handleOpenForm} onDelete={handleConfirmDelete} />
<TMinutaTable
data={tMinuta}
onEdit={handleOpenForm}
onDelete={handleConfirmDelete}
/>
</CardContent>
</Card>

View file

@ -1,34 +1,37 @@
'use client';
"use client";
import { useCallback, useEffect, useState } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { Card, CardContent } from '@/components/ui/card';
import { useTTBAndamentoServicoDeleteHook } from '@/packages/administrativo/hooks/TTBAndamentoServico/useTTBAndamentoServicoDeleteHook';
import { useTTBAndamentoServicoReadHook } from '@/packages/administrativo/hooks/TTBAndamentoServico/useTTBAndamentoServicoReadHook';
import { useTTBAndamentoServicoSaveHook } from '@/packages/administrativo/hooks/TTBAndamentoServico/useTTBAndamentoServicoSaveHook';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import Header from '@/shared/components/structure/Header';
import Loading from "@/app/_components/loading/loading";
import TTBAndamentoServicoTable from "../../_components/t_tb_andamentoservico/TTBAndamentoServicoTable";
import TTBAndamentoServicoForm from "../../_components/t_tb_andamentoservico/TTBAndamentoServicoForm";
import TTBAndamentoServicoInterface from '@/packages/administrativo/interfaces/TTBAndamentoServico/TTBAndamentoServicoInterface';
import TTBAndamentoServicoForm from './TTBAndamentoServicoForm';
import TTBAndamentoServicoTable from './TTBAndamentoServicoTable';
import { useTTBAndamentoServicoReadHook } from "../../_hooks/t_tb_andamentoservico/useTTBAndamentoServicoReadHook";
import { useTTBAndamentoServicoSaveHook } from "../../_hooks/t_tb_andamentoservico/useTTBAndamentoServicoSaveHook";
export default function TTBAndamentoServicoIndex() {
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import TTBAndamentoServicoInterface from "../../_interfaces/TTBAndamentoServicoInterface";
import { useTTBAndamentoServicoDeleteHook } from "../../_hooks/t_tb_andamentoservico/useTTBAndamentoServicoDeleteHook";
import Header from "@/app/_components/structure/Header";
export default function TTBAndamentoServico() {
// Hooks para leitura e salvamento
const { tTBAndamentosServicos, fetchTTBAndamentoServico } = useTTBAndamentoServicoReadHook();
const { tTBAndamentosServicos, fetchTTBAndamentoServico } =
useTTBAndamentoServicoReadHook();
const { saveTTBAndamentoServico } = useTTBAndamentoServicoSaveHook();
const { deleteTTBAndamentoServico } = useTTBAndamentoServicoDeleteHook();
// Estados
const [selectedAndamento, setSelectedAndamento] = useState<TTBAndamentoServicoInterface | null>(
null,
);
const [selectedAndamento, setSelectedAndamento] =
useState<TTBAndamentoServicoInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
// Estado para saber qual item será deletado
const [itemToDelete, setItemToDelete] = useState<TTBAndamentoServicoInterface | null>(null);
const [itemToDelete, setItemToDelete] =
useState<TTBAndamentoServicoInterface | null>(null);
/**
* Hook do modal de confirmação
@ -43,10 +46,13 @@ export default function TTBAndamentoServicoIndex() {
/**
* Abre o formulário no modo de edição ou criação
*/
const handleOpenForm = useCallback((data: TTBAndamentoServicoInterface | null) => {
setSelectedAndamento(data);
setIsFormOpen(true);
}, []);
const handleOpenForm = useCallback(
(data: TTBAndamentoServicoInterface | null) => {
setSelectedAndamento(data);
setIsFormOpen(true);
},
[],
);
/**
* Fecha o formulário e limpa o andamento selecionado
@ -119,9 +125,9 @@ export default function TTBAndamentoServicoIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'Andamentos'}
description={'Gerenciamento de Andamentos de Atos'}
buttonText={'Novo Andamento'}
title={"Andamentos"}
description={"Gerenciamento de Andamentos de Atos"}
buttonText={"Novo Andamento"}
buttonAction={() => {
handleOpenForm(null);
}}

View file

@ -1,23 +1,26 @@
'use client';
"use client";
import { useCallback, useEffect, useState } from 'react';
import { useEffect, useState, useCallback } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { Card, CardContent } from '@/components/ui/card';
import { useTTBReconhecimentoTipoDeleteHook } from '@/packages/administrativo/hooks/TTBReconhecimentoTipo/useTTBReconhecimentoTipoDeleteHook';
import { useTTBReconhecimentoTipoReadHook } from '@/packages/administrativo/hooks/TTBReconhecimentoTipo/useTTBReconhecimentoTipoReadHook';
import { useTTBReconhecimentoTipoSaveHook } from '@/packages/administrativo/hooks/TTBReconhecimentoTipo/useTTBReconhecimentoTipoSaveHook';
import TTBReconhecimentoTipoInterface from '@/packages/administrativo/interfaces/TTBREconhecimentoTipo/TTBReconhecimentoTipoInterface';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import Header from '@/shared/components/structure/Header';
import Loading from "@/app/_components/loading/loading";
import Header from "@/app/_components/structure/Header";
import TTBReconhecimentoTipoTable from "../../_components/t_tb_reconhecimentotipo/TTBReconhecimentoTipoTable";
import TTBReconhecimentoTipoForm from "../../_components/t_tb_reconhecimentotipo/TTBReconhecimentoTipoForm";
import TTBReconhecimentoTipoForm from './TTBReconhecimentoTipoForm';
import TTBReconhecimentoTipoTable from './TTBReconhecimentoTipoTable';
import { useTTBReconhecimentoTipoReadHook } from "../../_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoReadHook";
import { useTTBReconhecimentoTipoSaveHook } from "../../_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoSaveHook";
import { useTTBReconhecimentoTipoDeleteHook } from "../../_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoDeleteHook";
export default function TTBReconhecimentoTipoIndex() {
import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog";
import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog";
import TTBReconhecimentoTipoInterface from "../../_interfaces/TTBReconhecimentoTipoInterface";
export default function TTBAndamentoServico() {
// Hooks para leitura e salvamento
const { tTBReconhecimentoTipo, fetchTTBReconhecimentoTipo } = useTTBReconhecimentoTipoReadHook();
const { tTBReconhecimentosTipos, fetchTTBReconhecimentosTipos } =
useTTBReconhecimentoTipoReadHook();
const { saveTTBReconhecimentoTipo } = useTTBReconhecimentoTipoSaveHook();
const { deleteTTBReconhecimentoTipo } = useTTBReconhecimentoTipoDeleteHook();
@ -27,20 +30,29 @@ export default function TTBReconhecimentoTipoIndex() {
const [isFormOpen, setIsFormOpen] = useState(false);
// Estado para saber qual item será deletado
const [itemToDelete, setItemToDelete] = useState<TTBReconhecimentoTipoInterface | null>(null);
const [itemToDelete, setItemToDelete] =
useState<TTBReconhecimentoTipoInterface | null>(null);
/**
* Hook do modal de confirmação
*/
const { isOpen: isConfirmOpen, openDialog: openConfirmDialog, handleCancel } = useConfirmDialog();
const {
isOpen: isConfirmOpen,
openDialog: openConfirmDialog,
handleConfirm,
handleCancel,
} = useConfirmDialog();
/**
* Abre o formulário no modo de edição ou criação
*/
const handleOpenForm = useCallback((data: TTBReconhecimentoTipoInterface | null) => {
setReconhecimentoTipo(data);
setIsFormOpen(true);
}, []);
const handleOpenForm = useCallback(
(data: TTBReconhecimentoTipoInterface | null) => {
setReconhecimentoTipo(data);
setIsFormOpen(true);
},
[],
);
/**
* Fecha o formulário e limpa o andamento selecionado
@ -59,9 +71,9 @@ export default function TTBReconhecimentoTipoIndex() {
await saveTTBReconhecimentoTipo(formData);
// Atualiza a lista de dados
fetchTTBReconhecimentoTipo();
fetchTTBReconhecimentosTipos();
},
[saveTTBReconhecimentoTipo, fetchTTBReconhecimentoTipo],
[saveTTBReconhecimentoTipo, fetchTTBReconhecimentosTipos],
);
/**
@ -72,7 +84,7 @@ export default function TTBReconhecimentoTipoIndex() {
// Define o item atual para remoção
setItemToDelete(item);
// Abre o modal de exclusão
// Abre o modal de confirmação
openConfirmDialog();
},
[openConfirmDialog],
@ -89,26 +101,26 @@ export default function TTBReconhecimentoTipoIndex() {
await deleteTTBReconhecimentoTipo(itemToDelete);
// Atualiza a lista
await fetchTTBReconhecimentoTipo();
await fetchTTBReconhecimentosTipos();
// Limpa o item selecionado
setItemToDelete(null);
// Fecha o modal
handleCancel();
}, [itemToDelete, fetchTTBReconhecimentoTipo, handleCancel]);
}, [itemToDelete, fetchTTBReconhecimentosTipos, handleCancel]);
/**
* Busca inicial dos dados
*/
useEffect(() => {
fetchTTBReconhecimentoTipo();
fetchTTBReconhecimentosTipos();
}, []);
/**
* Tela de loading enquanto carrega os dados
*/
if (!tTBReconhecimentoTipo) {
if (!tTBReconhecimentosTipos) {
return <Loading type={2} />;
}
@ -116,9 +128,9 @@ export default function TTBReconhecimentoTipoIndex() {
<div>
{/* Cabeçalho */}
<Header
title={'Reconhecimentos'}
description={'Gerenciamento de tipos de reconhecimentos'}
buttonText={'Novo Tipo'}
title={"Reconhecimentos"}
description={"Gerenciamento de tipos de reconhecimentos"}
buttonText={"Novo Tipo"}
buttonAction={() => {
handleOpenForm(null);
}}
@ -128,7 +140,7 @@ export default function TTBReconhecimentoTipoIndex() {
<Card>
<CardContent>
<TTBReconhecimentoTipoTable
data={tTBReconhecimentoTipo}
data={tTBReconhecimentosTipos}
onEdit={handleOpenForm}
onDelete={handleConfirmDelete}
/>

View file

@ -1,11 +1,10 @@
'use client';
"use client";
import { zodResolver } from '@hookform/resolvers/zod';
import { useEffect } from 'react';
import { useForm } from 'react-hook-form';
import z from 'zod';
import z from "zod";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { Button } from '@/components/ui/button';
import { Button } from "@/components/ui/button";
import {
Dialog,
DialogClose,
@ -14,7 +13,7 @@ import {
DialogFooter,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
} from "@/components/ui/dialog";
import {
Form,
FormControl,
@ -22,20 +21,11 @@ import {
FormItem,
FormLabel,
FormMessage,
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
import { useGUfReadHook } from '@/packages/administrativo/hooks/GUF/useGUfReadHook';
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { GCidadeSchema } from '@/packages/administrativo/schemas/GCidade/GCidadeSchema';
// Hook responsável em trazer todos os estados brasileiros
import { GCidadeSchema } from "../../_schemas/GCidadeSchema";
import { useEffect } from "react";
// Define o tipo do formulário com base no schema Zod
type FormValues = z.infer<typeof GCidadeSchema>;
@ -50,52 +40,21 @@ interface Props {
// Componente principal do formulário
export default function GCidadeForm({ isOpen, data, onClose, onSave }: Props) {
//
const { gUf, fetchGUf } = useGUfReadHook();
// Inicializa o react-hook-form integrado ao Zod para validação
const form = useForm<FormValues>({
resolver: zodResolver(GCidadeSchema),
defaultValues: {
cidade_id: 0,
uf: '',
cidade_nome: '',
codigo_ibge: '',
codigo_gyn: '',
uf: "",
cidade_nome: "",
codigo_ibge: "",
codigo_gyn: "",
},
});
// Quando recebe dados para edição, atualiza os valores do formulário
useEffect(() => {
if (data) {
// Se for edição, carrega os dados recebidos
form.reset({
cidade_id: data.cidade_id,
uf: data.uf ?? '',
cidade_nome: data.cidade_nome ?? '',
codigo_ibge: data.codigo_ibge ?? '',
codigo_gyn: data.codigo_gyn ?? '',
});
} else {
// Se for novo cadastro, limpa o formulário com valores padrão
form.reset({
cidade_id: 0,
uf: '',
cidade_nome: '',
codigo_ibge: '',
codigo_gyn: '',
});
}
// Carrega todos os estados
// brasileiros para o formulário
const loadData = async () => {
// Aguarda a busca terminar
await fetchGUf();
};
// Dispara a função
loadData();
if (data) form.reset(data);
}, [data, form]);
return (
@ -124,7 +83,7 @@ export default function GCidadeForm({ isOpen, data, onClose, onSave }: Props) {
<FormItem>
<FormLabel>Descrição</FormLabel>
<FormControl>
<Input {...field} value={field.value ?? ''} placeholder="Digite a descrição" />
<Input {...field} placeholder="Digite a descrição" />
</FormControl>
<FormMessage />
</FormItem>
@ -139,37 +98,23 @@ export default function GCidadeForm({ isOpen, data, onClose, onSave }: Props) {
<FormItem>
<FormLabel>Código IBGE</FormLabel>
<FormControl>
<Input {...field} value={field.value ?? ''} placeholder="Digite o código" />
<Input {...field} placeholder="Digite o código" />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
{/* Tipo */}
{/* Campo: UF (Estado) */}
<FormField
control={form.control}
name="uf"
control={form.control}
render={({ field }) => (
<FormItem>
<FormLabel>UF</FormLabel>
<Select
value={field.value ?? ''} // garante que não será null
onValueChange={(val) => field.onChange(val)}
>
<FormControl className="w-full">
<SelectTrigger>
<SelectValue placeholder="Selecione o estado desejado" />
</SelectTrigger>
</FormControl>
<SelectContent>
{gUf.map((item) => (
<SelectItem key={item.g_uf_id} value={String(item.sigla)}>
{item.nome}
</SelectItem>
))}
</SelectContent>
</Select>
<FormLabel>Estado</FormLabel>
<FormControl>
<Input {...field} placeholder="Digite a UF" />
</FormControl>
<FormMessage />
</FormItem>
)}
@ -196,7 +141,7 @@ export default function GCidadeForm({ isOpen, data, onClose, onSave }: Props) {
</DialogFooter>
{/* Campo oculto: ID da cidade */}
<input type="hidden" {...form.register('cidade_id')} />
<input type="hidden" {...form.register("cidade_id")} />
</form>
</Form>
</DialogContent>

View file

@ -1,8 +1,6 @@
'use client';
"use client";
import { EllipsisIcon, PencilIcon, Trash2Icon } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Button } from "@/components/ui/button";
import {
DropdownMenu,
DropdownMenuContent,
@ -10,7 +8,7 @@ import {
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
} from "@/components/ui/dropdown-menu";
import {
Table,
TableBody,
@ -18,9 +16,10 @@ import {
TableHead,
TableHeader,
TableRow,
} from '@/components/ui/table';
} from "@/components/ui/table";
import GCidadeInterface from '@/packages/administrativo/interfaces/GCidade/GCidadeInterface';
import { EllipsisIcon, PencilIcon, Trash2Icon } from "lucide-react";
import GCidadeInterface from "../../_interfaces/GCidadeInterface";
// Tipagem das props do componente da tabela
interface GCidadeTableProps {
@ -33,21 +32,25 @@ interface GCidadeTableProps {
* Renderiza o "badge" de status da cidade (Ativo/Inativo)
*/
function StatusBadge({ situacao }: { situacao: string }) {
const isActive = situacao === 'A'; // define se está ativo ou inativo
const isActive = situacao === "A"; // define se está ativo ou inativo
// Estilos base
const baseClasses = 'text-xs font-medium px-2.5 py-0.5 rounded-sm me-2';
const baseClasses = "text-xs font-medium px-2.5 py-0.5 rounded-sm me-2";
// Estilo para ativo
const activeClasses = 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300';
const activeClasses =
"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300";
// Estilo para inativo
const inactiveClasses = 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300';
const inactiveClasses =
"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300";
// Retorna o badge com classe condicional
return (
<span className={`${baseClasses} ${isActive ? activeClasses : inactiveClasses}`}>
{isActive ? 'Ativo' : 'Inativo'}
<span
className={`${baseClasses} ${isActive ? activeClasses : inactiveClasses}`}
>
{isActive ? "Ativo" : "Inativo"}
</span>
);
}
@ -55,9 +58,13 @@ function StatusBadge({ situacao }: { situacao: string }) {
/**
* Componente principal da tabela de cidades
*/
export default function GCidadeTable({ data, onEdit, onDelete }: GCidadeTableProps) {
export default function GCidadeTable({
data,
onEdit,
onDelete,
}: GCidadeTableProps) {
return (
<Table className="w-full table-fixed">
<Table className="table-fixed w-full">
{/* Cabeçalho da tabela */}
<TableHeader>
<TableRow>
@ -90,7 +97,11 @@ export default function GCidadeTable({ data, onEdit, onDelete }: GCidadeTablePro
<DropdownMenu>
{/* Botão de disparo do menu */}
<DropdownMenuTrigger asChild>
<Button variant="outline" size="icon" className="cursor-pointer">
<Button
variant="outline"
size="icon"
className="cursor-pointer"
>
<EllipsisIcon />
</Button>
</DropdownMenuTrigger>

View file

@ -1,11 +1,11 @@
'use client';
"use client";
import { zodResolver } from '@hookform/resolvers/zod';
import { useEffect } from 'react';
import { useForm } from 'react-hook-form';
import z from 'zod';
import z from "zod";
import { useEffect } from "react";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { Button } from '@/components/ui/button';
import { Button } from "@/components/ui/button";
import {
Dialog,
DialogClose,
@ -14,7 +14,7 @@ import {
DialogFooter,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
} from "@/components/ui/dialog";
import {
Form,
FormControl,
@ -22,11 +22,11 @@ import {
FormItem,
FormLabel,
FormMessage,
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import LoadingButton from '@/shared/components/loadingButton/LoadingButton';
import { GMedidaTipoSchema } from '@/packages/administrativo/schemas/GMedidaTipo/GMedidaTipoSchema';
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import LoadingButton from "@/app/_components/loadingButton/LoadingButton";
import { GMedidaTipoSchema } from "../../_schemas/GMedidaTipoSchema";
import { GMedidaTipoInterface } from "../../_interfaces/GMedidaTipoInterface";
type FormValues = z.infer<typeof GMedidaTipoSchema>;
@ -50,8 +50,8 @@ export default function GMedidaTipoForm({
resolver: zodResolver(GMedidaTipoSchema),
defaultValues: {
medida_tipo_id: 0,
sigla: '',
descricao: '',
sigla: "",
descricao: "",
},
});
@ -127,7 +127,7 @@ export default function GMedidaTipoForm({
</DialogFooter>
{/* Campo oculto */}
<input type="hidden" {...form.register('medida_tipo_id')} />
<input type="hidden" {...form.register("medida_tipo_id")} />
</form>
</Form>
</DialogContent>

View file

@ -1,8 +1,6 @@
'use client';
"use client";
import { EllipsisIcon, PencilIcon, Trash2Icon } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Button } from "@/components/ui/button";
import {
DropdownMenu,
DropdownMenuContent,
@ -10,7 +8,7 @@ import {
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
} from "@/components/ui/dropdown-menu";
import {
Table,
TableBody,
@ -18,9 +16,9 @@ import {
TableHead,
TableHeader,
TableRow,
} from '@/components/ui/table';
import { GMedidaTipoInterface } from '@/packages/administrativo/interfaces/GMedidaTipo/GMedidaTipoInterface';
} from "@/components/ui/table";
import { EllipsisIcon, PencilIcon, Trash2Icon } from "lucide-react";
import { GMedidaTipoInterface } from "../../_interfaces/GMedidaTipoInterface";
interface GMedidaTipoTableProps {
data: GMedidaTipoInterface[];
@ -28,7 +26,11 @@ interface GMedidaTipoTableProps {
onDelete: (item: GMedidaTipoInterface, isEditingFormStatus: boolean) => void;
}
export default function GMedidaTipoTable({ data, onEdit, onDelete }: GMedidaTipoTableProps) {
export default function GMedidaTipoTable({
data,
onEdit,
onDelete,
}: GMedidaTipoTableProps) {
return (
<Table>
<TableHeader>
@ -49,7 +51,11 @@ export default function GMedidaTipoTable({ data, onEdit, onDelete }: GMedidaTipo
<TableCell className="text-right">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" size="icon" className="cursor-pointer">
<Button
variant="outline"
size="icon"
className="cursor-pointer"
>
<EllipsisIcon />
</Button>
</DropdownMenuTrigger>

View file

@ -1,11 +1,12 @@
'use client';
"use client";
import { zodResolver } from '@hookform/resolvers/zod';
import { useEffect } from 'react';
import { Controller, useForm } from 'react-hook-form';
import z from 'zod';
import z from "zod";
import { useEffect, useState } from "react";
import { useForm, Controller } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { Button } from '@/components/ui/button';
import { Button } from "@/components/ui/button";
import { Checkbox } from "@/components/ui/checkbox";
import {
Dialog,
DialogClose,
@ -14,7 +15,7 @@ import {
DialogFooter,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
} from "@/components/ui/dialog";
import {
Form,
FormControl,
@ -22,14 +23,13 @@ import {
FormItem,
FormLabel,
FormMessage,
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import LoadingButton from '@/shared/components/loadingButton/LoadingButton';
import SituacoesSelect from '@/shared/components/situacoes/SituacoesSelect';
import { SituacoesEnum } from '@/shared/enums/SituacoesEnum';
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { GTBBairroSchema } from '@/packages/administrativo/schemas/GTBBairro/GTBBairroSchema';
import { GTBBairroSchema } from "../../_schemas/GTBBairroSchema";
import LoadingButton from "@/app/_components/loadingButton/LoadingButton";
import { SituacoesEnum } from "@/enums/SituacoesEnum";
type FormValues = z.infer<typeof GTBBairroSchema>;
@ -54,7 +54,7 @@ export default function GTBBairroForm({
defaultValues: {
sistema_id: null,
tb_bairro_id: 0,
descricao: '',
descricao: "",
situacao: SituacoesEnum.A,
},
});
@ -76,6 +76,7 @@ export default function GTBBairroForm({
<DialogTitle>Bairro</DialogTitle>
<DialogDescription>Crie ou edite um bairro</DialogDescription>
</DialogHeader>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSave)} className="space-y-6">
{/* Descrição */}
@ -86,23 +87,33 @@ export default function GTBBairroForm({
<FormItem>
<FormLabel>Descrição</FormLabel>
<FormControl>
<Input {...field} placeholder="Digite a descrição do bairro" />
<Input
{...field}
placeholder="Digite a descrição do bairro"
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
{/* Situação */}
<Controller
name="situacao"
control={form.control}
render={({ field }) => (
<div className="flex items-center space-x-2">
<SituacoesSelect field={field} />
<Checkbox
checked={field.value === "A"}
onCheckedChange={(checked) =>
field.onChange(checked ? "A" : "I")
}
/>
<Label>Ativo</Label>
</div>
)}
/>
{/* Rodapé do Dialog */}
<DialogFooter className="mt-4">
<DialogClose asChild>
@ -125,8 +136,8 @@ export default function GTBBairroForm({
</DialogFooter>
{/* Campos ocultos */}
<input type="hidden" {...form.register('tb_bairro_id')} />
<input type="hidden" {...form.register('sistema_id')} />
<input type="hidden" {...form.register("tb_bairro_id")} />
<input type="hidden" {...form.register("sistema_id")} />
</form>
</Form>
</DialogContent>

View file

@ -1,8 +1,6 @@
'use client';
"use client";
import { EllipsisIcon, PencilIcon, Trash2Icon } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Button } from "@/components/ui/button";
import {
DropdownMenu,
DropdownMenuContent,
@ -10,7 +8,7 @@ import {
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
} from "@/components/ui/dropdown-menu";
import {
Table,
TableBody,
@ -18,10 +16,9 @@ import {
TableHead,
TableHeader,
TableRow,
} from '@/components/ui/table';
import { SituacoesEnum } from '@/shared/enums/SituacoesEnum';
import { GTBBairroInterface } from '@/packages/administrativo/interfaces/GTBBairro/GTBBairroInterface';
} from "@/components/ui/table";
import { EllipsisIcon, PencilIcon, Trash2Icon } from "lucide-react";
import { GTBBairroInterface } from "../../_interfaces/GTBBairroInterface";
interface GTBBairroTableProps {
data: GTBBairroInterface[];
@ -32,20 +29,31 @@ interface GTBBairroTableProps {
/**
* Renderiza o badge de situação
*/
function StatusBadge({ situacao }: { situacao: SituacoesEnum }) {
const isActive = situacao === SituacoesEnum.A;
const baseClasses = 'text-xs font-medium px-2.5 py-0.5 rounded-sm me-2';
const activeClasses = 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300';
const inactiveClasses = 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300';
function StatusBadge({ situacao }: { situacao: "A" | "I" }) {
const isActive = situacao === "A";
const baseClasses = "text-xs font-medium px-2.5 py-0.5 rounded-sm me-2";
const activeClasses =
"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300";
const inactiveClasses =
"bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300";
return (
<span className={`${baseClasses} ${isActive ? activeClasses : inactiveClasses}`}>
{situacao}
<span
className={`${baseClasses} ${isActive ? activeClasses : inactiveClasses}`}
>
{isActive ? "Ativo" : "Inativo"}
</span>
);
}
export default function GTBBairroTable({ data, onEdit, onDelete }: GTBBairroTableProps) {
export default function GTBBairroTable({
data,
onEdit,
onDelete,
}: GTBBairroTableProps) {
return (
<Table>
<TableHeader>
@ -71,7 +79,11 @@ export default function GTBBairroTable({ data, onEdit, onDelete }: GTBBairroTabl
<TableCell className="text-right">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" size="icon" className="cursor-pointer">
<Button
variant="outline"
size="icon"
className="cursor-pointer"
>
<EllipsisIcon />
</Button>
</DropdownMenuTrigger>

View file

@ -1,12 +1,13 @@
'use client';
"use client";
import { zodResolver } from '@hookform/resolvers/zod';
import { useEffect } from 'react';
import { Controller, useForm } from 'react-hook-form';
import z from 'zod';
import z from "zod";
import { useEffect } from "react";
import { useForm, Controller } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { Button } from '@/components/ui/button';
import { Checkbox } from '@/components/ui/checkbox';
import LoadingButton from "@/app/_components/loadingButton/LoadingButton";
import { Button } from "@/components/ui/button";
import { Checkbox } from "@/components/ui/checkbox";
import {
Dialog,
DialogClose,
@ -15,7 +16,7 @@ import {
DialogFooter,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
} from "@/components/ui/dialog";
import {
Form,
FormControl,
@ -23,12 +24,12 @@ import {
FormItem,
FormLabel,
FormMessage,
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import LoadingButton from '@/shared/components/loadingButton/LoadingButton';
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { GTBEstadoCivilSchema } from '@/packages/administrativo/schemas/GTBEstadoCivil/GTBEstadoCivilSchema';
import { GTBEstadoCivilSchema } from "../../_schemas/GTBEstadoCivilSchema";
import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface";
type FormValues = z.infer<typeof GTBEstadoCivilSchema>;
@ -53,8 +54,8 @@ export default function GTBEstadoCivilForm({
defaultValues: {
tb_estadocivil_id: 0,
sistema_id: 0,
descricao: '',
situacao: 'A',
descricao: "",
situacao: "A",
},
});
@ -100,8 +101,10 @@ export default function GTBEstadoCivilForm({
render={({ field }) => (
<div className="flex items-center space-x-2">
<Checkbox
checked={field.value === 'A'}
onCheckedChange={(checked) => field.onChange(checked ? 'A' : 'I')}
checked={field.value === "A"}
onCheckedChange={(checked) =>
field.onChange(checked ? "A" : "I")
}
/>
<Label>Ativo</Label>
</div>
@ -130,8 +133,14 @@ export default function GTBEstadoCivilForm({
</DialogFooter>
{/* Campos ocultos */}
<input type="hidden" {...form.register('tb_estadocivil_id', { valueAsNumber: true })} />
<input type="hidden" {...form.register('sistema_id', { valueAsNumber: true })} />
<input
type="hidden"
{...form.register("tb_estadocivil_id", { valueAsNumber: true })}
/>
<input
type="hidden"
{...form.register("sistema_id", { valueAsNumber: true })}
/>
</form>
</Form>
</DialogContent>

Some files were not shown because too many files have changed in this diff Show more