analytica-frontend-lib 1.2.81 → 1.2.82

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/ActivitiesHistory/index.js +34 -43
  2. package/dist/ActivitiesHistory/index.js.map +1 -1
  3. package/dist/ActivitiesHistory/index.mjs +34 -43
  4. package/dist/ActivitiesHistory/index.mjs.map +1 -1
  5. package/dist/ActivityDetails/index.js +30 -38
  6. package/dist/ActivityDetails/index.js.map +1 -1
  7. package/dist/ActivityDetails/index.mjs +30 -38
  8. package/dist/ActivityDetails/index.mjs.map +1 -1
  9. package/dist/ActivityFilters/index.js +30 -38
  10. package/dist/ActivityFilters/index.js.map +1 -1
  11. package/dist/ActivityFilters/index.mjs +30 -38
  12. package/dist/ActivityFilters/index.mjs.map +1 -1
  13. package/dist/AlertManager/index.js +30 -38
  14. package/dist/AlertManager/index.js.map +1 -1
  15. package/dist/AlertManager/index.mjs +30 -38
  16. package/dist/AlertManager/index.mjs.map +1 -1
  17. package/dist/RecommendedLessonsHistory/index.js +34 -43
  18. package/dist/RecommendedLessonsHistory/index.js.map +1 -1
  19. package/dist/RecommendedLessonsHistory/index.mjs +34 -43
  20. package/dist/RecommendedLessonsHistory/index.mjs.map +1 -1
  21. package/dist/SendActivityModal/SendActivityModal.js +30 -38
  22. package/dist/SendActivityModal/SendActivityModal.js.map +1 -1
  23. package/dist/SendActivityModal/SendActivityModal.mjs +30 -38
  24. package/dist/SendActivityModal/SendActivityModal.mjs.map +1 -1
  25. package/dist/SendActivityModal/index.js +30 -38
  26. package/dist/SendActivityModal/index.js.map +1 -1
  27. package/dist/SendActivityModal/index.mjs +30 -38
  28. package/dist/SendActivityModal/index.mjs.map +1 -1
  29. package/dist/TableProvider/index.js +30 -38
  30. package/dist/TableProvider/index.js.map +1 -1
  31. package/dist/TableProvider/index.mjs +30 -38
  32. package/dist/TableProvider/index.mjs.map +1 -1
  33. package/dist/hooks/useSendActivity/index.js +1 -1
  34. package/dist/hooks/useSendActivity/index.js.map +1 -1
  35. package/dist/hooks/useSendActivity/index.mjs +1 -1
  36. package/dist/hooks/useSendActivity/index.mjs.map +1 -1
  37. package/dist/index.js +39 -49
  38. package/dist/index.js.map +1 -1
  39. package/dist/index.mjs +39 -49
  40. package/dist/index.mjs.map +1 -1
  41. package/package.json +1 -1
@@ -63,7 +63,7 @@ function transformToCategoryConfig(data) {
63
63
  selectedIds: []
64
64
  },
65
65
  {
66
- key: "alunos",
66
+ key: "students",
67
67
  label: "Aluno",
68
68
  dependsOn: ["escola", "serie", "turma"],
69
69
  itens: data.students,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/useSendActivity.ts"],"sourcesContent":["/**\n * useSendActivity Hook\n *\n * Hook for managing the SendActivityModal state and actions.\n * Uses the API injection pattern (like ActivityDetails) for flexibility.\n */\n\nimport { useState, useCallback, useMemo, useRef } from 'react';\nimport dayjs from 'dayjs';\nimport type { CategoryConfig } from '../components/CheckBoxGroup/CheckBoxGroup';\nimport type {\n SendActivityFormData,\n SendActivityModalInitialData,\n} from '../components/SendActivityModal/types';\nimport type {\n UseSendActivityConfig,\n UseSendActivityReturn,\n SendActivityCategoriesData,\n ActivityModelItem,\n} from '../types/sendActivity';\n\n/**\n * Transform categories data to CategoryConfig format for CheckboxGroup\n * @param data - Categories data from API\n * @returns Array of CategoryConfig for CheckboxGroup\n */\nfunction transformToCategoryConfig(\n data: SendActivityCategoriesData\n): CategoryConfig[] {\n return [\n {\n key: 'escola',\n label: 'Escola',\n itens: data.schools,\n selectedIds: [],\n },\n {\n key: 'serie',\n label: 'Série',\n dependsOn: ['escola'],\n itens: data.schoolYears,\n filteredBy: [{ key: 'escola', internalField: 'escolaId' }],\n selectedIds: [],\n },\n {\n key: 'turma',\n label: 'Turma',\n dependsOn: ['escola', 'serie'],\n itens: data.classes,\n filteredBy: [\n { key: 'escola', internalField: 'escolaId' },\n { key: 'serie', internalField: 'serieId' },\n ],\n selectedIds: [],\n },\n {\n key: 'alunos',\n label: 'Aluno',\n dependsOn: ['escola', 'serie', 'turma'],\n itens: data.students,\n filteredBy: [\n { key: 'escola', internalField: 'escolaId' },\n { key: 'serie', internalField: 'serieId' },\n { key: 'turma', internalField: 'turmaId' },\n ],\n selectedIds: [],\n },\n ];\n}\n\n/**\n * Convert date and time to ISO datetime string\n * Uses dayjs for proper timezone conversion\n * @param date - Date string in YYYY-MM-DD format\n * @param time - Time string in HH:MM format\n * @returns ISO datetime string in UTC\n */\nfunction toISODateTime(date: string, time: string): string {\n return dayjs(`${date}T${time}`).toISOString();\n}\n\n/**\n * Hook for managing the SendActivityModal state and actions\n *\n * Uses the API injection pattern - receives functions for API calls\n * instead of making calls directly. This allows the hook to be used\n * in different projects with different API configurations.\n *\n * @param config - Configuration with API functions and callbacks\n * @returns Object with modal state, categories, and handlers\n *\n * @example\n * ```tsx\n * const sendActivity = useSendActivity({\n * fetchCategories: async () => {\n * const [schools, years, classes, students] = await Promise.all([\n * api.get('/schools'),\n * api.get('/school-years'),\n * api.get('/classes'),\n * api.get('/students'),\n * ]);\n * return { schools, schoolYears: years, classes, students };\n * },\n * createActivity: async (data) => {\n * const response = await api.post('/activities', data);\n * return { id: response.data.id };\n * },\n * sendToStudents: async (activityId, students) => {\n * await api.post('/activities/send-to-students', { activityId, students });\n * },\n * fetchQuestionIds: async (modelId) => {\n * const response = await api.get(`/activity-drafts/${modelId}`);\n * return response.data.selectedQuestions?.map(q => q.id) || null;\n * },\n * onSuccess: (msg) => toast.success(msg),\n * onError: (msg) => toast.error(msg),\n * });\n * ```\n */\nexport function useSendActivity(\n config: UseSendActivityConfig\n): UseSendActivityReturn {\n const {\n fetchCategories,\n createActivity,\n sendToStudents,\n fetchQuestionIds,\n onSuccess,\n onError,\n } = config;\n\n const [isOpen, setIsOpen] = useState(false);\n const [selectedModel, setSelectedModel] = useState<ActivityModelItem | null>(\n null\n );\n const [categories, setCategories] = useState<CategoryConfig[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isCategoriesLoading, setIsCategoriesLoading] = useState(false);\n\n const categoriesLoadedRef = useRef(false);\n\n /**\n * Initial data for pre-filling the modal form\n */\n const initialData = useMemo<SendActivityModalInitialData | undefined>(() => {\n if (!selectedModel) return undefined;\n return {\n title: selectedModel.title,\n };\n }, [selectedModel]);\n\n /**\n * Load categories for recipient selection\n */\n const loadCategories = useCallback(async () => {\n if (categoriesLoadedRef.current) return;\n\n setIsCategoriesLoading(true);\n try {\n const data = await fetchCategories();\n const categoryConfig = transformToCategoryConfig(data);\n setCategories(categoryConfig);\n categoriesLoadedRef.current = true;\n } catch (error) {\n console.error('Error loading categories:', error);\n onError?.('Erro ao carregar destinatários');\n } finally {\n setIsCategoriesLoading(false);\n }\n }, [fetchCategories, onError]);\n\n /**\n * Open the modal with a selected model\n * @param model - Activity model to send\n */\n const openModal = useCallback(\n (model: ActivityModelItem) => {\n setSelectedModel(model);\n setIsOpen(true);\n void loadCategories();\n },\n [loadCategories]\n );\n\n /**\n * Close the modal and reset state\n */\n const closeModal = useCallback(() => {\n setIsOpen(false);\n setSelectedModel(null);\n }, []);\n\n /**\n * Handle categories change from CheckboxGroup\n * @param updatedCategories - Updated categories array\n */\n const onCategoriesChange = useCallback(\n (updatedCategories: CategoryConfig[]) => {\n setCategories(updatedCategories);\n },\n []\n );\n\n /**\n * Handle form submission\n * @param data - Form data from SendActivityModal\n */\n const handleSubmit = useCallback(\n async (data: SendActivityFormData) => {\n if (!selectedModel) return;\n\n setIsLoading(true);\n\n try {\n // 1. Fetch question IDs from draft/model\n const questionIds = await fetchQuestionIds(selectedModel.id);\n if (!questionIds || questionIds.length === 0) {\n throw new Error('Não foi possível obter questões do modelo');\n }\n\n // 2. Create activity\n const createResponse = await createActivity({\n title: data.title,\n subjectId: selectedModel.subjectId,\n questionIds,\n subtype: data.subtype,\n notification: data.notification,\n startDate: toISODateTime(data.startDate, data.startTime),\n finalDate: toISODateTime(data.finalDate, data.finalTime),\n canRetry: data.canRetry,\n });\n\n // 3. Send to students\n await sendToStudents(createResponse.id, data.students);\n\n onSuccess?.(`Atividade enviada para ${data.students.length} aluno(s)`);\n\n closeModal();\n } catch (error) {\n console.error('Error sending activity:', error);\n onError?.('Erro ao enviar atividade');\n } finally {\n setIsLoading(false);\n }\n },\n [\n selectedModel,\n fetchQuestionIds,\n createActivity,\n sendToStudents,\n onSuccess,\n onError,\n closeModal,\n ]\n );\n\n return {\n isOpen,\n openModal,\n closeModal,\n selectedModel,\n initialData,\n categories,\n onCategoriesChange,\n isLoading,\n isCategoriesLoading,\n handleSubmit,\n };\n}\n"],"mappings":"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","names":["dayjs"]}
1
+ {"version":3,"sources":["../../../src/hooks/useSendActivity.ts"],"sourcesContent":["/**\n * useSendActivity Hook\n *\n * Hook for managing the SendActivityModal state and actions.\n * Uses the API injection pattern (like ActivityDetails) for flexibility.\n */\n\nimport { useState, useCallback, useMemo, useRef } from 'react';\nimport dayjs from 'dayjs';\nimport type { CategoryConfig } from '../components/CheckBoxGroup/CheckBoxGroup';\nimport type {\n SendActivityFormData,\n SendActivityModalInitialData,\n} from '../components/SendActivityModal/types';\nimport type {\n UseSendActivityConfig,\n UseSendActivityReturn,\n SendActivityCategoriesData,\n ActivityModelItem,\n} from '../types/sendActivity';\n\n/**\n * Transform categories data to CategoryConfig format for CheckboxGroup\n * @param data - Categories data from API\n * @returns Array of CategoryConfig for CheckboxGroup\n */\nfunction transformToCategoryConfig(\n data: SendActivityCategoriesData\n): CategoryConfig[] {\n return [\n {\n key: 'escola',\n label: 'Escola',\n itens: data.schools,\n selectedIds: [],\n },\n {\n key: 'serie',\n label: 'Série',\n dependsOn: ['escola'],\n itens: data.schoolYears,\n filteredBy: [{ key: 'escola', internalField: 'escolaId' }],\n selectedIds: [],\n },\n {\n key: 'turma',\n label: 'Turma',\n dependsOn: ['escola', 'serie'],\n itens: data.classes,\n filteredBy: [\n { key: 'escola', internalField: 'escolaId' },\n { key: 'serie', internalField: 'serieId' },\n ],\n selectedIds: [],\n },\n {\n key: 'students',\n label: 'Aluno',\n dependsOn: ['escola', 'serie', 'turma'],\n itens: data.students,\n filteredBy: [\n { key: 'escola', internalField: 'escolaId' },\n { key: 'serie', internalField: 'serieId' },\n { key: 'turma', internalField: 'turmaId' },\n ],\n selectedIds: [],\n },\n ];\n}\n\n/**\n * Convert date and time to ISO datetime string\n * Uses dayjs for proper timezone conversion\n * @param date - Date string in YYYY-MM-DD format\n * @param time - Time string in HH:MM format\n * @returns ISO datetime string in UTC\n */\nfunction toISODateTime(date: string, time: string): string {\n return dayjs(`${date}T${time}`).toISOString();\n}\n\n/**\n * Hook for managing the SendActivityModal state and actions\n *\n * Uses the API injection pattern - receives functions for API calls\n * instead of making calls directly. This allows the hook to be used\n * in different projects with different API configurations.\n *\n * @param config - Configuration with API functions and callbacks\n * @returns Object with modal state, categories, and handlers\n *\n * @example\n * ```tsx\n * const sendActivity = useSendActivity({\n * fetchCategories: async () => {\n * const [schools, years, classes, students] = await Promise.all([\n * api.get('/schools'),\n * api.get('/school-years'),\n * api.get('/classes'),\n * api.get('/students'),\n * ]);\n * return { schools, schoolYears: years, classes, students };\n * },\n * createActivity: async (data) => {\n * const response = await api.post('/activities', data);\n * return { id: response.data.id };\n * },\n * sendToStudents: async (activityId, students) => {\n * await api.post('/activities/send-to-students', { activityId, students });\n * },\n * fetchQuestionIds: async (modelId) => {\n * const response = await api.get(`/activity-drafts/${modelId}`);\n * return response.data.selectedQuestions?.map(q => q.id) || null;\n * },\n * onSuccess: (msg) => toast.success(msg),\n * onError: (msg) => toast.error(msg),\n * });\n * ```\n */\nexport function useSendActivity(\n config: UseSendActivityConfig\n): UseSendActivityReturn {\n const {\n fetchCategories,\n createActivity,\n sendToStudents,\n fetchQuestionIds,\n onSuccess,\n onError,\n } = config;\n\n const [isOpen, setIsOpen] = useState(false);\n const [selectedModel, setSelectedModel] = useState<ActivityModelItem | null>(\n null\n );\n const [categories, setCategories] = useState<CategoryConfig[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isCategoriesLoading, setIsCategoriesLoading] = useState(false);\n\n const categoriesLoadedRef = useRef(false);\n\n /**\n * Initial data for pre-filling the modal form\n */\n const initialData = useMemo<SendActivityModalInitialData | undefined>(() => {\n if (!selectedModel) return undefined;\n return {\n title: selectedModel.title,\n };\n }, [selectedModel]);\n\n /**\n * Load categories for recipient selection\n */\n const loadCategories = useCallback(async () => {\n if (categoriesLoadedRef.current) return;\n\n setIsCategoriesLoading(true);\n try {\n const data = await fetchCategories();\n const categoryConfig = transformToCategoryConfig(data);\n setCategories(categoryConfig);\n categoriesLoadedRef.current = true;\n } catch (error) {\n console.error('Error loading categories:', error);\n onError?.('Erro ao carregar destinatários');\n } finally {\n setIsCategoriesLoading(false);\n }\n }, [fetchCategories, onError]);\n\n /**\n * Open the modal with a selected model\n * @param model - Activity model to send\n */\n const openModal = useCallback(\n (model: ActivityModelItem) => {\n setSelectedModel(model);\n setIsOpen(true);\n void loadCategories();\n },\n [loadCategories]\n );\n\n /**\n * Close the modal and reset state\n */\n const closeModal = useCallback(() => {\n setIsOpen(false);\n setSelectedModel(null);\n }, []);\n\n /**\n * Handle categories change from CheckboxGroup\n * @param updatedCategories - Updated categories array\n */\n const onCategoriesChange = useCallback(\n (updatedCategories: CategoryConfig[]) => {\n setCategories(updatedCategories);\n },\n []\n );\n\n /**\n * Handle form submission\n * @param data - Form data from SendActivityModal\n */\n const handleSubmit = useCallback(\n async (data: SendActivityFormData) => {\n if (!selectedModel) return;\n\n setIsLoading(true);\n\n try {\n // 1. Fetch question IDs from draft/model\n const questionIds = await fetchQuestionIds(selectedModel.id);\n if (!questionIds || questionIds.length === 0) {\n throw new Error('Não foi possível obter questões do modelo');\n }\n\n // 2. Create activity\n const createResponse = await createActivity({\n title: data.title,\n subjectId: selectedModel.subjectId,\n questionIds,\n subtype: data.subtype,\n notification: data.notification,\n startDate: toISODateTime(data.startDate, data.startTime),\n finalDate: toISODateTime(data.finalDate, data.finalTime),\n canRetry: data.canRetry,\n });\n\n // 3. Send to students\n await sendToStudents(createResponse.id, data.students);\n\n onSuccess?.(`Atividade enviada para ${data.students.length} aluno(s)`);\n\n closeModal();\n } catch (error) {\n console.error('Error sending activity:', error);\n onError?.('Erro ao enviar atividade');\n } finally {\n setIsLoading(false);\n }\n },\n [\n selectedModel,\n fetchQuestionIds,\n createActivity,\n sendToStudents,\n onSuccess,\n onError,\n closeModal,\n ]\n );\n\n return {\n isOpen,\n openModal,\n closeModal,\n selectedModel,\n initialData,\n categories,\n onCategoriesChange,\n isLoading,\n isCategoriesLoading,\n handleSubmit,\n };\n}\n"],"mappings":"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","names":["dayjs"]}
@@ -29,7 +29,7 @@ function transformToCategoryConfig(data) {
29
29
  selectedIds: []
30
30
  },
31
31
  {
32
- key: "alunos",
32
+ key: "students",
33
33
  label: "Aluno",
34
34
  dependsOn: ["escola", "serie", "turma"],
35
35
  itens: data.students,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/useSendActivity.ts"],"sourcesContent":["/**\n * useSendActivity Hook\n *\n * Hook for managing the SendActivityModal state and actions.\n * Uses the API injection pattern (like ActivityDetails) for flexibility.\n */\n\nimport { useState, useCallback, useMemo, useRef } from 'react';\nimport dayjs from 'dayjs';\nimport type { CategoryConfig } from '../components/CheckBoxGroup/CheckBoxGroup';\nimport type {\n SendActivityFormData,\n SendActivityModalInitialData,\n} from '../components/SendActivityModal/types';\nimport type {\n UseSendActivityConfig,\n UseSendActivityReturn,\n SendActivityCategoriesData,\n ActivityModelItem,\n} from '../types/sendActivity';\n\n/**\n * Transform categories data to CategoryConfig format for CheckboxGroup\n * @param data - Categories data from API\n * @returns Array of CategoryConfig for CheckboxGroup\n */\nfunction transformToCategoryConfig(\n data: SendActivityCategoriesData\n): CategoryConfig[] {\n return [\n {\n key: 'escola',\n label: 'Escola',\n itens: data.schools,\n selectedIds: [],\n },\n {\n key: 'serie',\n label: 'Série',\n dependsOn: ['escola'],\n itens: data.schoolYears,\n filteredBy: [{ key: 'escola', internalField: 'escolaId' }],\n selectedIds: [],\n },\n {\n key: 'turma',\n label: 'Turma',\n dependsOn: ['escola', 'serie'],\n itens: data.classes,\n filteredBy: [\n { key: 'escola', internalField: 'escolaId' },\n { key: 'serie', internalField: 'serieId' },\n ],\n selectedIds: [],\n },\n {\n key: 'alunos',\n label: 'Aluno',\n dependsOn: ['escola', 'serie', 'turma'],\n itens: data.students,\n filteredBy: [\n { key: 'escola', internalField: 'escolaId' },\n { key: 'serie', internalField: 'serieId' },\n { key: 'turma', internalField: 'turmaId' },\n ],\n selectedIds: [],\n },\n ];\n}\n\n/**\n * Convert date and time to ISO datetime string\n * Uses dayjs for proper timezone conversion\n * @param date - Date string in YYYY-MM-DD format\n * @param time - Time string in HH:MM format\n * @returns ISO datetime string in UTC\n */\nfunction toISODateTime(date: string, time: string): string {\n return dayjs(`${date}T${time}`).toISOString();\n}\n\n/**\n * Hook for managing the SendActivityModal state and actions\n *\n * Uses the API injection pattern - receives functions for API calls\n * instead of making calls directly. This allows the hook to be used\n * in different projects with different API configurations.\n *\n * @param config - Configuration with API functions and callbacks\n * @returns Object with modal state, categories, and handlers\n *\n * @example\n * ```tsx\n * const sendActivity = useSendActivity({\n * fetchCategories: async () => {\n * const [schools, years, classes, students] = await Promise.all([\n * api.get('/schools'),\n * api.get('/school-years'),\n * api.get('/classes'),\n * api.get('/students'),\n * ]);\n * return { schools, schoolYears: years, classes, students };\n * },\n * createActivity: async (data) => {\n * const response = await api.post('/activities', data);\n * return { id: response.data.id };\n * },\n * sendToStudents: async (activityId, students) => {\n * await api.post('/activities/send-to-students', { activityId, students });\n * },\n * fetchQuestionIds: async (modelId) => {\n * const response = await api.get(`/activity-drafts/${modelId}`);\n * return response.data.selectedQuestions?.map(q => q.id) || null;\n * },\n * onSuccess: (msg) => toast.success(msg),\n * onError: (msg) => toast.error(msg),\n * });\n * ```\n */\nexport function useSendActivity(\n config: UseSendActivityConfig\n): UseSendActivityReturn {\n const {\n fetchCategories,\n createActivity,\n sendToStudents,\n fetchQuestionIds,\n onSuccess,\n onError,\n } = config;\n\n const [isOpen, setIsOpen] = useState(false);\n const [selectedModel, setSelectedModel] = useState<ActivityModelItem | null>(\n null\n );\n const [categories, setCategories] = useState<CategoryConfig[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isCategoriesLoading, setIsCategoriesLoading] = useState(false);\n\n const categoriesLoadedRef = useRef(false);\n\n /**\n * Initial data for pre-filling the modal form\n */\n const initialData = useMemo<SendActivityModalInitialData | undefined>(() => {\n if (!selectedModel) return undefined;\n return {\n title: selectedModel.title,\n };\n }, [selectedModel]);\n\n /**\n * Load categories for recipient selection\n */\n const loadCategories = useCallback(async () => {\n if (categoriesLoadedRef.current) return;\n\n setIsCategoriesLoading(true);\n try {\n const data = await fetchCategories();\n const categoryConfig = transformToCategoryConfig(data);\n setCategories(categoryConfig);\n categoriesLoadedRef.current = true;\n } catch (error) {\n console.error('Error loading categories:', error);\n onError?.('Erro ao carregar destinatários');\n } finally {\n setIsCategoriesLoading(false);\n }\n }, [fetchCategories, onError]);\n\n /**\n * Open the modal with a selected model\n * @param model - Activity model to send\n */\n const openModal = useCallback(\n (model: ActivityModelItem) => {\n setSelectedModel(model);\n setIsOpen(true);\n void loadCategories();\n },\n [loadCategories]\n );\n\n /**\n * Close the modal and reset state\n */\n const closeModal = useCallback(() => {\n setIsOpen(false);\n setSelectedModel(null);\n }, []);\n\n /**\n * Handle categories change from CheckboxGroup\n * @param updatedCategories - Updated categories array\n */\n const onCategoriesChange = useCallback(\n (updatedCategories: CategoryConfig[]) => {\n setCategories(updatedCategories);\n },\n []\n );\n\n /**\n * Handle form submission\n * @param data - Form data from SendActivityModal\n */\n const handleSubmit = useCallback(\n async (data: SendActivityFormData) => {\n if (!selectedModel) return;\n\n setIsLoading(true);\n\n try {\n // 1. Fetch question IDs from draft/model\n const questionIds = await fetchQuestionIds(selectedModel.id);\n if (!questionIds || questionIds.length === 0) {\n throw new Error('Não foi possível obter questões do modelo');\n }\n\n // 2. Create activity\n const createResponse = await createActivity({\n title: data.title,\n subjectId: selectedModel.subjectId,\n questionIds,\n subtype: data.subtype,\n notification: data.notification,\n startDate: toISODateTime(data.startDate, data.startTime),\n finalDate: toISODateTime(data.finalDate, data.finalTime),\n canRetry: data.canRetry,\n });\n\n // 3. Send to students\n await sendToStudents(createResponse.id, data.students);\n\n onSuccess?.(`Atividade enviada para ${data.students.length} aluno(s)`);\n\n closeModal();\n } catch (error) {\n console.error('Error sending activity:', error);\n onError?.('Erro ao enviar atividade');\n } finally {\n setIsLoading(false);\n }\n },\n [\n selectedModel,\n fetchQuestionIds,\n createActivity,\n sendToStudents,\n onSuccess,\n onError,\n closeModal,\n ]\n );\n\n return {\n isOpen,\n openModal,\n closeModal,\n selectedModel,\n initialData,\n categories,\n onCategoriesChange,\n isLoading,\n isCategoriesLoading,\n handleSubmit,\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/hooks/useSendActivity.ts"],"sourcesContent":["/**\n * useSendActivity Hook\n *\n * Hook for managing the SendActivityModal state and actions.\n * Uses the API injection pattern (like ActivityDetails) for flexibility.\n */\n\nimport { useState, useCallback, useMemo, useRef } from 'react';\nimport dayjs from 'dayjs';\nimport type { CategoryConfig } from '../components/CheckBoxGroup/CheckBoxGroup';\nimport type {\n SendActivityFormData,\n SendActivityModalInitialData,\n} from '../components/SendActivityModal/types';\nimport type {\n UseSendActivityConfig,\n UseSendActivityReturn,\n SendActivityCategoriesData,\n ActivityModelItem,\n} from '../types/sendActivity';\n\n/**\n * Transform categories data to CategoryConfig format for CheckboxGroup\n * @param data - Categories data from API\n * @returns Array of CategoryConfig for CheckboxGroup\n */\nfunction transformToCategoryConfig(\n data: SendActivityCategoriesData\n): CategoryConfig[] {\n return [\n {\n key: 'escola',\n label: 'Escola',\n itens: data.schools,\n selectedIds: [],\n },\n {\n key: 'serie',\n label: 'Série',\n dependsOn: ['escola'],\n itens: data.schoolYears,\n filteredBy: [{ key: 'escola', internalField: 'escolaId' }],\n selectedIds: [],\n },\n {\n key: 'turma',\n label: 'Turma',\n dependsOn: ['escola', 'serie'],\n itens: data.classes,\n filteredBy: [\n { key: 'escola', internalField: 'escolaId' },\n { key: 'serie', internalField: 'serieId' },\n ],\n selectedIds: [],\n },\n {\n key: 'students',\n label: 'Aluno',\n dependsOn: ['escola', 'serie', 'turma'],\n itens: data.students,\n filteredBy: [\n { key: 'escola', internalField: 'escolaId' },\n { key: 'serie', internalField: 'serieId' },\n { key: 'turma', internalField: 'turmaId' },\n ],\n selectedIds: [],\n },\n ];\n}\n\n/**\n * Convert date and time to ISO datetime string\n * Uses dayjs for proper timezone conversion\n * @param date - Date string in YYYY-MM-DD format\n * @param time - Time string in HH:MM format\n * @returns ISO datetime string in UTC\n */\nfunction toISODateTime(date: string, time: string): string {\n return dayjs(`${date}T${time}`).toISOString();\n}\n\n/**\n * Hook for managing the SendActivityModal state and actions\n *\n * Uses the API injection pattern - receives functions for API calls\n * instead of making calls directly. This allows the hook to be used\n * in different projects with different API configurations.\n *\n * @param config - Configuration with API functions and callbacks\n * @returns Object with modal state, categories, and handlers\n *\n * @example\n * ```tsx\n * const sendActivity = useSendActivity({\n * fetchCategories: async () => {\n * const [schools, years, classes, students] = await Promise.all([\n * api.get('/schools'),\n * api.get('/school-years'),\n * api.get('/classes'),\n * api.get('/students'),\n * ]);\n * return { schools, schoolYears: years, classes, students };\n * },\n * createActivity: async (data) => {\n * const response = await api.post('/activities', data);\n * return { id: response.data.id };\n * },\n * sendToStudents: async (activityId, students) => {\n * await api.post('/activities/send-to-students', { activityId, students });\n * },\n * fetchQuestionIds: async (modelId) => {\n * const response = await api.get(`/activity-drafts/${modelId}`);\n * return response.data.selectedQuestions?.map(q => q.id) || null;\n * },\n * onSuccess: (msg) => toast.success(msg),\n * onError: (msg) => toast.error(msg),\n * });\n * ```\n */\nexport function useSendActivity(\n config: UseSendActivityConfig\n): UseSendActivityReturn {\n const {\n fetchCategories,\n createActivity,\n sendToStudents,\n fetchQuestionIds,\n onSuccess,\n onError,\n } = config;\n\n const [isOpen, setIsOpen] = useState(false);\n const [selectedModel, setSelectedModel] = useState<ActivityModelItem | null>(\n null\n );\n const [categories, setCategories] = useState<CategoryConfig[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isCategoriesLoading, setIsCategoriesLoading] = useState(false);\n\n const categoriesLoadedRef = useRef(false);\n\n /**\n * Initial data for pre-filling the modal form\n */\n const initialData = useMemo<SendActivityModalInitialData | undefined>(() => {\n if (!selectedModel) return undefined;\n return {\n title: selectedModel.title,\n };\n }, [selectedModel]);\n\n /**\n * Load categories for recipient selection\n */\n const loadCategories = useCallback(async () => {\n if (categoriesLoadedRef.current) return;\n\n setIsCategoriesLoading(true);\n try {\n const data = await fetchCategories();\n const categoryConfig = transformToCategoryConfig(data);\n setCategories(categoryConfig);\n categoriesLoadedRef.current = true;\n } catch (error) {\n console.error('Error loading categories:', error);\n onError?.('Erro ao carregar destinatários');\n } finally {\n setIsCategoriesLoading(false);\n }\n }, [fetchCategories, onError]);\n\n /**\n * Open the modal with a selected model\n * @param model - Activity model to send\n */\n const openModal = useCallback(\n (model: ActivityModelItem) => {\n setSelectedModel(model);\n setIsOpen(true);\n void loadCategories();\n },\n [loadCategories]\n );\n\n /**\n * Close the modal and reset state\n */\n const closeModal = useCallback(() => {\n setIsOpen(false);\n setSelectedModel(null);\n }, []);\n\n /**\n * Handle categories change from CheckboxGroup\n * @param updatedCategories - Updated categories array\n */\n const onCategoriesChange = useCallback(\n (updatedCategories: CategoryConfig[]) => {\n setCategories(updatedCategories);\n },\n []\n );\n\n /**\n * Handle form submission\n * @param data - Form data from SendActivityModal\n */\n const handleSubmit = useCallback(\n async (data: SendActivityFormData) => {\n if (!selectedModel) return;\n\n setIsLoading(true);\n\n try {\n // 1. Fetch question IDs from draft/model\n const questionIds = await fetchQuestionIds(selectedModel.id);\n if (!questionIds || questionIds.length === 0) {\n throw new Error('Não foi possível obter questões do modelo');\n }\n\n // 2. Create activity\n const createResponse = await createActivity({\n title: data.title,\n subjectId: selectedModel.subjectId,\n questionIds,\n subtype: data.subtype,\n notification: data.notification,\n startDate: toISODateTime(data.startDate, data.startTime),\n finalDate: toISODateTime(data.finalDate, data.finalTime),\n canRetry: data.canRetry,\n });\n\n // 3. Send to students\n await sendToStudents(createResponse.id, data.students);\n\n onSuccess?.(`Atividade enviada para ${data.students.length} aluno(s)`);\n\n closeModal();\n } catch (error) {\n console.error('Error sending activity:', error);\n onError?.('Erro ao enviar atividade');\n } finally {\n setIsLoading(false);\n }\n },\n [\n selectedModel,\n fetchQuestionIds,\n createActivity,\n sendToStudents,\n onSuccess,\n onError,\n closeModal,\n ]\n );\n\n return {\n isOpen,\n openModal,\n closeModal,\n selectedModel,\n initialData,\n categories,\n onCategoriesChange,\n isLoading,\n isCategoriesLoading,\n handleSubmit,\n };\n}\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -2342,9 +2342,9 @@ var CheckboxGroup = ({
2342
2342
  showSingleItem = false
2343
2343
  }) => {
2344
2344
  const [openAccordion, setOpenAccordion] = (0, import_react7.useState)("");
2345
- const autoSelectionAppliedRef = (0, import_react7.useRef)(false);
2346
2345
  const onCategoriesChangeRef = (0, import_react7.useRef)(onCategoriesChange);
2347
2346
  const previousCategoriesRef = (0, import_react7.useRef)(categories);
2347
+ const appliedAutoSelectionRef = (0, import_react7.useRef)("");
2348
2348
  (0, import_react7.useEffect)(() => {
2349
2349
  onCategoriesChangeRef.current = onCategoriesChange;
2350
2350
  }, [onCategoriesChange]);
@@ -2365,9 +2365,6 @@ var CheckboxGroup = ({
2365
2365
  }, [categories]);
2366
2366
  (0, import_react7.useEffect)(() => {
2367
2367
  const categoriesChanged = categories !== previousCategoriesRef.current;
2368
- if (!categoriesChanged && autoSelectionAppliedRef.current) {
2369
- return;
2370
- }
2371
2368
  previousCategoriesRef.current = categories;
2372
2369
  const hasAutoSelectionChanges = categoriesWithAutoSelection.some(
2373
2370
  (cat, index) => {
@@ -2375,11 +2372,18 @@ var CheckboxGroup = ({
2375
2372
  return !areSelectedIdsEqual(cat.selectedIds, originalCat.selectedIds);
2376
2373
  }
2377
2374
  );
2378
- if (hasAutoSelectionChanges) {
2379
- autoSelectionAppliedRef.current = true;
2375
+ if (!hasAutoSelectionChanges) {
2376
+ if (categoriesChanged) {
2377
+ appliedAutoSelectionRef.current = "";
2378
+ }
2379
+ return;
2380
+ }
2381
+ const autoSelectionSignature = JSON.stringify(
2382
+ categoriesWithAutoSelection.map((c) => c.selectedIds)
2383
+ );
2384
+ if (appliedAutoSelectionRef.current !== autoSelectionSignature) {
2385
+ appliedAutoSelectionRef.current = autoSelectionSignature;
2380
2386
  onCategoriesChangeRef.current(categoriesWithAutoSelection);
2381
- } else if (categoriesChanged) {
2382
- autoSelectionAppliedRef.current = false;
2383
2387
  }
2384
2388
  }, [categoriesWithAutoSelection, categories]);
2385
2389
  const isCheckBoxIsSelected = (categoryKey, itemId) => {
@@ -2636,36 +2640,24 @@ var CheckboxGroup = ({
2636
2640
  };
2637
2641
  const renderCheckboxItem = (item, categoryKey) => {
2638
2642
  const uniqueId = `${categoryKey}-${item.id}`;
2639
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
2640
- "div",
2641
- {
2642
- className: "flex items-center gap-3 px-2",
2643
- role: "presentation",
2644
- onClick: (e) => e.stopPropagation(),
2645
- onMouseDown: (e) => e.stopPropagation(),
2646
- onMouseUp: (e) => e.stopPropagation(),
2647
- onKeyDown: (e) => e.stopPropagation(),
2648
- children: [
2649
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
2650
- CheckBox_default,
2651
- {
2652
- id: uniqueId,
2653
- checked: isCheckBoxIsSelected(categoryKey, item.id),
2654
- onChange: () => toggleItem(categoryKey, item.id)
2655
- }
2656
- ),
2657
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
2658
- "label",
2659
- {
2660
- htmlFor: uniqueId,
2661
- className: "text-sm text-text-950 cursor-pointer select-none",
2662
- children: item.name
2663
- }
2664
- )
2665
- ]
2666
- },
2667
- item.id
2668
- );
2643
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-3 px-2", children: [
2644
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
2645
+ CheckBox_default,
2646
+ {
2647
+ id: uniqueId,
2648
+ checked: isCheckBoxIsSelected(categoryKey, item.id),
2649
+ onChange: () => toggleItem(categoryKey, item.id)
2650
+ }
2651
+ ),
2652
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
2653
+ "label",
2654
+ {
2655
+ htmlFor: uniqueId,
2656
+ className: "text-sm text-text-950 cursor-pointer select-none",
2657
+ children: item.name
2658
+ }
2659
+ )
2660
+ ] }, item.id);
2669
2661
  };
2670
2662
  const renderFormattedGroup = (formattedGroup, idx, categoryKey) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
2671
2663
  "div",
@@ -25852,9 +25844,8 @@ var GoalPageTab = /* @__PURE__ */ ((GoalPageTab2) => {
25852
25844
  GoalPageTab2["MODELS"] = "models";
25853
25845
  return GoalPageTab2;
25854
25846
  })(GoalPageTab || {});
25855
- var isNonEmptyArray = (param) => Array.isArray(param) && param.length > 0;
25856
25847
  var extractFilterValue = (param) => {
25857
- if (!isNonEmptyArray(param)) return {};
25848
+ if (!Array.isArray(param) || param.length === 0) return {};
25858
25849
  return param.length === 1 ? { single: param[0] } : { multiple: param };
25859
25850
  };
25860
25851
  var buildFiltersFromParams = (params) => {
@@ -25865,7 +25856,7 @@ var buildFiltersFromParams = (params) => {
25865
25856
  if (params.search) {
25866
25857
  filters.search = params.search;
25867
25858
  }
25868
- if (isNonEmptyArray(params.status)) {
25859
+ if (Array.isArray(params.status) && params.status.length > 0) {
25869
25860
  filters.status = params.status[0];
25870
25861
  }
25871
25862
  const schoolFilter = extractFilterValue(params.school);
@@ -25874,10 +25865,10 @@ var buildFiltersFromParams = (params) => {
25874
25865
  const classFilter = extractFilterValue(params.class);
25875
25866
  if (classFilter.single) filters.classId = classFilter.single;
25876
25867
  if (classFilter.multiple) filters.classIds = classFilter.multiple;
25877
- if (isNonEmptyArray(params.students)) {
25868
+ if (Array.isArray(params.students) && params.students.length > 0) {
25878
25869
  filters.studentIds = params.students;
25879
25870
  }
25880
- if (isNonEmptyArray(params.subject)) {
25871
+ if (Array.isArray(params.subject) && params.subject.length > 0) {
25881
25872
  filters.subjectId = params.subject[0];
25882
25873
  }
25883
25874
  if (params.startDate && typeof params.startDate === "string") {
@@ -27315,7 +27306,6 @@ var renderTruncatedText = (value) => {
27315
27306
  };
27316
27307
 
27317
27308
  // src/components/ActivitiesHistory/utils/filterBuilders.ts
27318
- var isNonEmptyArray2 = (param) => Array.isArray(param) && param.length > 0;
27319
27309
  var isValidApiStatus = (value) => Object.values(GenericApiStatus).includes(value);
27320
27310
  var buildHistoryFiltersFromParams = (params) => {
27321
27311
  const filters = {
@@ -27325,13 +27315,13 @@ var buildHistoryFiltersFromParams = (params) => {
27325
27315
  if (params.search) {
27326
27316
  filters.search = params.search;
27327
27317
  }
27328
- if (isNonEmptyArray2(params.status) && isValidApiStatus(params.status[0])) {
27318
+ if (Array.isArray(params.status) && params.status.length > 0 && isValidApiStatus(params.status[0])) {
27329
27319
  filters.status = params.status[0];
27330
27320
  }
27331
- if (isNonEmptyArray2(params.school)) {
27321
+ if (Array.isArray(params.school) && params.school.length > 0) {
27332
27322
  filters.schoolId = params.school[0];
27333
27323
  }
27334
- if (isNonEmptyArray2(params.subject)) {
27324
+ if (Array.isArray(params.subject) && params.subject.length > 0) {
27335
27325
  filters.subjectId = params.subject[0];
27336
27326
  }
27337
27327
  return filters;
@@ -27344,7 +27334,7 @@ var buildModelsFiltersFromParams = (params) => {
27344
27334
  if (params.search) {
27345
27335
  filters.search = params.search;
27346
27336
  }
27347
- if (isNonEmptyArray2(params.subject)) {
27337
+ if (Array.isArray(params.subject) && params.subject.length > 0) {
27348
27338
  filters.subjectId = params.subject[0];
27349
27339
  }
27350
27340
  return filters;
@@ -29024,7 +29014,7 @@ function transformToCategoryConfig(data) {
29024
29014
  selectedIds: []
29025
29015
  },
29026
29016
  {
29027
- key: "alunos",
29017
+ key: "students",
29028
29018
  label: "Aluno",
29029
29019
  dependsOn: ["escola", "serie", "turma"],
29030
29020
  itens: data.students,