Skip to content

Commit

Permalink
Minor bug fixes.
Browse files Browse the repository at this point in the history
Signed-off-by: Aliwoto <aminnimaj@gmail.com>
  • Loading branch information
ALiwoto committed Aug 25, 2024
1 parent 9e5d8c3 commit 723046e
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 28 deletions.
2 changes: 2 additions & 0 deletions src/components/rendering/RenderAllFields.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ interface RenderAllFieldsProps {
disablePast?: boolean;
excludedFields?: string[];
noEditFields?: string[];
disableDateTimePickers?: boolean;
}

const RenderAllFields = (props: RenderAllFieldsProps) => {
Expand Down Expand Up @@ -56,6 +57,7 @@ const RenderAllFields = (props: RenderAllFieldsProps) => {
label={CurrentAppTranslation[field as keyof (typeof CurrentAppTranslation)]}
value={data[field] ?? ''}
dateType={CurrentAppTranslation.CalendarType}
disabled={props.disableDateTimePickers ?? false}
onChange={(newValue: any) => {
handleInputChange({
target: {
Expand Down
84 changes: 65 additions & 19 deletions src/components/rendering/RenderAllQuestions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ import { CurrentAppTranslation } from "../../translations/appTranslation";

interface RenderQuestionsListProps {
questions: ExamQuestionInfo[];

/**
* The id of the question that is currently being edited.
*/
editingId: number | null;

/**
Expand All @@ -22,6 +26,11 @@ interface RenderQuestionsListProps {
*/
canEditQuestions: boolean;

/**
* Whether the exam is finished.
*/
isExamFinished?: boolean;

handleEdit: (qId: number) => void;
handleSubmit: (qId: number) => void;
handleInputChange: (qId: number, field: keyof ExamQuestionInfo, value: string) => void;
Expand All @@ -30,14 +39,29 @@ interface RenderQuestionsListProps {
}

const RenderAllQuestions: React.FC<RenderQuestionsListProps> = ({ ...props }) => {
console.log(props.questions);
if (!props.questions || props.questions.length === 0) {
return (
<Typography variant="body2" sx={{ textAlign: 'center', mt: 4 }}>
{CurrentAppTranslation.ExamHasNoQuestionsYetText}
</Typography>
);
}

return (
<Container maxWidth="md">
<Container maxWidth="md" >
{props.questions.map((question) => (
<Paper key={question.question_id} elevation={3} sx={{ p: 3, mb: 3 }}>
<Box display="flex" justifyContent="space-between" alignItems="center" mb={2}>
<Box display="flex"
justifyContent="space-between"
alignItems="center"
mb={2}>
{props.editingId !== question.question_id || !props.canEditQuestions ? (
<Typography variant="h6">
<Typography variant="h6"
style={{
justifyContent: CurrentAppTranslation.justifyContent,
direction: CurrentAppTranslation.direction,
}}
>
{question.question_title}
</Typography>
) : (
Expand All @@ -49,21 +73,32 @@ const RenderAllQuestions: React.FC<RenderQuestionsListProps> = ({ ...props }) =>
disabled={props.editingId !== question.question_id}
/>
)}
<Button
variant="contained"
color={props.editingId === question.question_id ? "secondary" : "primary"}
onClick={() => props.handleEdit(question.question_id!)}
>
{props.editingId === question.question_id ?
CurrentAppTranslation.CancelButtonText :
CurrentAppTranslation.EditText}
</Button>
{!props.isExamFinished && (
<Button
variant="contained"
color={props.editingId === question.question_id ? "secondary" : "primary"}
onClick={() => props.handleEdit(question.question_id!)}
>
{props.editingId === question.question_id ?
CurrentAppTranslation.CancelButtonText :
CurrentAppTranslation.EditText}
</Button>
)}
</Box>
{props.editingId !== question.question_id || !props.canEditQuestions ? (
<Typography variant="body1" gutterBottom>
<Typography variant="body1"
sx={{
justifyContent: CurrentAppTranslation.justifyContent,
direction: CurrentAppTranslation.direction,
}}
gutterBottom>
{question.description}
</Typography>) : (
<TextField
sx={{
justifyContent: CurrentAppTranslation.justifyContent,
direction: CurrentAppTranslation.direction,
}}
fullWidth
multiline
rows={3}
Expand All @@ -76,17 +111,24 @@ const RenderAllQuestions: React.FC<RenderQuestionsListProps> = ({ ...props }) =>
)}
{apiClient.getQuestionOptions(question).map((option, index) => (
props.editingId !== question.question_id || !props.canEditQuestions ?
(<Typography key={index} variant="body2">
{`${index + 1}. ${option}`}
</Typography>) :
(
<Typography key={index} variant="body2" sx={{
justifyContent: CurrentAppTranslation.justifyContent,
direction: CurrentAppTranslation.direction,
}}>
{`${CurrentAppTranslation.OptionText} ${index + 1}${
CurrentAppTranslation.OptionSeparatorChar
} ${option}`}
</Typography>
) :
(<TextField
key={index}
fullWidth
label={`${CurrentAppTranslation.OptionText} ${index + 1}`}
value={option}
onChange={(e) => props.handleInputChange(
question.question_id!,
`option${index+1}` as keyof ExamQuestionInfo,
`option${index + 1}` as keyof ExamQuestionInfo,
e.target.value
)}
disabled={props.editingId !== question.question_id}
Expand All @@ -106,11 +148,15 @@ const RenderAllQuestions: React.FC<RenderQuestionsListProps> = ({ ...props }) =>
fullWidth
multiline
rows={3}
label="Answer Text"
label={CurrentAppTranslation.AnswerFieldText}
value={question.user_answer?.answer}
onChange={(e) => props.handleAnswerTextChange(question.question_id!, e.target.value)}
disabled={props.editingId !== question.question_id!}
margin="normal"
style={{
justifyContent: CurrentAppTranslation.justifyContent,
direction: CurrentAppTranslation.direction,
}}
/>)}
{props.editingId === question.question_id && (
<Button
Expand Down
17 changes: 14 additions & 3 deletions src/pages/examHallPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -256,13 +256,23 @@ const ExamHallPage: React.FC = () => {
titleText={
`${CurrentAppTranslation.ExamHallText} - ${examInfo?.exam_title ?? ''}`
}>
<Box sx={{
<Box sx={{
maxWidth: '650px',
width: '100%',
margin: '0 auto',
}}>
<Paper sx={{ backgroundColor: 'white', padding: '8px', margin: '8px', textAlign: 'center' }}>
{`${CurrentAppTranslation.ExamFinishesInText}: ${examInfo?.finishes_in ?? ''}`}
<Paper sx={
{
backgroundColor: 'white',
padding: '8px',
margin: '8px',
textAlign: 'center',
direction: `${CurrentAppTranslation.direction}`
}}>
{!examInfo?.has_finished ?
`${CurrentAppTranslation.ExamFinishesInText}: ${examInfo?.finishes_in ?? ''}` :
CurrentAppTranslation.ExamFinishedText
}
</Paper>
</Box>
<Box sx={{ display: 'flex', flexDirection: 'column', minHeight: '80vh' }}>
Expand Down Expand Up @@ -290,6 +300,7 @@ const ExamHallPage: React.FC = () => {
handleAnswerTextChange={handleAnswerTextChange}
isParticipating={examInfo?.has_participated ?? false}
canEditQuestions={examInfo?.can_edit_question ?? false}
isExamFinished={examInfo?.has_finished ?? true}
/>}
{editingId !== -1 && examInfo?.can_edit_question && !examInfo.has_finished && (
<Box sx={{
Expand Down
29 changes: 23 additions & 6 deletions src/pages/examInfoPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,16 @@ import RenderAllFields from '../components/rendering/RenderAllFields';

export var forceUpdateExamInfoPage = () => { };

interface DisplayingExamData extends EditExamData {
has_participated?: boolean;
has_started?: boolean;
has_finished?: boolean;
}

var ExamCountdownId = 0;

const ExamInfoPage = () => {
const [examData, setExamData] = useState<EditExamData>({
const [examData, setExamData] = useState<DisplayingExamData>({
exam_id: 0,
course_id: 0,
exam_title: '',
Expand Down Expand Up @@ -58,6 +64,9 @@ const ExamInfoPage = () => {
duration: result.duration,
exam_date: getUTCUnixTimestamp(getDateFromServerTimestamp(result.exam_date)!),
is_public: result.is_public,
has_participated: result.has_participated,
has_finished: result.has_finished,
has_started: result.has_started,
});
setExamInfo(result);

Expand Down Expand Up @@ -196,11 +205,13 @@ const ExamInfoPage = () => {
{CurrentAppTranslation.ExamInformationText}
</Typography>
<Box display="flex" justifyContent="space-between" alignItems="center" mb={2}>
<Button variant="contained" onClick={isEditing ? handleSave : handleEdit}>
{isEditing ? CurrentAppTranslation.SaveText : CurrentAppTranslation.EditText}
</Button>
{examInfo?.can_edit_question && (
<Button variant="contained" onClick={isEditing ? handleSave : handleEdit}>
{isEditing ? CurrentAppTranslation.SaveText : CurrentAppTranslation.EditText}
</Button>
)}
{(!isEditing && examInfo?.can_participate &&
!examInfo.has_participated &&
!examInfo.has_participated &&
!examInfo.has_finished && !examInfo.can_edit_question) && (
<Button variant="contained" onClick={handleParticipate}>
{CurrentAppTranslation.ParticipateText}
Expand All @@ -224,7 +235,13 @@ const ExamInfoPage = () => {
handleInputChange: handleChange,
isEditing: isEditing,
disablePast: true,
noEditFields: ['exam_id'],
disableDateTimePickers: examInfo?.has_finished,
noEditFields: [
'exam_id',
'has_participated',
'has_started',
'has_finished',
],
})}
</Grid>
</Paper>
Expand Down
7 changes: 7 additions & 0 deletions src/translations/appTranslation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ export class AppTranslationBase {
ConfirmText: string = "Confirm";
SubmitText: string = "Submit";
ChosenOptionText: string = "Chosen Option";
AnswerFieldText: string = "Answer Text";
OptionText: string = "Option";
OptionSeparatorChar: string = ".";
EditText: string = "Edit";
UserInformationText: string = "User Information";
CourseInformationText: string = "Course Information";
Expand All @@ -87,10 +89,12 @@ export class AppTranslationBase {
CancelButtonText: string = "Cancel";
SendEmailToUseText: string = "Send email confirmation to user";
ExamFinishesInText: string = "Exam finishes in";
ExamFinishedText: string = "Exam finished!";

// System messages
ExamParticipationSuccessText: string = "Successfully participated in the exam!";
LanguageChangedSuccessfullyText: string = "Language changed successfully!";
ExamHasNoQuestionsYetText: string = "This exam has no questions yet!";
EmailForPassWilLBeSentText: string = "An email will be sent to you for password change.";
UserUpdatedSuccessfullyText: string = "User updated successfully!";
PasswordChangedSuccessfullyText: string = "Password changed successfully!";
Expand Down Expand Up @@ -118,6 +122,9 @@ export class AppTranslationBase {

//#region API response fields translations

has_started: string = "Is Started";
has_finished: string = "Is Finished";
has_participated: string = "Has Participated";
setup_completed: string = "Send email confirmation to user";
is_public: string = "Is Public";
exam_date: string = "Exam Date";
Expand Down
7 changes: 7 additions & 0 deletions src/translations/faTranslation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@ class FaTranslation extends AppTranslationBase {
ConfirmText: string = "تایید";
SubmitText: string = "ثبت";
ChosenOptionText: string = "گزینه انتخابی";
AnswerFieldText: string = "متن پاسخ";
OptionText: string = "گزینه";
OptionSeparatorChar: string = ")";
EditText: string = "ویرایش";
UserInformationText: string = "اطلاعات کاربر";
CourseInformationText: string = "اطلاعات دوره";
Expand All @@ -85,10 +87,12 @@ class FaTranslation extends AppTranslationBase {
CancelButtonText: string = "لغو";
SendEmailToUseText: string = "ارسال ایمیل تایید به کاربر";
ExamFinishesInText: string = "آزمون پایان می یابد در";
ExamFinishedText: string = "آزمون پایان یافت!";

// System messages
ExamParticipationSuccessText: string = "عملیات شرکت در آزمون با موفقیت انجام شد!";
LanguageChangedSuccessfullyText: string = "زبان با موفقیت تغییر یافت";
ExamHasNoQuestionsYetText: string = "این آزمون هنوز سوالی ندارد!";
PasswordChangedSuccessfullyText: string = "رمز عبور با موفقیت تغییر یافت";
EmailForPassWilLBeSentText: string = "ایمیلی برای تغییر رمز عبور به شما ارسال خواهد شد";
UserUpdatedSuccessfullyText: string = "کاربر با موفقیت ویرایش شد";
Expand Down Expand Up @@ -116,6 +120,9 @@ class FaTranslation extends AppTranslationBase {

//#region API response fields translations

has_started: string = "شروع شده";
has_finished: string = "پایان یافته";
has_participated: string = "شرکت کرده";
setup_completed: string = "ارسال ایمیل تایید به کاربر";
is_public: string = "عمومی";
exam_date: string = "تاریخ آزمون";
Expand Down

0 comments on commit 723046e

Please sign in to comment.