@cuemath/leap 2.8.21-rj-16 → 2.8.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/images/images.js +0 -12
- package/dist/assets/images/images.js.map +1 -1
- package/dist/features/chapters/chapter/chapter.js +43 -45
- package/dist/features/chapters/chapter/chapter.js.map +1 -1
- package/dist/features/chapters/chapter/comps/core-lessons/core-lessons.js +21 -23
- package/dist/features/chapters/chapter/comps/core-lessons/core-lessons.js.map +1 -1
- package/dist/features/circle-games/game-launcher/use-game-launcher-journey/use-game-launcher-journey.js +3 -3
- package/dist/features/circle-games/game-launcher/use-game-launcher-journey/use-game-launcher-journey.js.map +1 -1
- package/dist/features/milestone/constants.js +18 -53
- package/dist/features/milestone/constants.js.map +1 -1
- package/dist/features/milestone/create/comps/chapters-selection-step/chapters-selection-step-styled.js +4 -16
- package/dist/features/milestone/create/comps/chapters-selection-step/chapters-selection-step-styled.js.map +1 -1
- package/dist/features/milestone/create/milestone-create-constants.js.map +1 -1
- package/dist/features/milestone/create/milestone-create-container.js +47 -56
- package/dist/features/milestone/create/milestone-create-container.js.map +1 -1
- package/dist/features/milestone/create/milestone-create-helpers.js +113 -132
- package/dist/features/milestone/create/milestone-create-helpers.js.map +1 -1
- package/dist/features/milestone/create/milestone-create-hooks.js +90 -92
- package/dist/features/milestone/create/milestone-create-hooks.js.map +1 -1
- package/dist/features/milestone/create/milestone-create-styled.js +20 -34
- package/dist/features/milestone/create/milestone-create-styled.js.map +1 -1
- package/dist/features/milestone/create/milestone-create.js +53 -72
- package/dist/features/milestone/create/milestone-create.js.map +1 -1
- package/dist/features/milestone/create/submit-modal/use-submit-milestone.js +46 -53
- package/dist/features/milestone/create/submit-modal/use-submit-milestone.js.map +1 -1
- package/dist/features/milestone/create/utils/index.js.map +1 -1
- package/dist/features/milestone/edit/comps/delete-milestone/styled.js +8 -11
- package/dist/features/milestone/edit/comps/delete-milestone/styled.js.map +1 -1
- package/dist/features/milestone/edit/comps/edit-milestone-modal/edit-milestone.js +82 -79
- package/dist/features/milestone/edit/comps/edit-milestone-modal/edit-milestone.js.map +1 -1
- package/dist/features/milestone/edit/comps/edit-milestone-modal/index.js +112 -136
- package/dist/features/milestone/edit/comps/edit-milestone-modal/index.js.map +1 -1
- package/dist/features/milestone/{drafts/goal-edit → edit/goal-drafts}/goal-draft-edit-container.js +22 -24
- package/dist/features/milestone/edit/goal-drafts/goal-draft-edit-container.js.map +1 -0
- package/dist/features/milestone/edit/goal-drafts/goal-draft-edit-helpers.js +17 -0
- package/dist/features/milestone/edit/goal-drafts/goal-draft-edit-helpers.js.map +1 -0
- package/dist/features/milestone/edit/goal-edit-helpers.js +5 -6
- package/dist/features/milestone/edit/goal-edit-helpers.js.map +1 -1
- package/dist/features/milestone/edit/milestone-edit-helpers.js +16 -17
- package/dist/features/milestone/edit/milestone-edit-helpers.js.map +1 -1
- package/dist/features/milestone/milestone-list-container/milestone-list/milestone-list.js +46 -48
- package/dist/features/milestone/milestone-list-container/milestone-list/milestone-list.js.map +1 -1
- package/dist/features/milestone/milestone-list-container/milestone-list-container.js +58 -60
- package/dist/features/milestone/milestone-list-container/milestone-list-container.js.map +1 -1
- package/dist/features/milestone/outcome/comps/past-milestone/past-milestone-container.js +39 -41
- package/dist/features/milestone/outcome/comps/past-milestone/past-milestone-container.js.map +1 -1
- package/dist/index.d.ts +7 -125
- package/dist/index.js +244 -258
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/constants/urls.js +0 -5
- package/dist/constants/urls.js.map +0 -1
- package/dist/features/milestone/drafts/create/draft-create-container.js +0 -54
- package/dist/features/milestone/drafts/create/draft-create-container.js.map +0 -1
- package/dist/features/milestone/drafts/edit/draft-edit-container.js +0 -77
- package/dist/features/milestone/drafts/edit/draft-edit-container.js.map +0 -1
- package/dist/features/milestone/drafts/edit/draft-edit-helpers.js +0 -69
- package/dist/features/milestone/drafts/edit/draft-edit-helpers.js.map +0 -1
- package/dist/features/milestone/drafts/goal-edit/goal-draft-edit-container.js.map +0 -1
- package/dist/features/milestone/drafts/review/draft-review-container.js +0 -76
- package/dist/features/milestone/drafts/review/draft-review-container.js.map +0 -1
- package/dist/features/milestone/edit/comps/delete-milestone/add-remove-nudge.js +0 -48
- package/dist/features/milestone/edit/comps/delete-milestone/add-remove-nudge.js.map +0 -1
- package/dist/features/milestone/edit/comps/edit-milestone-modal/edit-milestone-modal-styled.js +0 -23
- package/dist/features/milestone/edit/comps/edit-milestone-modal/edit-milestone-modal-styled.js.map +0 -1
- package/dist/features/milestone/edit/comps/edit-milestone-modal/share-screen.js +0 -68
- package/dist/features/milestone/edit/comps/edit-milestone-modal/share-screen.js.map +0 -1
- package/dist/features/milestone/help-modals/index.js +0 -22
- package/dist/features/milestone/help-modals/index.js.map +0 -1
- package/dist/features/milestone/help-modals/milestone-lesson.js +0 -17
- package/dist/features/milestone/help-modals/milestone-lesson.js.map +0 -1
- package/dist/features/milestone/help-modals/milestone-list.js +0 -17
- package/dist/features/milestone/help-modals/milestone-list.js.map +0 -1
- package/dist/features/milestone/help-modals/utils.js +0 -20
- package/dist/features/milestone/help-modals/utils.js.map +0 -1
- package/dist/features/milestone/intro-modal/index.js +0 -24
- package/dist/features/milestone/intro-modal/index.js.map +0 -1
- package/dist/features/notifications/api/notification.js +0 -13
- package/dist/features/notifications/api/notification.js.map +0 -1
- package/dist/features/notifications/use-student-journey.js +0 -20
- package/dist/features/notifications/use-student-journey.js.map +0 -1
- package/dist/features/sheets/constants/lessons.js +0 -28
- package/dist/features/sheets/constants/lessons.js.map +0 -1
- package/dist/features/ui/modals/info-modal/index.js +0 -117
- package/dist/features/ui/modals/info-modal/index.js.map +0 -1
- package/dist/static/goal_creation_helper.d45e4d58.png +0 -0
- package/dist/static/help_banner1.ddb0ef0f.png +0 -0
- package/dist/static/help_banner2.40979ed0.png +0 -0
- package/dist/static/help_banner3.532099c7.png +0 -0
- package/dist/static/help_banner4.90a6fd4d.png +0 -0
- package/dist/static/help_banner5.2a9efb39.png +0 -0
- package/dist/static/help_banner6.94fe9589.png +0 -0
- package/dist/static/milestone_intro_slide1.1537493e.png +0 -0
- package/dist/static/milestone_intro_slide2.b791c159.png +0 -0
- package/dist/static/milestone_intro_slide3.f7d63a11.png +0 -0
- package/dist/static/milestone_intro_slide4.f8da4e46.png +0 -0
- package/dist/static/milestone_intro_slide5.ea5d12d2.png +0 -0
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"milestone-create-helpers.js","sources":["../../../../src/features/milestone/create/milestone-create-helpers.ts"],"sourcesContent":["import type IStudentSchool from '../../../types/models/school';\nimport type { ISectionOption } from '../../ui/section-list/section-list-types';\nimport type { TTestType } from '../types';\nimport type {\n ICurriculumStandards,\n IFormStep,\n IGoalCurriculumMap,\n IMileStoneFormFields,\n IMilestoneConfig,\n IMilestoneFormData,\n IPreferencesCurriculumMap,\n TCourseStream,\n TCurriculumStandardOption,\n TEnrollmentTypes,\n TFormStepNames,\n TGoalCategory,\n TMilestoneFormFlow,\n TPreferenceCategory,\n} from './milestone-create-types';\n\nimport { COUNTRY_MAP } from '../../../constants/country';\nimport { convertToTitleCase } from '../../../helpers/label-text';\nimport {\n getIfGoalCurriculumStandardIsAccessible,\n getStudentEnrollmentSupported,\n} from './comps/chapters-selection-step/utils';\nimport {\n checkEnrollmentAvailable,\n getTestTypeBasedCategory,\n} from './comps/test-type-step/test-type-utils';\nimport { CHAPTERS_STEP, GOAL_EDIT_FLOWS } from './milestone-create-constants';\n\ninterface IGetCurrenStep {\n (\n formStep: IFormStep,\n milestoneFormData: IMilestoneFormData,\n flow: TMilestoneFormFlow,\n ): IFormStep | undefined;\n}\n\ninterface IClearNextFields {\n (\n formStep: IFormStep,\n milestoneFormData: IMilestoneFormData,\n currentStepName: TFormStepNames | undefined,\n shouldStartClearing: boolean,\n fieldsToClear: (keyof IMileStoneFormFields)[],\n ): IMilestoneFormData | undefined;\n}\n\n/**\n * Impure method that Removes specified fields from an object.\n *\n * @param obj The object from which fields are to be removed.\n * @param fieldsList An array of field names to be removed.\n */\nconst clearFields = (obj: Record<string, unknown>, fieldsList: string[]) => {\n fieldsList.forEach(field => {\n obj[field] = undefined;\n });\n};\n\nconst clearNextFields: IClearNextFields = (\n formStep,\n milestoneFormData,\n currentStepName,\n startClearing,\n fieldsToClear = [],\n) => {\n const { isLeafNode, next, reset } = formStep;\n const updatedFormData = { ...milestoneFormData };\n\n if (isLeafNode) {\n clearFields(updatedFormData, [...reset, ...fieldsToClear]);\n\n return updatedFormData;\n }\n\n if (next) {\n let shouldStartClearing = startClearing;\n let nextStep: IFormStep | undefined;\n\n next.every(step => {\n let conditionFulfilled = false;\n\n if (step.when !== undefined) {\n conditionFulfilled = step.when.every(([field, value]) => updatedFormData[field] === value);\n } else conditionFulfilled = true;\n\n if (conditionFulfilled) {\n if (shouldStartClearing) {\n step?.reset?.forEach(field => {\n fieldsToClear.push(field);\n });\n } else if (currentStepName === step?.name) {\n shouldStartClearing = true;\n }\n\n nextStep = step;\n\n return false;\n }\n\n return true;\n });\n if (nextStep) {\n return clearNextFields(\n nextStep,\n updatedFormData,\n currentStepName,\n shouldStartClearing,\n fieldsToClear,\n );\n }\n }\n\n return undefined;\n};\n\nconst getCurrenStep: IGetCurrenStep = (formStep, milestoneFormData, flow) => {\n const { isLeafNode, required, next } = formStep;\n\n if (isLeafNode) {\n return formStep;\n }\n\n const requiredFieldsFilled = required.every(field => milestoneFormData[field] !== undefined);\n\n if (GOAL_EDIT_FLOWS.includes(flow)) {\n const requiredFieldsReviewed = required.every(\n field => milestoneFormData.reviewed[field] === true,\n );\n\n if (!requiredFieldsFilled || !requiredFieldsReviewed) {\n return {\n ...formStep,\n next: undefined,\n };\n }\n } else {\n const requiredFieldsCommitted = required.every(\n field => milestoneFormData.committed[field] === true,\n );\n\n if (!requiredFieldsFilled || !requiredFieldsCommitted) {\n return {\n ...formStep,\n next: undefined,\n };\n }\n }\n\n if (next) {\n let nextStep: IFormStep | undefined;\n\n next.every(step => {\n if (step.when === undefined) {\n nextStep = step;\n\n return false;\n }\n\n const conditionFulfilled = step.when.every(\n ([field, value]) => milestoneFormData[field] === value,\n );\n\n if (conditionFulfilled) {\n nextStep = step;\n\n return false;\n }\n\n return true;\n });\n\n if (nextStep) {\n return getCurrenStep(nextStep, milestoneFormData, flow);\n }\n }\n\n return undefined;\n};\n\ntype TOptions = {\n id: string;\n label: string;\n description?: string;\n};\n\ninterface IGetSchoolTestsFromConfig {\n (config: IMilestoneConfig): TOptions[];\n}\n\nconst getSchoolTestsFromConfig: IGetSchoolTestsFromConfig = config => {\n return config.academic_events.reduce<TOptions[]>((acc, event) => {\n const { id, event_name: eventName, event_type: eventType } = event;\n\n if (eventType === 'SCHOOL_TEST') {\n acc.push({\n id,\n label: eventName,\n });\n }\n\n return acc;\n }, []);\n};\n\ninterface IGetCountriesFromConfig {\n (config: IMilestoneConfig): TOptions[];\n}\n\nconst getCountriesFromConfig: IGetCountriesFromConfig = config => {\n return config.boards\n .reduce<string[]>((acc, board) => acc.concat(board.available_countries), [])\n .sort()\n .reduce<TOptions[]>((acc, country) => {\n if (acc[acc.length - 1]?.id !== country) {\n const countryFullName = config.country_code_to_name_map[country];\n\n acc.push({\n id: country,\n label: countryFullName ? convertToTitleCase(countryFullName) : country,\n });\n }\n\n return acc;\n }, []);\n};\n\nconst computeCanIncludeCurrentGoal = (props: {\n currentGoalData: IGoalCurriculumMap;\n enrollmentType: TEnrollmentTypes;\n currentCountryCode?: string;\n grade?: string;\n selectedCategory?: string;\n}) => {\n const { currentGoalData, enrollmentType, currentCountryCode, grade, selectedCategory } = props;\n\n const {\n blocked_countries: blockedCountries,\n available_countries: availableCountries,\n available_grades: availableGrades,\n goal_category: goalCategory,\n available_enrollment_types: availableEnrollmentTypes,\n blocked_enrollment_types: blockedEnrollmentTypes,\n } = currentGoalData;\n\n const isStudentEnrollmentTypeSupported = getStudentEnrollmentSupported(\n blockedEnrollmentTypes,\n availableEnrollmentTypes,\n enrollmentType,\n );\n const isStudentRegionBlocked = blockedCountries.some(\n blockedCountry => blockedCountry === currentCountryCode,\n );\n const isStudentRegionAvailable =\n availableCountries.length > 0\n ? availableCountries.some(availableCountry => availableCountry === currentCountryCode)\n : true;\n\n const isCurrentGradeAvailable = availableGrades.some(gradeInfo => gradeInfo === grade);\n const isGoalCategoryAvailable = selectedCategory === goalCategory;\n\n return (\n isStudentEnrollmentTypeSupported &&\n !isStudentRegionBlocked &&\n isStudentRegionAvailable &&\n isCurrentGradeAvailable &&\n isGoalCategoryAvailable\n );\n};\n\ninterface IGetCurriculumStandardsFromConfig {\n (\n config: IMilestoneConfig,\n options: {\n grade: string;\n countryCode: string;\n goalCategory: TGoalCategory;\n courseStream: TCourseStream;\n enrollmentType: TEnrollmentTypes;\n classRatio?: number;\n },\n ): TCurriculumStandardOption[];\n}\n\nconst getCurriculumStandardsFromConfig: IGetCurriculumStandardsFromConfig = (\n config,\n { grade, countryCode, goalCategory, courseStream, classRatio, enrollmentType },\n) => {\n const { goal_curriculum_map: goals, curriculum_standards: curriculumStandards } = config;\n // check if atleast one goal present for the curriculum standard\n\n const filteredGoalCurriculumMap = goals.filter(item => item.course_stream === courseStream);\n\n const hasGoalForCurriculumStandards = (standard: ICurriculumStandards) =>\n filteredGoalCurriculumMap.some(goal => {\n // check goal category\n if (goal.goal_category !== goalCategory) return false;\n\n if (\n classRatio &&\n goal.available_class_ratios.length > 0 &&\n !goal.available_class_ratios.includes(classRatio)\n )\n return false;\n\n // check goal curriculum standard\n // if goal_curriculum_standard is undefined then it's available for all standard\n if (goal.goal_curriculum_standard && goal.goal_curriculum_standard !== standard.code)\n return false;\n\n if (goalCategory === 'SCHOOL_SUCCESS' && !goal.goal_curriculum_standard) return false;\n\n // check country availability\n if (goal.available_countries.length > 0 && !goal.available_countries.includes(countryCode))\n return false;\n\n if (goal.available_countries.length === 0 && goal.blocked_countries.includes(countryCode))\n return false;\n\n // check grade availability\n if (!goal.available_grades.includes(grade)) return false;\n\n return checkEnrollmentAvailable(goal, enrollmentType);\n });\n\n return curriculumStandards\n .filter(hasGoalForCurriculumStandards)\n .map(\n ({\n code,\n name,\n default_in_countries: defaultInCountries,\n recommended_in_countries: recommendedInCountries,\n }) => ({\n id: code,\n label: name,\n isDefault: defaultInCountries.includes(countryCode),\n isRecommended: recommendedInCountries.includes(countryCode),\n }),\n )\n .sort((a, b) => (a.label.toUpperCase() > b.label.toUpperCase() ? 1 : -1));\n};\n\ninterface IGetGoalsFromConfig {\n (\n config: IMilestoneConfig,\n options: {\n grade: string;\n countryCode: string;\n goalCategory: TGoalCategory;\n curriculumStandard?: string;\n courseStream: TCourseStream;\n enrollmentType: TEnrollmentTypes;\n },\n ): TOptions[];\n}\n\nconst getGoalsFromConfig: IGetGoalsFromConfig = (config, options) => {\n const { goal_curriculum_map: goals } = config;\n const { grade, countryCode, goalCategory, curriculumStandard, courseStream, enrollmentType } =\n options;\n const filteredGoalCurriculumMap = goals.filter(item => item.course_stream === courseStream);\n\n const isEligibleGoal = (goal: IGoalCurriculumMap) => {\n if (goal.goal_category !== goalCategory) return false;\n\n if (curriculumStandard && goal.goal_curriculum_standard !== curriculumStandard) return false;\n\n if (goal.available_countries.length > 0 && !goal.available_countries.includes(countryCode))\n return false;\n\n if (goal.available_countries.length === 0 && goal.blocked_countries.includes(countryCode))\n return false;\n\n if (!goal.available_grades.includes(grade)) return false;\n\n return checkEnrollmentAvailable(goal, enrollmentType);\n };\n\n return filteredGoalCurriculumMap\n ?.filter(isEligibleGoal)\n .map(({ goal_code: id, goal_name: label }) => ({\n id,\n label,\n }))\n .sort((a, b) => (a.label.toUpperCase() > b.label.toUpperCase() ? 1 : -1));\n};\n\nconst getGradesFromConfig: IGetCountriesFromConfig = config => {\n return config.grades.reduce<TOptions[]>((acc, grade) => {\n if (grade === '-1' || grade === '0') {\n acc.push({\n id: grade,\n label: grade === '-1' ? `Pre-K` : `KG`,\n });\n } else {\n acc.push({\n id: grade,\n label: `Grade ${grade}`,\n });\n }\n\n return acc;\n }, []);\n};\n\ninterface IGetPreferencesFromConfig {\n (\n config: IMilestoneConfig,\n options: {\n grade: string;\n preferenceCategory: TPreferenceCategory;\n courseStream: TCourseStream;\n },\n ): TOptions[];\n}\n\nconst getPreferencesFromConfig: IGetPreferencesFromConfig = (config, options) => {\n const { preference_config: preferenceConfig } = config;\n\n const isEligiblePreferences = (preference: IPreferencesCurriculumMap) => {\n const { grade, courseStream, preferenceCategory } = options;\n\n if (preference.course_stream !== courseStream) return false;\n\n if (preference.preference_category !== preferenceCategory) return false;\n\n if (preference.preference_grades.length > 0 && !preference.preference_grades.includes(grade))\n return false;\n\n if (!preference.is_live) return false;\n\n return true;\n };\n\n return preferenceConfig\n ?.filter(isEligiblePreferences)\n .map(\n ({ preference_code: id, preference_name: label, preference_description: description }) => ({\n id,\n label,\n description,\n }),\n );\n};\n\ninterface IGetGradeBasedOnGoalAvailability {\n (\n config: IMilestoneConfig,\n selectedGoalCategory: string,\n courseStream: TCourseStream,\n enrollmentType: TEnrollmentTypes,\n ): TOptions[];\n}\n\n//* Grades where goals are available for selected goal category.\nconst getGradesBasedOnGoalAvailability: IGetGradeBasedOnGoalAvailability = (\n config,\n selectedGoalCategory,\n courseStream,\n enrollmentType,\n) => {\n const { goal_curriculum_map: goals } = config;\n\n const grades = getGradesFromConfig(config);\n\n const gradeAvailableGoals = ({ id }: TOptions) => {\n return goals\n .filter(item => item.course_stream === courseStream)\n .some((goalData: IGoalCurriculumMap) => {\n const {\n available_grades: availableGrades,\n goal_category: goalCategory,\n available_enrollment_types: availableEnrollmentTypes,\n blocked_enrollment_types: blockedEnrollmentTypes,\n } = goalData;\n\n // check enrollment type availability\n if (\n availableEnrollmentTypes.length > 0 &&\n !availableEnrollmentTypes.includes(enrollmentType)\n )\n return false;\n\n if (\n availableEnrollmentTypes.length === 0 &&\n blockedEnrollmentTypes.includes(enrollmentType)\n )\n return false;\n\n //* Check for grade availability only for selected goal category\n return goalCategory === selectedGoalCategory && availableGrades.includes(id);\n });\n };\n\n return grades.filter(gradeAvailableGoals);\n};\n\ninterface IGetMajorsFromConfigBasedOnBoardAndGrade {\n (\n config: IMilestoneConfig,\n boardCode: string,\n grade: string,\n courseStream: TCourseStream,\n enrollmentType: TEnrollmentTypes,\n ): TOptions[];\n}\n\nconst getMajorsFromConfigBasedOnBoardAndGrade: IGetMajorsFromConfigBasedOnBoardAndGrade = (\n config,\n boardCode,\n grade,\n courseStream,\n enrollmentType,\n) => {\n //* We have US courses for grade 7 & above\n if (grade === 'KG' || Number(grade) < 7) return [];\n\n const { goal_curriculum_map: goalCurriculumMap } = config;\n const filterOnCourseStreamAndEnrollmentType = (goalData: IGoalCurriculumMap) => {\n if (goalData.course_stream !== courseStream) return false;\n\n return checkEnrollmentAvailable(goalData, enrollmentType);\n };\n\n const majorsWithLabelId = goalCurriculumMap\n .filter(filterOnCourseStreamAndEnrollmentType)\n .reduce<TOptions[]>((acc, goalData) => {\n const {\n available_grades: availableGrades,\n goal_curriculum_standard: goalCurriculumStandard,\n program_name: programName,\n program_code: programCode,\n } = goalData;\n\n const isGradeAvailable = availableGrades.some(availableGrade => availableGrade === grade);\n const isBoardAvailable = goalCurriculumStandard === boardCode;\n\n if (isGradeAvailable && isBoardAvailable) {\n acc.push({\n id: programCode,\n label: programName,\n });\n }\n\n return acc;\n }, []);\n\n return majorsWithLabelId;\n};\n\ninterface IGetCountryAndStateFromGeoCode {\n (geoCode: google.maps.GeocoderResult): {\n countryCode: string;\n stateCode?: string;\n };\n}\n\nconst getCountryAndStateFromGeoCode: IGetCountryAndStateFromGeoCode = geoCode => {\n const { address_components: addressComponents } = geoCode;\n\n const country = addressComponents.find(addressComponent =>\n addressComponent.types.includes('country'),\n );\n\n const state = addressComponents.find(addressComponent =>\n addressComponent.types.includes('administrative_area_level_1'),\n );\n\n return {\n countryCode: country?.short_name ?? '',\n stateCode: state?.short_name,\n };\n};\n\nconst computeCurrentStepIndex = (currentStep: TFormStepNames | undefined): number => {\n if (currentStep && CHAPTERS_STEP.includes(currentStep)) return 2;\n\n return 1;\n};\n\nconst findValidAcademicEventsForClass = (\n {\n grade,\n schoolRegion,\n }: {\n grade: string | undefined;\n schoolRegion: string | undefined;\n },\n academicEvents: IMilestoneConfig['academic_events'],\n) => {\n let unknownTestEventId;\n const events = academicEvents.filter(\n ({\n id,\n event_code: eventCode,\n event_type: eventType,\n available_in_countries: availableCountries,\n available_grade_and_syllabus_map: availableInGradeSyllabusMap,\n }) => {\n const availableGrades = Object.keys(availableInGradeSyllabusMap ?? {});\n\n if (eventCode === 'UNKNOWN') {\n unknownTestEventId = id;\n }\n\n if (availableCountries.length && schoolRegion && !availableCountries.includes(schoolRegion)) {\n return false;\n }\n\n if (grade && !availableGrades.includes(grade)) {\n return false;\n }\n\n return eventType === 'STANDARDISED_TEST' && eventCode !== 'UNKNOWN';\n },\n );\n\n return { events, unknownTestEventId };\n};\n\nconst getRegionCodeBasedOnCountryCode = (countryCode: string) => {\n const regionCode = COUNTRY_MAP.find(countryInfo => countryInfo.country_code === countryCode)\n ?.region_code;\n\n return regionCode;\n};\n\nconst generateFormStateWithPrefilledSchoolData = (\n schoolData: IStudentSchool | undefined,\n board: string | undefined,\n grade: string | undefined,\n currentCountryCode: string | undefined,\n): IMilestoneFormData => {\n if (schoolData && grade) {\n const { country_code: countryCode, place_id: placeId } = schoolData;\n\n return {\n committed: {},\n reviewed: {},\n grade: grade,\n schoolInfo: {\n countryCode: countryCode,\n stateCode: '',\n id: placeId,\n },\n region: countryCode,\n board: board ?? undefined,\n };\n }\n\n const regionCode = currentCountryCode\n ? getRegionCodeBasedOnCountryCode(currentCountryCode)\n : undefined;\n\n if (grade) {\n return {\n committed: {},\n reviewed: {},\n grade: grade,\n region: regionCode,\n board: board ?? undefined,\n };\n }\n\n return {\n committed: {},\n reviewed: {},\n };\n};\n\nconst appendSchoolDataToFormState = (\n formData: IMilestoneFormData,\n schoolData: IStudentSchool | undefined,\n board: string | undefined,\n grade: string | undefined,\n): IMilestoneFormData => {\n if (schoolData && grade) {\n const { country_code: countryCode, place_id: placeId } = schoolData;\n\n return {\n ...formData,\n grade: grade,\n schoolInfo: {\n countryCode: countryCode,\n stateCode: '',\n id: placeId,\n },\n board: formData.board ?? board ?? undefined,\n };\n }\n\n return formData;\n};\n\nconst appendPrimaryGoalCategoryToFormState = (\n config: IMilestoneConfig,\n testType: TTestType,\n grade: string | undefined,\n courseStream: TCourseStream,\n enrollmentType: TEnrollmentTypes,\n board?: string | undefined,\n country?: string | undefined,\n) => {\n const { goal_curriculum_map: goalCurriculumMap } = config;\n const isSchoolSuccessCategory = testType === 'no-test';\n const selectedGoalCategory = getTestTypeBasedCategory(testType);\n\n //TODO: This needs to compensate the course selection for US curriculum grade 8 & above\n const primaryGoalCurriculum = goalCurriculumMap.find(goalInfo => {\n const isCurrentGoalAvailable = computeCanIncludeCurrentGoal({\n currentGoalData: goalInfo,\n grade,\n currentCountryCode: country,\n selectedCategory: selectedGoalCategory,\n enrollmentType,\n });\n const { goal_curriculum_standard: goalCurriculumStandard } = goalInfo;\n\n const currentBoardAvailable = getIfGoalCurriculumStandardIsAccessible({\n goalCurriculumStandard,\n referenceStandard: board,\n });\n\n const isSameCourse = goalInfo.course_stream === courseStream;\n\n if (isSchoolSuccessCategory) {\n return isSameCourse && isCurrentGoalAvailable && currentBoardAvailable;\n }\n\n return isSameCourse && isCurrentGoalAvailable;\n });\n\n return primaryGoalCurriculum;\n};\n\nconst getDefaultBoard = (data: ISectionOption<TCurriculumStandardOption>[]) => {\n let recommendedBoards: TCurriculumStandardOption[] = [];\n let otherBoards: TCurriculumStandardOption[] = [];\n\n // Iterate through the data categories\n for (const category of data) {\n if (category.title === 'recommended') {\n recommendedBoards = category.data;\n } else if (category.title === 'others') {\n otherBoards = category.data;\n }\n }\n\n // 1. Check if any recommended board has isDefault: true\n const defaultBoard = recommendedBoards.find(board => board.isDefault && board.isRecommended);\n\n if (defaultBoard) {\n return defaultBoard.id;\n }\n\n // 2. If no default, return the first recommended board\n if (recommendedBoards.length > 0) {\n return recommendedBoards[0]?.id;\n }\n\n // 3. If no recommended, return the first board from others\n if (otherBoards.length > 0) {\n return otherBoards[0]?.id;\n }\n\n // 4. Return null if no boards are found\n return undefined;\n};\n\nexport {\n appendSchoolDataToFormState,\n appendPrimaryGoalCategoryToFormState,\n clearNextFields,\n computeCurrentStepIndex,\n findValidAcademicEventsForClass,\n generateFormStateWithPrefilledSchoolData,\n getCountriesFromConfig,\n getCountryAndStateFromGeoCode,\n getCurrenStep,\n getGradesFromConfig,\n getCurriculumStandardsFromConfig,\n getGoalsFromConfig,\n getGradesBasedOnGoalAvailability,\n getMajorsFromConfigBasedOnBoardAndGrade,\n getSchoolTestsFromConfig,\n getRegionCodeBasedOnCountryCode,\n computeCanIncludeCurrentGoal,\n getDefaultBoard,\n getPreferencesFromConfig,\n};\n"],"names":["clearFields","obj","fieldsList","field","clearNextFields","formStep","milestoneFormData","currentStepName","startClearing","fieldsToClear","isLeafNode","next","reset","updatedFormData","shouldStartClearing","nextStep","step","conditionFulfilled","value","_a","getCurrenStep","flow","required","requiredFieldsFilled","GOAL_EDIT_FLOWS","requiredFieldsReviewed","requiredFieldsCommitted","getSchoolTestsFromConfig","config","acc","event","id","eventName","eventType","computeCanIncludeCurrentGoal","props","currentGoalData","enrollmentType","currentCountryCode","grade","selectedCategory","blockedCountries","availableCountries","availableGrades","goalCategory","availableEnrollmentTypes","blockedEnrollmentTypes","isStudentEnrollmentTypeSupported","getStudentEnrollmentSupported","isStudentRegionBlocked","blockedCountry","isStudentRegionAvailable","availableCountry","isCurrentGradeAvailable","gradeInfo","getCurriculumStandardsFromConfig","countryCode","courseStream","classRatio","goals","curriculumStandards","filteredGoalCurriculumMap","item","hasGoalForCurriculumStandards","standard","goal","checkEnrollmentAvailable","code","name","defaultInCountries","recommendedInCountries","a","b","getGoalsFromConfig","options","curriculumStandard","isEligibleGoal","label","getGradesFromConfig","getPreferencesFromConfig","preferenceConfig","isEligiblePreferences","preference","preferenceCategory","description","getGradesBasedOnGoalAvailability","selectedGoalCategory","grades","gradeAvailableGoals","goalData","getMajorsFromConfigBasedOnBoardAndGrade","boardCode","goalCurriculumMap","filterOnCourseStreamAndEnrollmentType","goalCurriculumStandard","programName","programCode","availableGrade","findValidAcademicEventsForClass","schoolRegion","academicEvents","unknownTestEventId","eventCode","availableInGradeSyllabusMap","getRegionCodeBasedOnCountryCode","COUNTRY_MAP","countryInfo","generateFormStateWithPrefilledSchoolData","schoolData","board","placeId","regionCode","appendSchoolDataToFormState","formData","appendPrimaryGoalCategoryToFormState","testType","country","isSchoolSuccessCategory","getTestTypeBasedCategory","goalInfo","isCurrentGoalAvailable","currentBoardAvailable","getIfGoalCurriculumStandardIsAccessible","isSameCourse","getDefaultBoard","data","recommendedBoards","otherBoards","category","defaultBoard","_b"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"milestone-create-helpers.js","sources":["../../../../src/features/milestone/create/milestone-create-helpers.ts"],"sourcesContent":["import type IStudentSchool from '../../../types/models/school';\nimport type { ISectionOption } from '../../ui/section-list/section-list-types';\nimport type { TTestType } from '../types';\nimport type {\n ICurriculumStandards,\n IFormStep,\n IGoalCurriculumMap,\n IMileStoneFormFields,\n IMilestoneConfig,\n IMilestoneFormData,\n IPreferencesCurriculumMap,\n TCourseStream,\n TCurriculumStandardOption,\n TEnrollmentTypes,\n TFormStepNames,\n TGoalCategory,\n TMilestoneFormFlow,\n TPreferenceCategory,\n} from './milestone-create-types';\n\nimport { COUNTRY_MAP } from '../../../constants/country';\nimport {\n getIfGoalCurriculumStandardIsAccessible,\n getStudentEnrollmentSupported,\n} from './comps/chapters-selection-step/utils';\nimport {\n checkEnrollmentAvailable,\n getTestTypeBasedCategory,\n} from './comps/test-type-step/test-type-utils';\nimport { GOAL_EDIT_FLOWS } from './milestone-create-constants';\n\ninterface IGetCurrenStep {\n (\n formStep: IFormStep,\n milestoneFormData: IMilestoneFormData,\n flow: TMilestoneFormFlow,\n ): IFormStep | undefined;\n}\n\ninterface IClearNextFields {\n (\n formStep: IFormStep,\n milestoneFormData: IMilestoneFormData,\n currentStepName: TFormStepNames | undefined,\n shouldStartClearing: boolean,\n fieldsToClear: (keyof IMileStoneFormFields)[],\n ): IMilestoneFormData | undefined;\n}\n\n/**\n * Impure method that Removes specified fields from an object.\n *\n * @param obj The object from which fields are to be removed.\n * @param fieldsList An array of field names to be removed.\n */\nconst clearFields = (obj: Record<string, unknown>, fieldsList: string[]) => {\n fieldsList.forEach(field => {\n obj[field] = undefined;\n });\n};\n\nconst clearNextFields: IClearNextFields = (\n formStep,\n milestoneFormData,\n currentStepName,\n startClearing,\n fieldsToClear = [],\n) => {\n const { isLeafNode, next, reset } = formStep;\n const updatedFormData = { ...milestoneFormData };\n\n if (isLeafNode) {\n clearFields(updatedFormData, [...reset, ...fieldsToClear]);\n\n return updatedFormData;\n }\n\n if (next) {\n let shouldStartClearing = startClearing;\n let nextStep: IFormStep | undefined;\n\n next.every(step => {\n let conditionFulfilled = false;\n\n if (step.when !== undefined) {\n conditionFulfilled = step.when.every(([field, value]) => updatedFormData[field] === value);\n } else conditionFulfilled = true;\n\n if (conditionFulfilled) {\n if (shouldStartClearing) {\n step?.reset?.forEach(field => {\n fieldsToClear.push(field);\n });\n } else if (currentStepName === step?.name) {\n shouldStartClearing = true;\n }\n\n nextStep = step;\n\n return false;\n }\n\n return true;\n });\n if (nextStep) {\n return clearNextFields(\n nextStep,\n updatedFormData,\n currentStepName,\n shouldStartClearing,\n fieldsToClear,\n );\n }\n }\n\n return undefined;\n};\n\nconst getCurrenStep: IGetCurrenStep = (formStep, milestoneFormData, flow) => {\n const { isLeafNode, required, next } = formStep;\n\n if (isLeafNode) {\n return formStep;\n }\n\n const requiredFieldsFilled = required.every(field => milestoneFormData[field] !== undefined);\n\n if (GOAL_EDIT_FLOWS.includes(flow)) {\n const requiredFieldsReviewed = required.every(\n field => milestoneFormData.reviewed[field] === true,\n );\n\n if (!requiredFieldsFilled || !requiredFieldsReviewed) {\n return {\n ...formStep,\n next: undefined,\n };\n }\n } else {\n const requiredFieldsCommitted = required.every(\n field => milestoneFormData.committed[field] === true,\n );\n\n if (!requiredFieldsFilled || !requiredFieldsCommitted) {\n return {\n ...formStep,\n next: undefined,\n };\n }\n }\n\n if (next) {\n let nextStep: IFormStep | undefined;\n\n next.every(step => {\n if (step.when === undefined) {\n nextStep = step;\n\n return false;\n }\n\n const conditionFulfilled = step.when.every(\n ([field, value]) => milestoneFormData[field] === value,\n );\n\n if (conditionFulfilled) {\n nextStep = step;\n\n return false;\n }\n\n return true;\n });\n\n if (nextStep) {\n return getCurrenStep(nextStep, milestoneFormData, flow);\n }\n }\n\n return undefined;\n};\n\ntype TOptions = {\n id: string;\n label: string;\n description?: string;\n};\n\ninterface IGetSchoolTestsFromConfig {\n (config: IMilestoneConfig): TOptions[];\n}\n\nconst getSchoolTestsFromConfig: IGetSchoolTestsFromConfig = config => {\n return config.academic_events.reduce<TOptions[]>((acc, event) => {\n const { id, event_name: eventName, event_type: eventType } = event;\n\n if (eventType === 'SCHOOL_TEST') {\n acc.push({\n id,\n label: eventName,\n });\n }\n\n return acc;\n }, []);\n};\n\ninterface IGetCountriesFromConfig {\n (config: IMilestoneConfig): TOptions[];\n}\n\nconst computeCanIncludeCurrentGoal = (props: {\n currentGoalData: IGoalCurriculumMap;\n enrollmentType: TEnrollmentTypes;\n currentCountryCode?: string;\n grade?: string;\n selectedCategory?: string;\n}) => {\n const { currentGoalData, enrollmentType, currentCountryCode, grade, selectedCategory } = props;\n\n const {\n blocked_countries: blockedCountries,\n available_countries: availableCountries,\n available_grades: availableGrades,\n goal_category: goalCategory,\n available_enrollment_types: availableEnrollmentTypes,\n blocked_enrollment_types: blockedEnrollmentTypes,\n } = currentGoalData;\n\n const isStudentEnrollmentTypeSupported = getStudentEnrollmentSupported(\n blockedEnrollmentTypes,\n availableEnrollmentTypes,\n enrollmentType,\n );\n const isStudentRegionBlocked = blockedCountries.some(\n blockedCountry => blockedCountry === currentCountryCode,\n );\n const isStudentRegionAvailable =\n availableCountries.length > 0\n ? availableCountries.some(availableCountry => availableCountry === currentCountryCode)\n : true;\n\n const isCurrentGradeAvailable = availableGrades.some(gradeInfo => gradeInfo === grade);\n const isGoalCategoryAvailable = selectedCategory === goalCategory;\n\n return (\n isStudentEnrollmentTypeSupported &&\n !isStudentRegionBlocked &&\n isStudentRegionAvailable &&\n isCurrentGradeAvailable &&\n isGoalCategoryAvailable\n );\n};\n\ninterface IGetCurriculumStandardsFromConfig {\n (\n config: IMilestoneConfig,\n options: {\n grade: string;\n countryCode: string;\n goalCategory: TGoalCategory;\n courseStream: TCourseStream;\n enrollmentType: TEnrollmentTypes;\n classRatio?: number;\n },\n ): TCurriculumStandardOption[];\n}\n\nconst getCurriculumStandardsFromConfig: IGetCurriculumStandardsFromConfig = (\n config,\n { grade, countryCode, goalCategory, courseStream, classRatio, enrollmentType },\n) => {\n const { goal_curriculum_map: goals, curriculum_standards: curriculumStandards } = config;\n // check if atleast one goal present for the curriculum standard\n\n const filteredGoalCurriculumMap = goals.filter(item => item.course_stream === courseStream);\n\n const hasGoalForCurriculumStandards = (standard: ICurriculumStandards) =>\n filteredGoalCurriculumMap.some(goal => {\n // check goal category\n if (goal.goal_category !== goalCategory) return false;\n\n if (\n classRatio &&\n goal.available_class_ratios.length > 0 &&\n !goal.available_class_ratios.includes(classRatio)\n )\n return false;\n\n // check goal curriculum standard\n // if goal_curriculum_standard is undefined then it's available for all standard\n if (goal.goal_curriculum_standard && goal.goal_curriculum_standard !== standard.code)\n return false;\n\n if (goalCategory === 'SCHOOL_SUCCESS' && !goal.goal_curriculum_standard) return false;\n\n // check country availability\n if (goal.available_countries.length > 0 && !goal.available_countries.includes(countryCode))\n return false;\n\n if (goal.available_countries.length === 0 && goal.blocked_countries.includes(countryCode))\n return false;\n\n // check grade availability\n if (!goal.available_grades.includes(grade)) return false;\n\n return checkEnrollmentAvailable(goal, enrollmentType);\n });\n\n return curriculumStandards\n .filter(hasGoalForCurriculumStandards)\n .map(\n ({\n code,\n name,\n default_in_countries: defaultInCountries,\n recommended_in_countries: recommendedInCountries,\n }) => ({\n id: code,\n label: name,\n isDefault: defaultInCountries.includes(countryCode),\n isRecommended: recommendedInCountries.includes(countryCode),\n }),\n )\n .sort((a, b) => (a.label.toUpperCase() > b.label.toUpperCase() ? 1 : -1));\n};\n\ninterface IGetGoalsFromConfig {\n (\n config: IMilestoneConfig,\n options: {\n grade: string;\n countryCode: string;\n goalCategory: TGoalCategory;\n curriculumStandard?: string;\n courseStream: TCourseStream;\n enrollmentType: TEnrollmentTypes;\n },\n ): TOptions[];\n}\n\nconst getGoalsFromConfig: IGetGoalsFromConfig = (config, options) => {\n const { goal_curriculum_map: goals } = config;\n const { grade, countryCode, goalCategory, curriculumStandard, courseStream, enrollmentType } =\n options;\n const filteredGoalCurriculumMap = goals.filter(item => item.course_stream === courseStream);\n\n const isEligibleGoal = (goal: IGoalCurriculumMap) => {\n if (goal.goal_category !== goalCategory) return false;\n\n if (curriculumStandard && goal.goal_curriculum_standard !== curriculumStandard) return false;\n\n if (goal.available_countries.length > 0 && !goal.available_countries.includes(countryCode))\n return false;\n\n if (goal.available_countries.length === 0 && goal.blocked_countries.includes(countryCode))\n return false;\n\n if (!goal.available_grades.includes(grade)) return false;\n\n return checkEnrollmentAvailable(goal, enrollmentType);\n };\n\n return filteredGoalCurriculumMap\n ?.filter(isEligibleGoal)\n .map(({ goal_code: id, goal_name: label }) => ({\n id,\n label,\n }))\n .sort((a, b) => (a.label.toUpperCase() > b.label.toUpperCase() ? 1 : -1));\n};\n\nconst getGradesFromConfig: IGetCountriesFromConfig = config => {\n return config.grades.reduce<TOptions[]>((acc, grade) => {\n if (grade === '-1' || grade === '0') {\n acc.push({\n id: grade,\n label: grade === '-1' ? `Pre-K` : `KG`,\n });\n } else {\n acc.push({\n id: grade,\n label: `Grade ${grade}`,\n });\n }\n\n return acc;\n }, []);\n};\n\ninterface IGetPreferencesFromConfig {\n (\n config: IMilestoneConfig,\n options: {\n grade: string;\n preferenceCategory: TPreferenceCategory;\n courseStream: TCourseStream;\n },\n ): TOptions[];\n}\n\nconst getPreferencesFromConfig: IGetPreferencesFromConfig = (config, options) => {\n const { preference_config: preferenceConfig } = config;\n\n const isEligiblePreferences = (preference: IPreferencesCurriculumMap) => {\n const { grade, courseStream, preferenceCategory } = options;\n\n if (preference.course_stream !== courseStream) return false;\n\n if (preference.preference_category !== preferenceCategory) return false;\n\n if (preference.preference_grades.length > 0 && !preference.preference_grades.includes(grade))\n return false;\n\n if (!preference.is_live) return false;\n\n return true;\n };\n\n return preferenceConfig\n ?.filter(isEligiblePreferences)\n .map(\n ({ preference_code: id, preference_name: label, preference_description: description }) => ({\n id,\n label,\n description,\n }),\n );\n};\n\ninterface IGetGradeBasedOnGoalAvailability {\n (\n config: IMilestoneConfig,\n selectedGoalCategory: string,\n courseStream: TCourseStream,\n enrollmentType: TEnrollmentTypes,\n ): TOptions[];\n}\n\n//* Grades where goals are available for selected goal category.\nconst getGradesBasedOnGoalAvailability: IGetGradeBasedOnGoalAvailability = (\n config,\n selectedGoalCategory,\n courseStream,\n enrollmentType,\n) => {\n const { goal_curriculum_map: goals } = config;\n\n const grades = getGradesFromConfig(config);\n\n const gradeAvailableGoals = ({ id }: TOptions) => {\n return goals\n .filter(item => item.course_stream === courseStream)\n .some((goalData: IGoalCurriculumMap) => {\n const {\n available_grades: availableGrades,\n goal_category: goalCategory,\n available_enrollment_types: availableEnrollmentTypes,\n blocked_enrollment_types: blockedEnrollmentTypes,\n } = goalData;\n\n // check enrollment type availability\n if (\n availableEnrollmentTypes.length > 0 &&\n !availableEnrollmentTypes.includes(enrollmentType)\n )\n return false;\n\n if (\n availableEnrollmentTypes.length === 0 &&\n blockedEnrollmentTypes.includes(enrollmentType)\n )\n return false;\n\n //* Check for grade availability only for selected goal category\n return goalCategory === selectedGoalCategory && availableGrades.includes(id);\n });\n };\n\n return grades.filter(gradeAvailableGoals);\n};\n\ninterface IGetMajorsFromConfigBasedOnBoardAndGrade {\n (\n config: IMilestoneConfig,\n boardCode: string,\n grade: string,\n courseStream: TCourseStream,\n enrollmentType: TEnrollmentTypes,\n ): TOptions[];\n}\n\nconst getMajorsFromConfigBasedOnBoardAndGrade: IGetMajorsFromConfigBasedOnBoardAndGrade = (\n config,\n boardCode,\n grade,\n courseStream,\n enrollmentType,\n) => {\n //* We have US courses for grade 7 & above\n if (grade === 'KG' || Number(grade) < 7) return [];\n\n const { goal_curriculum_map: goalCurriculumMap } = config;\n const filterOnCourseStreamAndEnrollmentType = (goalData: IGoalCurriculumMap) => {\n if (goalData.course_stream !== courseStream) return false;\n\n return checkEnrollmentAvailable(goalData, enrollmentType);\n };\n\n const majorsWithLabelId = goalCurriculumMap\n .filter(filterOnCourseStreamAndEnrollmentType)\n .reduce<TOptions[]>((acc, goalData) => {\n const {\n available_grades: availableGrades,\n goal_curriculum_standard: goalCurriculumStandard,\n program_name: programName,\n program_code: programCode,\n } = goalData;\n\n const isGradeAvailable = availableGrades.some(availableGrade => availableGrade === grade);\n const isBoardAvailable = goalCurriculumStandard === boardCode;\n\n if (isGradeAvailable && isBoardAvailable) {\n acc.push({\n id: programCode,\n label: programName,\n });\n }\n\n return acc;\n }, []);\n\n return majorsWithLabelId;\n};\n\nconst getRegionCodeBasedOnCountryCode = (countryCode: string) => {\n const regionCode = COUNTRY_MAP.find(countryInfo => countryInfo.country_code === countryCode)\n ?.region_code;\n\n return regionCode;\n};\n\nconst generateFormStateWithPrefilledSchoolData = (\n schoolData: IStudentSchool | undefined,\n board: string | undefined,\n grade: string | undefined,\n currentCountryCode: string | undefined,\n): IMilestoneFormData => {\n if (schoolData && grade) {\n const { country_code: countryCode, place_id: placeId } = schoolData;\n\n return {\n committed: {},\n reviewed: {},\n grade: grade,\n schoolInfo: {\n countryCode: countryCode,\n stateCode: '',\n id: placeId,\n },\n region: countryCode,\n board: board ?? undefined,\n };\n }\n\n const regionCode = currentCountryCode\n ? getRegionCodeBasedOnCountryCode(currentCountryCode)\n : undefined;\n\n if (grade) {\n return {\n committed: {},\n reviewed: {},\n grade: grade,\n region: regionCode,\n board: board ?? undefined,\n };\n }\n\n return {\n committed: {},\n reviewed: {},\n };\n};\n\nconst appendSchoolDataToFormState = (\n formData: IMilestoneFormData,\n schoolData: IStudentSchool | undefined,\n board: string | undefined,\n grade: string | undefined,\n): IMilestoneFormData => {\n if (schoolData && grade) {\n const { country_code: countryCode, place_id: placeId } = schoolData;\n\n return {\n ...formData,\n grade: grade,\n schoolInfo: {\n countryCode: countryCode,\n stateCode: '',\n id: placeId,\n },\n board: formData.board ?? board ?? undefined,\n };\n }\n\n return formData;\n};\n\nconst appendPrimaryGoalCategoryToFormState = (\n config: IMilestoneConfig,\n testType: TTestType,\n grade: string | undefined,\n courseStream: TCourseStream,\n enrollmentType: TEnrollmentTypes,\n board?: string | undefined,\n country?: string | undefined,\n) => {\n const { goal_curriculum_map: goalCurriculumMap } = config;\n const isSchoolSuccessCategory = testType === 'no-test';\n const selectedGoalCategory = getTestTypeBasedCategory(testType);\n\n //TODO: This needs to compensate the course selection for US curriculum grade 8 & above\n const primaryGoalCurriculum = goalCurriculumMap.find(goalInfo => {\n const isCurrentGoalAvailable = computeCanIncludeCurrentGoal({\n currentGoalData: goalInfo,\n grade,\n currentCountryCode: country,\n selectedCategory: selectedGoalCategory,\n enrollmentType,\n });\n const { goal_curriculum_standard: goalCurriculumStandard } = goalInfo;\n\n const currentBoardAvailable = getIfGoalCurriculumStandardIsAccessible({\n goalCurriculumStandard,\n referenceStandard: board,\n });\n\n const isSameCourse = goalInfo.course_stream === courseStream;\n\n if (isSchoolSuccessCategory) {\n return isSameCourse && isCurrentGoalAvailable && currentBoardAvailable;\n }\n\n return isSameCourse && isCurrentGoalAvailable;\n });\n\n return primaryGoalCurriculum;\n};\n\nconst getDefaultBoard = (data: ISectionOption<TCurriculumStandardOption>[]) => {\n let recommendedBoards: TCurriculumStandardOption[] = [];\n let otherBoards: TCurriculumStandardOption[] = [];\n\n // Iterate through the data categories\n for (const category of data) {\n if (category.title === 'recommended') {\n recommendedBoards = category.data;\n } else if (category.title === 'others') {\n otherBoards = category.data;\n }\n }\n\n // 1. Check if any recommended board has isDefault: true\n const defaultBoard = recommendedBoards.find(board => board.isDefault && board.isRecommended);\n\n if (defaultBoard) {\n return defaultBoard.id;\n }\n\n // 2. If no default, return the first recommended board\n if (recommendedBoards.length > 0) {\n return recommendedBoards[0]?.id;\n }\n\n // 3. If no recommended, return the first board from others\n if (otherBoards.length > 0) {\n return otherBoards[0]?.id;\n }\n\n // 4. Return null if no boards are found\n return undefined;\n};\n\nexport {\n appendSchoolDataToFormState,\n appendPrimaryGoalCategoryToFormState,\n clearNextFields,\n generateFormStateWithPrefilledSchoolData,\n getCurrenStep,\n getGradesFromConfig,\n getCurriculumStandardsFromConfig,\n getGoalsFromConfig,\n getGradesBasedOnGoalAvailability,\n getMajorsFromConfigBasedOnBoardAndGrade,\n getSchoolTestsFromConfig,\n getRegionCodeBasedOnCountryCode,\n getDefaultBoard,\n getPreferencesFromConfig,\n};\n"],"names":["clearFields","obj","fieldsList","field","clearNextFields","formStep","milestoneFormData","currentStepName","startClearing","fieldsToClear","isLeafNode","next","reset","updatedFormData","shouldStartClearing","nextStep","step","conditionFulfilled","value","_a","getCurrenStep","flow","required","requiredFieldsFilled","GOAL_EDIT_FLOWS","requiredFieldsReviewed","requiredFieldsCommitted","getSchoolTestsFromConfig","config","acc","event","id","eventName","eventType","computeCanIncludeCurrentGoal","props","currentGoalData","enrollmentType","currentCountryCode","grade","selectedCategory","blockedCountries","availableCountries","availableGrades","goalCategory","availableEnrollmentTypes","blockedEnrollmentTypes","isStudentEnrollmentTypeSupported","getStudentEnrollmentSupported","isStudentRegionBlocked","blockedCountry","isStudentRegionAvailable","availableCountry","isCurrentGradeAvailable","gradeInfo","getCurriculumStandardsFromConfig","countryCode","courseStream","classRatio","goals","curriculumStandards","filteredGoalCurriculumMap","item","hasGoalForCurriculumStandards","standard","goal","checkEnrollmentAvailable","code","name","defaultInCountries","recommendedInCountries","a","b","getGoalsFromConfig","options","curriculumStandard","isEligibleGoal","label","getGradesFromConfig","getPreferencesFromConfig","preferenceConfig","isEligiblePreferences","preference","preferenceCategory","description","getGradesBasedOnGoalAvailability","selectedGoalCategory","grades","gradeAvailableGoals","goalData","getMajorsFromConfigBasedOnBoardAndGrade","boardCode","goalCurriculumMap","filterOnCourseStreamAndEnrollmentType","goalCurriculumStandard","programName","programCode","availableGrade","getRegionCodeBasedOnCountryCode","COUNTRY_MAP","countryInfo","generateFormStateWithPrefilledSchoolData","schoolData","board","placeId","regionCode","appendSchoolDataToFormState","formData","appendPrimaryGoalCategoryToFormState","testType","country","isSchoolSuccessCategory","getTestTypeBasedCategory","goalInfo","isCurrentGoalAvailable","currentBoardAvailable","getIfGoalCurriculumStandardIsAccessible","isSameCourse","getDefaultBoard","data","recommendedBoards","otherBoards","category","defaultBoard","_b"],"mappings":"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"}
|
@@ -1,144 +1,142 @@
|
|
1
|
-
import { useState as P, useMemo as
|
2
|
-
import j from "../../notifications/use-student-journey.js";
|
1
|
+
import { useState as P, useMemo as w, useRef as B, useCallback as N } from "react";
|
3
2
|
import { TEST_TYPE_TO_TEST_NAME as v } from "../constants.js";
|
4
|
-
import { checkIfCommittedFieldIsUpdated as
|
5
|
-
import { GOAL_EDIT_FLOWS as p, BRANCHING_FIELDS as
|
6
|
-
import
|
3
|
+
import { checkIfCommittedFieldIsUpdated as k } from "../edit/goal-edit-helpers.js";
|
4
|
+
import { GOAL_EDIT_FLOWS as p, BRANCHING_FIELDS as F } from "./milestone-create-constants.js";
|
5
|
+
import W, { CHAPTERS_SELECTION_FORM_TREE as j, ADD_CUSTOM_CHAPTERS as H, SET_COMPLETION_DATE as y } from "./milestone-create-form-tree.js";
|
7
6
|
import { appendSchoolDataToFormState as V, generateFormStateWithPrefilledSchoolData as Y, getCurrenStep as h, clearNextFields as q } from "./milestone-create-helpers.js";
|
8
|
-
const
|
9
|
-
schoolData:
|
10
|
-
board:
|
11
|
-
grade:
|
7
|
+
const $ = (l, {
|
8
|
+
schoolData: c,
|
9
|
+
board: t,
|
10
|
+
grade: r,
|
12
11
|
currentCountryCode: T,
|
13
|
-
flow:
|
12
|
+
flow: d
|
14
13
|
}) => {
|
15
|
-
const [
|
14
|
+
const [m, o] = P(() => l && p.includes(d) ? V(l, c, t, r) : {
|
16
15
|
...Y(
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
c,
|
17
|
+
t,
|
18
|
+
r,
|
20
19
|
T
|
21
20
|
)
|
22
21
|
});
|
23
|
-
return { formDataState:
|
24
|
-
},
|
25
|
-
flow:
|
26
|
-
formDataState:
|
27
|
-
isGoalCreation:
|
22
|
+
return { formDataState: m, setFormData: o };
|
23
|
+
}, x = ({
|
24
|
+
flow: l,
|
25
|
+
formDataState: c,
|
26
|
+
isGoalCreation: t
|
28
27
|
}) => {
|
29
|
-
const { testType:
|
30
|
-
return
|
31
|
-
if (p.includes(
|
32
|
-
const
|
33
|
-
...
|
28
|
+
const { testType: r } = c;
|
29
|
+
return w(() => {
|
30
|
+
if (p.includes(l) && r) {
|
31
|
+
const d = {
|
32
|
+
...j,
|
34
33
|
isRootNode: !0,
|
35
|
-
title: v[
|
36
|
-
},
|
37
|
-
return
|
34
|
+
title: v[r]
|
35
|
+
}, m = Object.assign({}, H), o = Object.assign({}, y);
|
36
|
+
return t || (m.buttonLabel = "Add to learning plan", d.buttonLabel = "Update"), l === "EDIT" && (o.buttonLabel = "Update goal"), (!t || r === "no-test") && (d.next = [m, o]), d;
|
38
37
|
}
|
39
|
-
return
|
40
|
-
}, [
|
41
|
-
},
|
42
|
-
flow:
|
43
|
-
updatedFormTree:
|
44
|
-
formData:
|
45
|
-
formDataState:
|
38
|
+
return W;
|
39
|
+
}, [l, r, t]);
|
40
|
+
}, a = ({
|
41
|
+
flow: l,
|
42
|
+
updatedFormTree: c,
|
43
|
+
formData: t,
|
44
|
+
formDataState: r,
|
46
45
|
setFormData: T,
|
47
|
-
handleExit:
|
46
|
+
handleExit: d
|
48
47
|
}) => {
|
49
|
-
const
|
50
|
-
() => h(
|
51
|
-
[
|
52
|
-
), O =
|
53
|
-
(
|
54
|
-
T((
|
55
|
-
const S =
|
56
|
-
if (p.includes(
|
57
|
-
const
|
58
|
-
...
|
59
|
-
...
|
48
|
+
const m = B(r), o = (t == null ? void 0 : t.currentFlow) ?? l, i = w(
|
49
|
+
() => h(c, t, o),
|
50
|
+
[c, t, o]
|
51
|
+
), O = i == null ? void 0 : i.name, b = !!(i != null && i.isRootNode), E = N(
|
52
|
+
(e) => {
|
53
|
+
T((s) => {
|
54
|
+
const S = s.testType;
|
55
|
+
if (p.includes(o)) {
|
56
|
+
const A = {
|
57
|
+
...s.committed,
|
58
|
+
...e.committed
|
60
59
|
}, C = [];
|
61
|
-
if (Object.entries((
|
62
|
-
const
|
63
|
-
if (
|
64
|
-
field:
|
65
|
-
isFieldCommited:
|
66
|
-
prevFormData:
|
67
|
-
newValueOfField:
|
68
|
-
formDataStateRef:
|
60
|
+
if (Object.entries((e == null ? void 0 : e.committed) || {}).forEach((R) => {
|
61
|
+
const n = R[0], U = !!R[1], M = e[n] ?? s[n];
|
62
|
+
if (k({
|
63
|
+
field: n,
|
64
|
+
isFieldCommited: U,
|
65
|
+
prevFormData: s,
|
66
|
+
newValueOfField: M,
|
67
|
+
formDataStateRef: m.current
|
69
68
|
})) {
|
70
69
|
let _ = [];
|
71
|
-
S && S === "no-test" && (_ = _.concat(["board"])), _.includes(
|
70
|
+
S && S === "no-test" && (_ = _.concat(["board"])), _.includes(n) || C.push(n);
|
72
71
|
}
|
73
|
-
}), C.length > 0 && C.some((
|
74
|
-
const
|
75
|
-
|
76
|
-
|
72
|
+
}), C.length > 0 && C.some((n) => F.includes(n))) {
|
73
|
+
const n = q(
|
74
|
+
c,
|
75
|
+
s,
|
77
76
|
O,
|
78
|
-
|
77
|
+
b,
|
79
78
|
[]
|
80
79
|
);
|
81
|
-
if (
|
80
|
+
if (n)
|
82
81
|
return {
|
83
|
-
...
|
84
|
-
...
|
82
|
+
...n,
|
83
|
+
...e,
|
85
84
|
committed: {
|
86
|
-
...
|
87
|
-
...
|
85
|
+
...n.committed,
|
86
|
+
...e.committed
|
88
87
|
},
|
89
88
|
reviewed: {
|
90
|
-
...
|
89
|
+
...A
|
91
90
|
},
|
92
91
|
currentFlow: "CREATE"
|
93
92
|
};
|
94
93
|
}
|
95
94
|
return {
|
96
|
-
...
|
97
|
-
...
|
95
|
+
...s,
|
96
|
+
...e,
|
98
97
|
committed: {
|
99
|
-
...
|
100
|
-
...
|
98
|
+
...s.committed,
|
99
|
+
...e.committed
|
101
100
|
},
|
102
|
-
reviewed:
|
101
|
+
reviewed: A
|
103
102
|
};
|
104
103
|
}
|
105
|
-
const { committed:
|
104
|
+
const { committed: u, reviewed: f, ...L } = s;
|
106
105
|
return {
|
107
106
|
...L,
|
108
|
-
...
|
107
|
+
...e,
|
109
108
|
committed: {
|
110
|
-
...
|
111
|
-
...
|
109
|
+
...u,
|
110
|
+
...e.committed
|
112
111
|
},
|
113
112
|
reviewed: {}
|
114
113
|
};
|
115
114
|
});
|
116
115
|
},
|
117
|
-
[T,
|
118
|
-
),
|
119
|
-
if (
|
120
|
-
const { reset:
|
116
|
+
[T, o, c, O, b]
|
117
|
+
), I = N(() => {
|
118
|
+
if (i) {
|
119
|
+
const { reset: e, rollback: s, isRootNode: S } = i;
|
121
120
|
if (S) {
|
122
|
-
|
121
|
+
d == null || d();
|
123
122
|
return;
|
124
123
|
}
|
125
|
-
const
|
124
|
+
const u = {
|
126
125
|
committed: {},
|
127
126
|
reviewed: {}
|
128
127
|
};
|
129
|
-
p.includes(
|
130
|
-
|
131
|
-
}) :
|
132
|
-
|
133
|
-
}), E(
|
128
|
+
p.includes(o) ? s.forEach((f) => {
|
129
|
+
u.reviewed[f] = void 0;
|
130
|
+
}) : e.forEach((f) => (u[f] = void 0, !0)), s.forEach((f) => {
|
131
|
+
u.committed[f] = void 0;
|
132
|
+
}), E(u);
|
134
133
|
}
|
135
|
-
}, [
|
136
|
-
return { currentStep:
|
134
|
+
}, [i, o, E, d]);
|
135
|
+
return { currentStep: i, updateFormData: E, handleBack: I };
|
137
136
|
};
|
138
137
|
export {
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
g as useMilestoneInfoTransitionsControl
|
138
|
+
$ as useFormDataPrefiller,
|
139
|
+
a as useFormTreeTraversal,
|
140
|
+
x as useMilestoneFormTree
|
143
141
|
};
|
144
142
|
//# sourceMappingURL=milestone-create-hooks.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"milestone-create-hooks.js","sources":["../../../../src/features/milestone/create/milestone-create-hooks.ts"],"sourcesContent":["import type IStudentSchool from '../../../types/models/school';\nimport type { IStudentJourneyData } from '../../notifications/types';\nimport type { TUserTypes } from '../../ui/types';\nimport type {\n IFormStep,\n IFormStepProps,\n IMileStoneFormFields,\n IMilestoneConfig,\n IMilestoneFormData,\n TMilesonteFormStateField,\n TMilestoneFormFlow,\n} from './milestone-create-types';\n\nimport { useCallback, useMemo, useRef, useState } from 'react';\n\nimport useStudentJourneys from '../../notifications/use-student-journey';\nimport { TEST_TYPE_TO_TEST_NAME } from '../constants';\nimport { checkIfCommittedFieldIsUpdated } from '../edit/goal-edit-helpers';\nimport { BRANCHING_FIELDS, GOAL_EDIT_FLOWS } from './milestone-create-constants';\nimport FORM_TREE, {\n ADD_CUSTOM_CHAPTERS,\n CHAPTERS_SELECTION_FORM_TREE,\n SET_COMPLETION_DATE,\n} from './milestone-create-form-tree';\nimport {\n appendSchoolDataToFormState,\n clearNextFields,\n generateFormStateWithPrefilledSchoolData,\n getCurrenStep,\n} from './milestone-create-helpers';\n\n//TODO: right now it is for only one step, but should be for all steps in future if needed\nconst useFormDataPrefiller = (\n formDataProp: IMilestoneFormData | undefined,\n {\n schoolData,\n board,\n grade,\n currentCountryCode,\n flow,\n }: {\n grade: string;\n schoolData: IStudentSchool | undefined;\n board: string | undefined;\n config: IMilestoneConfig;\n journeysToInclude: IStudentJourneyData[];\n flow: TMilestoneFormFlow;\n currentCountryCode?: string;\n },\n) => {\n const [formDataState, setFormData] = useState<IMilestoneFormData>(() => {\n if (formDataProp && GOAL_EDIT_FLOWS.includes(flow)) {\n return appendSchoolDataToFormState(formDataProp, schoolData, board, grade);\n }\n\n const formStateWithPrefilledSchoolData = generateFormStateWithPrefilledSchoolData(\n schoolData,\n board,\n grade,\n currentCountryCode,\n );\n\n return {\n ...formStateWithPrefilledSchoolData,\n };\n });\n\n return { formDataState, setFormData };\n};\n\nconst useMilestoneInfoTransitionsControl = (userType: TUserTypes, studentId: string | null) => {\n const journeysToInclude = useStudentJourneys(userType === 'TEACHER' ? studentId : null);\n\n return journeysToInclude;\n};\n\n/**\n * Based on the flow returns the correct modified tree\n */\nconst useMilestoneFormTree = ({\n flow,\n formDataState,\n isGoalCreation,\n}: {\n isFirstMilestoneCreated: boolean;\n flow: TMilestoneFormFlow;\n formDataState: IMilestoneFormData;\n isGoalCreation?: boolean;\n}) => {\n const { testType } = formDataState;\n\n const updatedFormTree: IFormStep = useMemo(() => {\n if (GOAL_EDIT_FLOWS.includes(flow) && testType) {\n const formTreeInfo = {\n ...CHAPTERS_SELECTION_FORM_TREE,\n isRootNode: true,\n title: TEST_TYPE_TO_TEST_NAME[testType],\n };\n\n //* Creating a shallow copy as we need to change only first level element.\n const addCustomChapter = Object.assign({}, ADD_CUSTOM_CHAPTERS);\n const setCompletionDate = Object.assign({}, SET_COMPLETION_DATE);\n\n //* To compensate existing milestones chapter addition.\n if (!isGoalCreation) {\n addCustomChapter.buttonLabel = 'Add to learning plan';\n formTreeInfo.buttonLabel = 'Update';\n }\n\n if (flow === 'EDIT') {\n setCompletionDate.buttonLabel = 'Update goal';\n }\n\n if (!isGoalCreation || testType === 'no-test') {\n formTreeInfo.next = [addCustomChapter, setCompletionDate];\n }\n\n return formTreeInfo;\n }\n\n return FORM_TREE;\n }, [flow, testType, isGoalCreation]);\n\n return updatedFormTree;\n};\n\n/**\n * This hook holds the logic to run the traversal of the tree during different flows.\n * While most of the logic is same for all flows, DRAFT_EDIT and DRAFT_REVIEW flows require extra logic where a user can navigate back and forth steps without clearing data.\n * Internally, this hook uses a currentFlow variable which is initially set to the flow but changes to CREATE flow, when certain BRANCHING_FIELDS are edited.\n * BRANCHING_FIELDS are fields on edition of which the flow might change and hence the prefilled data, needs to be cleared.\n * @returns `currentStep` - the current step the tree should be at\n * @returns `updateFormData` - the method to update form data\n * @returns `handleBack` - the method to handle back navigation\n */\nconst useFormTreeTraversal = ({\n flow,\n updatedFormTree,\n formData,\n formDataState,\n setFormData,\n handleExit,\n}: {\n flow: TMilestoneFormFlow;\n updatedFormTree: IFormStep;\n formData: IMilestoneFormData;\n formDataState: IMilestoneFormData;\n setFormData: React.Dispatch<React.SetStateAction<IMilestoneFormData>>;\n handleExit?: () => void;\n}) => {\n const formDataStateRef = useRef(formDataState);\n const currentFlow = formData?.currentFlow ?? flow;\n\n const currentStep = useMemo(\n () => getCurrenStep(updatedFormTree, formData, currentFlow),\n [updatedFormTree, formData, currentFlow],\n );\n\n const currentStepName = currentStep?.name;\n const isCurrentStepRoot = Boolean(currentStep?.isRootNode);\n\n const updateFormData = useCallback<IFormStepProps['onFormDataChange']>(\n changedFormData => {\n setFormData(prevFormData => {\n const currentTestType = prevFormData.testType;\n\n if (GOAL_EDIT_FLOWS.includes(currentFlow)) {\n const updatedReviewed = {\n ...prevFormData.committed,\n ...changedFormData.committed,\n };\n const updatedFields: TMilesonteFormStateField[] = [];\n\n Object.entries(changedFormData?.committed || {}).forEach(entry => {\n const field = entry[0] as keyof IMileStoneFormFields;\n const isFieldCommited = Boolean(entry[1]);\n const newValueOfField = changedFormData[field] ?? prevFormData[field];\n\n const isFieldUpdatedAndCommitted = checkIfCommittedFieldIsUpdated({\n field,\n isFieldCommited,\n prevFormData,\n newValueOfField,\n formDataStateRef: formDataStateRef.current,\n });\n\n if (isFieldUpdatedAndCommitted) {\n let exceptedFields: TMilesonteFormStateField[] = [];\n\n if (currentTestType && currentTestType === 'no-test') {\n exceptedFields = exceptedFields.concat(['board']);\n }\n\n if (!exceptedFields.includes(field)) {\n updatedFields.push(field);\n }\n }\n });\n\n if (updatedFields.length > 0) {\n const isBranchingFieldUpdated = updatedFields.some(field => {\n return BRANCHING_FIELDS.includes(field);\n });\n\n if (isBranchingFieldUpdated) {\n const updatedTree = clearNextFields(\n updatedFormTree,\n prevFormData,\n currentStepName,\n isCurrentStepRoot,\n [],\n );\n\n if (updatedTree)\n return {\n ...updatedTree,\n ...changedFormData,\n committed: {\n ...updatedTree.committed,\n ...changedFormData.committed,\n },\n reviewed: {\n ...updatedReviewed,\n },\n currentFlow: 'CREATE',\n };\n }\n }\n\n return {\n ...prevFormData,\n ...changedFormData,\n committed: {\n ...prevFormData.committed,\n ...changedFormData.committed,\n },\n reviewed: updatedReviewed,\n };\n }\n\n const { committed: prevFormCommitted, reviewed, ...fieldsData } = prevFormData;\n\n return {\n ...fieldsData,\n ...changedFormData,\n committed: {\n ...prevFormCommitted,\n ...changedFormData.committed,\n },\n reviewed: {},\n };\n });\n },\n [setFormData, currentFlow, updatedFormTree, currentStepName, isCurrentStepRoot],\n );\n\n const handleBack = useCallback(() => {\n if (currentStep) {\n const { reset, rollback, isRootNode } = currentStep;\n\n if (isRootNode) {\n handleExit?.();\n\n return;\n }\n\n const data: IMilestoneFormData = {\n committed: {},\n reviewed: {},\n };\n\n if (!GOAL_EDIT_FLOWS.includes(currentFlow)) {\n reset.forEach(field => {\n data[field] = undefined;\n\n return true;\n });\n } else {\n rollback.forEach(field => {\n data.reviewed[field] = undefined;\n });\n }\n rollback.forEach(field => {\n data.committed[field] = undefined;\n });\n\n updateFormData(data);\n }\n }, [currentStep, currentFlow, updateFormData, handleExit]);\n\n return { currentStep, updateFormData, handleBack };\n};\n\nexport {\n useFormDataPrefiller,\n useFormTreeTraversal,\n useMilestoneFormTree,\n useMilestoneInfoTransitionsControl,\n};\n"],"names":["useFormDataPrefiller","formDataProp","schoolData","board","grade","currentCountryCode","flow","formDataState","setFormData","useState","GOAL_EDIT_FLOWS","appendSchoolDataToFormState","generateFormStateWithPrefilledSchoolData","useMilestoneInfoTransitionsControl","userType","studentId","useStudentJourneys","useMilestoneFormTree","isGoalCreation","testType","useMemo","formTreeInfo","CHAPTERS_SELECTION_FORM_TREE","TEST_TYPE_TO_TEST_NAME","addCustomChapter","ADD_CUSTOM_CHAPTERS","setCompletionDate","SET_COMPLETION_DATE","FORM_TREE","useFormTreeTraversal","updatedFormTree","formData","handleExit","formDataStateRef","useRef","currentFlow","currentStep","getCurrenStep","currentStepName","isCurrentStepRoot","updateFormData","useCallback","changedFormData","prevFormData","currentTestType","updatedReviewed","updatedFields","entry","field","isFieldCommited","newValueOfField","checkIfCommittedFieldIsUpdated","exceptedFields","BRANCHING_FIELDS","updatedTree","clearNextFields","prevFormCommitted","reviewed","fieldsData","handleBack","reset","rollback","isRootNode","data"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"milestone-create-hooks.js","sources":["../../../../src/features/milestone/create/milestone-create-hooks.ts"],"sourcesContent":["import type IStudentSchool from '../../../types/models/school';\nimport type {\n IFormStep,\n IFormStepProps,\n IMileStoneFormFields,\n IMilestoneConfig,\n IMilestoneFormData,\n TMilestoneFormStateField,\n TMilestoneFormFlow,\n} from './milestone-create-types';\n\nimport { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { TEST_TYPE_TO_TEST_NAME } from '../constants';\nimport { checkIfCommittedFieldIsUpdated } from '../edit/goal-edit-helpers';\nimport { BRANCHING_FIELDS, GOAL_EDIT_FLOWS } from './milestone-create-constants';\nimport FORM_TREE, {\n ADD_CUSTOM_CHAPTERS,\n CHAPTERS_SELECTION_FORM_TREE,\n SET_COMPLETION_DATE,\n} from './milestone-create-form-tree';\nimport {\n appendSchoolDataToFormState,\n clearNextFields,\n generateFormStateWithPrefilledSchoolData,\n getCurrenStep,\n} from './milestone-create-helpers';\n\n//TODO: right now it is for only one step, but should be for all steps in future if needed\nconst useFormDataPrefiller = (\n formDataProp: IMilestoneFormData | undefined,\n {\n schoolData,\n board,\n grade,\n currentCountryCode,\n flow,\n }: {\n grade: string;\n schoolData: IStudentSchool | undefined;\n board: string | undefined;\n config: IMilestoneConfig;\n flow: TMilestoneFormFlow;\n currentCountryCode?: string;\n },\n) => {\n const [formDataState, setFormData] = useState<IMilestoneFormData>(() => {\n if (formDataProp && GOAL_EDIT_FLOWS.includes(flow)) {\n return appendSchoolDataToFormState(formDataProp, schoolData, board, grade);\n }\n\n const formStateWithPrefilledSchoolData = generateFormStateWithPrefilledSchoolData(\n schoolData,\n board,\n grade,\n currentCountryCode,\n );\n\n return {\n ...formStateWithPrefilledSchoolData,\n };\n });\n\n return { formDataState, setFormData };\n};\n\n/**\n * Based on the flow returns the correct modified tree\n */\nconst useMilestoneFormTree = ({\n flow,\n formDataState,\n isGoalCreation,\n}: {\n flow: TMilestoneFormFlow;\n formDataState: IMilestoneFormData;\n isGoalCreation?: boolean;\n}) => {\n const { testType } = formDataState;\n\n const updatedFormTree: IFormStep = useMemo(() => {\n if (GOAL_EDIT_FLOWS.includes(flow) && testType) {\n const formTreeInfo = {\n ...CHAPTERS_SELECTION_FORM_TREE,\n isRootNode: true,\n title: TEST_TYPE_TO_TEST_NAME[testType],\n };\n\n //* Creating a shallow copy as we need to change only first level element.\n const addCustomChapter = Object.assign({}, ADD_CUSTOM_CHAPTERS);\n const setCompletionDate = Object.assign({}, SET_COMPLETION_DATE);\n\n //* To compensate existing milestones chapter addition.\n if (!isGoalCreation) {\n addCustomChapter.buttonLabel = 'Add to learning plan';\n formTreeInfo.buttonLabel = 'Update';\n }\n\n if (flow === 'EDIT') {\n setCompletionDate.buttonLabel = 'Update goal';\n }\n\n if (!isGoalCreation || testType === 'no-test') {\n formTreeInfo.next = [addCustomChapter, setCompletionDate];\n }\n\n return formTreeInfo;\n }\n\n return FORM_TREE;\n }, [flow, testType, isGoalCreation]);\n\n return updatedFormTree;\n};\n\n/**\n * This hook holds the logic to run the traversal of the tree during different flows.\n * While most of the logic is same for all flows, DRAFT_EDIT and DRAFT_REVIEW flows require extra logic where a user can navigate back and forth steps without clearing data.\n * Internally, this hook uses a currentFlow variable which is initially set to the flow but changes to CREATE flow, when certain BRANCHING_FIELDS are edited.\n * BRANCHING_FIELDS are fields on edition of which the flow might change and hence the prefilled data, needs to be cleared.\n * @returns `currentStep` - the current step the tree should be at\n * @returns `updateFormData` - the method to update form data\n * @returns `handleBack` - the method to handle back navigation\n */\nconst useFormTreeTraversal = ({\n flow,\n updatedFormTree,\n formData,\n formDataState,\n setFormData,\n handleExit,\n}: {\n flow: TMilestoneFormFlow;\n updatedFormTree: IFormStep;\n formData: IMilestoneFormData;\n formDataState: IMilestoneFormData;\n setFormData: React.Dispatch<React.SetStateAction<IMilestoneFormData>>;\n handleExit?: () => void;\n}) => {\n const formDataStateRef = useRef(formDataState);\n const currentFlow = formData?.currentFlow ?? flow;\n\n const currentStep = useMemo(\n () => getCurrenStep(updatedFormTree, formData, currentFlow),\n [updatedFormTree, formData, currentFlow],\n );\n\n const currentStepName = currentStep?.name;\n const isCurrentStepRoot = Boolean(currentStep?.isRootNode);\n\n const updateFormData = useCallback<IFormStepProps['onFormDataChange']>(\n changedFormData => {\n setFormData(prevFormData => {\n const currentTestType = prevFormData.testType;\n\n if (GOAL_EDIT_FLOWS.includes(currentFlow)) {\n const updatedReviewed = {\n ...prevFormData.committed,\n ...changedFormData.committed,\n };\n const updatedFields: TMilestoneFormStateField[] = [];\n\n Object.entries(changedFormData?.committed || {}).forEach(entry => {\n const field = entry[0] as keyof IMileStoneFormFields;\n const isFieldCommited = Boolean(entry[1]);\n const newValueOfField = changedFormData[field] ?? prevFormData[field];\n\n const isFieldUpdatedAndCommitted = checkIfCommittedFieldIsUpdated({\n field,\n isFieldCommited,\n prevFormData,\n newValueOfField,\n formDataStateRef: formDataStateRef.current,\n });\n\n if (isFieldUpdatedAndCommitted) {\n let exceptedFields: TMilestoneFormStateField[] = [];\n\n if (currentTestType && currentTestType === 'no-test') {\n exceptedFields = exceptedFields.concat(['board']);\n }\n\n if (!exceptedFields.includes(field)) {\n updatedFields.push(field);\n }\n }\n });\n\n if (updatedFields.length > 0) {\n const isBranchingFieldUpdated = updatedFields.some(field => {\n return BRANCHING_FIELDS.includes(field);\n });\n\n if (isBranchingFieldUpdated) {\n const updatedTree = clearNextFields(\n updatedFormTree,\n prevFormData,\n currentStepName,\n isCurrentStepRoot,\n [],\n );\n\n if (updatedTree)\n return {\n ...updatedTree,\n ...changedFormData,\n committed: {\n ...updatedTree.committed,\n ...changedFormData.committed,\n },\n reviewed: {\n ...updatedReviewed,\n },\n currentFlow: 'CREATE',\n };\n }\n }\n\n return {\n ...prevFormData,\n ...changedFormData,\n committed: {\n ...prevFormData.committed,\n ...changedFormData.committed,\n },\n reviewed: updatedReviewed,\n };\n }\n\n const { committed: prevFormCommitted, reviewed, ...fieldsData } = prevFormData;\n\n return {\n ...fieldsData,\n ...changedFormData,\n committed: {\n ...prevFormCommitted,\n ...changedFormData.committed,\n },\n reviewed: {},\n };\n });\n },\n [setFormData, currentFlow, updatedFormTree, currentStepName, isCurrentStepRoot],\n );\n\n const handleBack = useCallback(() => {\n if (currentStep) {\n const { reset, rollback, isRootNode } = currentStep;\n\n if (isRootNode) {\n handleExit?.();\n\n return;\n }\n\n const data: IMilestoneFormData = {\n committed: {},\n reviewed: {},\n };\n\n if (!GOAL_EDIT_FLOWS.includes(currentFlow)) {\n reset.forEach(field => {\n data[field] = undefined;\n\n return true;\n });\n } else {\n rollback.forEach(field => {\n data.reviewed[field] = undefined;\n });\n }\n rollback.forEach(field => {\n data.committed[field] = undefined;\n });\n\n updateFormData(data);\n }\n }, [currentStep, currentFlow, updateFormData, handleExit]);\n\n return { currentStep, updateFormData, handleBack };\n};\n\nexport { useFormDataPrefiller, useFormTreeTraversal, useMilestoneFormTree };\n"],"names":["useFormDataPrefiller","formDataProp","schoolData","board","grade","currentCountryCode","flow","formDataState","setFormData","useState","GOAL_EDIT_FLOWS","appendSchoolDataToFormState","generateFormStateWithPrefilledSchoolData","useMilestoneFormTree","isGoalCreation","testType","useMemo","formTreeInfo","CHAPTERS_SELECTION_FORM_TREE","TEST_TYPE_TO_TEST_NAME","addCustomChapter","ADD_CUSTOM_CHAPTERS","setCompletionDate","SET_COMPLETION_DATE","FORM_TREE","useFormTreeTraversal","updatedFormTree","formData","handleExit","formDataStateRef","useRef","currentFlow","currentStep","getCurrenStep","currentStepName","isCurrentStepRoot","updateFormData","useCallback","changedFormData","prevFormData","currentTestType","updatedReviewed","updatedFields","entry","field","isFieldCommited","newValueOfField","checkIfCommittedFieldIsUpdated","exceptedFields","BRANCHING_FIELDS","updatedTree","clearNextFields","prevFormCommitted","reviewed","fieldsData","handleBack","reset","rollback","isRootNode","data"],"mappings":"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"}
|
@@ -1,12 +1,12 @@
|
|
1
1
|
import r from "styled-components";
|
2
2
|
import n from "../../ui/layout/flex-view.js";
|
3
|
-
const
|
4
|
-
({ $height: o, $viewMode:
|
3
|
+
const l = r.div(
|
4
|
+
({ $height: o, $viewMode: e, $minHeight: t }) => `
|
5
5
|
display: flex;
|
6
6
|
flex-direction: column;
|
7
7
|
height: ${o ? typeof o == "number" ? `${o}px` : `${o}` : "auto"};
|
8
|
-
min-height: ${
|
9
|
-
${
|
8
|
+
min-height: ${t || "auto"};
|
9
|
+
${e ? `
|
10
10
|
cursor: not-allowed;
|
11
11
|
border: 2px solid black;
|
12
12
|
border-radius: 8px;
|
@@ -16,8 +16,8 @@ const d = r.div(
|
|
16
16
|
}
|
17
17
|
` : ""}
|
18
18
|
`
|
19
|
-
),
|
20
|
-
({ theme: o, $viewMode:
|
19
|
+
), d = r.div(
|
20
|
+
({ theme: o, $viewMode: e }) => `
|
21
21
|
position: relative;
|
22
22
|
display: flex;
|
23
23
|
flex-direction: column;
|
@@ -25,7 +25,7 @@ const d = r.div(
|
|
25
25
|
margin-bottom: ${o.layout.gutter * 0.5}px;
|
26
26
|
border: 1px solid ${o.colors.GREY_1};
|
27
27
|
border-radius: ${o.layout.gutter * 0.75}px;
|
28
|
-
${
|
28
|
+
${e ? `
|
29
29
|
pointer-events: none;
|
30
30
|
// opacity: 0.85;
|
31
31
|
` : ""}
|
@@ -45,34 +45,25 @@ const d = r.div(
|
|
45
45
|
position: fixed;
|
46
46
|
bottom: 24px;
|
47
47
|
right: 24px;
|
48
|
-
`)
|
49
|
-
r.div(({ theme: o }) => {
|
50
|
-
const { gutter: t } = o.layout;
|
51
|
-
return `
|
52
|
-
position: absolute;
|
53
|
-
top: ${t * 2}px;
|
54
|
-
left: ${t * 1.5}px;
|
55
|
-
`;
|
56
|
-
});
|
57
|
-
const x = r.img(({ theme: o, $backgroundColor: t }) => {
|
48
|
+
`), x = r.img(({ theme: o, $backgroundColor: e }) => {
|
58
49
|
const {
|
59
|
-
layout: { gutter:
|
50
|
+
layout: { gutter: t },
|
60
51
|
colors: i
|
61
52
|
} = o;
|
62
53
|
return `
|
63
|
-
width: ${
|
64
|
-
height: ${
|
65
|
-
background: ${i[
|
66
|
-
border-radius: ${
|
54
|
+
width: ${t * 6}px;
|
55
|
+
height: ${t * 6}px;
|
56
|
+
background: ${i[e]};
|
57
|
+
border-radius: ${t * 0.5}px;
|
67
58
|
`;
|
68
|
-
}), f = r(n)(({ theme: o, $viewMode:
|
59
|
+
}), f = r(n)(({ theme: o, $viewMode: e }) => {
|
69
60
|
const {
|
70
|
-
layout: { gutter:
|
61
|
+
layout: { gutter: t }
|
71
62
|
} = o;
|
72
63
|
return `
|
73
64
|
position:relative;
|
74
|
-
min-height:${
|
75
|
-
${
|
65
|
+
min-height:${t * 2.75}px;
|
66
|
+
${e ? `
|
76
67
|
pointer-events: none;
|
77
68
|
opacity: 0.85;
|
78
69
|
` : ""}
|
@@ -81,20 +72,15 @@ const x = r.img(({ theme: o, $backgroundColor: t }) => {
|
|
81
72
|
position: absolute;
|
82
73
|
left: 50%;
|
83
74
|
transform: translateX(-50%);
|
84
|
-
`, b = r(n)`
|
85
|
-
border-radius: 0 0 8px 8px;
|
86
|
-
margin: auto;
|
87
|
-
width: 328px;
|
88
75
|
`;
|
89
76
|
export {
|
90
|
-
|
91
|
-
|
77
|
+
d as BodyContainer,
|
78
|
+
l as Container,
|
92
79
|
a as ContentContainer,
|
93
80
|
c as FooterWrapper,
|
94
81
|
u as HeaderContainer,
|
95
82
|
f as HeaderWrapper,
|
96
83
|
x as RadioCardIcon,
|
97
|
-
$ as StepperWrapper
|
98
|
-
b as SyncIndicator
|
84
|
+
$ as StepperWrapper
|
99
85
|
};
|
100
86
|
//# sourceMappingURL=milestone-create-styled.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"milestone-create-styled.js","sources":["../../../../src/features/milestone/create/milestone-create-styled.tsx"],"sourcesContent":["import type { TColorNames } from '../../ui/types';\n\nimport styled from 'styled-components';\n\nimport FlexView from '../../ui/layout/flex-view';\n\ninterface ContainerProps {\n $height?: string | number;\n $minHeight?: string;\n $viewMode: boolean;\n}\n\nconst Container = styled.div<ContainerProps>(\n ({ $height, $viewMode, $minHeight }) => `\n display: flex;\n flex-direction: column;\n height: ${$height ? (typeof $height === 'number' ? `${$height}px` : `${$height}`) : 'auto'};\n min-height: ${$minHeight ? $minHeight : 'auto'};\n ${\n $viewMode\n ? `\n cursor: not-allowed;\n border: 2px solid black;\n border-radius: 8px;\n transform: scale3d(.9943, .9900, 1);\n & ${ContentContainer} {\n pointer-events: auto;\n }\n `\n : ``\n }\n`,\n);\n\nconst BodyContainer = styled.div<{ $viewMode?: boolean }>(\n ({ theme, $viewMode }) => `\n position: relative;\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n margin-bottom: ${theme.layout.gutter * 0.5}px;\n border: 1px solid ${theme.colors.GREY_1};\n border-radius: ${theme.layout.gutter * 0.75}px;\n ${\n $viewMode\n ? `\n pointer-events: none;\n // opacity: 0.85;\n `\n : ``\n }\n`,\n);\n\ninterface IContentContainer {\n $overflowHidden?: boolean;\n}\n\nconst ContentContainer = styled.div<IContentContainer>(({ $overflowHidden }) => {\n return `\n flex-grow: 1;\n overflow-y: auto;\n\n ${$overflowHidden && 'overflow: hidden'};\n `;\n});\n\nconst HeaderContainer = styled(FlexView)(({ theme }) => {\n return `\n position: sticky;\n top: 0;\n z-index: 2;\n border-bottom: 1px solid ${theme.colors.WHITE_5};\n `;\n});\n\nconst FooterWrapper = styled(FlexView)(() => {\n return `\n align-self: flex-end;\n position: fixed;\n bottom: 24px;\n right: 24px;\n `;\n});\n\
|
1
|
+
{"version":3,"file":"milestone-create-styled.js","sources":["../../../../src/features/milestone/create/milestone-create-styled.tsx"],"sourcesContent":["import type { TColorNames } from '../../ui/types';\n\nimport styled from 'styled-components';\n\nimport FlexView from '../../ui/layout/flex-view';\n\ninterface ContainerProps {\n $height?: string | number;\n $minHeight?: string;\n $viewMode: boolean;\n}\n\nconst Container = styled.div<ContainerProps>(\n ({ $height, $viewMode, $minHeight }) => `\n display: flex;\n flex-direction: column;\n height: ${$height ? (typeof $height === 'number' ? `${$height}px` : `${$height}`) : 'auto'};\n min-height: ${$minHeight ? $minHeight : 'auto'};\n ${\n $viewMode\n ? `\n cursor: not-allowed;\n border: 2px solid black;\n border-radius: 8px;\n transform: scale3d(.9943, .9900, 1);\n & ${ContentContainer} {\n pointer-events: auto;\n }\n `\n : ``\n }\n`,\n);\n\nconst BodyContainer = styled.div<{ $viewMode?: boolean }>(\n ({ theme, $viewMode }) => `\n position: relative;\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n margin-bottom: ${theme.layout.gutter * 0.5}px;\n border: 1px solid ${theme.colors.GREY_1};\n border-radius: ${theme.layout.gutter * 0.75}px;\n ${\n $viewMode\n ? `\n pointer-events: none;\n // opacity: 0.85;\n `\n : ``\n }\n`,\n);\n\ninterface IContentContainer {\n $overflowHidden?: boolean;\n}\n\nconst ContentContainer = styled.div<IContentContainer>(({ $overflowHidden }) => {\n return `\n flex-grow: 1;\n overflow-y: auto;\n\n ${$overflowHidden && 'overflow: hidden'};\n `;\n});\n\nconst HeaderContainer = styled(FlexView)(({ theme }) => {\n return `\n position: sticky;\n top: 0;\n z-index: 2;\n border-bottom: 1px solid ${theme.colors.WHITE_5};\n `;\n});\n\nconst FooterWrapper = styled(FlexView)(() => {\n return `\n align-self: flex-end;\n position: fixed;\n bottom: 24px;\n right: 24px;\n `;\n});\n\ninterface IRadioCardIconProps {\n $backgroundColor: TColorNames;\n}\n\nconst RadioCardIcon = styled.img<IRadioCardIconProps>(({ theme, $backgroundColor }) => {\n const {\n layout: { gutter },\n colors,\n } = theme;\n\n return `\n width: ${gutter * 6}px;\n height: ${gutter * 6}px;\n background: ${colors[$backgroundColor]};\n border-radius: ${gutter * 0.5}px;\n `;\n});\n\nconst HeaderWrapper = styled(FlexView)<{ $viewMode?: boolean }>(({ theme, $viewMode }) => {\n const {\n layout: { gutter },\n } = theme;\n\n return `\n position:relative;\n min-height:${gutter * 2.75}px;\n ${\n $viewMode\n ? `\n pointer-events: none;\n opacity: 0.85;\n `\n : ``\n }\n`;\n});\n\nconst StepperWrapper = styled.div`\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n`;\n\nexport {\n Container,\n BodyContainer,\n ContentContainer,\n HeaderContainer,\n FooterWrapper,\n RadioCardIcon,\n StepperWrapper,\n HeaderWrapper,\n};\n"],"names":["Container","styled","$height","$viewMode","$minHeight","ContentContainer","BodyContainer","theme","$overflowHidden","HeaderContainer","FlexView","FooterWrapper","RadioCardIcon","$backgroundColor","gutter","colors","HeaderWrapper","StepperWrapper"],"mappings":";;AAYA,MAAMA,IAAYC,EAAO;AAAA,EACvB,CAAC,EAAE,SAAAC,GAAS,WAAAC,GAAW,YAAAC,EAAiB,MAAA;AAAA;AAAA;AAAA,YAG9BF,IAAW,OAAOA,KAAY,WAAW,GAAGA,CAAO,OAAO,GAAGA,CAAO,KAAM,MAAM;AAAA,gBAC5EE,KAA0B,MAAM;AAAA,IAE5CD,IACI;AAAA;AAAA;AAAA;AAAA;AAAA,YAKIE,CAAgB;AAAA;AAAA;AAAA,UAIpB,EACN;AAAA;AAEF,GAEMC,IAAgBL,EAAO;AAAA,EAC3B,CAAC,EAAE,OAAAM,GAAO,WAAAJ,EAAA,MAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKTI,EAAM,OAAO,SAAS,GAAG;AAAA,sBACtBA,EAAM,OAAO,MAAM;AAAA,mBACtBA,EAAM,OAAO,SAAS,IAAI;AAAA,IAEzCJ,IACI;AAAA;AAAA;AAAA,UAIA,EACN;AAAA;AAEF,GAMME,IAAmBJ,EAAO,IAAuB,CAAC,EAAE,iBAAAO,QACjD;AAAA;AAAA;AAAA;AAAA,MAIHA,KAAmB,kBAAkB;AAAA,GAE1C,GAEKC,IAAkBR,EAAOS,CAAQ,EAAE,CAAC,EAAE,OAAAH,QACnC;AAAA;AAAA;AAAA;AAAA,+BAIsBA,EAAM,OAAO,OAAO;AAAA,GAElD,GAEKI,IAAgBV,EAAOS,CAAQ,EAAE,MAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,KAMR,GAMKE,IAAgBX,EAAO,IAAyB,CAAC,EAAE,OAAAM,GAAO,kBAAAM,QAAuB;AAC/E,QAAA;AAAA,IACJ,QAAQ,EAAE,QAAAC,EAAO;AAAA,IACjB,QAAAC;AAAA,EACE,IAAAR;AAEG,SAAA;AAAA,aACIO,IAAS,CAAC;AAAA,cACTA,IAAS,CAAC;AAAA,kBACNC,EAAOF,CAAgB,CAAC;AAAA,qBACrBC,IAAS,GAAG;AAAA;AAEjC,CAAC,GAEKE,IAAgBf,EAAOS,CAAQ,EAA2B,CAAC,EAAE,OAAAH,GAAO,WAAAJ,QAAgB;AAClF,QAAA;AAAA,IACJ,QAAQ,EAAE,QAAAW,EAAO;AAAA,EACf,IAAAP;AAEG,SAAA;AAAA;AAAA,iBAEQO,IAAS,IAAI;AAAA,MAExBX,IACI;AAAA;AAAA;AAAA,YAIA,EACN;AAAA;AAEJ,CAAC,GAEKc,IAAiBhB,EAAO;AAAA;AAAA;AAAA;AAAA;"}
|