- Sistema FOT (Formatura Operations Tracking): * Tela de Gestão FOT (/cursos) com tabela Excel-style * Modal CourseForm com 10 campos (FOT, Empresa, Instituição, etc) * Validação de FOT (5 dígitos numéricos) * Edição de turmas ao clicar na linha * Integração com API backend (empresas, níveis educacionais, universidades) - Dashboard renovado (/painel): * Tabela com 8 colunas (FOT, Data, Curso, Instituição, Ano, Empresa, Tipo, Status) * Filtros avançados: FOT (busca numérica), Data, Tipo de Evento * Removidos filtros de Estado e Cidade * Página de detalhes com tabela vertical (12 informações) * Botão Aprovar redireciona para modal de equipe - Sistema de Aprovação Dupla (/aprovacao): * 2 tabelas separadas por abas (Usuários Normais e Profissionais) * Coluna Universidade renomeada para Empresa * Coluna Função nos profissionais * Workflow de aprovação com atribuição de equipe - Cadastro Profissional (/cadastro-profissional): * Formulário específico para fotógrafos * Dropdown de Função Profissional da API * Tratamento de erro quando backend offline - Modal de Criar Evento: * Tipo de Evento como primeiro campo * Nome do Evento (Opcional) como segundo campo - Componentes novos: * EventTable.tsx - Tabela de eventos com ordenação * EventFiltersBar.tsx - Filtros avançados (3 filtros) * CourseForm.tsx - Formulário FOT completo * ProfessionalForm.tsx - Cadastro profissional - API Service: * Integração com backend Go * Endpoints: /api/empresas, /api/funcoes, /api/niveis-educacionais, /api/universidades, /graduation-years - Documentação: * README.md principal atualizado * frontend/README.md atualizado * Documentação completa de componentes e features
156 lines
3.1 KiB
TypeScript
156 lines
3.1 KiB
TypeScript
// Serviço para comunicação com o backend
|
|
const API_BASE_URL =
|
|
import.meta.env.VITE_API_URL || "http://localhost:3000/api";
|
|
|
|
interface ApiResponse<T> {
|
|
data: T | null;
|
|
error: string | null;
|
|
isBackendDown: boolean;
|
|
}
|
|
|
|
// Função auxiliar para fazer requisições
|
|
async function fetchFromBackend<T>(endpoint: string): Promise<ApiResponse<T>> {
|
|
try {
|
|
const response = await fetch(`${API_BASE_URL}${endpoint}`, {
|
|
method: "GET",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
|
|
const data = await response.json();
|
|
return {
|
|
data,
|
|
error: null,
|
|
isBackendDown: false,
|
|
};
|
|
} catch (error) {
|
|
console.error(`Error fetching ${endpoint}:`, error);
|
|
return {
|
|
data: null,
|
|
error: error instanceof Error ? error.message : "Erro desconhecido",
|
|
isBackendDown: true,
|
|
};
|
|
}
|
|
}
|
|
|
|
// Funções específicas para cada endpoint
|
|
|
|
/**
|
|
* Busca as funções profissionais disponíveis
|
|
*/
|
|
export async function getProfessionalRoles(): Promise<ApiResponse<string[]>> {
|
|
return fetchFromBackend<string[]>("/professional-roles");
|
|
}
|
|
|
|
/**
|
|
* Busca as empresas disponíveis
|
|
*/
|
|
export async function getCompanies(): Promise<
|
|
ApiResponse<
|
|
Array<{
|
|
id: string;
|
|
nome: string;
|
|
}>
|
|
>
|
|
> {
|
|
return fetchFromBackend("/api/empresas");
|
|
}
|
|
|
|
/**
|
|
* Busca as funções profissionais disponíveis do backend
|
|
*/
|
|
export async function getFunctions(): Promise<
|
|
ApiResponse<
|
|
Array<{
|
|
id: string;
|
|
nome: string;
|
|
}>
|
|
>
|
|
> {
|
|
return fetchFromBackend("/api/funcoes");
|
|
}
|
|
|
|
export interface EventTypeResponse {
|
|
id: string;
|
|
nome: string;
|
|
precos: any[];
|
|
}
|
|
|
|
/**
|
|
* Busca os tipos de eventos disponíveis
|
|
*/
|
|
export async function getEventTypes(): Promise<
|
|
ApiResponse<EventTypeResponse[]>
|
|
> {
|
|
return fetchFromBackend<EventTypeResponse[]>("/api/tipos-eventos");
|
|
}
|
|
|
|
/**
|
|
* Busca os cursos/turmas disponíveis
|
|
*/
|
|
export async function getCourses(): Promise<
|
|
ApiResponse<
|
|
Array<{
|
|
id: string;
|
|
name: string;
|
|
institution: string;
|
|
year: number;
|
|
}>
|
|
>
|
|
> {
|
|
return fetchFromBackend("/courses");
|
|
}
|
|
|
|
/**
|
|
* Busca as instituições/empresas disponíveis
|
|
*/
|
|
export async function getInstitutions(): Promise<
|
|
ApiResponse<
|
|
Array<{
|
|
id: string;
|
|
name: string;
|
|
}>
|
|
>
|
|
> {
|
|
return fetchFromBackend("/institutions");
|
|
}
|
|
|
|
/**
|
|
* Busca os anos de formatura disponíveis
|
|
*/
|
|
export async function getGraduationYears(): Promise<ApiResponse<number[]>> {
|
|
return fetchFromBackend<number[]>("/graduation-years");
|
|
}
|
|
|
|
/**
|
|
* Busca os níveis educacionais disponíveis (EF I / EF II)
|
|
*/
|
|
export async function getEducationLevels(): Promise<
|
|
ApiResponse<
|
|
Array<{
|
|
id: string;
|
|
nome: string;
|
|
}>
|
|
>
|
|
> {
|
|
return fetchFromBackend("/api/niveis-educacionais");
|
|
}
|
|
|
|
/**
|
|
* Busca as universidades cadastradas
|
|
*/
|
|
export async function getUniversities(): Promise<
|
|
ApiResponse<
|
|
Array<{
|
|
id: string;
|
|
nome: string;
|
|
}>
|
|
>
|
|
> {
|
|
return fetchFromBackend("/api/universidades");
|
|
}
|