feat: Implement internationalization for task management components

- Added translation support for task-related strings in ProjectTaskForm and ProjectTasksSection components.
- Integrated translation for navigation items in the Navigation component.
- Created ProjectCalendarWidget component with Polish translations for project statuses and deadlines.
- Developed Tooltip component for enhanced user experience with tooltips.
- Established a field change history logging system in the database with associated queries.
- Enhanced task update logging to include translated status and priority changes.
- Introduced server-side translations for system messages to improve localization.
This commit is contained in:
2025-09-11 15:49:07 +02:00
parent 50adc50a24
commit 0dd988730f
24 changed files with 1945 additions and 114 deletions

View File

@@ -0,0 +1,24 @@
// Force this API route to use Node.js runtime for database access
export const runtime = "nodejs";
import { getFinishDateUpdates } from "@/lib/queries/projects";
import { NextResponse } from "next/server";
import { withReadAuth } from "@/lib/middleware/auth";
async function getFinishDateUpdatesHandler(req, { params }) {
const { id } = await params;
try {
const updates = getFinishDateUpdates(parseInt(id));
return NextResponse.json(updates);
} catch (error) {
console.error("Error fetching finish date updates:", error);
return NextResponse.json(
{ error: "Failed to fetch finish date updates" },
{ status: 500 }
);
}
}
// Protected route - require authentication
export const GET = withReadAuth(getFinishDateUpdatesHandler);

View File

@@ -3,9 +3,11 @@ export const runtime = "nodejs";
import {
getProjectById,
getProjectWithContract,
updateProject,
deleteProject,
} from "@/lib/queries/projects";
import { logFieldChange } from "@/lib/queries/fieldHistory";
import initializeDatabase from "@/lib/init-db";
import { NextResponse } from "next/server";
import { withReadAuth, withUserAuth } from "@/lib/middleware/auth";
@@ -20,7 +22,7 @@ initializeDatabase();
async function getProjectHandler(req, { params }) {
const { id } = await params;
const project = getProjectById(parseInt(id));
const project = getProjectWithContract(parseInt(id));
if (!project) {
return NextResponse.json({ error: "Project not found" }, { status: 404 });
@@ -46,9 +48,31 @@ async function updateProjectHandler(req, { params }) {
// Get user ID from authenticated request
const userId = req.user?.id;
// Get original project data for audit log
// Get original project data for audit log and field tracking
const originalProject = getProjectById(parseInt(id));
if (!originalProject) {
return NextResponse.json({ error: "Project not found" }, { status: 404 });
}
// Track field changes for specific fields we want to monitor
const fieldsToTrack = ['finish_date', 'project_status', 'assigned_to', 'contract_id'];
for (const fieldName of fieldsToTrack) {
if (data.hasOwnProperty(fieldName)) {
const oldValue = originalProject[fieldName];
const newValue = data[fieldName];
if (oldValue !== newValue) {
try {
logFieldChange('projects', parseInt(id), fieldName, oldValue, newValue, userId);
} catch (error) {
console.error(`Failed to log field change for ${fieldName}:`, error);
}
}
}
}
updateProject(parseInt(id), data, userId);
// Get updated project