diff --git a/apps/web/src/components/projects/ProjectModal.tsx b/apps/web/src/components/projects/ProjectModal.tsx
index 90d63fc..5f7e891 100644
--- a/apps/web/src/components/projects/ProjectModal.tsx
+++ b/apps/web/src/components/projects/ProjectModal.tsx
@@ -204,7 +204,7 @@ export function ProjectModal({ project, onClose }: ProjectModalProps) {
startDate: new Date(form.startDate),
endDate: new Date(form.endDate),
status: form.status as unknown as ProjectStatus,
- responsiblePerson: form.responsiblePerson.trim() || undefined,
+ responsiblePerson: form.responsiblePerson.trim(),
...(form.color ? { color: form.color } : {}),
...(form.utilizationCategoryId ? { utilizationCategoryId: form.utilizationCategoryId } : {}),
...(form.clientId ? { clientId: form.clientId } : {}),
@@ -223,7 +223,7 @@ export function ProjectModal({ project, onClose }: ProjectModalProps) {
status: form.status as unknown as ProjectStatus,
staffingReqs: [],
dynamicFields: {},
- responsiblePerson: form.responsiblePerson.trim() || undefined,
+ responsiblePerson: form.responsiblePerson.trim(),
...(form.color ? { color: form.color } : {}),
...(form.utilizationCategoryId ? { utilizationCategoryId: form.utilizationCategoryId } : {}),
...(form.clientId ? { clientId: form.clientId } : {}),
@@ -521,8 +521,8 @@ export function ProjectModal({ project, onClose }: ProjectModalProps) {
setField("responsiblePerson", e.target.value)}
placeholder="Name or EID"
+ required
className={inputClass}
/>
diff --git a/apps/web/src/components/projects/ProjectWizard.tsx b/apps/web/src/components/projects/ProjectWizard.tsx
index e81b108..f754202 100644
--- a/apps/web/src/components/projects/ProjectWizard.tsx
+++ b/apps/web/src/components/projects/ProjectWizard.tsx
@@ -1089,7 +1089,7 @@ export function ProjectWizard({ open, onClose }: ProjectWizardProps) {
endDate: new Date(state.endDate),
staffingReqs: state.staffingReqs,
status: state.saveAsDraft ? ProjectStatus.DRAFT : ProjectStatus.ACTIVE,
- responsiblePerson: state.responsiblePerson.trim() || undefined,
+ responsiblePerson: state.responsiblePerson.trim(),
blueprintId: state.blueprintId ?? undefined,
dynamicFields: {},
});
diff --git a/packages/shared/src/schemas/project.schema.ts b/packages/shared/src/schemas/project.schema.ts
index d0a9b26..743024a 100644
--- a/packages/shared/src/schemas/project.schema.ts
+++ b/packages/shared/src/schemas/project.schema.ts
@@ -28,7 +28,7 @@ export const CreateProjectBaseSchema = z.object({
dynamicFields: z.record(z.string(), z.unknown()).default({}),
blueprintId: z.string().optional(),
status: z.nativeEnum(ProjectStatus).default(ProjectStatus.DRAFT),
- responsiblePerson: z.string().max(200).optional(),
+ responsiblePerson: z.string().min(1, "Responsible person is required").max(200),
color: z.string().regex(/^#[0-9a-fA-F]{6}$/, "Must be a hex color like #3b82f6").optional(),
utilizationCategoryId: z.string().optional(),
clientId: z.string().optional(),