Fixed API calls on governance page

Enforced multitenancy
This commit is contained in:
2026-09-26 10:28:43 +02:00
parent b2688867f3
commit f3a8f78144
16 changed files with 3552 additions and 503 deletions
@@ -75,6 +75,8 @@ const projectSchema = z.object({
programmeId: z.coerce.number().min(1, 'Select a programme'),
sector: z.coerce.number().min(1),
projectType: z.coerce.number().min(1),
startedAt: z.string().optional().nullable(),
endedAt: z.string().optional().nullable(),
});
const activitySchema = z.object({
@@ -83,6 +85,7 @@ const activitySchema = z.object({
category: z.string().min(2, 'Category required'),
amount: z.coerce.number().min(1, 'Amount must be positive'),
milestoneId: z.string().optional().nullable(),
performedAt: z.string().optional().nullable(),
});
const milestoneSchema = z.object({
@@ -164,6 +167,8 @@ export const ProjectsPage: React.FC = () => {
programmeId: programmes[0]?.id ? Number(programmes[0].id) : 0,
sector: IndustrySector.AgriTech,
projectType: ProjectType.Innovation,
startedAt: '',
endedAt: '',
},
});
@@ -175,6 +180,7 @@ export const ProjectsPage: React.FC = () => {
category: '',
amount: 0,
milestoneId: '',
performedAt: '',
},
});
@@ -197,6 +203,8 @@ export const ProjectsPage: React.FC = () => {
programmeId: programmes[0]?.id ? Number(programmes[0].id) : 0,
sector: IndustrySector.AgriTech,
projectType: ProjectType.Innovation,
startedAt: '',
endedAt: '',
});
setIsProjectModalOpen(true);
};
@@ -209,6 +217,8 @@ export const ProjectsPage: React.FC = () => {
programmeId: p.programmeId ? Number(p.programmeId) : (programmes[0]?.id ? Number(programmes[0].id) : 0),
sector: p.sector || IndustrySector.AgriTech,
projectType: p.projectType || ProjectType.Innovation,
startedAt: p.startedAt ? p.startedAt.slice(0, 10) : '',
endedAt: p.endedAt ? p.endedAt.slice(0, 10) : '',
});
setIsProjectModalOpen(true);
};
@@ -221,6 +231,7 @@ export const ProjectsPage: React.FC = () => {
category: '',
amount: 0,
milestoneId: '',
performedAt: new Date().toISOString().slice(0, 10),
});
setIsActivityModalOpen(true);
};
@@ -233,6 +244,7 @@ export const ProjectsPage: React.FC = () => {
category: a.category || '',
amount: a.amount || 0,
milestoneId: a.milestoneId ? String(a.milestoneId) : '',
performedAt: a.performedAt ? a.performedAt.slice(0, 10) : '',
});
setIsActivityModalOpen(true);
};
@@ -267,6 +279,8 @@ export const ProjectsPage: React.FC = () => {
projectId: editingProject.id,
name: data.name,
description: data.description,
startedAt: data.startedAt ? new Date(data.startedAt).toISOString() : null,
endedAt: data.endedAt ? new Date(data.endedAt).toISOString() : null,
sector: Number(data.sector),
projectType: Number(data.projectType),
});
@@ -310,6 +324,7 @@ export const ProjectsPage: React.FC = () => {
data.milestoneId && String(data.milestoneId).trim() !== ''
? Number(data.milestoneId)
: null;
const performedAtIso = data.performedAt ? new Date(data.performedAt).toISOString() : null;
if (editingActivity) {
return updateActivity({
@@ -320,6 +335,7 @@ export const ProjectsPage: React.FC = () => {
category: data.category,
amount: Number(data.amount),
milestoneId: parsedMilestoneId,
performedAt: performedAtIso,
});
}
return createActivity({
@@ -329,6 +345,7 @@ export const ProjectsPage: React.FC = () => {
category: data.category,
amount: Number(data.amount),
milestoneId: parsedMilestoneId,
performedAt: performedAtIso,
});
},
onSuccess: () => {
@@ -985,6 +1002,41 @@ export const ProjectsPage: React.FC = () => {
</div>
</div>
<div className="grid grid-cols-2 gap-3">
<div>
<div className="flex items-center gap-1 mb-1">
<label className="block text-xs font-semibold text-slate-300">Start Date</label>
<HelpTooltip
title="Project Start Date"
content="Scheduled or actual project commencement date."
size="sm"
placement="top"
/>
</div>
<input
type="date"
{...projectForm.register('startedAt')}
className="w-full px-3 py-2 text-xs border border-slate-700/80 rounded-xl focus:outline-none focus:ring-1 focus:ring-blue-500 text-white bg-[#090d16]"
/>
</div>
<div>
<div className="flex items-center gap-1 mb-1">
<label className="block text-xs font-semibold text-slate-300">Target Completion Date</label>
<HelpTooltip
title="Target Completion Date"
content="Projected or contractual conclusion date for statutory reporting."
size="sm"
placement="top"
/>
</div>
<input
type="date"
{...projectForm.register('endedAt')}
className="w-full px-3 py-2 text-xs border border-slate-700/80 rounded-xl focus:outline-none focus:ring-1 focus:ring-blue-500 text-white bg-[#090d16]"
/>
</div>
</div>
<div>
<label className="block text-xs font-semibold text-slate-300 mb-1">Project Scope & Objectives *</label>
<textarea
@@ -1112,6 +1164,23 @@ export const ProjectsPage: React.FC = () => {
</div>
</div>
<div>
<div className="flex items-center gap-1 mb-1">
<label className="block text-xs font-semibold text-slate-300">Execution / Performed Date</label>
<HelpTooltip
title="Activity Execution Date"
content="Scheduled or actual date on which the activity was performed."
size="sm"
placement="right"
/>
</div>
<input
type="date"
{...activityForm.register('performedAt')}
className="w-full px-3 py-2 text-xs border border-slate-700/80 rounded-xl focus:outline-none focus:ring-1 focus:ring-blue-500 text-white bg-[#090d16]"
/>
</div>
<div>
<label className="block text-xs font-semibold text-slate-300 mb-1">Description *</label>
<textarea