|
8 | 8 | createTimedComponent, |
9 | 9 | } from "../../common/js/renderComponent"; |
10 | 10 | import RunestoneBase from "../../common/js/runestonebase"; |
| 11 | +import "../css/selectquestion.css"; |
11 | 12 |
|
12 | 13 | export default class SelectOne extends RunestoneBase { |
13 | 14 | /** |
@@ -38,6 +39,7 @@ export default class SelectOne extends RunestoneBase { |
38 | 39 | this.selector_id = $(opts.orig).first().attr("id"); |
39 | 40 | this.primaryOnly = $(opts.orig).data("primary"); |
40 | 41 | this.ABExperiment = $(opts.orig).data("ab"); |
| 42 | + this.toggle = $(opts.orig).data("toggle"); |
41 | 43 | opts.orig.id = this.selector_id; |
42 | 44 | } |
43 | 45 | /** |
@@ -79,6 +81,9 @@ export default class SelectOne extends RunestoneBase { |
79 | 81 | if (this.timedWrapper) { |
80 | 82 | data.timedWrapper = this.timedWrapper; |
81 | 83 | } |
| 84 | + if (this.toggle) { |
| 85 | + data.toggle = this.toggle; |
| 86 | + } |
82 | 87 | let opts = this.origOpts; |
83 | 88 | let selectorId = this.selector_id; |
84 | 89 | console.log("getting question source"); |
@@ -116,14 +121,183 @@ export default class SelectOne extends RunestoneBase { |
116 | 121 | self.containerDiv = res.question.containerDiv; |
117 | 122 | self.realComponent.selectorId = selectorId; |
118 | 123 | } else { |
| 124 | + /////////////////////////// |
| 125 | + if (data.toggle) { |
| 126 | + var toggleQuestions = this.questions.split(", "); |
| 127 | + var toggleUI = ""; |
| 128 | + if (!document.getElementById("component-preview")) { |
| 129 | + toggleUI += |
| 130 | + '<div id="component-preview" class="col-md-6 toggle-preview" style="z-index: 999;"></div>'; |
| 131 | + } |
| 132 | + toggleUI += |
| 133 | + '<label for="' + |
| 134 | + selectorId + |
| 135 | + '-toggleQuestion" style="margin-left: 10px">Toggle Question:</label><select id="' + |
| 136 | + selectorId + |
| 137 | + '-toggleQuestion">'; |
| 138 | + var i; |
| 139 | + var toggleQuestionHTMLSrc; |
| 140 | + var toggleQuestionSubstring; |
| 141 | + var toggleQuestionType; |
| 142 | + for (i = 0; i < toggleQuestions.length; i++) { |
| 143 | + toggleQuestionHTMLSrc = await this.getToggleSrc( |
| 144 | + toggleQuestions[i] |
| 145 | + ); |
| 146 | + toggleQuestionSubstring = toggleQuestionHTMLSrc.split( |
| 147 | + 'data-component="' |
| 148 | + )[1]; |
| 149 | + switch ( |
| 150 | + toggleQuestionSubstring.substring( |
| 151 | + 0, |
| 152 | + toggleQuestionSubstring.indexOf('"') |
| 153 | + ) |
| 154 | + ) { |
| 155 | + case "activecode": |
| 156 | + toggleQuestionType = "Active Code"; |
| 157 | + break; |
| 158 | + case "clickablearea": |
| 159 | + toggleQuestionType = "Clickable Area"; |
| 160 | + break; |
| 161 | + case "dragndrop": |
| 162 | + toggleQuestionType = "Drag n Drop"; |
| 163 | + break; |
| 164 | + case "fillintheblank": |
| 165 | + toggleQuestionType = "Fill in the Blank"; |
| 166 | + break; |
| 167 | + case "multiplechoice": |
| 168 | + toggleQuestionType = "Multiple Choice"; |
| 169 | + break; |
| 170 | + case "parsons": |
| 171 | + toggleQuestionType = "Parsons"; |
| 172 | + break; |
| 173 | + case "shortanswer": |
| 174 | + toggleQuestionType = "Short Answer"; |
| 175 | + break; |
| 176 | + } |
| 177 | + toggleUI += |
| 178 | + '<option value="' + |
| 179 | + toggleQuestions[i] + |
| 180 | + '">' + |
| 181 | + toggleQuestionType + |
| 182 | + " - " + |
| 183 | + toggleQuestions[i] + |
| 184 | + "</option>"; |
| 185 | + } |
| 186 | + toggleUI += |
| 187 | + '</select><div id="' + |
| 188 | + selectorId + |
| 189 | + '-toggleSelectedQuestion">'; |
| 190 | + var toggleFirstID = htmlsrc.split('id="')[1]; |
| 191 | + toggleFirstID = toggleFirstID.split('"')[0]; |
| 192 | + htmlsrc = toggleUI + htmlsrc + "</div>"; |
| 193 | + } |
| 194 | + /////////////////////////// |
119 | 195 | // just render this component on the page in its usual place |
120 | 196 | res = renderRunestoneComponent(htmlsrc, selectorId, { |
121 | 197 | selector_id: selectorId, |
122 | 198 | useRunestoneServices: true, |
123 | 199 | }); |
| 200 | + /////////////////////////// |
| 201 | + if (data.toggle) { |
| 202 | + $("#component-preview").hide(); |
| 203 | + var toggleQuestionSelect = document.getElementById( |
| 204 | + selectorId + "-toggleQuestion" |
| 205 | + ); |
| 206 | + for (i = 0; i < toggleQuestionSelect.options.length; i++) { |
| 207 | + if ( |
| 208 | + toggleQuestionSelect.options[i].value == toggleFirstID |
| 209 | + ) { |
| 210 | + toggleQuestionSelect.value = toggleFirstID; |
| 211 | + $("#" + selectorId).data( |
| 212 | + "toggle_current", |
| 213 | + toggleFirstID |
| 214 | + ); |
| 215 | + break; |
| 216 | + } |
| 217 | + } |
| 218 | + toggleQuestionSelect.addEventListener( |
| 219 | + "change", |
| 220 | + async function () { |
| 221 | + await this.togglePreview( |
| 222 | + toggleQuestionSelect.parentElement.id |
| 223 | + ); |
| 224 | + }.bind(this) |
| 225 | + ); |
| 226 | + } |
| 227 | + /////////////////////////// |
124 | 228 | } |
125 | 229 | return response; |
126 | 230 | } |
| 231 | + |
| 232 | + async getToggleSrc(toggleQuestionID) { |
| 233 | + let request = new Request( |
| 234 | + "/runestone/admin/htmlsrc?acid=" + toggleQuestionID, |
| 235 | + { |
| 236 | + method: "GET", |
| 237 | + } |
| 238 | + ); |
| 239 | + let response = await fetch(request); |
| 240 | + let htmlsrc = await response.json(); |
| 241 | + return htmlsrc; |
| 242 | + } |
| 243 | + |
| 244 | + async togglePreview(parentID) { |
| 245 | + var parentDiv = document.getElementById(parentID); |
| 246 | + var toggleQuestionSelect = parentDiv.getElementsByTagName("select")[0]; |
| 247 | + var selectedQuestion = |
| 248 | + toggleQuestionSelect.options[toggleQuestionSelect.selectedIndex] |
| 249 | + .value; |
| 250 | + var htmlsrc = await this.getToggleSrc(selectedQuestion); |
| 251 | + let res = renderRunestoneComponent(htmlsrc, "component-preview", { |
| 252 | + selector_id: "component-preview", |
| 253 | + useRunestoneServices: true, |
| 254 | + }); |
| 255 | + // let pd = document.getElementById(preview_div); |
| 256 | + // pd.appendChild(renderGradingComponents(sid, selectedQuestion)); |
| 257 | + |
| 258 | + let closeButton = document.createElement("button"); |
| 259 | + $(closeButton).text("Close Preview"); |
| 260 | + $(closeButton).addClass("btn btn-default"); |
| 261 | + $(closeButton).click(function (event) { |
| 262 | + $("#component-preview").html(""); |
| 263 | + toggleQuestionSelect.value = $("#" + parentID).data( |
| 264 | + "toggle_current" |
| 265 | + ); |
| 266 | + $("#component-preview").hide(); |
| 267 | + }); |
| 268 | + $("#component-preview").append(closeButton); |
| 269 | + |
| 270 | + let setButton = document.createElement("button"); |
| 271 | + $(setButton).text("Select this Problem"); |
| 272 | + $(setButton).addClass("btn btn-primary"); |
| 273 | + $(setButton).click( |
| 274 | + async function () { |
| 275 | + await this.toggleSet(parentID, selectedQuestion, htmlsrc); |
| 276 | + $("#component-preview").hide(); |
| 277 | + }.bind(this) |
| 278 | + ); |
| 279 | + $("#component-preview").append(setButton); |
| 280 | + $("#component-preview").show(); |
| 281 | + } |
| 282 | + |
| 283 | + async toggleSet(parentID, selectedQuestion, htmlsrc) { |
| 284 | + var selectorId = parentID + "-toggleSelectedQuestion"; |
| 285 | + document.getElementById(selectorId).innerHTML = ""; // need to check whether this is even necessary |
| 286 | + let res = renderRunestoneComponent(htmlsrc, selectorId, { |
| 287 | + selector_id: selectorId, |
| 288 | + useRunestoneServices: true, |
| 289 | + }); |
| 290 | + let request = new Request( |
| 291 | + "/runestone/ajax/update_selected_question?metaid=" + |
| 292 | + parentID + |
| 293 | + "&selected=" + |
| 294 | + selectedQuestion, |
| 295 | + {} |
| 296 | + ); |
| 297 | + let response = await fetch(request); |
| 298 | + $("#component-preview").html(""); |
| 299 | + $("#" + parentID).data("toggle_current", selectedQuestion); |
| 300 | + } |
127 | 301 | } |
128 | 302 |
|
129 | 303 | /* |
|
0 commit comments