-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCsvExport.tsx
66 lines (53 loc) · 2.21 KB
/
CsvExport.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { ArrowUpOnSquareIcon } from '@heroicons/react/24/outline'
import { useContext } from 'react'
import CourseContext from '../../../../contexts/CourseContext'
import MultipleOptionsContext from '../../../../contexts/MultipleOptionsContext'
import { AnalyticsTracker, Feature } from '../../../../utils/AnalyticsTracker'
import { csvEncode } from '../../../../utils/io'
import api from '../../../../api/backend'
/**
* Sidebar with all the main schedule interactions
*/
const CsvExport = () => {
const { pickedCourses } = useContext(CourseContext);
const { multipleOptions } = useContext(MultipleOptionsContext);
const getOptions = async (): Promise<string[]> => {
const lines = [];
for(const course of pickedCourses) {
const baseInfo = [course.course_id, course.course_unit_year, csvEncode(course.name), course.acronym]
const classValues = multipleOptions.map(option => {
const courseOption = option.course_options.find(co => co.course_id === course.id);
const pickedClass = courseOption ?
course.classes.find(c => c.id === courseOption.picked_class_id) :
undefined;
return csvEncode(pickedClass?.name);
});
lines.push([...baseInfo, ...classValues].join(','));
}
return lines;
}
const exportCSV = async () => {
const header = ['ID_Curso', 'Ano', 'Nome', 'Sigla']
multipleOptions.forEach((option) => header.push(option.name));
const lines = await getOptions();
const csv = [header.join(','), lines.flat().join('\n')].join('\n')
const blob = new Blob([csv], { type: 'text/csv' })
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = 'schedule.csv'
a.click()
URL.revokeObjectURL(url)
AnalyticsTracker.trackFeature(Feature.EXPORT_TO_CSV)
}
return (
<button
onClick={exportCSV}
className="group flex w-full items-center gap-2n dark:text-white rounded-md p-1 text-gray text-sm disabled:cursor-not-allowed disabled:opacity-50"
>
<ArrowUpOnSquareIcon className="h-5 w-5 text-secondary black:hover:brightness-200" />
<span className="pl-1"> Exportar Opções (CSV)</span>
</button>
)
}
export default CsvExport