/** * A field to update the grades */ import {useState, useEffect} from 'react'; import {useTranslation} from 'next-i18next'; import {Container, Row, Col} from 'reactstrap'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faPlus} from '@fortawesome/free-solid-svg-icons'; import {DndContext} from '@dnd-kit/core'; import {arrayMove, SortableContext} from '@dnd-kit/sortable'; import {DEFAULT_GRADES} from '@services/constants'; import {ElectionTypes, useElection} from '@services/ElectionContext'; import GradeField from './GradeField'; import GradeModalAdd from './GradeModalAdd'; import {gradeColors} from '@services/grades'; import Switch from '@components/Switch'; const AddField = () => { const {t} = useTranslation(); const [modal, setModal] = useState(false); const toggle = () => setModal((m) => !m); const [election, _] = useElection(); const numGrades = election.grades.filter((g) => g.active).length; const disabled = numGrades >= gradeColors.length; return ( ); }; const Grades = () => { const {t} = useTranslation(); const [election, dispatch] = useElection(); const [visible, setVisible] = useState(false); const toggle = () => setVisible((v) => !v); useEffect(() => { if (election.grades.length < 2) { const defaultGrades = DEFAULT_GRADES.map((g, i) => ({ name: t(g), value: DEFAULT_GRADES.length - 1 - i, active: true, })); dispatch({ type: ElectionTypes.SET, field: 'grades', value: defaultGrades, }); } }, []); const handleDragEnd = (event) => { /** * Update the list of grades after dragging an item */ const {active, over} = event; if (active.id !== over.id) { const names = election.grades.map((g) => g.name); const activeIdx = names.indexOf(active.id); const overIdx = names.indexOf(over.id); const newGrades = arrayMove(election.grades, activeIdx, overIdx); newGrades.forEach((g, i) => (g.value = newGrades.length - i - 1)); dispatch({ type: ElectionTypes.SET, field: 'grades', value: newGrades, }); } }; return (
{t('admin.grades-title')}
{visible && ( <>

{t('admin.grades-desc')}

g.name)}> {election.grades.map((grade, i) => ( ))} )}
); }; export default Grades;