Skip to content

Commit 804f706

Browse files
committed
Merge branch 'ascholerChemeketa-shortanswer-warning-update'
2 parents 09f1595 + aa99507 commit 804f706

2 files changed

Lines changed: 32 additions & 15 deletions

File tree

bases/rsptx/interactives/runestone/shortanswer/css/shortanswer.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,12 @@ div.journal div.latexoutput {
4646
outline: none;
4747
border-color: #0969da;
4848
box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.15);
49+
}
50+
51+
.shortanswer__rendered-answer-div {
52+
margin-top: 1rem;
53+
}
54+
55+
.shortanswer__feedback {
56+
margin-top: 1rem;
4957
}

bases/rsptx/interactives/runestone/shortanswer/js/shortanswer.js

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,6 @@ export default class ShortAnswer extends RunestoneBase {
7272
this.jOptionsDiv.classList.add("journal-options");
7373
this.jInputDiv.appendChild(this.jOptionsDiv);
7474
this.jTextArea = document.createElement("textarea");
75-
let self = this;
76-
this.jTextArea.onchange = function () {
77-
self.isAnswered = true;
78-
};
7975
this.jTextArea.id = this.divid + "_solution";
8076
this.jTextArea.setAttribute("aria-label", "textarea");
8177
this.jTextArea.placeholder = this.placeholder;
@@ -85,16 +81,26 @@ export default class ShortAnswer extends RunestoneBase {
8581
this.jTextArea.rows = 4;
8682
this.jTextArea.cols = 50;
8783
this.jOptionsDiv.appendChild(this.jTextArea);
84+
85+
// fires when we loose focus on the textarea after making a change
86+
// mark it as answered for peer/timed purposes
8887
this.jTextArea.onchange = function () {
8988
this.isAnswered = true;
89+
}.bind(this);
90+
91+
// the answer has not been saved yet. Update as soon as user types in
92+
// the box, not just when they loose focus.
93+
this.jTextArea.addEventListener("keydown", () => {
9094
if (this.isTimed) {
95+
// no need for danger status... nothing for user to do here
9196
this.feedbackDiv.innerHTML = "Your answer is automatically saved.";
9297
} else {
9398
this.feedbackDiv.innerHTML = "Your answer has not been saved yet!";
99+
this.feedbackDiv.classList.remove("alert-success");
100+
this.feedbackDiv.classList.add("alert", "alert-danger");
94101
}
95-
this.feedbackDiv.classList.remove("alert-success");
96-
this.feedbackDiv.classList.add("alert", "alert-danger");
97-
}.bind(this);
102+
});
103+
98104
this.jTextArea.addEventListener("input", () => {
99105
this.jTextArea.style.height = "auto";
100106
this.jTextArea.style.height = `${this.jTextArea.scrollHeight}px`;
@@ -122,6 +128,7 @@ export default class ShortAnswer extends RunestoneBase {
122128
this.feedbackDiv.style.width = "530px";
123129
this.feedbackDiv.style.fontStyle = "italic";
124130
this.feedbackDiv.id = this.divid + "_feedback";
131+
this.feedbackDiv.classList.add("shortanswer__feedback");
125132
this.feedbackDiv.style.display = "none";
126133
this.fieldSet.appendChild(this.feedbackDiv);
127134
if (this.attachment) {
@@ -156,32 +163,34 @@ export default class ShortAnswer extends RunestoneBase {
156163
renderMath(value) {
157164
if (looksLikeLatexMath(value)) {
158165
if (!this.renderedAnswer) {
166+
this.rederedAnswerDiv = document.createElement("div");
167+
this.rederedAnswerDiv.classList.add("shortanswer__rendered-answer-div");
168+
this.fieldSet.appendChild(this.rederedAnswerDiv);
169+
159170
this.renderedAnswerLabel = document.createElement("label");
160171
this.renderedAnswerLabel.innerHTML = "Rendered Answer:";
161172
this.renderedAnswerLabel.id = this.divid + "_rendered_answer_label";
162-
this.renderedAnswerLabel.style.display = "none";
163-
this.fieldSet.appendChild(this.renderedAnswerLabel);
173+
this.renderedAnswerLabel.classList.add("shortanswer__rendered-answer-label");
174+
this.rederedAnswerDiv.appendChild(this.renderedAnswerLabel);
164175

165176
this.renderedAnswer = document.createElement("div");
177+
this.renderedAnswer.classList.add("shortanswer__rendered-answer");
166178
this.renderedAnswer.classList.add("latexoutput");
167179
this.renderedAnswer.setAttribute('aria-labelledby', this.renderedAnswerLabel.id);
168180
this.renderedAnswer.setAttribute('aria-live', "polite");
169-
this.renderedAnswer.style.display = "none";
170-
this.fieldSet.appendChild(this.renderedAnswer);
181+
this.rederedAnswerDiv.appendChild(this.renderedAnswer);
171182
}
172183
value = value.replace(/\$\$(.*?)\$\$/g, "\\[ $1 \\]");
173184
value = value.replace(/\$(.*?)\$/g, "\\( $1 \\)");
174185
value = value.replace(/\n/g, "<br/>");
175186
this.renderedAnswer.innerHTML = value;
176187

177-
this.renderedAnswer.style.display = "block";
178-
this.renderedAnswerLabel.style.display = "block";
188+
this.rederedAnswerDiv.style.display = "block";
179189
this.queueMathJax(this.renderedAnswer);
180190

181191
} else {
182192
if (this.renderedAnswer) {
183-
this.renderedAnswer.style.display = "none";
184-
this.renderedAnswerLabel.style.display = "none";
193+
this.rederedAnswerDiv.style.display = "none";
185194
}
186195
}
187196
}

0 commit comments

Comments
 (0)