analytica-frontend-lib 1.2.54 → 1.2.55

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.
Files changed (50) hide show
  1. package/dist/ActivitiesHistory/index.js +108 -42
  2. package/dist/ActivitiesHistory/index.js.map +1 -1
  3. package/dist/ActivitiesHistory/index.mjs +108 -42
  4. package/dist/ActivitiesHistory/index.mjs.map +1 -1
  5. package/dist/ActivityDetails/index.js +108 -42
  6. package/dist/ActivityDetails/index.js.map +1 -1
  7. package/dist/ActivityDetails/index.mjs +108 -42
  8. package/dist/ActivityDetails/index.mjs.map +1 -1
  9. package/dist/ActivityFilters/index.js +110 -42
  10. package/dist/ActivityFilters/index.js.map +1 -1
  11. package/dist/ActivityFilters/index.mjs +110 -42
  12. package/dist/ActivityFilters/index.mjs.map +1 -1
  13. package/dist/AlertManager/index.js +110 -42
  14. package/dist/AlertManager/index.js.map +1 -1
  15. package/dist/AlertManager/index.mjs +110 -42
  16. package/dist/AlertManager/index.mjs.map +1 -1
  17. package/dist/RecommendedLessonsHistory/index.js +108 -42
  18. package/dist/RecommendedLessonsHistory/index.js.map +1 -1
  19. package/dist/RecommendedLessonsHistory/index.mjs +108 -42
  20. package/dist/RecommendedLessonsHistory/index.mjs.map +1 -1
  21. package/dist/SendActivityModal/SendActivityModal.js +124 -46
  22. package/dist/SendActivityModal/SendActivityModal.js.map +1 -1
  23. package/dist/SendActivityModal/SendActivityModal.mjs +124 -46
  24. package/dist/SendActivityModal/SendActivityModal.mjs.map +1 -1
  25. package/dist/SendActivityModal/hooks/useSendActivityModal.d.ts.map +1 -1
  26. package/dist/SendActivityModal/hooks/useSendActivityModal.js +16 -4
  27. package/dist/SendActivityModal/hooks/useSendActivityModal.js.map +1 -1
  28. package/dist/SendActivityModal/hooks/useSendActivityModal.mjs +16 -4
  29. package/dist/SendActivityModal/hooks/useSendActivityModal.mjs.map +1 -1
  30. package/dist/SendActivityModal/index.js +124 -46
  31. package/dist/SendActivityModal/index.js.map +1 -1
  32. package/dist/SendActivityModal/index.mjs +124 -46
  33. package/dist/SendActivityModal/index.mjs.map +1 -1
  34. package/dist/SendActivityModal/validation.js +1 -1
  35. package/dist/SendActivityModal/validation.js.map +1 -1
  36. package/dist/SendActivityModal/validation.mjs +1 -1
  37. package/dist/SendActivityModal/validation.mjs.map +1 -1
  38. package/dist/TableProvider/index.js +108 -42
  39. package/dist/TableProvider/index.js.map +1 -1
  40. package/dist/TableProvider/index.mjs +108 -42
  41. package/dist/TableProvider/index.mjs.map +1 -1
  42. package/dist/hooks/useActivityModels/index.d.ts +6 -6
  43. package/dist/hooks/useActivityModels.d.ts +6 -6
  44. package/dist/index.d.ts +2 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +180 -59
  47. package/dist/index.js.map +1 -1
  48. package/dist/index.mjs +178 -59
  49. package/dist/index.mjs.map +1 -1
  50. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useSendActivityModal.d.ts","sourceRoot":"","sources":["../../../../src/components/SendActivityModal/hooks/useSendActivityModal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG5E;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,gBAAgB;IAChB,QAAQ,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACxC,oBAAoB;IACpB,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;IAE3D,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,4BAA4B;IAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,qDAAqD;IACrD,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,0BAA0B;IAC1B,YAAY,EAAE,MAAM,IAAI,CAAC;IAEzB,wBAAwB;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,iBAAiB;IACjB,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,4BAA4B;IAC5B,mBAAmB,EAAE,MAAM,OAAO,CAAC;IACnC,yBAAyB;IACzB,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAEhC,gDAAgD;IAChD,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,kDAAkD;IAClD,aAAa,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAEtD,mCAAmC;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAsED;;GAEG;AACH,eAAO,MAAM,yBAAyB,qFA8ErC,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,2BAEnC"}
1
+ {"version":3,"file":"useSendActivityModal.d.ts","sourceRoot":"","sources":["../../../../src/components/SendActivityModal/hooks/useSendActivityModal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG5E;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,gBAAgB;IAChB,QAAQ,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACxC,oBAAoB;IACpB,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;IAE3D,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,4BAA4B;IAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,qDAAqD;IACrD,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,0BAA0B;IAC1B,YAAY,EAAE,MAAM,IAAI,CAAC;IAEzB,wBAAwB;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,iBAAiB;IACjB,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,4BAA4B;IAC5B,mBAAmB,EAAE,MAAM,OAAO,CAAC;IACnC,yBAAyB;IACzB,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAEhC,gDAAgD;IAChD,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,kDAAkD;IAClD,aAAa,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAEtD,mCAAmC;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAsED;;GAEG;AACH,eAAO,MAAM,yBAAyB,qFA4FrC,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,2BAEnC"}
@@ -100,7 +100,7 @@ function validateActivityStep(data) {
100
100
  function validateRecipientStep(data) {
101
101
  const errors = {};
102
102
  const result = recipientStepSchema.safeParse({
103
- students: data.students
103
+ students: data.students ?? []
104
104
  });
105
105
  if (!result.success) {
106
106
  result.error.issues.forEach((issue) => {
@@ -230,14 +230,26 @@ var useSendActivityModalStore = (0, import_zustand.create)(
230
230
  },
231
231
  validateCurrentStep: () => {
232
232
  const state = get();
233
- const errors = validateStep(state.currentStep, state.formData);
234
- set({ errors });
233
+ let formDataToValidate = state.formData;
234
+ let updatedFormData = state.formData;
235
+ if (state.currentStep === 2 && state.categories.length > 0) {
236
+ const students = extractStudentsFromCategories(state.categories);
237
+ formDataToValidate = { ...state.formData, students };
238
+ updatedFormData = formDataToValidate;
239
+ }
240
+ const errors = validateStep(state.currentStep, formDataToValidate);
241
+ set({ formData: updatedFormData, errors });
235
242
  return Object.keys(errors).length === 0;
236
243
  },
237
244
  validateAllSteps: () => {
238
245
  const state = get();
246
+ let formDataForStep2 = state.formData;
247
+ if (state.categories.length > 0) {
248
+ const students = extractStudentsFromCategories(state.categories);
249
+ formDataForStep2 = { ...state.formData, students };
250
+ }
239
251
  const errors1 = validateStep(1, state.formData);
240
- const errors2 = validateStep(2, state.formData);
252
+ const errors2 = validateStep(2, formDataForStep2);
241
253
  const errors3 = validateStep(3, state.formData);
242
254
  const allErrors = { ...errors1, ...errors2, ...errors3 };
243
255
  set({ errors: allErrors });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/SendActivityModal/hooks/useSendActivityModal.ts","../../../src/components/SendActivityModal/validation.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { SendActivityFormData, StepErrors, CategoryConfig } from '../types';\nimport { validateStep } from '../validation';\n\n/**\n * Store interface for SendActivityModal\n */\nexport interface SendActivityModalStore {\n /** Form data */\n formData: Partial<SendActivityFormData>;\n /** Set form data */\n setFormData: (data: Partial<SendActivityFormData>) => void;\n\n /** Current step (1, 2, or 3) */\n currentStep: number;\n /** Completed steps */\n completedSteps: number[];\n /** Go to a specific step */\n goToStep: (step: number) => void;\n /** Go to next step (validates current step first) */\n nextStep: () => boolean;\n /** Go to previous step */\n previousStep: () => void;\n\n /** Validation errors */\n errors: StepErrors;\n /** Set errors */\n setErrors: (errors: StepErrors) => void;\n /** Validate current step */\n validateCurrentStep: () => boolean;\n /** Validate all steps */\n validateAllSteps: () => boolean;\n\n /** Categories state managed by CheckboxGroup */\n categories: CategoryConfig[];\n /** Update categories (called by CheckboxGroup) */\n setCategories: (categories: CategoryConfig[]) => void;\n\n /** Reset store to initial state */\n reset: () => void;\n}\n\nconst initialState = {\n formData: {\n canRetry: false,\n startTime: '00:00',\n finalTime: '23:59',\n } as Partial<SendActivityFormData>,\n currentStep: 1,\n completedSteps: [] as number[],\n errors: {} as StepErrors,\n categories: [] as CategoryConfig[],\n};\n\n/**\n * Helper to extract selected students from the students category\n */\nfunction extractStudentsFromCategories(\n categories: CategoryConfig[]\n): Array<{ studentId: string; userInstitutionId: string }> {\n // Find the students category (first matching by key 'students', 'alunos', or 'student')\n const studentsCategory = categories.find(\n (cat) =>\n cat.key === 'students' || cat.key === 'alunos' || cat.key === 'student'\n );\n\n if (!studentsCategory?.selectedIds || !studentsCategory.itens) {\n return [];\n }\n\n return studentsCategory.selectedIds\n .map((id) => {\n const student = studentsCategory.itens?.find((item) => item.id === id);\n if (student) {\n const rawStudentId = student.studentId;\n const rawUserInstId = student.userInstitutionId;\n const rawInstId = student.institutionId;\n\n // Extract studentId with type guard\n const studentId =\n typeof rawStudentId === 'string' || typeof rawStudentId === 'number'\n ? String(rawStudentId)\n : student.id;\n let userInstitutionId = '';\n if (\n typeof rawUserInstId === 'string' ||\n typeof rawUserInstId === 'number'\n ) {\n userInstitutionId = String(rawUserInstId);\n } else if (\n typeof rawInstId === 'string' ||\n typeof rawInstId === 'number'\n ) {\n userInstitutionId = String(rawInstId);\n }\n\n // Filter out entries without valid userInstitutionId\n if (!userInstitutionId) {\n return null;\n }\n\n return { studentId, userInstitutionId };\n }\n return null;\n })\n .filter(\n (s): s is { studentId: string; userInstitutionId: string } => s !== null\n );\n}\n\n/**\n * Creates the SendActivityModal store\n */\nexport const useSendActivityModalStore = create<SendActivityModalStore>(\n (set, get) => ({\n ...initialState,\n\n setFormData: (data) => {\n set((state) => ({\n formData: { ...state.formData, ...data },\n }));\n },\n\n goToStep: (step) => {\n if (step >= 1 && step <= 3) {\n set({ currentStep: step, errors: {} });\n }\n },\n\n nextStep: () => {\n const state = get();\n const isValid = state.validateCurrentStep();\n\n if (isValid && state.currentStep < 3) {\n set((prev) => ({\n currentStep: prev.currentStep + 1,\n completedSteps: prev.completedSteps.includes(prev.currentStep)\n ? prev.completedSteps\n : [...prev.completedSteps, prev.currentStep],\n errors: {},\n }));\n return true;\n }\n\n return isValid;\n },\n\n previousStep: () => {\n const state = get();\n if (state.currentStep > 1) {\n set({ currentStep: state.currentStep - 1, errors: {} });\n }\n },\n\n setErrors: (errors) => {\n set({ errors });\n },\n\n validateCurrentStep: () => {\n const state = get();\n const errors = validateStep(state.currentStep, state.formData);\n set({ errors });\n return Object.keys(errors).length === 0;\n },\n\n validateAllSteps: () => {\n const state = get();\n const errors1 = validateStep(1, state.formData);\n const errors2 = validateStep(2, state.formData);\n const errors3 = validateStep(3, state.formData);\n const allErrors = { ...errors1, ...errors2, ...errors3 };\n set({ errors: allErrors });\n return Object.keys(allErrors).length === 0;\n },\n\n setCategories: (categories) => {\n // Extract students from categories and update formData\n const students = extractStudentsFromCategories(categories);\n set((state) => ({\n categories,\n formData: { ...state.formData, students },\n }));\n },\n\n reset: () => {\n set({\n ...initialState,\n categories: [],\n });\n },\n })\n);\n\n/**\n * Hook to use the SendActivityModal store\n */\nexport function useSendActivityModal() {\n return useSendActivityModalStore();\n}\n","import { z } from 'zod';\nimport { SendActivityFormData, StepErrors } from './types';\n\n/**\n * Error messages for validation\n */\nexport const ERROR_MESSAGES = {\n SUBTYPE_REQUIRED:\n 'Campo obrigatório! Por favor, selecione uma opção para continuar.',\n TITLE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n STUDENTS_REQUIRED:\n 'Campo obrigatório! Por favor, selecione pelo menos um aluno para continuar.',\n START_DATE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n FINAL_DATE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n FINAL_DATE_INVALID: 'A data final deve ser maior ou igual à data inicial.',\n} as const;\n\n/**\n * Zod schema for activity step (Step 1)\n */\nexport const activityStepSchema = z.object({\n subtype: z.enum(['TAREFA', 'TRABALHO', 'PROVA'], {\n errorMap: () => ({ message: ERROR_MESSAGES.SUBTYPE_REQUIRED }),\n }),\n title: z\n .string({ required_error: ERROR_MESSAGES.TITLE_REQUIRED })\n .transform((val) => val.trim())\n .refine((val) => val.length > 0, {\n message: ERROR_MESSAGES.TITLE_REQUIRED,\n }),\n notification: z.string().optional(),\n});\n\n/**\n * Zod schema for recipient step (Step 2)\n */\nexport const recipientStepSchema = z.object({\n students: z\n .array(\n z.object({\n studentId: z.string(),\n userInstitutionId: z.string(),\n }),\n {\n required_error: ERROR_MESSAGES.STUDENTS_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.STUDENTS_REQUIRED,\n }\n )\n .min(1, ERROR_MESSAGES.STUDENTS_REQUIRED),\n});\n\n/**\n * Regex patterns for date and time validation\n */\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst TIME_REGEX = /^\\d{2}:\\d{2}$/;\n\n/**\n * Zod schema for deadline step (Step 3) - base validation\n */\nconst deadlineStepBaseSchema = z.object({\n startDate: z\n .string({\n required_error: ERROR_MESSAGES.START_DATE_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.START_DATE_REQUIRED,\n })\n .min(1, ERROR_MESSAGES.START_DATE_REQUIRED)\n .regex(DATE_REGEX, ERROR_MESSAGES.START_DATE_REQUIRED),\n startTime: z.string().regex(TIME_REGEX).default('00:00'),\n finalDate: z\n .string({\n required_error: ERROR_MESSAGES.FINAL_DATE_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.FINAL_DATE_REQUIRED,\n })\n .min(1, ERROR_MESSAGES.FINAL_DATE_REQUIRED)\n .regex(DATE_REGEX, ERROR_MESSAGES.FINAL_DATE_REQUIRED),\n finalTime: z.string().regex(TIME_REGEX).default('23:59'),\n canRetry: z.boolean().default(false),\n});\n\n/**\n * Zod schema for deadline step with date comparison refinement\n */\nexport const deadlineStepSchema = deadlineStepBaseSchema.refine(\n (data) => {\n const start = new Date(`${data.startDate}T${data.startTime}`);\n const end = new Date(`${data.finalDate}T${data.finalTime}`);\n return end >= start;\n },\n { message: ERROR_MESSAGES.FINAL_DATE_INVALID, path: ['finalDate'] }\n);\n\n/**\n * Type inference from Zod schemas\n */\nexport type ActivityStepData = z.infer<typeof activityStepSchema>;\nexport type RecipientStepData = z.infer<typeof recipientStepSchema>;\nexport type DeadlineStepData = z.infer<typeof deadlineStepSchema>;\n\n/**\n * Validates the activity step (Step 1) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateActivityStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n const result = activityStepSchema.safeParse({\n subtype: data.subtype,\n title: data.title,\n notification: data.notification,\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n const field = issue.path[0] as keyof StepErrors;\n if (field === 'subtype' || field === 'title') {\n errors[field] = issue.message;\n }\n });\n }\n\n return errors;\n}\n\n/**\n * Validates the recipient step (Step 2) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateRecipientStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n const result = recipientStepSchema.safeParse({\n students: data.students,\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n if (issue.path[0] === 'students') {\n errors.students = issue.message;\n }\n });\n }\n\n return errors;\n}\n\n/**\n * Validates the deadline step (Step 3) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateDeadlineStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n // First validate individual fields\n if (!data.startDate) {\n errors.startDate = ERROR_MESSAGES.START_DATE_REQUIRED;\n }\n\n if (!data.finalDate) {\n errors.finalDate = ERROR_MESSAGES.FINAL_DATE_REQUIRED;\n }\n\n // If both dates exist, validate with the full schema (including refinement)\n if (data.startDate && data.finalDate) {\n const result = deadlineStepSchema.safeParse({\n startDate: data.startDate,\n startTime: data.startTime ?? '00:00',\n finalDate: data.finalDate,\n finalTime: data.finalTime ?? '23:59',\n canRetry: data.canRetry ?? false,\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n const field = issue.path[0] as keyof StepErrors;\n if (field === 'startDate' || field === 'finalDate') {\n errors[field] = issue.message;\n }\n });\n }\n }\n\n return errors;\n}\n\n/**\n * Validates a specific step\n * @param step - Step number (1, 2, or 3)\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateStep(\n step: number,\n data: Partial<SendActivityFormData>\n): StepErrors {\n switch (step) {\n case 1:\n return validateActivityStep(data);\n case 2:\n return validateRecipientStep(data);\n case 3:\n return validateDeadlineStep(data);\n default:\n return {};\n }\n}\n\n/**\n * Checks if a specific step is valid\n * @param step - Step number (1, 2, or 3)\n * @param data - Partial form data\n * @returns true if the step is valid\n */\nexport function isStepValid(\n step: number,\n data: Partial<SendActivityFormData>\n): boolean {\n const errors = validateStep(step, data);\n return Object.keys(errors).length === 0;\n}\n\n/**\n * Checks if all steps are valid (form can be submitted)\n * @param data - Partial form data\n * @returns true if all steps are valid\n */\nexport function isFormValid(data: Partial<SendActivityFormData>): boolean {\n return isStepValid(1, data) && isStepValid(2, data) && isStepValid(3, data);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/SendActivityModal/hooks/useSendActivityModal.ts","../../../src/components/SendActivityModal/validation.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { SendActivityFormData, StepErrors, CategoryConfig } from '../types';\nimport { validateStep } from '../validation';\n\n/**\n * Store interface for SendActivityModal\n */\nexport interface SendActivityModalStore {\n /** Form data */\n formData: Partial<SendActivityFormData>;\n /** Set form data */\n setFormData: (data: Partial<SendActivityFormData>) => void;\n\n /** Current step (1, 2, or 3) */\n currentStep: number;\n /** Completed steps */\n completedSteps: number[];\n /** Go to a specific step */\n goToStep: (step: number) => void;\n /** Go to next step (validates current step first) */\n nextStep: () => boolean;\n /** Go to previous step */\n previousStep: () => void;\n\n /** Validation errors */\n errors: StepErrors;\n /** Set errors */\n setErrors: (errors: StepErrors) => void;\n /** Validate current step */\n validateCurrentStep: () => boolean;\n /** Validate all steps */\n validateAllSteps: () => boolean;\n\n /** Categories state managed by CheckboxGroup */\n categories: CategoryConfig[];\n /** Update categories (called by CheckboxGroup) */\n setCategories: (categories: CategoryConfig[]) => void;\n\n /** Reset store to initial state */\n reset: () => void;\n}\n\nconst initialState = {\n formData: {\n canRetry: false,\n startTime: '00:00',\n finalTime: '23:59',\n } as Partial<SendActivityFormData>,\n currentStep: 1,\n completedSteps: [] as number[],\n errors: {} as StepErrors,\n categories: [] as CategoryConfig[],\n};\n\n/**\n * Helper to extract selected students from the students category\n */\nfunction extractStudentsFromCategories(\n categories: CategoryConfig[]\n): Array<{ studentId: string; userInstitutionId: string }> {\n // Find the students category (first matching by key 'students', 'alunos', or 'student')\n const studentsCategory = categories.find(\n (cat) =>\n cat.key === 'students' || cat.key === 'alunos' || cat.key === 'student'\n );\n\n if (!studentsCategory?.selectedIds || !studentsCategory.itens) {\n return [];\n }\n\n return studentsCategory.selectedIds\n .map((id) => {\n const student = studentsCategory.itens?.find((item) => item.id === id);\n if (student) {\n const rawStudentId = student.studentId;\n const rawUserInstId = student.userInstitutionId;\n const rawInstId = student.institutionId;\n\n // Extract studentId with type guard\n const studentId =\n typeof rawStudentId === 'string' || typeof rawStudentId === 'number'\n ? String(rawStudentId)\n : student.id;\n let userInstitutionId = '';\n if (\n typeof rawUserInstId === 'string' ||\n typeof rawUserInstId === 'number'\n ) {\n userInstitutionId = String(rawUserInstId);\n } else if (\n typeof rawInstId === 'string' ||\n typeof rawInstId === 'number'\n ) {\n userInstitutionId = String(rawInstId);\n }\n\n // Filter out entries without valid userInstitutionId\n if (!userInstitutionId) {\n return null;\n }\n\n return { studentId, userInstitutionId };\n }\n return null;\n })\n .filter(\n (s): s is { studentId: string; userInstitutionId: string } => s !== null\n );\n}\n\n/**\n * Creates the SendActivityModal store\n */\nexport const useSendActivityModalStore = create<SendActivityModalStore>(\n (set, get) => ({\n ...initialState,\n\n setFormData: (data) => {\n set((state) => ({\n formData: { ...state.formData, ...data },\n }));\n },\n\n goToStep: (step) => {\n if (step >= 1 && step <= 3) {\n set({ currentStep: step, errors: {} });\n }\n },\n\n nextStep: () => {\n const state = get();\n const isValid = state.validateCurrentStep();\n\n if (isValid && state.currentStep < 3) {\n set((prev) => ({\n currentStep: prev.currentStep + 1,\n completedSteps: prev.completedSteps.includes(prev.currentStep)\n ? prev.completedSteps\n : [...prev.completedSteps, prev.currentStep],\n errors: {},\n }));\n return true;\n }\n\n return isValid;\n },\n\n previousStep: () => {\n const state = get();\n if (state.currentStep > 1) {\n set({ currentStep: state.currentStep - 1, errors: {} });\n }\n },\n\n setErrors: (errors) => {\n set({ errors });\n },\n\n validateCurrentStep: () => {\n const state = get();\n // For step 2, extract students from categories to ensure auto-selection is considered\n let formDataToValidate = state.formData;\n let updatedFormData = state.formData;\n if (state.currentStep === 2 && state.categories.length > 0) {\n const students = extractStudentsFromCategories(state.categories);\n formDataToValidate = { ...state.formData, students };\n updatedFormData = formDataToValidate;\n }\n const errors = validateStep(state.currentStep, formDataToValidate);\n set({ formData: updatedFormData, errors });\n return Object.keys(errors).length === 0;\n },\n\n validateAllSteps: () => {\n const state = get();\n // Extract students from categories for step 2 validation\n let formDataForStep2 = state.formData;\n if (state.categories.length > 0) {\n const students = extractStudentsFromCategories(state.categories);\n formDataForStep2 = { ...state.formData, students };\n }\n const errors1 = validateStep(1, state.formData);\n const errors2 = validateStep(2, formDataForStep2);\n const errors3 = validateStep(3, state.formData);\n const allErrors = { ...errors1, ...errors2, ...errors3 };\n set({ errors: allErrors });\n return Object.keys(allErrors).length === 0;\n },\n\n setCategories: (categories) => {\n // Extract students from categories and update formData\n const students = extractStudentsFromCategories(categories);\n set((state) => ({\n categories,\n formData: { ...state.formData, students },\n }));\n },\n\n reset: () => {\n set({\n ...initialState,\n categories: [],\n });\n },\n })\n);\n\n/**\n * Hook to use the SendActivityModal store\n */\nexport function useSendActivityModal() {\n return useSendActivityModalStore();\n}\n","import { z } from 'zod';\nimport { SendActivityFormData, StepErrors } from './types';\n\n/**\n * Error messages for validation\n */\nexport const ERROR_MESSAGES = {\n SUBTYPE_REQUIRED:\n 'Campo obrigatório! Por favor, selecione uma opção para continuar.',\n TITLE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n STUDENTS_REQUIRED:\n 'Campo obrigatório! Por favor, selecione pelo menos um aluno para continuar.',\n START_DATE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n FINAL_DATE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n FINAL_DATE_INVALID: 'A data final deve ser maior ou igual à data inicial.',\n} as const;\n\n/**\n * Zod schema for activity step (Step 1)\n */\nexport const activityStepSchema = z.object({\n subtype: z.enum(['TAREFA', 'TRABALHO', 'PROVA'], {\n errorMap: () => ({ message: ERROR_MESSAGES.SUBTYPE_REQUIRED }),\n }),\n title: z\n .string({ required_error: ERROR_MESSAGES.TITLE_REQUIRED })\n .transform((val) => val.trim())\n .refine((val) => val.length > 0, {\n message: ERROR_MESSAGES.TITLE_REQUIRED,\n }),\n notification: z.string().optional(),\n});\n\n/**\n * Zod schema for recipient step (Step 2)\n */\nexport const recipientStepSchema = z.object({\n students: z\n .array(\n z.object({\n studentId: z.string(),\n userInstitutionId: z.string(),\n }),\n {\n required_error: ERROR_MESSAGES.STUDENTS_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.STUDENTS_REQUIRED,\n }\n )\n .min(1, ERROR_MESSAGES.STUDENTS_REQUIRED),\n});\n\n/**\n * Regex patterns for date and time validation\n */\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst TIME_REGEX = /^\\d{2}:\\d{2}$/;\n\n/**\n * Zod schema for deadline step (Step 3) - base validation\n */\nconst deadlineStepBaseSchema = z.object({\n startDate: z\n .string({\n required_error: ERROR_MESSAGES.START_DATE_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.START_DATE_REQUIRED,\n })\n .min(1, ERROR_MESSAGES.START_DATE_REQUIRED)\n .regex(DATE_REGEX, ERROR_MESSAGES.START_DATE_REQUIRED),\n startTime: z.string().regex(TIME_REGEX).default('00:00'),\n finalDate: z\n .string({\n required_error: ERROR_MESSAGES.FINAL_DATE_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.FINAL_DATE_REQUIRED,\n })\n .min(1, ERROR_MESSAGES.FINAL_DATE_REQUIRED)\n .regex(DATE_REGEX, ERROR_MESSAGES.FINAL_DATE_REQUIRED),\n finalTime: z.string().regex(TIME_REGEX).default('23:59'),\n canRetry: z.boolean().default(false),\n});\n\n/**\n * Zod schema for deadline step with date comparison refinement\n */\nexport const deadlineStepSchema = deadlineStepBaseSchema.refine(\n (data) => {\n const start = new Date(`${data.startDate}T${data.startTime}`);\n const end = new Date(`${data.finalDate}T${data.finalTime}`);\n return end >= start;\n },\n { message: ERROR_MESSAGES.FINAL_DATE_INVALID, path: ['finalDate'] }\n);\n\n/**\n * Type inference from Zod schemas\n */\nexport type ActivityStepData = z.infer<typeof activityStepSchema>;\nexport type RecipientStepData = z.infer<typeof recipientStepSchema>;\nexport type DeadlineStepData = z.infer<typeof deadlineStepSchema>;\n\n/**\n * Validates the activity step (Step 1) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateActivityStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n const result = activityStepSchema.safeParse({\n subtype: data.subtype,\n title: data.title,\n notification: data.notification,\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n const field = issue.path[0] as keyof StepErrors;\n if (field === 'subtype' || field === 'title') {\n errors[field] = issue.message;\n }\n });\n }\n\n return errors;\n}\n\n/**\n * Validates the recipient step (Step 2) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateRecipientStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n const result = recipientStepSchema.safeParse({\n students: data.students ?? [],\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n if (issue.path[0] === 'students') {\n errors.students = issue.message;\n }\n });\n }\n\n return errors;\n}\n\n/**\n * Validates the deadline step (Step 3) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateDeadlineStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n // First validate individual fields\n if (!data.startDate) {\n errors.startDate = ERROR_MESSAGES.START_DATE_REQUIRED;\n }\n\n if (!data.finalDate) {\n errors.finalDate = ERROR_MESSAGES.FINAL_DATE_REQUIRED;\n }\n\n // If both dates exist, validate with the full schema (including refinement)\n if (data.startDate && data.finalDate) {\n const result = deadlineStepSchema.safeParse({\n startDate: data.startDate,\n startTime: data.startTime ?? '00:00',\n finalDate: data.finalDate,\n finalTime: data.finalTime ?? '23:59',\n canRetry: data.canRetry ?? false,\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n const field = issue.path[0] as keyof StepErrors;\n if (field === 'startDate' || field === 'finalDate') {\n errors[field] = issue.message;\n }\n });\n }\n }\n\n return errors;\n}\n\n/**\n * Validates a specific step\n * @param step - Step number (1, 2, or 3)\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateStep(\n step: number,\n data: Partial<SendActivityFormData>\n): StepErrors {\n switch (step) {\n case 1:\n return validateActivityStep(data);\n case 2:\n return validateRecipientStep(data);\n case 3:\n return validateDeadlineStep(data);\n default:\n return {};\n }\n}\n\n/**\n * Checks if a specific step is valid\n * @param step - Step number (1, 2, or 3)\n * @param data - Partial form data\n * @returns true if the step is valid\n */\nexport function isStepValid(\n step: number,\n data: Partial<SendActivityFormData>\n): boolean {\n const errors = validateStep(step, data);\n return Object.keys(errors).length === 0;\n}\n\n/**\n * Checks if all steps are valid (form can be submitted)\n * @param data - Partial form data\n * @returns true if all steps are valid\n */\nexport function isFormValid(data: Partial<SendActivityFormData>): boolean {\n return isStepValid(1, data) && isStepValid(2, data) && isStepValid(3, data);\n}\n"],"mappings":"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","names":[]}
@@ -75,7 +75,7 @@ function validateActivityStep(data) {
75
75
  function validateRecipientStep(data) {
76
76
  const errors = {};
77
77
  const result = recipientStepSchema.safeParse({
78
- students: data.students
78
+ students: data.students ?? []
79
79
  });
80
80
  if (!result.success) {
81
81
  result.error.issues.forEach((issue) => {
@@ -205,14 +205,26 @@ var useSendActivityModalStore = create(
205
205
  },
206
206
  validateCurrentStep: () => {
207
207
  const state = get();
208
- const errors = validateStep(state.currentStep, state.formData);
209
- set({ errors });
208
+ let formDataToValidate = state.formData;
209
+ let updatedFormData = state.formData;
210
+ if (state.currentStep === 2 && state.categories.length > 0) {
211
+ const students = extractStudentsFromCategories(state.categories);
212
+ formDataToValidate = { ...state.formData, students };
213
+ updatedFormData = formDataToValidate;
214
+ }
215
+ const errors = validateStep(state.currentStep, formDataToValidate);
216
+ set({ formData: updatedFormData, errors });
210
217
  return Object.keys(errors).length === 0;
211
218
  },
212
219
  validateAllSteps: () => {
213
220
  const state = get();
221
+ let formDataForStep2 = state.formData;
222
+ if (state.categories.length > 0) {
223
+ const students = extractStudentsFromCategories(state.categories);
224
+ formDataForStep2 = { ...state.formData, students };
225
+ }
214
226
  const errors1 = validateStep(1, state.formData);
215
- const errors2 = validateStep(2, state.formData);
227
+ const errors2 = validateStep(2, formDataForStep2);
216
228
  const errors3 = validateStep(3, state.formData);
217
229
  const allErrors = { ...errors1, ...errors2, ...errors3 };
218
230
  set({ errors: allErrors });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/SendActivityModal/hooks/useSendActivityModal.ts","../../../src/components/SendActivityModal/validation.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { SendActivityFormData, StepErrors, CategoryConfig } from '../types';\nimport { validateStep } from '../validation';\n\n/**\n * Store interface for SendActivityModal\n */\nexport interface SendActivityModalStore {\n /** Form data */\n formData: Partial<SendActivityFormData>;\n /** Set form data */\n setFormData: (data: Partial<SendActivityFormData>) => void;\n\n /** Current step (1, 2, or 3) */\n currentStep: number;\n /** Completed steps */\n completedSteps: number[];\n /** Go to a specific step */\n goToStep: (step: number) => void;\n /** Go to next step (validates current step first) */\n nextStep: () => boolean;\n /** Go to previous step */\n previousStep: () => void;\n\n /** Validation errors */\n errors: StepErrors;\n /** Set errors */\n setErrors: (errors: StepErrors) => void;\n /** Validate current step */\n validateCurrentStep: () => boolean;\n /** Validate all steps */\n validateAllSteps: () => boolean;\n\n /** Categories state managed by CheckboxGroup */\n categories: CategoryConfig[];\n /** Update categories (called by CheckboxGroup) */\n setCategories: (categories: CategoryConfig[]) => void;\n\n /** Reset store to initial state */\n reset: () => void;\n}\n\nconst initialState = {\n formData: {\n canRetry: false,\n startTime: '00:00',\n finalTime: '23:59',\n } as Partial<SendActivityFormData>,\n currentStep: 1,\n completedSteps: [] as number[],\n errors: {} as StepErrors,\n categories: [] as CategoryConfig[],\n};\n\n/**\n * Helper to extract selected students from the students category\n */\nfunction extractStudentsFromCategories(\n categories: CategoryConfig[]\n): Array<{ studentId: string; userInstitutionId: string }> {\n // Find the students category (first matching by key 'students', 'alunos', or 'student')\n const studentsCategory = categories.find(\n (cat) =>\n cat.key === 'students' || cat.key === 'alunos' || cat.key === 'student'\n );\n\n if (!studentsCategory?.selectedIds || !studentsCategory.itens) {\n return [];\n }\n\n return studentsCategory.selectedIds\n .map((id) => {\n const student = studentsCategory.itens?.find((item) => item.id === id);\n if (student) {\n const rawStudentId = student.studentId;\n const rawUserInstId = student.userInstitutionId;\n const rawInstId = student.institutionId;\n\n // Extract studentId with type guard\n const studentId =\n typeof rawStudentId === 'string' || typeof rawStudentId === 'number'\n ? String(rawStudentId)\n : student.id;\n let userInstitutionId = '';\n if (\n typeof rawUserInstId === 'string' ||\n typeof rawUserInstId === 'number'\n ) {\n userInstitutionId = String(rawUserInstId);\n } else if (\n typeof rawInstId === 'string' ||\n typeof rawInstId === 'number'\n ) {\n userInstitutionId = String(rawInstId);\n }\n\n // Filter out entries without valid userInstitutionId\n if (!userInstitutionId) {\n return null;\n }\n\n return { studentId, userInstitutionId };\n }\n return null;\n })\n .filter(\n (s): s is { studentId: string; userInstitutionId: string } => s !== null\n );\n}\n\n/**\n * Creates the SendActivityModal store\n */\nexport const useSendActivityModalStore = create<SendActivityModalStore>(\n (set, get) => ({\n ...initialState,\n\n setFormData: (data) => {\n set((state) => ({\n formData: { ...state.formData, ...data },\n }));\n },\n\n goToStep: (step) => {\n if (step >= 1 && step <= 3) {\n set({ currentStep: step, errors: {} });\n }\n },\n\n nextStep: () => {\n const state = get();\n const isValid = state.validateCurrentStep();\n\n if (isValid && state.currentStep < 3) {\n set((prev) => ({\n currentStep: prev.currentStep + 1,\n completedSteps: prev.completedSteps.includes(prev.currentStep)\n ? prev.completedSteps\n : [...prev.completedSteps, prev.currentStep],\n errors: {},\n }));\n return true;\n }\n\n return isValid;\n },\n\n previousStep: () => {\n const state = get();\n if (state.currentStep > 1) {\n set({ currentStep: state.currentStep - 1, errors: {} });\n }\n },\n\n setErrors: (errors) => {\n set({ errors });\n },\n\n validateCurrentStep: () => {\n const state = get();\n const errors = validateStep(state.currentStep, state.formData);\n set({ errors });\n return Object.keys(errors).length === 0;\n },\n\n validateAllSteps: () => {\n const state = get();\n const errors1 = validateStep(1, state.formData);\n const errors2 = validateStep(2, state.formData);\n const errors3 = validateStep(3, state.formData);\n const allErrors = { ...errors1, ...errors2, ...errors3 };\n set({ errors: allErrors });\n return Object.keys(allErrors).length === 0;\n },\n\n setCategories: (categories) => {\n // Extract students from categories and update formData\n const students = extractStudentsFromCategories(categories);\n set((state) => ({\n categories,\n formData: { ...state.formData, students },\n }));\n },\n\n reset: () => {\n set({\n ...initialState,\n categories: [],\n });\n },\n })\n);\n\n/**\n * Hook to use the SendActivityModal store\n */\nexport function useSendActivityModal() {\n return useSendActivityModalStore();\n}\n","import { z } from 'zod';\nimport { SendActivityFormData, StepErrors } from './types';\n\n/**\n * Error messages for validation\n */\nexport const ERROR_MESSAGES = {\n SUBTYPE_REQUIRED:\n 'Campo obrigatório! Por favor, selecione uma opção para continuar.',\n TITLE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n STUDENTS_REQUIRED:\n 'Campo obrigatório! Por favor, selecione pelo menos um aluno para continuar.',\n START_DATE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n FINAL_DATE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n FINAL_DATE_INVALID: 'A data final deve ser maior ou igual à data inicial.',\n} as const;\n\n/**\n * Zod schema for activity step (Step 1)\n */\nexport const activityStepSchema = z.object({\n subtype: z.enum(['TAREFA', 'TRABALHO', 'PROVA'], {\n errorMap: () => ({ message: ERROR_MESSAGES.SUBTYPE_REQUIRED }),\n }),\n title: z\n .string({ required_error: ERROR_MESSAGES.TITLE_REQUIRED })\n .transform((val) => val.trim())\n .refine((val) => val.length > 0, {\n message: ERROR_MESSAGES.TITLE_REQUIRED,\n }),\n notification: z.string().optional(),\n});\n\n/**\n * Zod schema for recipient step (Step 2)\n */\nexport const recipientStepSchema = z.object({\n students: z\n .array(\n z.object({\n studentId: z.string(),\n userInstitutionId: z.string(),\n }),\n {\n required_error: ERROR_MESSAGES.STUDENTS_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.STUDENTS_REQUIRED,\n }\n )\n .min(1, ERROR_MESSAGES.STUDENTS_REQUIRED),\n});\n\n/**\n * Regex patterns for date and time validation\n */\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst TIME_REGEX = /^\\d{2}:\\d{2}$/;\n\n/**\n * Zod schema for deadline step (Step 3) - base validation\n */\nconst deadlineStepBaseSchema = z.object({\n startDate: z\n .string({\n required_error: ERROR_MESSAGES.START_DATE_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.START_DATE_REQUIRED,\n })\n .min(1, ERROR_MESSAGES.START_DATE_REQUIRED)\n .regex(DATE_REGEX, ERROR_MESSAGES.START_DATE_REQUIRED),\n startTime: z.string().regex(TIME_REGEX).default('00:00'),\n finalDate: z\n .string({\n required_error: ERROR_MESSAGES.FINAL_DATE_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.FINAL_DATE_REQUIRED,\n })\n .min(1, ERROR_MESSAGES.FINAL_DATE_REQUIRED)\n .regex(DATE_REGEX, ERROR_MESSAGES.FINAL_DATE_REQUIRED),\n finalTime: z.string().regex(TIME_REGEX).default('23:59'),\n canRetry: z.boolean().default(false),\n});\n\n/**\n * Zod schema for deadline step with date comparison refinement\n */\nexport const deadlineStepSchema = deadlineStepBaseSchema.refine(\n (data) => {\n const start = new Date(`${data.startDate}T${data.startTime}`);\n const end = new Date(`${data.finalDate}T${data.finalTime}`);\n return end >= start;\n },\n { message: ERROR_MESSAGES.FINAL_DATE_INVALID, path: ['finalDate'] }\n);\n\n/**\n * Type inference from Zod schemas\n */\nexport type ActivityStepData = z.infer<typeof activityStepSchema>;\nexport type RecipientStepData = z.infer<typeof recipientStepSchema>;\nexport type DeadlineStepData = z.infer<typeof deadlineStepSchema>;\n\n/**\n * Validates the activity step (Step 1) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateActivityStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n const result = activityStepSchema.safeParse({\n subtype: data.subtype,\n title: data.title,\n notification: data.notification,\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n const field = issue.path[0] as keyof StepErrors;\n if (field === 'subtype' || field === 'title') {\n errors[field] = issue.message;\n }\n });\n }\n\n return errors;\n}\n\n/**\n * Validates the recipient step (Step 2) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateRecipientStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n const result = recipientStepSchema.safeParse({\n students: data.students,\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n if (issue.path[0] === 'students') {\n errors.students = issue.message;\n }\n });\n }\n\n return errors;\n}\n\n/**\n * Validates the deadline step (Step 3) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateDeadlineStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n // First validate individual fields\n if (!data.startDate) {\n errors.startDate = ERROR_MESSAGES.START_DATE_REQUIRED;\n }\n\n if (!data.finalDate) {\n errors.finalDate = ERROR_MESSAGES.FINAL_DATE_REQUIRED;\n }\n\n // If both dates exist, validate with the full schema (including refinement)\n if (data.startDate && data.finalDate) {\n const result = deadlineStepSchema.safeParse({\n startDate: data.startDate,\n startTime: data.startTime ?? '00:00',\n finalDate: data.finalDate,\n finalTime: data.finalTime ?? '23:59',\n canRetry: data.canRetry ?? false,\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n const field = issue.path[0] as keyof StepErrors;\n if (field === 'startDate' || field === 'finalDate') {\n errors[field] = issue.message;\n }\n });\n }\n }\n\n return errors;\n}\n\n/**\n * Validates a specific step\n * @param step - Step number (1, 2, or 3)\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateStep(\n step: number,\n data: Partial<SendActivityFormData>\n): StepErrors {\n switch (step) {\n case 1:\n return validateActivityStep(data);\n case 2:\n return validateRecipientStep(data);\n case 3:\n return validateDeadlineStep(data);\n default:\n return {};\n }\n}\n\n/**\n * Checks if a specific step is valid\n * @param step - Step number (1, 2, or 3)\n * @param data - Partial form data\n * @returns true if the step is valid\n */\nexport function isStepValid(\n step: number,\n data: Partial<SendActivityFormData>\n): boolean {\n const errors = validateStep(step, data);\n return Object.keys(errors).length === 0;\n}\n\n/**\n * Checks if all steps are valid (form can be submitted)\n * @param data - Partial form data\n * @returns true if all steps are valid\n */\nexport function isFormValid(data: Partial<SendActivityFormData>): boolean {\n return isStepValid(1, data) && isStepValid(2, data) && isStepValid(3, data);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/SendActivityModal/hooks/useSendActivityModal.ts","../../../src/components/SendActivityModal/validation.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { SendActivityFormData, StepErrors, CategoryConfig } from '../types';\nimport { validateStep } from '../validation';\n\n/**\n * Store interface for SendActivityModal\n */\nexport interface SendActivityModalStore {\n /** Form data */\n formData: Partial<SendActivityFormData>;\n /** Set form data */\n setFormData: (data: Partial<SendActivityFormData>) => void;\n\n /** Current step (1, 2, or 3) */\n currentStep: number;\n /** Completed steps */\n completedSteps: number[];\n /** Go to a specific step */\n goToStep: (step: number) => void;\n /** Go to next step (validates current step first) */\n nextStep: () => boolean;\n /** Go to previous step */\n previousStep: () => void;\n\n /** Validation errors */\n errors: StepErrors;\n /** Set errors */\n setErrors: (errors: StepErrors) => void;\n /** Validate current step */\n validateCurrentStep: () => boolean;\n /** Validate all steps */\n validateAllSteps: () => boolean;\n\n /** Categories state managed by CheckboxGroup */\n categories: CategoryConfig[];\n /** Update categories (called by CheckboxGroup) */\n setCategories: (categories: CategoryConfig[]) => void;\n\n /** Reset store to initial state */\n reset: () => void;\n}\n\nconst initialState = {\n formData: {\n canRetry: false,\n startTime: '00:00',\n finalTime: '23:59',\n } as Partial<SendActivityFormData>,\n currentStep: 1,\n completedSteps: [] as number[],\n errors: {} as StepErrors,\n categories: [] as CategoryConfig[],\n};\n\n/**\n * Helper to extract selected students from the students category\n */\nfunction extractStudentsFromCategories(\n categories: CategoryConfig[]\n): Array<{ studentId: string; userInstitutionId: string }> {\n // Find the students category (first matching by key 'students', 'alunos', or 'student')\n const studentsCategory = categories.find(\n (cat) =>\n cat.key === 'students' || cat.key === 'alunos' || cat.key === 'student'\n );\n\n if (!studentsCategory?.selectedIds || !studentsCategory.itens) {\n return [];\n }\n\n return studentsCategory.selectedIds\n .map((id) => {\n const student = studentsCategory.itens?.find((item) => item.id === id);\n if (student) {\n const rawStudentId = student.studentId;\n const rawUserInstId = student.userInstitutionId;\n const rawInstId = student.institutionId;\n\n // Extract studentId with type guard\n const studentId =\n typeof rawStudentId === 'string' || typeof rawStudentId === 'number'\n ? String(rawStudentId)\n : student.id;\n let userInstitutionId = '';\n if (\n typeof rawUserInstId === 'string' ||\n typeof rawUserInstId === 'number'\n ) {\n userInstitutionId = String(rawUserInstId);\n } else if (\n typeof rawInstId === 'string' ||\n typeof rawInstId === 'number'\n ) {\n userInstitutionId = String(rawInstId);\n }\n\n // Filter out entries without valid userInstitutionId\n if (!userInstitutionId) {\n return null;\n }\n\n return { studentId, userInstitutionId };\n }\n return null;\n })\n .filter(\n (s): s is { studentId: string; userInstitutionId: string } => s !== null\n );\n}\n\n/**\n * Creates the SendActivityModal store\n */\nexport const useSendActivityModalStore = create<SendActivityModalStore>(\n (set, get) => ({\n ...initialState,\n\n setFormData: (data) => {\n set((state) => ({\n formData: { ...state.formData, ...data },\n }));\n },\n\n goToStep: (step) => {\n if (step >= 1 && step <= 3) {\n set({ currentStep: step, errors: {} });\n }\n },\n\n nextStep: () => {\n const state = get();\n const isValid = state.validateCurrentStep();\n\n if (isValid && state.currentStep < 3) {\n set((prev) => ({\n currentStep: prev.currentStep + 1,\n completedSteps: prev.completedSteps.includes(prev.currentStep)\n ? prev.completedSteps\n : [...prev.completedSteps, prev.currentStep],\n errors: {},\n }));\n return true;\n }\n\n return isValid;\n },\n\n previousStep: () => {\n const state = get();\n if (state.currentStep > 1) {\n set({ currentStep: state.currentStep - 1, errors: {} });\n }\n },\n\n setErrors: (errors) => {\n set({ errors });\n },\n\n validateCurrentStep: () => {\n const state = get();\n // For step 2, extract students from categories to ensure auto-selection is considered\n let formDataToValidate = state.formData;\n let updatedFormData = state.formData;\n if (state.currentStep === 2 && state.categories.length > 0) {\n const students = extractStudentsFromCategories(state.categories);\n formDataToValidate = { ...state.formData, students };\n updatedFormData = formDataToValidate;\n }\n const errors = validateStep(state.currentStep, formDataToValidate);\n set({ formData: updatedFormData, errors });\n return Object.keys(errors).length === 0;\n },\n\n validateAllSteps: () => {\n const state = get();\n // Extract students from categories for step 2 validation\n let formDataForStep2 = state.formData;\n if (state.categories.length > 0) {\n const students = extractStudentsFromCategories(state.categories);\n formDataForStep2 = { ...state.formData, students };\n }\n const errors1 = validateStep(1, state.formData);\n const errors2 = validateStep(2, formDataForStep2);\n const errors3 = validateStep(3, state.formData);\n const allErrors = { ...errors1, ...errors2, ...errors3 };\n set({ errors: allErrors });\n return Object.keys(allErrors).length === 0;\n },\n\n setCategories: (categories) => {\n // Extract students from categories and update formData\n const students = extractStudentsFromCategories(categories);\n set((state) => ({\n categories,\n formData: { ...state.formData, students },\n }));\n },\n\n reset: () => {\n set({\n ...initialState,\n categories: [],\n });\n },\n })\n);\n\n/**\n * Hook to use the SendActivityModal store\n */\nexport function useSendActivityModal() {\n return useSendActivityModalStore();\n}\n","import { z } from 'zod';\nimport { SendActivityFormData, StepErrors } from './types';\n\n/**\n * Error messages for validation\n */\nexport const ERROR_MESSAGES = {\n SUBTYPE_REQUIRED:\n 'Campo obrigatório! Por favor, selecione uma opção para continuar.',\n TITLE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n STUDENTS_REQUIRED:\n 'Campo obrigatório! Por favor, selecione pelo menos um aluno para continuar.',\n START_DATE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n FINAL_DATE_REQUIRED:\n 'Campo obrigatório! Por favor, preencha este campo para continuar.',\n FINAL_DATE_INVALID: 'A data final deve ser maior ou igual à data inicial.',\n} as const;\n\n/**\n * Zod schema for activity step (Step 1)\n */\nexport const activityStepSchema = z.object({\n subtype: z.enum(['TAREFA', 'TRABALHO', 'PROVA'], {\n errorMap: () => ({ message: ERROR_MESSAGES.SUBTYPE_REQUIRED }),\n }),\n title: z\n .string({ required_error: ERROR_MESSAGES.TITLE_REQUIRED })\n .transform((val) => val.trim())\n .refine((val) => val.length > 0, {\n message: ERROR_MESSAGES.TITLE_REQUIRED,\n }),\n notification: z.string().optional(),\n});\n\n/**\n * Zod schema for recipient step (Step 2)\n */\nexport const recipientStepSchema = z.object({\n students: z\n .array(\n z.object({\n studentId: z.string(),\n userInstitutionId: z.string(),\n }),\n {\n required_error: ERROR_MESSAGES.STUDENTS_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.STUDENTS_REQUIRED,\n }\n )\n .min(1, ERROR_MESSAGES.STUDENTS_REQUIRED),\n});\n\n/**\n * Regex patterns for date and time validation\n */\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst TIME_REGEX = /^\\d{2}:\\d{2}$/;\n\n/**\n * Zod schema for deadline step (Step 3) - base validation\n */\nconst deadlineStepBaseSchema = z.object({\n startDate: z\n .string({\n required_error: ERROR_MESSAGES.START_DATE_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.START_DATE_REQUIRED,\n })\n .min(1, ERROR_MESSAGES.START_DATE_REQUIRED)\n .regex(DATE_REGEX, ERROR_MESSAGES.START_DATE_REQUIRED),\n startTime: z.string().regex(TIME_REGEX).default('00:00'),\n finalDate: z\n .string({\n required_error: ERROR_MESSAGES.FINAL_DATE_REQUIRED,\n invalid_type_error: ERROR_MESSAGES.FINAL_DATE_REQUIRED,\n })\n .min(1, ERROR_MESSAGES.FINAL_DATE_REQUIRED)\n .regex(DATE_REGEX, ERROR_MESSAGES.FINAL_DATE_REQUIRED),\n finalTime: z.string().regex(TIME_REGEX).default('23:59'),\n canRetry: z.boolean().default(false),\n});\n\n/**\n * Zod schema for deadline step with date comparison refinement\n */\nexport const deadlineStepSchema = deadlineStepBaseSchema.refine(\n (data) => {\n const start = new Date(`${data.startDate}T${data.startTime}`);\n const end = new Date(`${data.finalDate}T${data.finalTime}`);\n return end >= start;\n },\n { message: ERROR_MESSAGES.FINAL_DATE_INVALID, path: ['finalDate'] }\n);\n\n/**\n * Type inference from Zod schemas\n */\nexport type ActivityStepData = z.infer<typeof activityStepSchema>;\nexport type RecipientStepData = z.infer<typeof recipientStepSchema>;\nexport type DeadlineStepData = z.infer<typeof deadlineStepSchema>;\n\n/**\n * Validates the activity step (Step 1) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateActivityStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n const result = activityStepSchema.safeParse({\n subtype: data.subtype,\n title: data.title,\n notification: data.notification,\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n const field = issue.path[0] as keyof StepErrors;\n if (field === 'subtype' || field === 'title') {\n errors[field] = issue.message;\n }\n });\n }\n\n return errors;\n}\n\n/**\n * Validates the recipient step (Step 2) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateRecipientStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n const result = recipientStepSchema.safeParse({\n students: data.students ?? [],\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n if (issue.path[0] === 'students') {\n errors.students = issue.message;\n }\n });\n }\n\n return errors;\n}\n\n/**\n * Validates the deadline step (Step 3) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateDeadlineStep(\n data: Partial<SendActivityFormData>\n): StepErrors {\n const errors: StepErrors = {};\n\n // First validate individual fields\n if (!data.startDate) {\n errors.startDate = ERROR_MESSAGES.START_DATE_REQUIRED;\n }\n\n if (!data.finalDate) {\n errors.finalDate = ERROR_MESSAGES.FINAL_DATE_REQUIRED;\n }\n\n // If both dates exist, validate with the full schema (including refinement)\n if (data.startDate && data.finalDate) {\n const result = deadlineStepSchema.safeParse({\n startDate: data.startDate,\n startTime: data.startTime ?? '00:00',\n finalDate: data.finalDate,\n finalTime: data.finalTime ?? '23:59',\n canRetry: data.canRetry ?? false,\n });\n\n if (!result.success) {\n result.error.issues.forEach((issue) => {\n const field = issue.path[0] as keyof StepErrors;\n if (field === 'startDate' || field === 'finalDate') {\n errors[field] = issue.message;\n }\n });\n }\n }\n\n return errors;\n}\n\n/**\n * Validates a specific step\n * @param step - Step number (1, 2, or 3)\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateStep(\n step: number,\n data: Partial<SendActivityFormData>\n): StepErrors {\n switch (step) {\n case 1:\n return validateActivityStep(data);\n case 2:\n return validateRecipientStep(data);\n case 3:\n return validateDeadlineStep(data);\n default:\n return {};\n }\n}\n\n/**\n * Checks if a specific step is valid\n * @param step - Step number (1, 2, or 3)\n * @param data - Partial form data\n * @returns true if the step is valid\n */\nexport function isStepValid(\n step: number,\n data: Partial<SendActivityFormData>\n): boolean {\n const errors = validateStep(step, data);\n return Object.keys(errors).length === 0;\n}\n\n/**\n * Checks if all steps are valid (form can be submitted)\n * @param data - Partial form data\n * @returns true if all steps are valid\n */\nexport function isFormValid(data: Partial<SendActivityFormData>): boolean {\n return isStepValid(1, data) && isStepValid(2, data) && isStepValid(3, data);\n}\n"],"mappings":"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","names":[]}
@@ -5392,6 +5392,87 @@ var AccordionGroup = (0, import_react15.forwardRef)(
5392
5392
  );
5393
5393
  AccordionGroup.displayName = "AccordionGroup";
5394
5394
 
5395
+ // src/components/CheckBoxGroup/CheckBoxGroup.helpers.ts
5396
+ var areSelectedIdsEqual = (ids1, ids2) => {
5397
+ if (ids1 === ids2) return true;
5398
+ if (!ids1 || !ids2) return ids1 === ids2;
5399
+ if (ids1.length !== ids2.length) return false;
5400
+ for (let i = 0; i < ids1.length; i++) {
5401
+ if (ids1[i] !== ids2[i]) return false;
5402
+ }
5403
+ return true;
5404
+ };
5405
+ var isCategoryEnabled = (category, allCategories) => {
5406
+ if (!category.dependsOn || category.dependsOn.length === 0) {
5407
+ return true;
5408
+ }
5409
+ return category.dependsOn.every((depKey) => {
5410
+ const depCat = allCategories.find((c) => c.key === depKey);
5411
+ return depCat?.selectedIds && depCat.selectedIds.length > 0;
5412
+ });
5413
+ };
5414
+ var isItemMatchingFilter = (item, filter, allCategories) => {
5415
+ const parentCat = allCategories.find((c) => c.key === filter.key);
5416
+ const parentSelectedIds = parentCat?.selectedIds || [];
5417
+ const itemFieldValue = item[filter.internalField];
5418
+ return parentSelectedIds.includes(String(itemFieldValue));
5419
+ };
5420
+ var getBadgeText = (category, formattedItems) => {
5421
+ const visibleIds = formattedItems.flatMap((group) => group.itens || []).map((i) => i.id);
5422
+ const selectedVisibleCount = visibleIds.filter(
5423
+ (id) => category.selectedIds?.includes(id)
5424
+ ).length;
5425
+ const totalVisible = visibleIds.length;
5426
+ return `${selectedVisibleCount} de ${totalVisible} ${selectedVisibleCount === 1 ? "selecionado" : "selecionados"}`;
5427
+ };
5428
+ var handleAccordionValueChange = (value, categories, isCategoryEnabledFn) => {
5429
+ if (typeof value !== "string") {
5430
+ if (!value) {
5431
+ return "";
5432
+ }
5433
+ return null;
5434
+ }
5435
+ if (!value) {
5436
+ return "";
5437
+ }
5438
+ const category = categories.find((c) => c.key === value);
5439
+ if (!category) {
5440
+ return null;
5441
+ }
5442
+ const isEnabled = isCategoryEnabledFn(category);
5443
+ if (!isEnabled) {
5444
+ return null;
5445
+ }
5446
+ return value;
5447
+ };
5448
+ var calculateFormattedItemsForAutoSelection = (category, allCategories) => {
5449
+ if (!category?.dependsOn || category.dependsOn.length === 0) {
5450
+ return category?.itens || [];
5451
+ }
5452
+ const isEnabled = isCategoryEnabled(category, allCategories);
5453
+ if (!isEnabled) {
5454
+ return [];
5455
+ }
5456
+ const filters = category.filteredBy || [];
5457
+ if (filters.length === 0) {
5458
+ return category?.itens || [];
5459
+ }
5460
+ const selectedIdsArr = filters.map((f) => {
5461
+ const parentCat = allCategories.find((c) => c.key === f.key);
5462
+ if (!parentCat?.selectedIds?.length) {
5463
+ return [];
5464
+ }
5465
+ return parentCat.selectedIds;
5466
+ });
5467
+ if (selectedIdsArr.some((arr) => arr.length === 0)) {
5468
+ return [];
5469
+ }
5470
+ const filteredItems = (category.itens || []).filter(
5471
+ (item) => filters.every((filter) => isItemMatchingFilter(item, filter, allCategories))
5472
+ );
5473
+ return filteredItems;
5474
+ };
5475
+
5395
5476
  // src/components/CheckBoxGroup/CheckBoxGroup.tsx
5396
5477
  var import_jsx_runtime25 = require("react/jsx-runtime");
5397
5478
  var CheckboxGroup = ({
@@ -5408,21 +5489,16 @@ var CheckboxGroup = ({
5408
5489
  (0, import_react16.useEffect)(() => {
5409
5490
  onCategoriesChangeRef.current = onCategoriesChange;
5410
5491
  }, [onCategoriesChange]);
5411
- const areSelectedIdsEqual = (ids1, ids2) => {
5412
- if (ids1 === ids2) return true;
5413
- if (!ids1 || !ids2) return ids1 === ids2;
5414
- if (ids1.length !== ids2.length) return false;
5415
- for (let i = 0; i < ids1.length; i++) {
5416
- if (ids1[i] !== ids2[i]) return false;
5417
- }
5418
- return true;
5419
- };
5420
5492
  const categoriesWithAutoSelection = (0, import_react16.useMemo)(() => {
5421
5493
  return categories.map((category) => {
5422
- if (category.itens?.length === 1 && (!category.selectedIds || category.selectedIds.length === 0)) {
5494
+ const filteredItems = calculateFormattedItemsForAutoSelection(
5495
+ category,
5496
+ categories
5497
+ );
5498
+ if (filteredItems.length === 1 && (!category.selectedIds || category.selectedIds.length === 0)) {
5423
5499
  return {
5424
5500
  ...category,
5425
- selectedIds: [category.itens[0].id]
5501
+ selectedIds: [filteredItems[0].id]
5426
5502
  };
5427
5503
  }
5428
5504
  return category;
@@ -5557,6 +5633,23 @@ var CheckboxGroup = ({
5557
5633
  const getFormattedItems = (categoryKey) => {
5558
5634
  return formattedItemsMap[categoryKey] || [{ itens: [] }];
5559
5635
  };
5636
+ const getBadgeText2 = (category) => {
5637
+ const formattedItems = getFormattedItems(category.key);
5638
+ return getBadgeText(category, formattedItems);
5639
+ };
5640
+ const isCategoryEnabled2 = (category) => {
5641
+ return isCategoryEnabled(category, categories);
5642
+ };
5643
+ const handleAccordionValueChange2 = (value) => {
5644
+ const newValue = handleAccordionValueChange(
5645
+ value,
5646
+ categories,
5647
+ isCategoryEnabled2
5648
+ );
5649
+ if (newValue !== null) {
5650
+ setOpenAccordion(newValue);
5651
+ }
5652
+ };
5560
5653
  const getDependentCategories = (categoryKey) => {
5561
5654
  return categories.filter((cat) => cat.dependsOn?.includes(categoryKey)).map((cat) => cat.key);
5562
5655
  };
@@ -5749,14 +5842,7 @@ var CheckboxGroup = ({
5749
5842
  }
5750
5843
  )
5751
5844
  ] }),
5752
- (openAccordion === category.key || isEnabled) && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Badge_default, { variant: "solid", action: "info", children: (() => {
5753
- const visibleIds = getFormattedItems(category.key).flatMap((group) => group.itens || []).map((i) => i.id);
5754
- const selectedVisibleCount = visibleIds.filter(
5755
- (id) => category.selectedIds?.includes(id)
5756
- ).length;
5757
- const totalVisible = visibleIds.length;
5758
- return `${selectedVisibleCount} de ${totalVisible} ${selectedVisibleCount === 1 ? "selecionado" : "selecionados"}`;
5759
- })() })
5845
+ (openAccordion === category.key || isEnabled) && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Badge_default, { variant: "solid", action: "info", children: getBadgeText2(category) })
5760
5846
  ] });
5761
5847
  const renderCompactSingleItem = (category) => {
5762
5848
  const formattedItems = getFormattedItems(category.key);
@@ -5778,10 +5864,7 @@ var CheckboxGroup = ({
5778
5864
  );
5779
5865
  };
5780
5866
  const renderCategoryAccordion = (category) => {
5781
- const isEnabled = !category.dependsOn || category.dependsOn.every((depKey) => {
5782
- const depCat = categories.find((c) => c.key === depKey);
5783
- return depCat?.selectedIds && depCat.selectedIds.length > 0;
5784
- });
5867
+ const isEnabled = isCategoryEnabled2(category);
5785
5868
  const hasOnlyOneItem = category.itens?.length === 1;
5786
5869
  if (hasOnlyOneItem && !compactSingleItem && !showSingleItem) {
5787
5870
  return null;
@@ -5821,10 +5904,7 @@ var CheckboxGroup = ({
5821
5904
  if (!openAccordion) return;
5822
5905
  const category = categories.find((c) => c.key === openAccordion);
5823
5906
  if (!category) return;
5824
- const isEnabled = !category.dependsOn || category.dependsOn.every((depKey) => {
5825
- const depCat = categories.find((c) => c.key === depKey);
5826
- return depCat?.selectedIds && depCat.selectedIds.length > 0;
5827
- });
5907
+ const isEnabled = isCategoryEnabled2(category);
5828
5908
  if (!isEnabled) {
5829
5909
  setTimeout(() => {
5830
5910
  setOpenAccordion("");
@@ -5837,21 +5917,7 @@ var CheckboxGroup = ({
5837
5917
  type: "single",
5838
5918
  collapsible: true,
5839
5919
  value: openAccordion,
5840
- onValueChange: (value) => {
5841
- if (typeof value === "string") {
5842
- if (value) {
5843
- const category = categories.find((c) => c.key === value);
5844
- const isEnabled = !category?.dependsOn || category.dependsOn.every((depKey) => {
5845
- const depCat = categories.find((c) => c.key === depKey);
5846
- return depCat?.selectedIds && depCat.selectedIds.length > 0;
5847
- });
5848
- if (!isEnabled) {
5849
- return;
5850
- }
5851
- }
5852
- setOpenAccordion(value);
5853
- }
5854
- },
5920
+ onValueChange: handleAccordionValueChange2,
5855
5921
  children: categories.map(renderCategoryAccordion)
5856
5922
  }
5857
5923
  );
@@ -5934,7 +6000,7 @@ function validateActivityStep(data) {
5934
6000
  function validateRecipientStep(data) {
5935
6001
  const errors = {};
5936
6002
  const result = recipientStepSchema.safeParse({
5937
- students: data.students
6003
+ students: data.students ?? []
5938
6004
  });
5939
6005
  if (!result.success) {
5940
6006
  result.error.issues.forEach((issue) => {
@@ -6071,14 +6137,26 @@ var useSendActivityModalStore = (0, import_zustand5.create)(
6071
6137
  },
6072
6138
  validateCurrentStep: () => {
6073
6139
  const state = get();
6074
- const errors = validateStep(state.currentStep, state.formData);
6075
- set({ errors });
6140
+ let formDataToValidate = state.formData;
6141
+ let updatedFormData = state.formData;
6142
+ if (state.currentStep === 2 && state.categories.length > 0) {
6143
+ const students = extractStudentsFromCategories(state.categories);
6144
+ formDataToValidate = { ...state.formData, students };
6145
+ updatedFormData = formDataToValidate;
6146
+ }
6147
+ const errors = validateStep(state.currentStep, formDataToValidate);
6148
+ set({ formData: updatedFormData, errors });
6076
6149
  return Object.keys(errors).length === 0;
6077
6150
  },
6078
6151
  validateAllSteps: () => {
6079
6152
  const state = get();
6153
+ let formDataForStep2 = state.formData;
6154
+ if (state.categories.length > 0) {
6155
+ const students = extractStudentsFromCategories(state.categories);
6156
+ formDataForStep2 = { ...state.formData, students };
6157
+ }
6080
6158
  const errors1 = validateStep(1, state.formData);
6081
- const errors2 = validateStep(2, state.formData);
6159
+ const errors2 = validateStep(2, formDataForStep2);
6082
6160
  const errors3 = validateStep(3, state.formData);
6083
6161
  const allErrors = { ...errors1, ...errors2, ...errors3 };
6084
6162
  set({ errors: allErrors });