diff --git a/components/CodingChallenge/EditableList.vue b/components/CodingChallenge/EditableList.vue index 2a971e02..349402bb 100644 --- a/components/CodingChallenge/EditableList.vue +++ b/components/CodingChallenge/EditableList.vue @@ -1,8 +1,8 @@ import { useI18n } from "vue-i18n"; import { defineComponent} from "vue"; -import { CheckIcon, CheckBadgeIcon } from "@heroicons/vue/24/solid"; +import { CheckIcon, CheckBadgeIcon, LockClosedIcon } from "@heroicons/vue/24/solid"; export default defineComponent({ components: { CheckIcon, CheckBadgeIcon, + LockClosedIcon }, props: { course: { type: Object as PropType, default: null }, @@ -170,6 +176,7 @@ export default defineComponent({ user, canCreate, totalLevel, + LockClosedIcon, }; }, }); diff --git a/components/form/Quiz.vue b/components/form/Quiz.vue index 13a1aeca..9eb09f55 100644 --- a/components/form/Quiz.vue +++ b/components/form/Quiz.vue @@ -13,21 +13,28 @@ @submit.prevent="onclickSubmitForm()" ref="refForm" > - +
+ + - Add Option +
+
+
+ {{ t("Buttons.AnswerOption") }} +
(null); + const defaultQuestionXP = 5; + const canEdit = computed(() => { if (props.data != null) { if (user.value?.admin) { @@ -118,6 +137,11 @@ export default defineComponent({ rules: [(v: string) => !!v || "Error.InputEmpty_Inputs.Question"], }, single_choice: { value: false, valid: true }, + xp: { + valid: false, + value: defaultQuestionXP, + rules: [(v: string) => !!v || "Error.InputEmpty_Inputs.XPForQuiz"], + }, submitting: false, validate: () => { @@ -195,10 +219,7 @@ export default defineComponent({ } if (!isAllowed) { - openSnackbar( - "error", - "Please fill current option first before adding new option." - ); + openSnackbar("error", "Error.FillCurrentOption"); return; } @@ -207,6 +228,7 @@ export default defineComponent({ valid: false, rules: [(v: string) => !!v || "Error.InputEmpty_Inputs.Option"], correct: false, + placeholder: "Headings.AnswerOption", }); } @@ -245,6 +267,7 @@ export default defineComponent({ if (!!!data) return; form.question.value = data.question ?? ""; form.question.valid = !!form.question.value; + form.xp.value = data.xp ?? defaultQuestionXP; if (data?.single_choice) { selectedQuestionType.value = "Single Choice"; @@ -338,11 +361,26 @@ export default defineComponent({ return openSnackbar("error", "Error.OptionsCannotBeSame"); for (let i = 0; i < options.value.length; i++) { if (options.value[i].answer.length > 256) { - return openSnackbar("error", t("Error.CannotHaveMoreCharacters", { input: t("Inputs.AnswerOption"), max: 256 })); + return openSnackbar( + "error", + t("Error.CannotHaveMoreCharacters", { + input: t("Inputs.AnswerOption"), + max: 256, + }) + ); } } if (form.question.value.length > 4096) { - return openSnackbar("error", t("Error.CannotHaveMoreCharacters", { input: t("Inputs.Question"), max: 4096 })); + return openSnackbar( + "error", + t("Error.CannotHaveMoreCharacters", { + input: t("Inputs.Question"), + max: 4096, + }) + ); + } + if (form.xp.value < 1) { + return openSnackbar("error", "Error.XPValueCannotBeLessThanOne"); } if (checkIsSingleChoice(options.value)) { form.single_choice.value = true; @@ -367,7 +405,7 @@ export default defineComponent({ answers: form.body().answers, question: form.body().question, coins: 0, - xp: 5, + xp: parseInt(form.body().xp), single_choice: form.body().single_choice, }); form.submitting = false; @@ -405,6 +443,7 @@ export default defineComponent({ answers: form.body().answers, question: form.body().question, single_choice: form.body().single_choice, + xp: form.body().xp, } ); form.submitting = false; @@ -448,6 +487,7 @@ export default defineComponent({ onclickAddOption, options, XMarkIcon, + PlusCircleIcon, onclickRemoveOption, selectedQuestionType, setOptionCorrect, diff --git a/components/matching/EditableList.vue b/components/matching/EditableList.vue index 5263611a..5854d04d 100644 --- a/components/matching/EditableList.vue +++ b/components/matching/EditableList.vue @@ -1,7 +1,7 @@