diff --git a/src/components/questionStructure/Task/index.tsx b/src/components/questionStructure/Task/editable/index.tsx similarity index 88% rename from src/components/questionStructure/Task/index.tsx rename to src/components/questionStructure/Task/editable/index.tsx index cd72aa5..afa916b 100644 --- a/src/components/questionStructure/Task/index.tsx +++ b/src/components/questionStructure/Task/editable/index.tsx @@ -1,9 +1,9 @@ import { Flex } from '@radix-ui/themes' import React, { FC } from 'react' -import Markdown from '../../Markdown' -import { TaskType } from './constants' -import './index.css' +import Markdown from '../../../Markdown' +import { TaskType } from '../constants' +import '../styles/common.css' import { CodeTask, CodeTaskProps } from './variants/CodeTask' import { EssayTask, EssayTaskProps } from './variants/EssayTask' import { FlagTask, FlagTaskProps } from './variants/FlagTask' @@ -38,7 +38,7 @@ const taskComponentMap = { type TaskComponent = FC -export const TaskFactory: TaskComponent = ({ instructions, ...taskProps }) => { +export const EditableTaskFactory: TaskComponent = ({ instructions, ...taskProps }) => { const Component = taskComponentMap[taskProps.type] as TaskComponent return ( diff --git a/src/components/questionStructure/Task/variants/CodeTask.tsx b/src/components/questionStructure/Task/editable/variants/CodeTask.tsx similarity index 74% rename from src/components/questionStructure/Task/variants/CodeTask.tsx rename to src/components/questionStructure/Task/editable/variants/CodeTask.tsx index da6eeff..4ffbe7d 100644 --- a/src/components/questionStructure/Task/variants/CodeTask.tsx +++ b/src/components/questionStructure/Task/editable/variants/CodeTask.tsx @@ -2,22 +2,17 @@ import { TextArea, TextField } from '@radix-ui/themes' import { isEqual } from 'lodash' import React, { FC, useEffect, useMemo, useState } from 'react' -import useDebounce from '../../../../hooks/debouncing' -import { TaskType } from '../constants' -import '../index.css' -import { TaskBaseProps } from '../types' +import useDebounce from '../../../../../hooks/debouncing' +import { TaskType } from '../../constants' +import '../../styles/common.css' +import { EditableTaskProps } from '../../types' -export interface CodeTaskProps extends TaskBaseProps { +export interface CodeTaskProps extends EditableTaskProps { type: TaskType.CODE lines?: number } -export const CodeTask: FC = ({ - answer, - onAnswerUpdate, - lines = 5, - disabled = false, -}) => { +export const CodeTask: FC = ({ answer, onAnswerUpdate, lines = 5 }) => { const initialValue = useMemo(() => answer?.answer ?? '', [answer]) const [value, setValue] = useState(initialValue) const debouncedValue = useDebounce(value) @@ -38,7 +33,6 @@ export const CodeTask: FC = ({ value: value, onChange: handleOnChange, placeholder: 'Your answer here…', - disabled: disabled, variant: 'soft' as 'soft', className: 'monospaced', } diff --git a/src/components/questionStructure/Task/variants/EssayTask.tsx b/src/components/questionStructure/Task/editable/variants/EssayTask.tsx similarity index 75% rename from src/components/questionStructure/Task/variants/EssayTask.tsx rename to src/components/questionStructure/Task/editable/variants/EssayTask.tsx index 9cd0dea..7d0f3fb 100644 --- a/src/components/questionStructure/Task/variants/EssayTask.tsx +++ b/src/components/questionStructure/Task/editable/variants/EssayTask.tsx @@ -2,21 +2,16 @@ import { TextArea, TextField } from '@radix-ui/themes' import { isEqual } from 'lodash' import React, { FC, useEffect, useMemo, useState } from 'react' -import useDebounce from '../../../../hooks/debouncing' -import { TaskType } from '../constants' -import { TaskBaseProps } from '../types' +import useDebounce from '../../../../../hooks/debouncing' +import { TaskType } from '../../constants' +import { EditableTaskProps } from '../../types' -export interface EssayTaskProps extends TaskBaseProps { +export interface EssayTaskProps extends EditableTaskProps { type: TaskType.ESSAY lines?: number } -export const EssayTask: FC = ({ - answer, - onAnswerUpdate, - lines = 5, - disabled = false, -}) => { +export const EssayTask: FC = ({ answer, onAnswerUpdate, lines = 5 }) => { const initialValue = useMemo(() => answer?.answer ?? '', [answer]) const [value, setValue] = useState(initialValue) const debouncedValue = useDebounce(value) @@ -38,7 +33,6 @@ export const EssayTask: FC = ({ value: value, onChange: handleOnChange, placeholder: 'Your answer here…', - disabled: disabled, variant: 'soft' as 'soft', } if (lines === 1) return diff --git a/src/components/questionStructure/Task/variants/FlagTask/index.tsx b/src/components/questionStructure/Task/editable/variants/FlagTask.tsx similarity index 85% rename from src/components/questionStructure/Task/variants/FlagTask/index.tsx rename to src/components/questionStructure/Task/editable/variants/FlagTask.tsx index d93d88f..a292f37 100644 --- a/src/components/questionStructure/Task/variants/FlagTask/index.tsx +++ b/src/components/questionStructure/Task/editable/variants/FlagTask.tsx @@ -5,20 +5,15 @@ import React, { FC, useEffect, useMemo, useState } from 'react' import useDebounce from '../../../../../hooks/debouncing' import { TaskType } from '../../constants' -import { TaskBaseProps } from '../../types' -import './index.css' +import '../../styles/flag.css' +import { EditableTaskProps } from '../../types' -export interface FlagTaskProps extends TaskBaseProps { +export interface FlagTaskProps extends EditableTaskProps { type: TaskType.FLAG showOrnament?: boolean } -export const FlagTask: FC = ({ - answer, - onAnswerUpdate, - showOrnament = true, - disabled = false, -}) => { +export const FlagTask: FC = ({ answer, onAnswerUpdate, showOrnament = true }) => { const FLAG_LENGTH = 32 const initialValue = useMemo(() => answer?.answer ?? '', [answer]) const [value, setValue] = useState(initialValue) @@ -45,7 +40,6 @@ export const FlagTask: FC = ({ )} = ({ - answer, - onAnswerUpdate, - choices, - disabled = false, -}) => { +export const MCQOneTask: FC = ({ answer, onAnswerUpdate, choices }) => { const initialValue = useMemo(() => answer?.answer ?? '', [answer]) const [value, setValue] = useState(initialValue) useEffect(() => { @@ -41,7 +36,7 @@ export const MCQOneTask: FC = ({ } return ( - + {map(choices, (o) => ( {o.label} @@ -51,12 +46,7 @@ export const MCQOneTask: FC = ({ ) } -export const MCQMultiTask: FC = ({ - answer, - onAnswerUpdate, - choices, - disabled = false, -}) => { +export const MCQMultiTask: FC = ({ answer, onAnswerUpdate, choices }) => { const initialValue = useMemo(() => (answer?.answer ? answer.answer.split(',') : []), [answer]) const [value, setValue] = useState(initialValue) useEffect(() => { @@ -74,7 +64,7 @@ export const MCQMultiTask: FC = ({ } return ( - + {map(choices, (o) => ( {o.label} diff --git a/src/components/questionStructure/Task/variants/NumberTask.tsx b/src/components/questionStructure/Task/editable/variants/NumberTask.tsx similarity index 78% rename from src/components/questionStructure/Task/variants/NumberTask.tsx rename to src/components/questionStructure/Task/editable/variants/NumberTask.tsx index 90502d0..b9deac7 100644 --- a/src/components/questionStructure/Task/variants/NumberTask.tsx +++ b/src/components/questionStructure/Task/editable/variants/NumberTask.tsx @@ -2,15 +2,15 @@ import { TextField } from '@radix-ui/themes' import { isEqual } from 'lodash' import React, { FC, useEffect, useMemo, useState } from 'react' -import useDebounce from '../../../../hooks/debouncing' -import { TaskType } from '../constants' -import { TaskBaseProps } from '../types' +import useDebounce from '../../../../../hooks/debouncing' +import { TaskType } from '../../constants' +import { EditableTaskProps } from '../../types' -export interface NumberTaskProps extends TaskBaseProps { +export interface NumberTaskProps extends EditableTaskProps { type: TaskType.INTEGER } -export const NumberTask: FC = ({ answer, onAnswerUpdate, disabled = false }) => { +export const NumberTask: FC = ({ answer, onAnswerUpdate }) => { const initialValue = useMemo(() => answer?.answer ?? '', [answer]) const [value, setValue] = useState(initialValue) const debouncedValue = useDebounce(value) @@ -34,7 +34,6 @@ export const NumberTask: FC = ({ answer, onAnswerUpdate, disabl onChange={handleChange} type="number" variant="soft" - disabled={disabled} placeholder="Your number here..." /> ) diff --git a/src/components/questionStructure/Task/variants/handwriting/ProcessedHandwritingTask.tsx b/src/components/questionStructure/Task/editable/variants/handwriting/ProcessedHandwritingTask.tsx similarity index 78% rename from src/components/questionStructure/Task/variants/handwriting/ProcessedHandwritingTask.tsx rename to src/components/questionStructure/Task/editable/variants/handwriting/ProcessedHandwritingTask.tsx index 19c52e2..0b300bc 100644 --- a/src/components/questionStructure/Task/variants/handwriting/ProcessedHandwritingTask.tsx +++ b/src/components/questionStructure/Task/editable/variants/handwriting/ProcessedHandwritingTask.tsx @@ -4,19 +4,18 @@ import { MathJax } from 'better-react-mathjax' import { isEmpty, isEqual } from 'lodash' import { FC, useEffect, useMemo, useState } from 'react' -import { TaskType } from '../../constants' -import { TaskBaseProps } from '../../types' +import { TaskType } from '../../../constants' +import { EditableTaskProps } from '../../../types' import { ViewOnlyCanvas } from './components/ViewOnlyCanvas' import { ProcessedHandwritingEditor } from './editors/ProcessedHandwritingEditor' -export interface ProcessedHandwritingProps extends TaskBaseProps { +export interface ProcessedHandwritingProps extends EditableTaskProps { type: TaskType.PROCESSED_HANDWRITING } export const ProcessedHandwritingTask: FC = ({ answer, onAnswerUpdate, - disabled = false, }) => { const initialValue = useMemo( () => (answer?.answer ? JSON.parse(answer.answer) : { latex: '' }), @@ -35,14 +34,12 @@ export const ProcessedHandwritingTask: FC = ({ return ( - {!disabled && ( - - - - )} + + + {value?.latex && ( diff --git a/src/components/questionStructure/Task/variants/handwriting/RawHandwritingTask.tsx b/src/components/questionStructure/Task/editable/variants/handwriting/RawHandwritingTask.tsx similarity index 67% rename from src/components/questionStructure/Task/variants/handwriting/RawHandwritingTask.tsx rename to src/components/questionStructure/Task/editable/variants/handwriting/RawHandwritingTask.tsx index 5a23b27..ce5b21a 100644 --- a/src/components/questionStructure/Task/variants/handwriting/RawHandwritingTask.tsx +++ b/src/components/questionStructure/Task/editable/variants/handwriting/RawHandwritingTask.tsx @@ -3,20 +3,16 @@ import { Button, Dialog, Flex } from '@radix-ui/themes' import { isEmpty, isEqual } from 'lodash' import { FC, useEffect, useMemo, useState } from 'react' -import { TaskType } from '../../constants' -import { TaskBaseProps } from '../../types' +import { TaskType } from '../../../constants' +import { EditableTaskProps } from '../../../types' import { ViewOnlyCanvas } from './components/ViewOnlyCanvas' import RawHandwritingEditor from './editors/RawHandwritingEditor/rawHandwritingEditor' -export interface RawHandwritingProps extends TaskBaseProps { +export interface RawHandwritingProps extends EditableTaskProps { type: TaskType.RAW_HANDWRITING } -export const RawHandwritingTask: FC = ({ - answer, - onAnswerUpdate, - disabled = false, -}) => { +export const RawHandwritingTask: FC = ({ answer, onAnswerUpdate }) => { const initialValue = useMemo(() => (answer?.answer ? JSON.parse(answer.answer) : {}), [answer]) const [value, setValue] = useState(initialValue) @@ -29,16 +25,14 @@ export const RawHandwritingTask: FC = ({ return ( - {!disabled && ( - - - - - - )} + + + + + {!isEmpty(value?.raw?.elements) && ( )} diff --git a/src/components/questionStructure/Task/variants/handwriting/components/Canvas/index.scss b/src/components/questionStructure/Task/editable/variants/handwriting/components/Canvas/index.scss similarity index 100% rename from src/components/questionStructure/Task/variants/handwriting/components/Canvas/index.scss rename to src/components/questionStructure/Task/editable/variants/handwriting/components/Canvas/index.scss diff --git a/src/components/questionStructure/Task/variants/handwriting/components/Canvas/index.tsx b/src/components/questionStructure/Task/editable/variants/handwriting/components/Canvas/index.tsx similarity index 98% rename from src/components/questionStructure/Task/variants/handwriting/components/Canvas/index.tsx rename to src/components/questionStructure/Task/editable/variants/handwriting/components/Canvas/index.tsx index ecc2046..5238244 100644 --- a/src/components/questionStructure/Task/variants/handwriting/components/Canvas/index.tsx +++ b/src/components/questionStructure/Task/editable/variants/handwriting/components/Canvas/index.tsx @@ -13,7 +13,7 @@ import React, { useState, } from 'react' -import { ConfirmDialog } from '../../../../../../ConfirmDialog' +import { ConfirmDialog } from '../../../../../../../ConfirmDialog' import { RawHandwritingAnswer } from '../../types' import './index.scss' diff --git a/src/components/questionStructure/Task/variants/handwriting/components/ViewOnlyCanvas/index.scss b/src/components/questionStructure/Task/editable/variants/handwriting/components/ViewOnlyCanvas/index.scss similarity index 100% rename from src/components/questionStructure/Task/variants/handwriting/components/ViewOnlyCanvas/index.scss rename to src/components/questionStructure/Task/editable/variants/handwriting/components/ViewOnlyCanvas/index.scss diff --git a/src/components/questionStructure/Task/variants/handwriting/components/ViewOnlyCanvas/index.tsx b/src/components/questionStructure/Task/editable/variants/handwriting/components/ViewOnlyCanvas/index.tsx similarity index 100% rename from src/components/questionStructure/Task/variants/handwriting/components/ViewOnlyCanvas/index.tsx rename to src/components/questionStructure/Task/editable/variants/handwriting/components/ViewOnlyCanvas/index.tsx diff --git a/src/components/questionStructure/Task/variants/handwriting/editors/ProcessedHandwritingEditor/index.css b/src/components/questionStructure/Task/editable/variants/handwriting/editors/ProcessedHandwritingEditor/index.css similarity index 100% rename from src/components/questionStructure/Task/variants/handwriting/editors/ProcessedHandwritingEditor/index.css rename to src/components/questionStructure/Task/editable/variants/handwriting/editors/ProcessedHandwritingEditor/index.css diff --git a/src/components/questionStructure/Task/variants/handwriting/editors/ProcessedHandwritingEditor/index.tsx b/src/components/questionStructure/Task/editable/variants/handwriting/editors/ProcessedHandwritingEditor/index.tsx similarity index 100% rename from src/components/questionStructure/Task/variants/handwriting/editors/ProcessedHandwritingEditor/index.tsx rename to src/components/questionStructure/Task/editable/variants/handwriting/editors/ProcessedHandwritingEditor/index.tsx diff --git a/src/components/questionStructure/Task/variants/handwriting/editors/RawHandwritingEditor/index.css b/src/components/questionStructure/Task/editable/variants/handwriting/editors/RawHandwritingEditor/index.css similarity index 100% rename from src/components/questionStructure/Task/variants/handwriting/editors/RawHandwritingEditor/index.css rename to src/components/questionStructure/Task/editable/variants/handwriting/editors/RawHandwritingEditor/index.css diff --git a/src/components/questionStructure/Task/variants/handwriting/editors/RawHandwritingEditor/rawHandwritingEditor.tsx b/src/components/questionStructure/Task/editable/variants/handwriting/editors/RawHandwritingEditor/rawHandwritingEditor.tsx similarity index 100% rename from src/components/questionStructure/Task/variants/handwriting/editors/RawHandwritingEditor/rawHandwritingEditor.tsx rename to src/components/questionStructure/Task/editable/variants/handwriting/editors/RawHandwritingEditor/rawHandwritingEditor.tsx diff --git a/src/components/questionStructure/Task/variants/handwriting/hooks/live-updates.hook.ts b/src/components/questionStructure/Task/editable/variants/handwriting/hooks/live-updates.hook.ts similarity index 97% rename from src/components/questionStructure/Task/variants/handwriting/hooks/live-updates.hook.ts rename to src/components/questionStructure/Task/editable/variants/handwriting/hooks/live-updates.hook.ts index 5369052..95d3554 100644 --- a/src/components/questionStructure/Task/variants/handwriting/hooks/live-updates.hook.ts +++ b/src/components/questionStructure/Task/editable/variants/handwriting/hooks/live-updates.hook.ts @@ -7,8 +7,8 @@ import { SceneData } from '@excalidraw/excalidraw/types/types' import axios, { AxiosError } from 'axios' import { useCallback, useEffect, useRef, useState } from 'react' -import axiosInstance from '../../../../../../api/axiosInstance' -import routes from '../../../../../../api/routes' +import axiosInstance from '../../../../../../../api/axiosInstance' +import routes from '../../../../../../../api/routes' // Constants /** Time to wait with user putting no stroks on the pages before API call */ diff --git a/src/components/questionStructure/Task/variants/handwriting/types.ts b/src/components/questionStructure/Task/editable/variants/handwriting/types.ts similarity index 100% rename from src/components/questionStructure/Task/variants/handwriting/types.ts rename to src/components/questionStructure/Task/editable/variants/handwriting/types.ts diff --git a/src/components/questionStructure/Task/readonly/index.tsx b/src/components/questionStructure/Task/readonly/index.tsx new file mode 100644 index 0000000..19fcd64 --- /dev/null +++ b/src/components/questionStructure/Task/readonly/index.tsx @@ -0,0 +1,50 @@ +import { Flex } from '@radix-ui/themes' +import React, { FC } from 'react' + +import Markdown from '../../../Markdown' +import { TaskType } from '../constants' +import '../styles/common.css' +import { CodeTask, CodeTaskProps } from './variants/CodeTask' +import { EssayTask, EssayTaskProps } from './variants/EssayTask' +import { FlagTask, FlagTaskProps } from './variants/FlagTask' +import { MCQMultiTask, MCQMultiTaskProps, MCQOneTask, MCQOneTaskProps } from './variants/MCQ' +import NoAnswerBanner from './variants/NoAnswerBanner' +import { NumberTask, NumberTaskProps } from './variants/NumberTask' +import { + ProcessedHandwritingProps, + ProcessedHandwritingTask, +} from './variants/handwriting/ProcessedHandwritingTask' +import { RawHandwritingProps, RawHandwritingTask } from './variants/handwriting/RawHandwritingTask' + +export type TaskProps = + | FlagTaskProps + | NumberTaskProps + | EssayTaskProps + | CodeTaskProps + | MCQOneTaskProps + | MCQMultiTaskProps + | ProcessedHandwritingProps + | RawHandwritingProps + +const taskComponentMap = { + [TaskType.ESSAY]: EssayTask, + [TaskType.CODE]: CodeTask, + [TaskType.INTEGER]: NumberTask, + [TaskType.FLAG]: FlagTask, + [TaskType.MULTIPLE_CHOICE_SELECT_ONE]: MCQOneTask, + [TaskType.MULTIPLE_CHOICE_SELECT_SEVERAL]: MCQMultiTask, + [TaskType.RAW_HANDWRITING]: RawHandwritingTask, + [TaskType.PROCESSED_HANDWRITING]: ProcessedHandwritingTask, +} as const + +type TaskComponent = FC + +export const ReadOnlyTaskFactory: TaskComponent = ({ instructions, ...taskProps }) => { + const Component = taskComponentMap[taskProps.type] as TaskComponent + return ( + + {instructions && {instructions}} + {taskProps.answer ? : } + + ) +} diff --git a/src/components/questionStructure/Task/readonly/variants/CodeTask.tsx b/src/components/questionStructure/Task/readonly/variants/CodeTask.tsx new file mode 100644 index 0000000..8a4cbcd --- /dev/null +++ b/src/components/questionStructure/Task/readonly/variants/CodeTask.tsx @@ -0,0 +1,24 @@ +import { TextArea, TextField } from '@radix-ui/themes' +import { countBy } from 'lodash' +import React, { FC } from 'react' + +import { TaskType } from '../../constants' +import '../../styles/common.css' +import { TaskBaseProps } from '../../types' + +export interface CodeTaskProps extends TaskBaseProps { + type: TaskType.ESSAY +} + +const LINES_PADDING = 2 +export const CodeTask: FC = ({ answer }) => { + const lines = countBy(answer.answer)['\n'] + const commonProps = { + value: answer.answer, + disabled: true, + variant: 'soft' as 'soft', + className: 'monospaced', + } + if (lines === 1) return + return