@@ -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