diff --git a/src/app/contracts/[id]/page.js b/src/app/contracts/[id]/page.js index 58f33c5..b0977d0 100644 --- a/src/app/contracts/[id]/page.js +++ b/src/app/contracts/[id]/page.js @@ -12,6 +12,7 @@ import { LoadingState } from "@/components/ui/States"; import { formatDate } from "@/lib/utils"; import FileUploadModal from "@/components/FileUploadModal"; import FileAttachmentsList from "@/components/FileAttachmentsList"; +import { useTranslation } from "@/lib/i18n"; export default function ContractDetailsPage() { const params = useParams(); @@ -21,6 +22,7 @@ export default function ContractDetailsPage() { const [loading, setLoading] = useState(true); const [showUploadModal, setShowUploadModal] = useState(false); const [attachments, setAttachments] = useState([]); + const { t } = useTranslation(); useEffect(() => { async function fetchContractDetails() { @@ -67,7 +69,7 @@ export default function ContractDetailsPage() { if (loading) { return ( - + ); } @@ -77,9 +79,9 @@ export default function ContractDetailsPage() { -

Contract not found.

+

{t('contracts.contractNotFound')}

- +
@@ -89,8 +91,8 @@ export default function ContractDetailsPage() { return ( @@ -108,7 +110,7 @@ export default function ContractDetailsPage() { d="M15 19l-7-7 7-7" /> - Back to Contracts + {t('contracts.backToContracts')} @@ -126,7 +128,7 @@ export default function ContractDetailsPage() { d="M12 4v16m8-8H4" /> - Add Project + {t('contracts.addProject')} @@ -139,14 +141,14 @@ export default function ContractDetailsPage() {

- Contract Information + {t('contracts.contractInformation')}

- Contract Number + {t('contracts.contractNumber')}

{contract.contract_number} @@ -155,7 +157,7 @@ export default function ContractDetailsPage() { {contract.contract_name && (

- Contract Name + {t('contracts.contractName')}

{contract.contract_name} @@ -165,7 +167,7 @@ export default function ContractDetailsPage() { {contract.customer_contract_number && (

- Customer Contract Number + {t('contracts.customerContractNumber')}

{contract.customer_contract_number} @@ -175,7 +177,7 @@ export default function ContractDetailsPage() { {contract.customer && (

- Customer + {t('contracts.customer')}

{contract.customer} @@ -185,7 +187,7 @@ export default function ContractDetailsPage() { {contract.investor && (

- Investor + {t('contracts.investor')}

{contract.investor} @@ -195,7 +197,7 @@ export default function ContractDetailsPage() { {contract.date_signed && (

- Date Signed + {t('contracts.dateSigned')}

{formatDate(contract.date_signed)} @@ -205,7 +207,7 @@ export default function ContractDetailsPage() { {contract.finish_date && (

- Finish Date + {t('contracts.finishDate')}

{formatDate(contract.finish_date)} @@ -221,22 +223,22 @@ export default function ContractDetailsPage() {

-

Summary

+

{t('contracts.summary')}

- Projects Count + {t('contracts.projectsCount')} - {projects.length} Projects + {projects.length} {t('contracts.projects')}
{contract.finish_date && (
- Contract Status + {t('contracts.contractStatus')} {new Date(contract.finish_date) > new Date() - ? "Active" - : "Expired"} + ? t('contracts.active') + : t('contracts.expired')}
)} @@ -262,7 +264,7 @@ export default function ContractDetailsPage() {

- Contract Documents ({attachments.length}) + {t('contracts.contractDocuments')} ({attachments.length})

@@ -300,7 +302,7 @@ export default function ContractDetailsPage() {

- Associated Projects ({projects.length}) + {t('contracts.associatedProjects')} ({projects.length})

@@ -339,13 +341,13 @@ export default function ContractDetailsPage() {

- No projects yet + {t('contracts.noProjectsYet')}

- Get started by creating your first project for this contract + {t('contracts.getStartedMessage')}

- +
) : ( @@ -411,22 +413,22 @@ export default function ContractDetailsPage() { size="sm" > {project.project_status === "registered" - ? "Registered" + ? t('projectStatus.registered') : project.project_status === "in_progress_design" - ? "In Progress (Design)" + ? t('projectStatus.in_progress_design') : project.project_status === "in_progress_construction" - ? "In Progress (Construction)" + ? t('projectStatus.in_progress_construction') : project.project_status === "fulfilled" - ? "Completed" - : "Unknown"} + ? t('projectStatus.fulfilled') + : t('projectStatus.unknown')}
diff --git a/src/app/contracts/new/page.js b/src/app/contracts/new/page.js index ffa0503..2240140 100644 --- a/src/app/contracts/new/page.js +++ b/src/app/contracts/new/page.js @@ -1,15 +1,19 @@ +"use client"; + import ContractForm from "@/components/ContractForm"; import PageContainer from "@/components/ui/PageContainer"; import PageHeader from "@/components/ui/PageHeader"; import Button from "@/components/ui/Button"; import Link from "next/link"; +import { useTranslation } from "@/lib/i18n"; export default function NewContractPage() { + const { t } = useTranslation(); return ( } diff --git a/src/components/ContractForm.js b/src/components/ContractForm.js index bf4eee6..c21cece 100644 --- a/src/components/ContractForm.js +++ b/src/components/ContractForm.js @@ -6,8 +6,10 @@ import { Card, CardHeader, CardContent } from "@/components/ui/Card"; import Button from "@/components/ui/Button"; import { Input } from "@/components/ui/Input"; import { formatDateForInput } from "@/lib/utils"; +import { useTranslation } from "@/lib/i18n"; export default function ContractForm() { + const { t } = useTranslation(); const [form, setForm] = useState({ contract_number: "", contract_name: "", @@ -42,13 +44,11 @@ export default function ContractForm() { const contract = await res.json(); router.push(`/contracts/${contract.contract_id}`); } else { - alert( - "Failed to create contract. Please check the data and try again." - ); + alert(t('contracts.failedToCreateContract')); } } catch (error) { console.error("Error creating contract:", error); - alert("Failed to create contract. Please try again."); + alert(t('contracts.failedToCreateContract')); } finally { setLoading(false); } @@ -58,7 +58,7 @@ export default function ContractForm() {

- Contract Details + {t('contracts.contractDetails')}

@@ -67,73 +67,73 @@ export default function ContractForm() {
{" "} {" "} router.back()} disabled={loading} > - Cancel + {t('common.cancel')} diff --git a/src/components/FileAttachmentsList.js b/src/components/FileAttachmentsList.js index 46bfac9..eaf5177 100644 --- a/src/components/FileAttachmentsList.js +++ b/src/components/FileAttachmentsList.js @@ -3,10 +3,12 @@ import { useState, useEffect } from "react"; import Button from "@/components/ui/Button"; import { formatDate } from "@/lib/utils"; +import { useTranslation } from "@/lib/i18n"; export default function FileAttachmentsList({ entityType, entityId, onFilesChange }) { const [files, setFiles] = useState([]); const [loading, setLoading] = useState(true); + const { t } = useTranslation(); const fetchFiles = async () => { try { @@ -30,7 +32,7 @@ export default function FileAttachmentsList({ entityType, entityId, onFilesChang }, [entityType, entityId]); const handleDelete = async (fileId) => { - if (!confirm("Are you sure you want to delete this file?")) { + if (!confirm(t('contracts.confirmDeleteFile'))) { return; } @@ -45,11 +47,11 @@ export default function FileAttachmentsList({ entityType, entityId, onFilesChang onFilesChange(files.filter(file => file.file_id !== fileId)); } } else { - alert("Failed to delete file"); + alert(t('contracts.failedToDeleteFile')); } } catch (error) { console.error("Error deleting file:", error); - alert("Failed to delete file"); + alert(t('contracts.failedToDeleteFile')); } }; @@ -102,7 +104,7 @@ export default function FileAttachmentsList({ entityType, entityId, onFilesChang - Loading files... + {t('contracts.loadingFiles')}
); } @@ -113,7 +115,7 @@ export default function FileAttachmentsList({ entityType, entityId, onFilesChang -

No documents uploaded yet

+

{t('contracts.noDocumentsUploaded')}

); } @@ -156,7 +158,7 @@ export default function FileAttachmentsList({ entityType, entityId, onFilesChang - Download + {t('contracts.download')}
) : (
@@ -152,10 +154,10 @@ export default function FileUploadModal({ - Drop files here or click to browse + {t('contracts.dropFilesHere')} - PDF, DOC, XLS, Images up to 10MB + {t('contracts.supportedFiles')}
)} @@ -177,7 +179,7 @@ export default function FileUploadModal({ onClick={onClose} disabled={uploading} > - Cancel + {t('common.cancel')}
diff --git a/src/lib/i18n.js b/src/lib/i18n.js index f0940cc..e63ab32 100644 --- a/src/lib/i18n.js +++ b/src/lib/i18n.js @@ -198,6 +198,7 @@ const translations = { contracts: { title: "Umowy", subtitle: "---", + contract: "Umowa", newContract: "Nowa umowa", editContract: "Edytuj umowę", deleteContract: "Usuń umowę", @@ -226,7 +227,50 @@ const translations = { signedOn: "Zawarcie:", finishOn: "Zakończenie:", customerLabel: "Zleceniodawca:", - investorLabel: "Inwestor:" + investorLabel: "Inwestor:", + loadingContractDetails: "Ładowanie szczegółów umowy...", + contractNotFound: "Umowa nie została znaleziona.", + backToContracts: "Powrót do umów", + addProject: "Dodaj projekt", + contractInformation: "Informacje o umowie", + contractNumber: "Numer umowy", + contractName: "Nazwa umowy", + customerContractNumber: "Numer umowy klienta", + customer: "Klient", + investor: "Inwestor", + dateSigned: "Data zawarcia", + finishDate: "Data zakończenia", + summary: "Podsumowanie", + projectsCount: "Liczba projektów", + projects: "projektów", + contractStatus: "Status umowy", + active: "Aktywna", + expired: "Przeterminowana", + contractDocuments: "Dokumenty umowy", + uploadDocument: "Prześlij dokument", + associatedProjects: "Powiązane projekty", + noProjectsYet: "Brak projektów", + getStartedMessage: "Rozpocznij od utworzenia pierwszego projektu dla tej umowy", + createFirstProject: "Utwórz pierwszy projekt", + viewDetails: "Zobacz szczegóły", + createNewContract: "Utwórz nową umowę", + addNewContractDescription: "Dodaj nową umowę do swojego portfolio", + contractDetails: "Szczegóły umowy", + failedToCreateContract: "Nie udało się utworzyć umowy. Sprawdź dane i spróbuj ponownie.", + // File upload translations + uploadDocumentTitle: "Prześlij dokument", + descriptionOptional: "Opis (opcjonalny)", + descriptionPlaceholder: "Krótki opis dokumentu...", + uploading: "Przesyłanie...", + dropFilesHere: "Upuść pliki tutaj lub kliknij, aby przeglądać", + supportedFiles: "PDF, DOC, XLS, Obrazy do 10MB", + chooseFile: "Wybierz plik", + failedToUploadFile: "Nie udało się przesłać pliku", + loadingFiles: "Ładowanie plików...", + noDocumentsUploaded: "Brak przesłanych dokumentów", + download: "Pobierz", + confirmDeleteFile: "Czy na pewno chcesz usunąć ten plik?", + failedToDeleteFile: "Nie udało się usunąć pliku" }, // Tasks