diff --git a/frontend/src/pages/intake-form/IntakeForm.tsx b/frontend/src/pages/intake-form/IntakeForm.tsx index e4aca29d..e0467dbd 100644 --- a/frontend/src/pages/intake-form/IntakeForm.tsx +++ b/frontend/src/pages/intake-form/IntakeForm.tsx @@ -5,6 +5,10 @@ import { ExperienceRoles } from './pages/ExperienceRoles'; import { Skills } from './pages/Skills'; import { ReviewAndSubmit } from './pages/ReviewAndSubmit'; import { Complete } from './pages/Complete'; +import { personalDetailsSchema, programSelectionSchema } from './validation'; +import { personalDetails, programFields } from './fields'; +import { useRoleContext } from '@/providers'; +import { useKeycloak } from '@react-keycloak/web'; import { experienceRolesSchema, personalInfoSchema, @@ -13,8 +17,9 @@ import { } from './validation'; import { personalInfoFields, programFields } from './fields'; import { useKeycloak } from '@react-keycloak/web'; - + const IntakeForm = () => { + const { keycloak } = useKeycloak(); const { tokenParsed } = keycloak; @@ -27,8 +32,13 @@ const IntakeForm = () => { { }} validationSchema={{ programSelectionSchema, - personalInfoSchema, + personalDetailsSchema, experienceRolesSchema, skillsSchema, }} diff --git a/frontend/src/pages/intake-form/fields.ts b/frontend/src/pages/intake-form/fields.ts index 468e4662..90b0ee67 100644 --- a/frontend/src/pages/intake-form/fields.ts +++ b/frontend/src/pages/intake-form/fields.ts @@ -1,38 +1,285 @@ -import { Program } from '@/common'; +// common +import { + BcwsRoleInterface, + Languages, + Location, + PersonnelTool, + Program, +} from '@/common'; export interface ProgramFields { program?: Program; } -// program selection +// core team program selection export const programFields: ProgramFields = { program: undefined, }; -export interface PersonalInfoFields { +// acknowledgement for selected program stream(s) +export interface AcknowledgementEmcr { + expectations: boolean; + approvedBySupervisor: boolean; +} + +export type AcknowledgementBcws = AcknowledgementEmcr & { + orientation: boolean; + willingnessStatement: boolean; + parQ: boolean; +}; + +export type AcknowledgementBoth = AcknowledgementEmcr & AcknowledgementBcws; + +export const acknowledgementEmcr: AcknowledgementEmcr = { + expectations: false, + approvedBySupervisor: false, +}; + +export const acknowledgementBcws: AcknowledgementBcws = { + expectations: false, + approvedBySupervisor: false, + orientation: false, + willingnessStatement: false, + parQ: false, +}; + +export const acknowledgementBoth: AcknowledgementBoth = { + expectations: false, + approvedBySupervisor: false, + orientation: false, + willingnessStatement: false, + parQ: false, +}; + +// personal & employee information + +// personal details + +export interface PersonalDetails { firstName: string; lastName: string; - email: string; - // ...etc + primaryPhone: string; + secondaryPhone?: string; + homeLocation?: Location; } -// personal info -export const personalInfoFields: PersonalInfoFields = { +export const personalDetails: PersonalDetails = { firstName: '', lastName: '', + primaryPhone: '', + secondaryPhone: '', + homeLocation: undefined, +}; + +// employment details + +export interface EmploymentDetails { + jobTitle: string; + employeeId: string; + email: string; + workPhone: string; + ministry: string; + division: string; + paylistId: string; + purchaseCardHolder: boolean; +} + +export const employmentDetails: EmploymentDetails = { + jobTitle: '', + employeeId: '', email: '', - // ...etc + workPhone: '', + ministry: '', + division: '', + paylistId: '', + purchaseCardHolder: false, +}; + +// supervisor and liaison details, travel preferences + +export interface SupervisorDetails { + supervisorFirstName: string; + supervisorLastName: string; + supervisorEmail: string; + supervisorPhone?: string; +} +export interface LiaisonDetails { + liaisonUnknown?: boolean; + liaisonFirstName?: string; + liaisonLastName?: string; + liaisonEmail?: string; + liaisonPhoneNumber?: string; +} +export interface TravelDetails { + travelPreferences: string; +} + +export const supervisorDetails: SupervisorDetails = { + supervisorFirstName: '', + supervisorLastName: '', + supervisorEmail: '', + supervisorPhone: '', +}; + +export const liaisonDetails: LiaisonDetails = { + liaisonUnknown: false, + liaisonFirstName: '', + liaisonLastName: '', + liaisonEmail: '', + liaisonPhoneNumber: '', +}; + +export const travelDetails: TravelDetails = { + travelPreferences: '', +}; + +// emergency contact details + +export interface EmergencyContactDetails { + emergencyContactFirstName: string; + emergencyContactLastName: string; + emergencyContactPhoneNumber: string; + emergencyContactRelationship: string; +} + +export const emergencyContactDetails: EmergencyContactDetails = { + emergencyContactFirstName: '', + emergencyContactLastName: '', + emergencyContactPhoneNumber: '', + emergencyContactRelationship: '', }; -// experience & roles +// experience and section interests -// skills +// emcr section(s) interest -// review and submit +export interface GeneralEmergencyManagementExperience { + directExperience: boolean; + preocExperience: boolean; + peccExperience: boolean; + indigenousExperience: boolean; +} + +export const generalEmergencyManagementExperience: GeneralEmergencyManagementExperience = + { + directExperience: false, + preocExperience: false, + peccExperience: false, + indigenousExperience: false, + }; + +export interface SectionChoiceEmcr { + firstChoiceFunction: string; + secondChoiceFunction?: string; + thirdChoiceFunction?: string; +} + +export const sectionChoiceEmcr: SectionChoiceEmcr = { + firstChoiceFunction: '', + secondChoiceFunction: '', + thirdChoiceFunction: '', +}; + +export interface SectionInterestEmcr { + advancePlanningUnit?: boolean; + deputyDirector?: boolean; + ess?: boolean; + finance?: boolean; + firstNationsBranch?: boolean; + liaison?: boolean; + logistics?: boolean; + operations?: boolean; + planning?: boolean; + recovery?: boolean; +} + +export const sectionInterestEmcr: SectionInterestEmcr = { + advancePlanningUnit: false, + deputyDirector: false, + ess: false, + finance: false, + firstNationsBranch: false, + liaison: false, + logistics: false, + operations: false, + planning: false, + recovery: false, +}; + +// bcws section(s) & role(s) interest + +export interface SectionChoiceBcws { + firstChoiceSection: string; + secondChoiceSection?: string; + thirdChoiceSection?: string; +} + +export const sectionChoiceBcws: SectionChoiceBcws = { + firstChoiceSection: '', + secondChoiceSection: '', + thirdChoiceSection: '', +}; + +export interface SectionRolesBcws { + planning?: BcwsRoleInterface[]; + logistics?: BcwsRoleInterface[]; + finance?: BcwsRoleInterface[]; + operations?: BcwsRoleInterface[]; + command?: BcwsRoleInterface[]; + aviation?: BcwsRoleInterface[]; +} + +export const sectionRolesBcws: SectionRolesBcws = { + planning: [], + logistics: [], + finance: [], + operations: [], + command: [], + aviation: [], +}; + +// other skills & qualifications + +export interface LanguageSkills { + languages?: Languages[]; +} + +export const languageSkills: LanguageSkills = { + languages: [], +}; + +export interface SoftwareSkills { + tools?: PersonnelTool[]; +} + +export const softwareSkills: SoftwareSkills = { + tools: [], +}; +export interface OtherCertifications { + highestOfaCompleted?: string; + driverLicenseQualifications?: string[]; + certifiedPfa: string; + otherCertifications?: string[]; +} +export const otherCertifications: OtherCertifications = { + highestOfaCompleted: '', + driverLicenseQualifications: [], + certifiedPfa: '', + otherCertifications: [], +}; + +// review & submit + +export interface ReviewAndSubmit { + acknowledgeSubmit: boolean; +} + +export const reviewAndSubmit: ReviewAndSubmit = { + acknowledgeSubmit: false, +}; // form interface export interface IntakeFormInterface { - programFields: ProgramFields - personalInfoFields: PersonalInfoFields - + programFields: ProgramFields; + personalDetails: PersonalDetails; } diff --git a/frontend/src/pages/intake-form/validation.ts b/frontend/src/pages/intake-form/validation.ts index 1af33527..b9d3dd7b 100644 --- a/frontend/src/pages/intake-form/validation.ts +++ b/frontend/src/pages/intake-form/validation.ts @@ -1,16 +1,151 @@ import * as Yup from 'yup'; -export const programSelectionSchema = Yup.object().shape({}) +export const programSelectionSchema = Yup.object().shape({ + program: Yup.string().required('Program is required'), +}); -export const experienceRolesSchema = Yup.object().shape({}) +export const acknowledgementSchemaEmcr = Yup.object().shape({ + expectations: Yup.boolean().required(), + supervisorApproval: Yup.boolean().required(), +}); -export const skillsSchema = Yup.object().shape({}) +export const acknowledgementSchemaBcws = Yup.object().shape({ + expectations: Yup.boolean().required(), + supervisorApproval: Yup.boolean().required(), + training: Yup.boolean().required(), + willingnessStatement: Yup.boolean().required(), + parQ: Yup.boolean().required(), +}); -export const personalInfoSchema = Yup.object().shape({ - firstName: Yup.string().required('First Name is required'), -}) +export const acknowledgementSchemaBoth = Yup.object().shape({ + expectations: Yup.boolean().required(), + supervisorApproval: Yup.boolean().required(), + training: Yup.boolean().required(), + willingnessStatement: Yup.boolean().required(), + parQ: Yup.boolean().required(), +}); -export const reviewAndSubmitSchema = Yup.object().shape({}) +export const personalDetailsSchema = Yup.object().shape({ + firstName: Yup.string().required('First name is required'), + lastName: Yup.string().required('Last name is required'), + primaryPhone: Yup.string().required('Primary phone is required'), + secondaryPhone: Yup.string(), + homeLocation: Yup.string().required('Home location is required'), +}); +export const employmentDetailsSchema = Yup.object().shape({ + jobTitle: Yup.string().required('Job title is required'), + bcGovEmployeeNumber: Yup.string().required('Employee number is required'), + bcGovEmail: Yup.string().required('Email is required'), + workPhone: Yup.string().required('Work phone is required'), + ministry: Yup.string().required('Ministry is required'), + division: Yup.string().required('Division is required'), + deptId: Yup.string().required('Pay list (Dept ID) is required'), + purchaseCardHolder: Yup.string().required('Purchase card holder is required'), +}); +export const supervisorDetailsSchema = Yup.object().shape({ + supervisorFirstName: Yup.string().required("Supervisor's first name is required"), + supervisorLastName: Yup.string().required("Supervisor's last name is required"), + supervisorEmail: Yup.string().required("Supervisor's email is required"), + supervisorPhone: Yup.string(), +}); +export const liaisonDetailsSchema = Yup.object().shape({ + liaisonUnknown: Yup.string(), + liaisonFirstName: Yup.string(), + liaisonLastName: Yup.string(), + liaisonEmail: Yup.string(), + liaisonPhone: Yup.string(), +}); + +export const travelDetailsSchema = Yup.object().shape({ + travelPreferences: Yup.string(), +}); + +export const emergencyContactDetailsSchema = Yup.object().shape({ + emergencyFirstName: Yup.string().required( + "Emergency contact's first name is required", + ), + emergencyLastName: Yup.string().required( + "Emergency contact's last name is required", + ), + emergencyPhone: Yup.string().required("Emergency contact's phone is required"), + emergencyRelationship: Yup.string().required('Relationship is required'), +}); + +export const generalEmergencyManagementExperienceSchema = Yup.object().shape({ + directExperience: Yup.boolean().required(), + preocExperience: Yup.boolean().required(), + peccExperience: Yup.boolean().required(), + indigenousExperience: Yup.boolean().required(), +}); + +export const sectionChoiceEmcrSchema = Yup.object().shape({ + firstChoiceEmcr: Yup.string().required('First choice is required'), + secondChoiceEmcr: Yup.string(), + thirdChoiceEmcr: Yup.string(), +}); + +export const sectionInterestEmcrSchema = Yup.object().shape({ + advancePlanningUnit: Yup.boolean(), + deputyDirector: Yup.boolean(), + ess: Yup.boolean(), + finance: Yup.boolean(), + firstNationsBranch: Yup.boolean(), + liaison: Yup.boolean(), + logistics: Yup.boolean(), + operations: Yup.boolean(), + planning: Yup.boolean(), + recovery: Yup.boolean(), +}); + +export const sectionChoiceBcwsSchema = Yup.object().shape({ + firstChoiceBcws: Yup.string().required('First choice is required'), + secondChoiceBcws: Yup.string(), + thirdChoiceBcws: Yup.string(), +}); + +export const bcwsRoleSchema = Yup.object().shape({ + id: Yup.string(), + name: Yup.string(), + section: Yup.string(), +}); + +export const sectionRolesBcwsSchema = Yup.object().shape({ + planning: Yup.array().of(bcwsRoleSchema), + logistics: Yup.array().of(bcwsRoleSchema), + finance: Yup.array().of(bcwsRoleSchema), + operations: Yup.array().of(bcwsRoleSchema), + command: Yup.array().of(bcwsRoleSchema), + aviation: Yup.array().of(bcwsRoleSchema), +}); + +export const languageSkillsSchema = Yup.object().shape({ + languages: Yup.array().of( + Yup.object().shape({ + language: Yup.string().required('Language is required'), + proficiencyLevel: Yup.string().required('Proficiency level is required'), + }), + ), +}); + +export const softwareSkillsSchema = Yup.object().shape({ + languages: Yup.array().of( + Yup.object().shape({ + tool: Yup.string().required('Tool is required'), + proficiencyLevel: Yup.string().required('Proficiency level is required'), + }), + ), +}); + +export const certificationsSchema = Yup.object().shape({ + highestOfaCompleted: Yup.string(), + driverLicenseQualifications: Yup.array().of(Yup.string()), + certifiedPfa: Yup.string().required('PFA is required'), + otherCertifications: Yup.array().of(Yup.string()), +}); + +export const reviewAndSubmitSchema = Yup.object().shape({ + acknowledgeSubmit: Yup.boolean().required('You must acknowledge your submission'), +});