import { CrossedEyeIcon } from "@icons/CrossedEyeIcon"; import { ArrowDownIcon } from "@icons/questionsPage/ArrowDownIcon"; import { CopyIcon } from "@icons/questionsPage/CopyIcon"; import { OneIcon } from "@icons/questionsPage/OneIcon"; import { PointsIcon } from "@icons/questionsPage/PointsIcon"; import Answer from "@icons/questionsPage/answer"; import Date from "@icons/questionsPage/date"; import { DeleteIcon } from "@icons/questionsPage/deleteIcon"; import Download from "@icons/questionsPage/download"; import DropDown from "@icons/questionsPage/drop_down"; import Emoji from "@icons/questionsPage/emoji"; import { HideIcon } from "@icons/questionsPage/hideIcon"; import Input from "@icons/questionsPage/input"; import OptionsAndPict from "@icons/questionsPage/options_and_pict"; import OptionsPict from "@icons/questionsPage/options_pict"; import Page from "@icons/questionsPage/page"; import RatingIcon from "@icons/questionsPage/rating"; import Slider from "@icons/questionsPage/slider"; import ExpandLessIcon from "@mui/icons-material/ExpandLess"; import { Box, Button, Checkbox, FormControl, FormControlLabel, IconButton, InputAdornment, Modal, Paper, TextField, Typography, useMediaQuery, useTheme, } from "@mui/material"; import { copyQuestion, createUntypedQuestion, deleteQuestion, clearRuleForAll, toggleExpandQuestion, updateQuestion, updateUntypedQuestion, getQuestionByContentId, deleteQuestionWithTimeout, } from "@root/questions/actions"; import { updateRootContentId } from "@root/quizes/actions"; import { useRef, useState } from "react"; import type { DraggableProvidedDragHandleProps } from "react-beautiful-dnd"; import { useDebouncedCallback } from "use-debounce"; import { ReactComponent as PlusIcon } from "../../../assets/icons/plus.svg"; import type { AnyTypedQuizQuestion, UntypedQuizQuestion } from "../../../model/questionTypes/shared"; import SwitchQuestionsPage from "../SwitchQuestionsPage"; import { ChooseAnswerModal } from "./ChooseAnswerModal"; import TypeQuestions from "../TypeQuestions"; import { QuestionType } from "@model/question/question"; import { useCurrentQuiz } from "@root/quizes/hooks"; import { useQuestionsStore } from "@root/questions/store"; import { updateSomeWorkBackend } from "@root/uiTools/actions"; import { DeleteFunction } from "@utils/deleteFunc"; interface Props { question: AnyTypedQuizQuestion | UntypedQuizQuestion; draggableProps: DraggableProvidedDragHandleProps | null | undefined; isDragging: boolean; index: number; } export default function QuestionsPageCard({ question, draggableProps, isDragging, index }: Props) { const maxLengthTextField = 225; const { questions } = useQuestionsStore(); const [plusVisible, setPlusVisible] = useState(false); const [open, setOpen] = useState(false); const [isTextFieldtActive, setIsTextFieldtActive] = useState(false); const [openDelete, setOpenDelete] = useState(false); const theme = useTheme(); const isTablet = useMediaQuery(theme.breakpoints.down(1000)); const isMobile = useMediaQuery(theme.breakpoints.down(790)); const anchorRef = useRef(null); const quiz = useCurrentQuiz(); const setTitle = useDebouncedCallback((title) => { const updateQuestionFn = question.type === null ? updateUntypedQuestion : updateQuestion; updateQuestionFn(question.id, question => { question.title = title; }); }, 200); const handleInputFocus = () => { setIsTextFieldtActive(true); }; const handleInputBlur = (event: React.FocusEvent) => { setIsTextFieldtActive(false); }; return ( <> setTitle(target.value || " ")} onFocus={handleInputFocus} onBlur={handleInputBlur} inputProps={{ maxLength: maxLengthTextField, }} InputProps={{ startAdornment: ( setOpen((isOpened) => !isOpened)} > {IconAndrom(question.expanded, question.type)} setOpen(false)} anchorRef={anchorRef} question={question} questionType={question.type} /> ), endAdornment: isTextFieldtActive && question.title.length >= maxLengthTextField - 7 && ( {question.title.length} / {maxLengthTextField} ), }} sx={{ margin: isMobile ? "10px 0" : 0, "& .MuiInputBase-root": { color: "#000000", backgroundColor: question.expanded ? theme.palette.background.default : "transparent", height: "48px", borderRadius: "10px", ".MuiOutlinedInput-notchedOutline": { borderWidth: "1px !important", border: !question.expanded ? "none" : null, }, "& .MuiInputBase-input::placeholder": { color: "#4D4D4D", opacity: 0.8, }, }, }} /> toggleExpandQuestion(question.id)} > {question.expanded ? ( ) : ( )} {question.expanded ? ( <> ) : ( {/* } checkedIcon={} /> } label={""} sx={{ color: theme.palette.grey2.main, ml: "-9px", mr: 0, userSelect: "none", }} /> */} copyQuestion(question.id, question.quizId)}> { if (question.type === null) { deleteQuestion(question.id); } if (question.content.rule.parentId.length !== 0) { setOpenDelete(true); } else { deleteQuestionWithTimeout(question.id, () => DeleteFunction(questions, question, quiz)); } }} data-cy="delete-question" > setOpenDelete(false)}> Вы удаляете вопрос, участвующий в ветвлении. Все его потомки потеряют данные ветвления. Вы уверены, что хотите удалить вопрос? )} {question.type !== null && ( {question.page + 1} )} {question.expanded && ( {question.type === null ? ( ) : ( )} )} setPlusVisible(true)} onMouseLeave={() => setPlusVisible(false)} sx={{ maxWidth: "825px", display: "flex", alignItems: "center", height: "40px", cursor: "pointer", }} > createUntypedQuestion(question.quizId, question.id)} sx={{ display: plusVisible && !isDragging ? "flex" : "none", width: "100%", alignItems: "center", columnGap: "10px", }} data-cy="create-question" > ); } const IconAndrom = (isExpanded: boolean, questionType: QuestionType | null) => { switch (questionType) { case "variant": return ( ); case "images": return ( ); case "varimg": return ( ); case "emoji": return ( ); case "text": return ( ); case "select": return ( ); case "date": return ( ); case "number": return ( ); case "file": return ( ); case "page": return ( ); case "rating": return ( ); default: return <>; } };