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.
- package/dist/ActivitiesHistory/index.js +34 -43
- package/dist/ActivitiesHistory/index.js.map +1 -1
- package/dist/ActivitiesHistory/index.mjs +34 -43
- package/dist/ActivitiesHistory/index.mjs.map +1 -1
- package/dist/ActivityDetails/index.js +30 -38
- package/dist/ActivityDetails/index.js.map +1 -1
- package/dist/ActivityDetails/index.mjs +30 -38
- package/dist/ActivityDetails/index.mjs.map +1 -1
- package/dist/ActivityFilters/index.js +30 -38
- package/dist/ActivityFilters/index.js.map +1 -1
- package/dist/ActivityFilters/index.mjs +30 -38
- package/dist/ActivityFilters/index.mjs.map +1 -1
- package/dist/AlertManager/index.js +30 -38
- package/dist/AlertManager/index.js.map +1 -1
- package/dist/AlertManager/index.mjs +30 -38
- package/dist/AlertManager/index.mjs.map +1 -1
- package/dist/RecommendedLessonsHistory/index.js +34 -43
- package/dist/RecommendedLessonsHistory/index.js.map +1 -1
- package/dist/RecommendedLessonsHistory/index.mjs +34 -43
- package/dist/RecommendedLessonsHistory/index.mjs.map +1 -1
- package/dist/SendActivityModal/SendActivityModal.js +30 -38
- package/dist/SendActivityModal/SendActivityModal.js.map +1 -1
- package/dist/SendActivityModal/SendActivityModal.mjs +30 -38
- package/dist/SendActivityModal/SendActivityModal.mjs.map +1 -1
- package/dist/SendActivityModal/index.js +30 -38
- package/dist/SendActivityModal/index.js.map +1 -1
- package/dist/SendActivityModal/index.mjs +30 -38
- package/dist/SendActivityModal/index.mjs.map +1 -1
- package/dist/TableProvider/index.js +30 -38
- package/dist/TableProvider/index.js.map +1 -1
- package/dist/TableProvider/index.mjs +30 -38
- package/dist/TableProvider/index.mjs.map +1 -1
- package/dist/hooks/useSendActivity/index.js +1 -1
- package/dist/hooks/useSendActivity/index.js.map +1 -1
- package/dist/hooks/useSendActivity/index.mjs +1 -1
- package/dist/hooks/useSendActivity/index.mjs.map +1 -1
- package/dist/index.js +39 -49
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +39 -49
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -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"]}
|
|
@@ -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":";AAOA,SAAS,UAAU,aAAa,SAAS,cAAc;AACvD,OAAO,WAAW;AAkBlB,SAAS,0BACP,MACkB;AAClB,SAAO;AAAA,IACL;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,OAAO,KAAK;AAAA,MACZ,aAAa,CAAC;AAAA,IAChB;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,WAAW,CAAC,QAAQ;AAAA,MACpB,OAAO,KAAK;AAAA,MACZ,YAAY,CAAC,EAAE,KAAK,UAAU,eAAe,WAAW,CAAC;AAAA,MACzD,aAAa,CAAC;AAAA,IAChB;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,WAAW,CAAC,UAAU,OAAO;AAAA,MAC7B,OAAO,KAAK;AAAA,MACZ,YAAY;AAAA,QACV,EAAE,KAAK,UAAU,eAAe,WAAW;AAAA,QAC3C,EAAE,KAAK,SAAS,eAAe,UAAU;AAAA,MAC3C;AAAA,MACA,aAAa,CAAC;AAAA,IAChB;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,WAAW,CAAC,UAAU,SAAS,OAAO;AAAA,MACtC,OAAO,KAAK;AAAA,MACZ,YAAY;AAAA,QACV,EAAE,KAAK,UAAU,eAAe,WAAW;AAAA,QAC3C,EAAE,KAAK,SAAS,eAAe,UAAU;AAAA,QACzC,EAAE,KAAK,SAAS,eAAe,UAAU;AAAA,MAC3C;AAAA,MACA,aAAa,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AASA,SAAS,cAAc,MAAc,MAAsB;AACzD,SAAO,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,YAAY;AAC9C;AAwCO,SAAS,gBACd,QACuB;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,eAAe,gBAAgB,IAAI;AAAA,IACxC;AAAA,EACF;AACA,QAAM,CAAC,YAAY,aAAa,IAAI,SAA2B,CAAC,CAAC;AACjE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,KAAK;AAEpE,QAAM,sBAAsB,OAAO,KAAK;AAKxC,QAAM,cAAc,QAAkD,MAAM;AAC1E,QAAI,CAAC,cAAe,QAAO;AAC3B,WAAO;AAAA,MACL,OAAO,cAAc;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAKlB,QAAM,iBAAiB,YAAY,YAAY;AAC7C,QAAI,oBAAoB,QAAS;AAEjC,2BAAuB,IAAI;AAC3B,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgB;AACnC,YAAM,iBAAiB,0BAA0B,IAAI;AACrD,oBAAc,cAAc;AAC5B,0BAAoB,UAAU;AAAA,IAChC,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,gBAAU,mCAAgC;AAAA,IAC5C,UAAE;AACA,6BAAuB,KAAK;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,iBAAiB,OAAO,CAAC;AAM7B,QAAM,YAAY;AAAA,IAChB,CAAC,UAA6B;AAC5B,uBAAiB,KAAK;AACtB,gBAAU,IAAI;AACd,WAAK,eAAe;AAAA,IACtB;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAKA,QAAM,aAAa,YAAY,MAAM;AACnC,cAAU,KAAK;AACf,qBAAiB,IAAI;AAAA,EACvB,GAAG,CAAC,CAAC;AAML,QAAM,qBAAqB;AAAA,IACzB,CAAC,sBAAwC;AACvC,oBAAc,iBAAiB;AAAA,IACjC;AAAA,IACA,CAAC;AAAA,EACH;AAMA,QAAM,eAAe;AAAA,IACnB,OAAO,SAA+B;AACpC,UAAI,CAAC,cAAe;AAEpB,mBAAa,IAAI;AAEjB,UAAI;AAEF,cAAM,cAAc,MAAM,iBAAiB,cAAc,EAAE;AAC3D,YAAI,CAAC,eAAe,YAAY,WAAW,GAAG;AAC5C,gBAAM,IAAI,MAAM,oDAA2C;AAAA,QAC7D;AAGA,cAAM,iBAAiB,MAAM,eAAe;AAAA,UAC1C,OAAO,KAAK;AAAA,UACZ,WAAW,cAAc;AAAA,UACzB;AAAA,UACA,SAAS,KAAK;AAAA,UACd,cAAc,KAAK;AAAA,UACnB,WAAW,cAAc,KAAK,WAAW,KAAK,SAAS;AAAA,UACvD,WAAW,cAAc,KAAK,WAAW,KAAK,SAAS;AAAA,UACvD,UAAU,KAAK;AAAA,QACjB,CAAC;AAGD,cAAM,eAAe,eAAe,IAAI,KAAK,QAAQ;AAErD,oBAAY,0BAA0B,KAAK,SAAS,MAAM,WAAW;AAErE,mBAAW;AAAA,MACb,SAAS,OAAO;AACd,gBAAQ,MAAM,2BAA2B,KAAK;AAC9C,kBAAU,0BAA0B;AAAA,MACtC,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","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
|
-
|
|
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
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
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 (!
|
|
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 (
|
|
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 (
|
|
25868
|
+
if (Array.isArray(params.students) && params.students.length > 0) {
|
|
25878
25869
|
filters.studentIds = params.students;
|
|
25879
25870
|
}
|
|
25880
|
-
if (
|
|
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 (
|
|
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 (
|
|
27321
|
+
if (Array.isArray(params.school) && params.school.length > 0) {
|
|
27332
27322
|
filters.schoolId = params.school[0];
|
|
27333
27323
|
}
|
|
27334
|
-
if (
|
|
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 (
|
|
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: "
|
|
29017
|
+
key: "students",
|
|
29028
29018
|
label: "Aluno",
|
|
29029
29019
|
dependsOn: ["escola", "serie", "turma"],
|
|
29030
29020
|
itens: data.students,
|