analytica-frontend-lib 1.2.78 → 1.2.79
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/ActivitiesHistory/index.js +485 -418
- package/dist/ActivitiesHistory/index.js.map +1 -1
- package/dist/ActivitiesHistory/index.mjs +478 -411
- package/dist/ActivitiesHistory/index.mjs.map +1 -1
- package/dist/RecommendedLessonsHistory/index.d.ts +1 -1
- package/dist/RecommendedLessonsHistory/index.d.ts.map +1 -1
- package/dist/RecommendedLessonsHistory/index.js +1183 -381
- package/dist/RecommendedLessonsHistory/index.js.map +1 -1
- package/dist/RecommendedLessonsHistory/index.mjs +1176 -372
- package/dist/RecommendedLessonsHistory/index.mjs.map +1 -1
- package/dist/SendActivityModal/SendActivityModal.d.ts.map +1 -1
- package/dist/SendActivityModal/SendActivityModal.js +4261 -4117
- package/dist/SendActivityModal/SendActivityModal.js.map +1 -1
- package/dist/SendActivityModal/SendActivityModal.mjs +4282 -4139
- package/dist/SendActivityModal/SendActivityModal.mjs.map +1 -1
- package/dist/SendActivityModal/hooks/useSendActivityModal.d.ts.map +1 -1
- package/dist/SendActivityModal/hooks/useSendActivityModal.js +16 -18
- package/dist/SendActivityModal/hooks/useSendActivityModal.js.map +1 -1
- package/dist/SendActivityModal/hooks/useSendActivityModal.mjs +16 -18
- package/dist/SendActivityModal/hooks/useSendActivityModal.mjs.map +1 -1
- package/dist/SendActivityModal/index.js +1285 -1141
- package/dist/SendActivityModal/index.js.map +1 -1
- package/dist/SendActivityModal/index.mjs +1164 -1021
- package/dist/SendActivityModal/index.mjs.map +1 -1
- package/dist/hooks/useGoalModels.d.ts +171 -0
- package/dist/hooks/useGoalModels.d.ts.map +1 -0
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1864 -1716
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1896 -1765
- package/dist/index.mjs.map +1 -1
- package/dist/types/recommendedLessons/index.d.ts +61 -0
- package/dist/types/recommendedLessons/index.d.ts.map +1 -1
- package/dist/types/recommendedLessons/index.js +7 -0
- package/dist/types/recommendedLessons/index.js.map +1 -1
- package/dist/types/recommendedLessons/index.mjs +6 -0
- package/dist/types/recommendedLessons/index.mjs.map +1 -1
- package/dist/types/recommendedLessons.d.ts +61 -0
- package/dist/types/recommendedLessons.d.ts.map +1 -1
- package/dist/utils/extractStudentsFromCategories.d.ts +15 -0
- package/dist/utils/extractStudentsFromCategories.d.ts.map +1 -0
- package/dist/utils/renderSubjectCell.d.ts +11 -0
- package/dist/utils/renderSubjectCell.d.ts.map +1 -0
- package/package.json +3 -2
|
@@ -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;
|
|
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;AAI5E;;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;AAcD;;GAEG;AACH,eAAO,MAAM,yBAAyB,qFA4FrC,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,2BAEnC"}
|
|
@@ -151,22 +151,9 @@ function validateStep(step, data) {
|
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
// src/
|
|
155
|
-
var initialState = {
|
|
156
|
-
formData: {
|
|
157
|
-
canRetry: false,
|
|
158
|
-
startTime: "00:00",
|
|
159
|
-
finalTime: "23:59"
|
|
160
|
-
},
|
|
161
|
-
currentStep: 1,
|
|
162
|
-
completedSteps: [],
|
|
163
|
-
errors: {},
|
|
164
|
-
categories: []
|
|
165
|
-
};
|
|
154
|
+
// src/utils/extractStudentsFromCategories.ts
|
|
166
155
|
function extractStudentsFromCategories(categories) {
|
|
167
|
-
const studentsCategory = categories.find(
|
|
168
|
-
(cat) => cat.key === "students" || cat.key === "alunos" || cat.key === "student"
|
|
169
|
-
);
|
|
156
|
+
const studentsCategory = categories.find((cat) => cat.key === "students");
|
|
170
157
|
if (!studentsCategory?.selectedIds || !studentsCategory.itens) {
|
|
171
158
|
return [];
|
|
172
159
|
}
|
|
@@ -189,10 +176,21 @@ function extractStudentsFromCategories(categories) {
|
|
|
189
176
|
return { studentId, userInstitutionId };
|
|
190
177
|
}
|
|
191
178
|
return null;
|
|
192
|
-
}).filter(
|
|
193
|
-
(s) => s !== null
|
|
194
|
-
);
|
|
179
|
+
}).filter((s) => s !== null);
|
|
195
180
|
}
|
|
181
|
+
|
|
182
|
+
// src/components/SendActivityModal/hooks/useSendActivityModal.ts
|
|
183
|
+
var initialState = {
|
|
184
|
+
formData: {
|
|
185
|
+
canRetry: false,
|
|
186
|
+
startTime: "00:00",
|
|
187
|
+
finalTime: "23:59"
|
|
188
|
+
},
|
|
189
|
+
currentStep: 1,
|
|
190
|
+
completedSteps: [],
|
|
191
|
+
errors: {},
|
|
192
|
+
categories: []
|
|
193
|
+
};
|
|
196
194
|
var useSendActivityModalStore = (0, import_zustand.create)(
|
|
197
195
|
(set, get) => ({
|
|
198
196
|
...initialState,
|
|
@@ -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 // 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":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/SendActivityModal/hooks/useSendActivityModal.ts","../../../src/components/SendActivityModal/validation.ts","../../../src/utils/extractStudentsFromCategories.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { SendActivityFormData, StepErrors, CategoryConfig } from '../types';\nimport { validateStep } from '../validation';\nimport { extractStudentsFromCategories } from '../../../utils/extractStudentsFromCategories';\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 * 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","import type { CategoryConfig } from '../components/CheckBoxGroup/CheckBoxGroup';\n\n/**\n * Student data extracted from category selection\n */\nexport interface ExtractedStudent {\n studentId: string;\n userInstitutionId: string;\n}\n\n/**\n * Extract selected students from the students category\n * @param categories - Array of category configurations from CheckBoxGroup\n * @returns Array of extracted student data with studentId and userInstitutionId\n */\nexport function extractStudentsFromCategories(\n categories: CategoryConfig[]\n): ExtractedStudent[] {\n // Find the students category\n const studentsCategory = categories.find((cat) => cat.key === 'students');\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((s): s is ExtractedStudent => s !== null);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -126,22 +126,9 @@ function validateStep(step, data) {
|
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
// src/
|
|
130
|
-
var initialState = {
|
|
131
|
-
formData: {
|
|
132
|
-
canRetry: false,
|
|
133
|
-
startTime: "00:00",
|
|
134
|
-
finalTime: "23:59"
|
|
135
|
-
},
|
|
136
|
-
currentStep: 1,
|
|
137
|
-
completedSteps: [],
|
|
138
|
-
errors: {},
|
|
139
|
-
categories: []
|
|
140
|
-
};
|
|
129
|
+
// src/utils/extractStudentsFromCategories.ts
|
|
141
130
|
function extractStudentsFromCategories(categories) {
|
|
142
|
-
const studentsCategory = categories.find(
|
|
143
|
-
(cat) => cat.key === "students" || cat.key === "alunos" || cat.key === "student"
|
|
144
|
-
);
|
|
131
|
+
const studentsCategory = categories.find((cat) => cat.key === "students");
|
|
145
132
|
if (!studentsCategory?.selectedIds || !studentsCategory.itens) {
|
|
146
133
|
return [];
|
|
147
134
|
}
|
|
@@ -164,10 +151,21 @@ function extractStudentsFromCategories(categories) {
|
|
|
164
151
|
return { studentId, userInstitutionId };
|
|
165
152
|
}
|
|
166
153
|
return null;
|
|
167
|
-
}).filter(
|
|
168
|
-
(s) => s !== null
|
|
169
|
-
);
|
|
154
|
+
}).filter((s) => s !== null);
|
|
170
155
|
}
|
|
156
|
+
|
|
157
|
+
// src/components/SendActivityModal/hooks/useSendActivityModal.ts
|
|
158
|
+
var initialState = {
|
|
159
|
+
formData: {
|
|
160
|
+
canRetry: false,
|
|
161
|
+
startTime: "00:00",
|
|
162
|
+
finalTime: "23:59"
|
|
163
|
+
},
|
|
164
|
+
currentStep: 1,
|
|
165
|
+
completedSteps: [],
|
|
166
|
+
errors: {},
|
|
167
|
+
categories: []
|
|
168
|
+
};
|
|
171
169
|
var useSendActivityModalStore = create(
|
|
172
170
|
(set, get) => ({
|
|
173
171
|
...initialState,
|
|
@@ -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 // 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":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/SendActivityModal/hooks/useSendActivityModal.ts","../../../src/components/SendActivityModal/validation.ts","../../../src/utils/extractStudentsFromCategories.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { SendActivityFormData, StepErrors, CategoryConfig } from '../types';\nimport { validateStep } from '../validation';\nimport { extractStudentsFromCategories } from '../../../utils/extractStudentsFromCategories';\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 * 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","import type { CategoryConfig } from '../components/CheckBoxGroup/CheckBoxGroup';\n\n/**\n * Student data extracted from category selection\n */\nexport interface ExtractedStudent {\n studentId: string;\n userInstitutionId: string;\n}\n\n/**\n * Extract selected students from the students category\n * @param categories - Array of category configurations from CheckBoxGroup\n * @returns Array of extracted student data with studentId and userInstitutionId\n */\nexport function extractStudentsFromCategories(\n categories: CategoryConfig[]\n): ExtractedStudent[] {\n // Find the students category\n const studentsCategory = categories.find((cat) => cat.key === 'students');\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((s): s is ExtractedStudent => s !== null);\n}\n"],"mappings":"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","names":[]}
|