analytica-frontend-lib 1.2.53 → 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.
- package/dist/ActivitiesHistory/index.js +108 -42
- package/dist/ActivitiesHistory/index.js.map +1 -1
- package/dist/ActivitiesHistory/index.mjs +108 -42
- package/dist/ActivitiesHistory/index.mjs.map +1 -1
- package/dist/ActivityDetails/index.js +108 -42
- package/dist/ActivityDetails/index.js.map +1 -1
- package/dist/ActivityDetails/index.mjs +108 -42
- package/dist/ActivityDetails/index.mjs.map +1 -1
- package/dist/ActivityFilters/index.js +110 -42
- package/dist/ActivityFilters/index.js.map +1 -1
- package/dist/ActivityFilters/index.mjs +110 -42
- package/dist/ActivityFilters/index.mjs.map +1 -1
- package/dist/AlertManager/index.js +110 -42
- package/dist/AlertManager/index.js.map +1 -1
- package/dist/AlertManager/index.mjs +110 -42
- package/dist/AlertManager/index.mjs.map +1 -1
- package/dist/RecommendedLessonsHistory/index.js +108 -42
- package/dist/RecommendedLessonsHistory/index.js.map +1 -1
- package/dist/RecommendedLessonsHistory/index.mjs +108 -42
- package/dist/RecommendedLessonsHistory/index.mjs.map +1 -1
- package/dist/SendActivityModal/SendActivityModal.js +124 -46
- package/dist/SendActivityModal/SendActivityModal.js.map +1 -1
- package/dist/SendActivityModal/SendActivityModal.mjs +124 -46
- 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 -4
- package/dist/SendActivityModal/hooks/useSendActivityModal.js.map +1 -1
- package/dist/SendActivityModal/hooks/useSendActivityModal.mjs +16 -4
- package/dist/SendActivityModal/hooks/useSendActivityModal.mjs.map +1 -1
- package/dist/SendActivityModal/index.js +124 -46
- package/dist/SendActivityModal/index.js.map +1 -1
- package/dist/SendActivityModal/index.mjs +124 -46
- package/dist/SendActivityModal/index.mjs.map +1 -1
- package/dist/SendActivityModal/validation.js +1 -1
- package/dist/SendActivityModal/validation.js.map +1 -1
- package/dist/SendActivityModal/validation.mjs +1 -1
- package/dist/SendActivityModal/validation.mjs.map +1 -1
- package/dist/TableProvider/index.js +108 -42
- package/dist/TableProvider/index.js.map +1 -1
- package/dist/TableProvider/index.mjs +108 -42
- package/dist/TableProvider/index.mjs.map +1 -1
- package/dist/hooks/useActivityModels/index.d.ts +6 -6
- package/dist/hooks/useActivityModels.d.ts +6 -6
- package/dist/hooks/useAppContent.d.ts +1 -0
- package/dist/hooks/useAppContent.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +183 -60
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +181 -60
- package/dist/index.mjs.map +1 -1
- 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,
|
|
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
|
-
|
|
234
|
-
|
|
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,
|
|
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
|
-
|
|
209
|
-
|
|
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,
|
|
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
|
-
|
|
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: [
|
|
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 =
|
|
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 =
|
|
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:
|
|
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
|
-
|
|
6075
|
-
|
|
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,
|
|
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 });
|