@@ -126,6 +126,12 @@ export default class SelectOne extends RunestoneBase {
126126 self . realComponent . selectorId = selectorId ;
127127 } else {
128128 if ( data . toggle ) {
129+ var toggleOptions = data . toggleOptions ;
130+ var toggleLabels ;
131+ if ( toggleOptions . includes ( "labels{" ) ) {
132+ toggleLabels = toggleOptions . slice ( toggleOptions . indexOf ( "labels{" ) + 7 , toggleOptions . indexOf ( "}" ) ) . split ( "," ) ;
133+ toggleOptions = toggleOptions . slice ( 0 , toggleOptions . indexOf ( ",labels{" ) ) ;
134+ }
129135 var toggleQuestions = this . questions . split ( ", " ) ;
130136 var toggleUI = "" ;
131137 // check so that only the first toggle select question on the assignments page has a preview panel created, then all toggle select previews use this same panel
@@ -147,6 +153,7 @@ export default class SelectOne extends RunestoneBase {
147153 var toggleQuestionHTMLSrc ;
148154 var toggleQuestionSubstring ;
149155 var toggleQuestionType ;
156+ var toggleQuestionTypes = [ ] ;
150157 for ( i = 0 ; i < toggleQuestions . length ; i ++ ) {
151158 toggleQuestionHTMLSrc = await this . getToggleSrc (
152159 toggleQuestions [ i ]
@@ -155,13 +162,13 @@ export default class SelectOne extends RunestoneBase {
155162 'data-component="'
156163 ) [ 1 ] ;
157164 switch (
158- toggleQuestionSubstring . substring (
165+ toggleQuestionSubstring . slice (
159166 0 ,
160167 toggleQuestionSubstring . indexOf ( '"' )
161168 )
162169 ) {
163170 case "activecode" :
164- toggleQuestionType = "Write Code" ;
171+ toggleQuestionType = "Active Write Code" ;
165172 break ;
166173 case "clickablearea" :
167174 toggleQuestionType = "Clickable Area" ;
@@ -176,20 +183,26 @@ export default class SelectOne extends RunestoneBase {
176183 toggleQuestionType = "Multiple Choice" ;
177184 break ;
178185 case "parsons" :
179- toggleQuestionType = "Mixed-Up Code" ;
186+ toggleQuestionType = "Parsons Mixed-Up Code" ;
180187 break ;
181188 case "shortanswer" :
182189 toggleQuestionType = "Short Answer" ;
183190 break ;
184191 }
192+ toggleQuestionTypes [ i ] = toggleQuestionType ;
185193 toggleUI +=
186194 '<option value="' +
187195 toggleQuestions [ i ] +
188- '">' +
189- toggleQuestionType +
196+ '">' ;
197+ if ( toggleLabels [ i ] ) {
198+ toggleUI += toggleLabels [ i ] ;
199+ }
200+ else {
201+ toggleUI += toggleQuestionType +
190202 " - " +
191203 toggleQuestions [ i ] ;
192- if ( ( i == 0 ) && ( data . toggleOptions . includes ( "lock" ) ) ) {
204+ }
205+ if ( ( i == 0 ) && ( toggleOptions . includes ( "lock" ) ) ) {
193206 toggleUI += " (only this question will be graded)" ;
194207 }
195208 toggleUI += "</option>" ;
@@ -221,6 +234,10 @@ export default class SelectOne extends RunestoneBase {
221234 "toggle_current" ,
222235 toggleFirstID
223236 ) ;
237+ $ ( "#" + selectorId ) . data (
238+ "toggle_current_type" ,
239+ toggleQuestionTypes [ 0 ]
240+ ) ;
224241 break ;
225242 }
226243 }
@@ -229,7 +246,8 @@ export default class SelectOne extends RunestoneBase {
229246 async function ( ) {
230247 await this . togglePreview (
231248 toggleQuestionSelect . parentElement . id ,
232- data . toggleOptions
249+ toggleOptions ,
250+ toggleQuestionTypes
233251 ) ;
234252 } . bind ( this )
235253 ) ;
@@ -252,7 +270,7 @@ export default class SelectOne extends RunestoneBase {
252270 }
253271
254272 // on changing the value of toggle select dropdown, render selected question in preview panel, add appropriate buttons, then make preview panel visible
255- async togglePreview ( parentID , toggleOptions ) {
273+ async togglePreview ( parentID , toggleOptions , toggleQuestionTypes ) {
256274 $ ( "#toggle-buttons" ) . html ( "" ) ;
257275 var parentDiv = document . getElementById ( parentID ) ;
258276 var toggleQuestionSelect = parentDiv . getElementsByTagName ( "select" ) [ 0 ] ;
@@ -285,33 +303,23 @@ export default class SelectOne extends RunestoneBase {
285303 $ ( setButton ) . addClass ( "btn btn-primary" ) ;
286304 $ ( setButton ) . click (
287305 async function ( ) {
288- await this . toggleSet ( parentID , selectedQuestion , htmlsrc ) ;
306+ await this . toggleSet ( parentID , selectedQuestion , htmlsrc , toggleQuestionTypes ) ;
289307 $ ( "#component-preview" ) . hide ( ) ;
290308 } . bind ( this )
291309 ) ;
292310 $ ( "#toggle-buttons" ) . append ( setButton ) ;
293311
294312 // if "transfer" in toggle options, and if current question type is Parsons and selected question type is active code, then add "Transfer" button to preview panel
295313 if ( toggleOptions . includes ( "transfer" ) ) {
296- var optionText ;
297- var currentType ;
298- var selectedType ;
299- for ( var n = 0 ; n < toggleQuestionSelect . options . length ; n ++ ) {
300- optionText = toggleQuestionSelect . options [ n ] . innerHTML ;
301- if ( optionText . includes ( $ ( "#" + parentID ) . data ( "toggle_current" ) ) ) {
302- currentType = optionText . substring ( 0 , optionText . indexOf ( " - " ) ) ;
303- }
304- if ( optionText . includes ( selectedQuestion ) ) {
305- selectedType = optionText . substring ( 0 , optionText . indexOf ( " - " ) ) ;
306- }
307- }
308- if ( ( currentType == "Mixed-Up Code" ) && ( selectedType == "Write Code" ) ) {
314+ var currentType = $ ( "#" + parentID ) . data ( "toggle_current_type" ) ;
315+ var selectedType = toggleQuestionTypes [ toggleQuestionSelect . selectedIndex ] ;
316+ if ( ( currentType == "Parsons Mixed-Up Code" ) && ( selectedType == "Active Write Code" ) ) {
309317 let transferButton = document . createElement ( "button" ) ;
310- $ ( transferButton ) . text ( "Transfer Mixed-Up Code to Write Code" ) ;
318+ $ ( transferButton ) . text ( "Transfer Parsons Mixed-Up Code to Active Write Code" ) ;
311319 $ ( transferButton ) . addClass ( "btn btn-primary" ) ;
312320 $ ( transferButton ) . click (
313321 async function ( ) {
314- await this . toggleTransfer ( parentID , selectedQuestion , htmlsrc ) ;
322+ await this . toggleTransfer ( parentID , selectedQuestion , htmlsrc , toggleQuestionTypes ) ;
315323 } . bind ( this )
316324 ) ;
317325 $ ( "#toggle-buttons" ) . append ( transferButton ) ;
@@ -323,8 +331,9 @@ export default class SelectOne extends RunestoneBase {
323331 }
324332
325333 // on clicking "Select this Problem" button, close preview panel, replace current question in assignments page with selected question, and send request to update grading database
326- async toggleSet ( parentID , selectedQuestion , htmlsrc ) {
334+ async toggleSet ( parentID , selectedQuestion , htmlsrc , toggleQuestionTypes ) {
327335 var selectorId = parentID + "-toggleSelectedQuestion" ;
336+ var toggleQuestionSelect = document . getElementById ( parentID ) . getElementsByTagName ( "select" ) [ 0 ] ;
328337 document . getElementById ( selectorId ) . innerHTML = "" ; // need to check whether this is even necessary
329338 let res = renderRunestoneComponent ( htmlsrc , selectorId , {
330339 selector_id : selectorId ,
@@ -340,10 +349,11 @@ export default class SelectOne extends RunestoneBase {
340349 let response = await fetch ( request ) ;
341350 $ ( "#toggle-preview" ) . html ( "" ) ;
342351 $ ( "#" + parentID ) . data ( "toggle_current" , selectedQuestion ) ;
352+ $ ( "#" + parentID ) . data ( "toggle_current_type" , toggleQuestionTypes [ toggleQuestionSelect . selectedIndex ] ) ;
343353 }
344354
345355 // on clicking "Transfer" button, extract the current text and indentation of the Parsons blocks in the answer space, then paste that into the selected active code question
346- async toggleTransfer ( parentID , selectedQuestion , htmlsrc ) {
356+ async toggleTransfer ( parentID , selectedQuestion , htmlsrc , toggleQuestionTypes ) {
347357 // retrieve all Parsons lines within the answer space and loop through this list
348358 var currentParsons = document . getElementById ( parentID + "-toggleSelectedQuestion" ) . querySelectorAll ( "div[class^='answer']" ) [ 0 ] . getElementsByClassName ( "prettyprint lang-py" ) ;
349359 var currentParsonsClass ;
@@ -360,13 +370,13 @@ export default class SelectOne extends RunestoneBase {
360370 currentParsonsClass = currentParsons [ p ] . classList [ 2 ] ;
361371 if ( currentParsonsClass ) {
362372 if ( currentParsonsClass . includes ( "indent" ) ) {
363- indentCount = parseInt ( indentCount ) + parseInt ( currentParsonsClass . substring ( 6 , currentParsonsClass . length ) ) ;
373+ indentCount = parseInt ( indentCount ) + parseInt ( currentParsonsClass . slice ( 6 , currentParsonsClass . length ) ) ;
364374 }
365375 }
366376 // for Parsons answer spaces with vertical lines that allow student to define their own line indentation
367377 currentBlockIndent = currentParsons [ p ] . parentElement . parentElement . style . left ;
368378 if ( currentBlockIndent ) {
369- indentCount = parseInt ( indentCount ) + parseInt ( currentBlockIndent . substring ( 0 , currentBlockIndent . indexOf ( "px" ) ) / 30 ) ;
379+ indentCount = parseInt ( indentCount ) + parseInt ( currentBlockIndent . slice ( 0 , currentBlockIndent . indexOf ( "px" ) ) / 30 ) ;
370380 }
371381 for ( var d = 0 ; d < indentCount ; d ++ ) {
372382 indent += " " ;
@@ -394,11 +404,11 @@ export default class SelectOne extends RunestoneBase {
394404 }
395405 }
396406 // replace all existing code within selected active code question with extracted Parsons text
397- var htmlsrcFormer = htmlsrc . substring ( 0 , htmlsrc . indexOf ( "<textarea" ) + htmlsrc . split ( "<textarea" ) [ 1 ] . indexOf ( ">" ) + 10 ) ;
398- var htmlsrcLatter = htmlsrc . substring ( htmlsrc . indexOf ( "</textarea>" ) , htmlsrc . length ) ;
407+ var htmlsrcFormer = htmlsrc . slice ( 0 , htmlsrc . indexOf ( "<textarea" ) + htmlsrc . split ( "<textarea" ) [ 1 ] . indexOf ( ">" ) + 10 ) ;
408+ var htmlsrcLatter = htmlsrc . slice ( htmlsrc . indexOf ( "</textarea>" ) , htmlsrc . length ) ;
399409 htmlsrc = htmlsrcFormer + parsonsLines + htmlsrcLatter ;
400410
401- await this . toggleSet ( parentID , selectedQuestion , htmlsrc ) ;
411+ await this . toggleSet ( parentID , selectedQuestion , htmlsrc , toggleQuestionTypes ) ;
402412 $ ( "#component-preview" ) . hide ( ) ;
403413 }
404414}
0 commit comments