X-Git-Url: https://git.auder.net/pieces/Cwda/c_white_knight.svg?a=blobdiff_plain;f=public%2Fjavascripts%2Fcomponents%2Fstatements.js;h=0fb5124134361ea8ae3de21ab70998853ca3e261;hb=43828378be054cf3604b753e8d9ab24af911188f;hp=d93a97f239c5f1e5aad79db28c16f24a7b805d4d;hpb=435371c7ba4b60790953115b9ebed68a047bb0a3;p=qomet.git
diff --git a/public/javascripts/components/statements.js b/public/javascripts/components/statements.js
index d93a97f..0fb5124 100644
--- a/public/javascripts/components/statements.js
+++ b/public/javascripts/components/statements.js
@@ -1,10 +1,35 @@
+/*
+ * questions group by index prefix 1.2.3 1.1 ...etc --> '1'
+
+NOTE: questions can contain parameterized exercises (how ?
+--> describe variables (syntax ?)
+--> write javascript script (OK, users trusted ? ==> safe mode possible if public website)
+Imaginary example: (using math.js)
+ (avant l'exo)
+ x: math.random()
+ y: math.random()
+ M: math.matrix([[7, x], [y, -3]]);
+ res: math.det(M)
+
+
Calculer le déterminant de
+ $$\begin{matrix}7 & x\\y & -3\end{matrix}$$
+ * ...
+*/
+
Vue.component("statements", {
- props: ['questions','inputs','showAnswers','index'], // index=-1 : show all, otherwise show current question
+ // 'answers' is an object containing
+ // 'inputs'(array),
+ // 'displayAll'(bool), //TODO: should be in questions!
+ // 'showSolution'(bool),
+ // 'indices': order of appearance
+ // 'index': current integer index (focused question)
+ props: ['questions','answers'],
// TODO: general render function for nested exercises
// There should be a questions navigator below, or next (visible if display=='all')
// Full questions tree is rendered, but some parts hidden depending on display settings
render(h) {
- let domTree = this.questions.map( (q,i) => {
+ // TODO: render nothing if answers is empty
+ let domTree = (this.questions || [ ]).map( (q,i) => {
let questionContent = [ ];
questionContent.push(
h(
@@ -30,7 +55,7 @@ Vue.component("statements", {
"input",
{
domProps: {
- checked: this.inputs.length > 0 && this.inputs[i][idx],
+ checked: this.answers.inputs.length > 0 && this.answers.inputs[i][idx],
disabled: monitoring,
},
attrs: {
@@ -38,9 +63,10 @@ Vue.component("statements", {
type: "checkbox",
},
on: {
- change: e => { this.inputs[i][idx] = e.target.checked; },
+ change: e => { this.answers.inputs[i][idx] = e.target.checked; },
},
},
+ [ '' ] //to work in Firefox 45.9 ESR @ ENSTA...
)
);
option.push(
@@ -62,8 +88,8 @@ Vue.component("statements", {
{
"class": {
option: true,
- choiceCorrect: showAnswers && this.questions[i].answer.includes(idx),
- choiceWrong: showAnswers && this.inputs[i][idx] && !questions[i].answer.includes(idx),
+ choiceCorrect: this.answers.showSolution && this.questions[i].answer.includes(idx),
+ choiceWrong: this.answers.showSolution && this.answers.inputs[i][idx] && !q.answer.includes(idx),
},
},
option
@@ -81,12 +107,14 @@ Vue.component("statements", {
optionList
)
);
+ if (this.answers.displayAll && i < this.questions.length-1)
+ questionContent.push( h("hr") );
return h(
"div",
{
"class": {
"question": true,
- "hide": index >= 0 && index != i,
+ "hide": !this.answers.displayAll && this.answers.indices[this.answers.index] != i,
},
},
questionContent
@@ -99,9 +127,12 @@ Vue.component("statements", {
id: "statements",
},
},
- questions
+ domTree
);
},
+ mounted: function() {
+ statementsLibsRefresh();
+ },
updated: function() {
// TODO: next line shouldn't be required: questions wordings + answer + options
// are processed earlier; their content should be updated at this time.