From b56c6017961877771fe26e1134bf4d39c2d66901 Mon Sep 17 00:00:00 2001 From: Tiago Yamamoto Date: Sat, 14 Feb 2026 20:22:27 -0300 Subject: [PATCH 1/5] chore: keep agent and module docs in original locations --- ARCHITECTURE.md => docs/root/ARCHITECTURE.md | 0 CLAUDE.md => docs/root/CLAUDE.md | 0 ROADMAP.md => docs/root/ROADMAP.md | 0 STATUS_REPORT.md => docs/root/STATUS_REPORT.md | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename ARCHITECTURE.md => docs/root/ARCHITECTURE.md (100%) rename CLAUDE.md => docs/root/CLAUDE.md (100%) rename ROADMAP.md => docs/root/ROADMAP.md (100%) rename STATUS_REPORT.md => docs/root/STATUS_REPORT.md (100%) diff --git a/ARCHITECTURE.md b/docs/root/ARCHITECTURE.md similarity index 100% rename from ARCHITECTURE.md rename to docs/root/ARCHITECTURE.md diff --git a/CLAUDE.md b/docs/root/CLAUDE.md similarity index 100% rename from CLAUDE.md rename to docs/root/CLAUDE.md diff --git a/ROADMAP.md b/docs/root/ROADMAP.md similarity index 100% rename from ROADMAP.md rename to docs/root/ROADMAP.md diff --git a/STATUS_REPORT.md b/docs/root/STATUS_REPORT.md similarity index 100% rename from STATUS_REPORT.md rename to docs/root/STATUS_REPORT.md From 49d761cad87f8eae1754eda3ad88fbdb0bd5a65b Mon Sep 17 00:00:00 2001 From: Tiago Yamamoto Date: Sat, 14 Feb 2026 20:33:54 -0300 Subject: [PATCH 2/5] feat: unificar campos de register job em publicar vaga --- docs/publicar-vaga-routes.md | 12 + frontend/src/app/dashboard/jobs/new/page.tsx | 331 +------------ frontend/src/app/dashboard/jobs/page.tsx | 2 +- frontend/src/app/publicar-vaga/page.tsx | 477 +++++++++---------- 4 files changed, 250 insertions(+), 572 deletions(-) create mode 100644 docs/publicar-vaga-routes.md diff --git a/docs/publicar-vaga-routes.md b/docs/publicar-vaga-routes.md new file mode 100644 index 0000000..67adb68 --- /dev/null +++ b/docs/publicar-vaga-routes.md @@ -0,0 +1,12 @@ +# Rotas de publicar vaga (frontend) + +As principais rotas usadas para publicar vagas no projeto são: + +1. `/publicar-vaga` — landing/formulário público de anúncio de vaga. +2. `/post-job` — fluxo principal multi-etapas para publicação com dados da empresa e da vaga. +3. `/register/job` — formulário público alternativo para criação de vaga. + +## Pontos de entrada no sistema + +- Link para `/publicar-vaga` na página **About** e no **Footer**. +- Link para `/post-job` na página **Contact**. diff --git a/frontend/src/app/dashboard/jobs/new/page.tsx b/frontend/src/app/dashboard/jobs/new/page.tsx index c31277c..642716a 100644 --- a/frontend/src/app/dashboard/jobs/new/page.tsx +++ b/frontend/src/app/dashboard/jobs/new/page.tsx @@ -1,330 +1,5 @@ -"use client" +import { redirect } from "next/navigation" -import { useState, useEffect } from "react" -import { useRouter } from "next/navigation" -import { Button } from "@/components/ui/button" -import { Input } from "@/components/ui/input" -import { Label } from "@/components/ui/label" -import { Textarea } from "@/components/ui/textarea" -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" -import { Separator } from "@/components/ui/separator" -import { ArrowLeft, Loader2, Building2, DollarSign, FileText, Briefcase, MapPin, Clock } from "lucide-react" -import { jobsApi, adminCompaniesApi, type CreateJobPayload, type AdminCompany } from "@/lib/api" -import { useTranslation } from "@/lib/i18n" -import { toast } from "sonner" - -export default function NewJobPage() { - const router = useRouter() - const { t } = useTranslation() - const [isSubmitting, setIsSubmitting] = useState(false) - const [companies, setCompanies] = useState([]) - const [loadingCompanies, setLoadingCompanies] = useState(true) - - const [formData, setFormData] = useState({ - // Job Details - title: "", - description: "", - location: "", - // Salary - salaryMin: "", - salaryMax: "", - salaryType: "monthly", - currency: "BRL", - employmentType: "", - workingHours: "", - // Company - companyId: "", - // Status - status: "draft" as "draft" | "published", - }) - - useEffect(() => { - const loadCompanies = async () => { - try { - setLoadingCompanies(true) - const data = await adminCompaniesApi.list(undefined, 1, 100) - setCompanies(data.data ?? []) - } catch (error) { - console.error("Failed to load companies:", error) - toast.error("Failed to load companies") - } finally { - setLoadingCompanies(false) - } - } - loadCompanies() - }, []) - - const updateField = (field: string, value: string | boolean) => { - setFormData(prev => ({ ...prev, [field]: value })) - } - - const canSubmit = () => { - return formData.title.length >= 5 && - formData.description.length >= 20 && - formData.companyId !== "" - } - - const handleSubmit = async (publishNow: boolean = false) => { - if (!canSubmit()) { - toast.error("Please fill in all required fields") - return - } - - setIsSubmitting(true) - try { - const payload: CreateJobPayload = { - companyId: formData.companyId, - title: formData.title, - description: formData.description, - location: formData.location || undefined, - employmentType: formData.employmentType as CreateJobPayload['employmentType'] || undefined, - salaryMin: formData.salaryMin ? parseFloat(formData.salaryMin) : undefined, - salaryMax: formData.salaryMax ? parseFloat(formData.salaryMax) : undefined, - salaryType: formData.salaryType as CreateJobPayload['salaryType'] || undefined, - currency: formData.currency as CreateJobPayload['currency'] || undefined, - workingHours: formData.workingHours || undefined, - status: publishNow ? "published" : "draft", - } - - await jobsApi.create(payload) - toast.success(publishNow ? "Job published successfully!" : "Job saved as draft!") - router.push("/dashboard/jobs") - } catch (error) { - console.error("Failed to create job:", error) - toast.error("Failed to create job. Please try again.") - } finally { - setIsSubmitting(false) - } - } - - return ( -
- {/* Header */} -
- -
-

{t('admin.jobs.newJob')}

-

{t('admin.jobs.edit.subtitle')}

-
-
- - {/* Job Details Section */} - - - - - {t('admin.jobs.details.title')} - - {t('admin.jobs.details.description')} - - -
- - updateField("title", e.target.value)} - /> - {formData.title.length > 0 && formData.title.length < 5 && ( -

Title must be at least 5 characters

- )} -
-
- -