{"version":3,"file":"866.acc4fa2810869869.bundle.js","mappings":"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","sources":["webpack://WebComponents/./runestone/clickableArea/js/clickable.js","webpack://WebComponents/./runestone/clickableArea/js/timedclickable.js"],"sourcesContent":["/*==========================================\n======= Master clickable.js ========\n============================================\n=== This file contains the JS for the ===\n=== Runestone clickable area component. ===\n============================================\n=== Created by ===\n=== Isaiah Mayerchak ===\n=== 7/1/15 ===\n==========================================*/\n\"use strict\";\n\nimport RunestoneBase from \"../../common/js/runestonebase.js\";\nimport \"../css/clickable.css\";\n\nexport var CAList = {}; // Object that contains all instances of ClickableArea objects\n\nexport default class ClickableArea extends RunestoneBase {\n constructor(opts) {\n super(opts);\n var orig = opts.orig; // entire
element that will be replaced by new HTML\n this.origElem = orig;\n this.divid = orig.id;\n this.useRunestoneServices = opts.useRunestoneServices;\n this.clickableArray = []; // holds all clickable elements\n this.correctArray = []; // holds the IDs of all correct clickable span elements, used for eval\n this.incorrectArray = []; // holds IDs of all incorrect clickable span elements, used for eval\n //For use with Sphinx-rendered html\n this.isTable = false;\n if ($(this.origElem).data(\"cc\") !== undefined) {\n if ($(this.origElem).is(\"[data-table]\")) {\n this.isTable = true;\n this.ccArray = $(this.origElem).data(\"cc\").split(\";\");\n this.ciArray = $(this.origElem).data(\"ci\").split(\";\");\n } else {\n this.ccArray = $(this.origElem).data(\"cc\").split(\",\");\n this.ciArray = $(this.origElem).data(\"ci\").split(\",\");\n }\n }\n // For use in the recursive replace function\n this.clickIndex = 0; // Index of this.clickedIndexArray that we're checking against\n this.clickableCounter = 0; // Index of the current clickable element\n this.getQuestion();\n this.getFeedback();\n this.renderNewElements();\n this.caption = \"Clickable\";\n this.addCaption(\"runestone\");\n this.checkServer(\"clickableArea\", true);\n }\n /*===========================\n == Update basic attributes ==\n ===========================*/\n getQuestion() {\n for (var i = 0; i < this.origElem.childNodes.length; i++) {\n if ($(this.origElem.childNodes[i]).is(\"[data-question]\")) {\n this.question = this.origElem.childNodes[i];\n break;\n }\n }\n }\n getFeedback() {\n this.feedback = \"\";\n for (var i = 0; i < this.origElem.childNodes.length; i++) {\n if ($(this.origElem.childNodes[i]).is(\"[data-feedback]\")) {\n this.feedback = this.origElem.childNodes[i];\n }\n }\n if (this.feedback !== \"\") {\n // Get the feedback element out of the container if the user has defined feedback\n $(this.feedback).remove();\n this.feedback = this.feedback.innerHTML;\n }\n }\n /*===========================================\n ==== Functions generating final HTML ====\n ===========================================*/\n renderNewElements() {\n // wrapper function for generating everything\n this.containerDiv = document.createElement(\"div\");\n this.containerDiv.id = this.origElem.id;\n this.containerDiv.appendChild(this.question);\n $(this.containerDiv).addClass(this.origElem.getAttribute(\"class\"));\n this.newDiv = document.createElement(\"div\");\n var newContent = $(this.origElem).html();\n while (newContent[0] === \"\\n\") {\n newContent = newContent.slice(1);\n }\n this.newDiv.innerHTML = newContent;\n this.containerDiv.appendChild(this.newDiv);\n this.createButtons();\n this.createFeedbackDiv();\n $(this.origElem).replaceWith(this.containerDiv);\n }\n createButtons() {\n this.submitButton = document.createElement(\"button\"); // Check me button\n this.submitButton.textContent = \"Check Me\";\n $(this.submitButton).attr({\n class: \"btn btn-success\",\n name: \"do answer\",\n type: \"button\",\n });\n this.submitButton.onclick = function () {\n this.checkCurrentAnswer();\n this.logCurrentAnswer();\n this.renderFeedback();\n }.bind(this);\n this.containerDiv.appendChild(this.submitButton);\n }\n createFeedbackDiv() {\n this.feedBackDiv = document.createElement(\"div\");\n this.containerDiv.appendChild(document.createElement(\"br\"));\n this.containerDiv.appendChild(this.feedBackDiv);\n }\n /*===================================\n === Checking/restoring from storage ===\n ===================================*/\n restoreAnswers(data) {\n // Restore answers from storage retrieval done in RunestoneBase or from local storage\n if (data.answer !== undefined) {\n // if we got data from the server\n this.hasStoredAnswers = true;\n this.clickedIndexArray = data.answer.split(\";\");\n }\n if (this.ccArray === undefined) {\n this.modifyClickables(this.newDiv.childNodes);\n } else {\n // For use with Sphinx-rendered HTML\n this.ccCounter = 0;\n this.ccIndex = 0;\n this.ciIndex = 0;\n if (!this.isTable) {\n this.modifyViaCC(this.newDiv.children);\n } else {\n this.modifyTableViaCC(this.newDiv.children);\n }\n }\n }\n checkLocalStorage() {\n if (this.graderactive) {\n return;\n }\n var storageObj;\n // Gets previous answer data from local storage if it exists\n this.hasStoredAnswers = false;\n var len = localStorage.length;\n if (len > 0) {\n var ex = localStorage.getItem(this.localStorageKey());\n if (ex !== null) {\n this.hasStoredAnswers = true;\n try {\n storageObj = JSON.parse(ex);\n this.clickedIndexArray = storageObj.answer.split(\";\");\n } catch (err) {\n // error while parsing; likely due to bad value stored in storage\n console.log(err.message);\n localStorage.removeItem(this.localStorageKey());\n this.hasStoredAnswers = false;\n this.restoreAnswers({});\n return;\n }\n if (this.useRunestoneServices) {\n // log answer to server\n this.givenIndexArray = [];\n for (var i = 0; i < this.clickableArray.length; i++) {\n if (\n $(this.clickableArray[i]).hasClass(\n \"clickable-clicked\"\n )\n ) {\n this.givenIndexArray.push(i);\n }\n }\n this.logBookEvent({\n event: \"clickableArea\",\n act: this.clickedIndexArray.join(\";\"),\n answer: this.clickedIndexArray.join(\";\"),\n div_id: this.divid,\n correct: storageObj.correct,\n });\n }\n }\n }\n this.restoreAnswers({}); // pass empty object\n }\n setLocalStorage(data) {\n // Array of the indices of clicked elements is passed to local storage\n var answer;\n if (data.answer !== undefined) {\n // If we got data from the server, we can just use that\n answer = this.clickedIndexArray.join(\";\");\n } else {\n this.givenIndexArray = [];\n for (var i = 0; i < this.clickableArray.length; i++) {\n if ($(this.clickableArray[i]).hasClass(\"clickable-clicked\")) {\n this.givenIndexArray.push(i);\n }\n }\n answer = this.givenIndexArray.join(\";\");\n }\n var timeStamp = new Date();\n var correct = data.correct;\n var storageObject = {\n answer: answer,\n correct: correct,\n timestamp: timeStamp,\n };\n localStorage.setItem(\n this.localStorageKey(),\n JSON.stringify(storageObject)\n );\n }\n /*==========================\n === Auxilliary functions ===\n ==========================*/\n modifyClickables(childNodes) {\n // Strips the data-correct/data-incorrect labels and updates the correct/incorrect arrays\n for (var i = 0; i < childNodes.length; i++) {\n if (\n $(childNodes[i]).is(\"[data-correct]\") ||\n $(childNodes[i]).is(\"[data-incorrect]\")\n ) {\n this.manageNewClickable(childNodes[i]);\n if ($(childNodes[i]).is(\"[data-correct]\")) {\n $(childNodes[i]).removeAttr(\"data-correct\");\n this.correctArray.push(childNodes[i]);\n } else {\n $(childNodes[i]).removeAttr(\"data-incorrect\");\n this.incorrectArray.push(childNodes[i]);\n }\n }\n if (childNodes[i].childNodes.length !== 0) {\n this.modifyClickables(childNodes[i].childNodes);\n }\n }\n }\n modifyViaCC(children) {\n for (var i = 0; i < children.length; i++) {\n if (children[i].children.length !== 0) {\n this.modifyViaCC(children[i].children);\n } else {\n this.ccCounter++;\n if (this.ccCounter === Math.floor(this.ccArray[this.ccIndex])) {\n this.manageNewClickable(children[i]);\n this.correctArray.push(children[i]);\n this.ccIndex++;\n } else if (\n this.ccCounter === Math.floor(this.ciArray[this.ciIndex])\n ) {\n this.manageNewClickable(children[i]);\n this.incorrectArray.push(children[i]);\n this.ciIndex++;\n }\n }\n }\n }\n modifyTableViaCC(children) {\n // table version of modifyViaCC\n var tComponentArr = [];\n for (let i = 0; i < children.length; i++) {\n if (children[i].nodeName === \"TABLE\") {\n let tmp = children[i];\n for (let j = 0; j < tmp.children.length; j++) {\n if (tmp.children[j].nodeName === \"THEAD\") {\n tComponentArr.push(tmp.children[j]);\n } else if (tmp.children[j].nodeName === \"TBODY\") {\n tComponentArr.push(tmp.children[j]);\n } else if (tmp.children[j].nodeName === \"TFOOT\") {\n tComponentArr.push(tmp.children[j]);\n }\n }\n }\n }\n for (var t = 0; t < tComponentArr.length; t++) {\n for (let i = 0; i < tComponentArr[t].children.length; i++) {\n this.ccCounter++;\n // First check if the entire row needs to be clickable\n if (\n this.ccIndex < this.ccArray.length &&\n this.ccCounter ===\n Math.floor(this.ccArray[this.ccIndex].split(\",\")[0]) &&\n Math.floor(this.ccArray[this.ccIndex].split(\",\")[1]) === 0\n ) {\n this.manageNewClickable(tComponentArr[t].children[i]);\n this.correctArray.push(tComponentArr[t].children[i]);\n this.ccIndex++;\n } else if (\n this.ciIndex < this.ciArray.length &&\n this.ccCounter ===\n Math.floor(this.ciArray[this.ciIndex].split(\",\")[0]) &&\n Math.floor(this.ciArray[this.ciIndex].split(\",\")[1]) === 0\n ) {\n this.manageNewClickable(tComponentArr[t].children[i]);\n this.incorrectArray.push(tComponentArr[t].children[i]);\n this.ciIndex++;\n } else {\n // If not, check the individual data cells\n for (\n let j = 0;\n j < tComponentArr[t].children[i].children.length;\n j++\n ) {\n let tmp = j + 1;\n if (\n this.ccIndex < this.ccArray.length &&\n tmp ===\n Math.floor(\n this.ccArray[this.ccIndex].split(\",\")[1]\n ) &&\n this.ccCounter ===\n Math.floor(\n this.ccArray[this.ccIndex].split(\",\")[0]\n )\n ) {\n this.manageNewClickable(\n tComponentArr[t].children[i].children[j]\n );\n this.correctArray.push(\n tComponentArr[t].children[i].children[j]\n );\n this.ccIndex++;\n } else if (\n this.ciIndex < this.ciArray.length &&\n tmp ===\n Math.floor(\n this.ciArray[this.ciIndex].split(\",\")[1]\n ) &&\n this.ccCounter ===\n Math.floor(\n this.ciArray[this.ciIndex].split(\",\")[0]\n )\n ) {\n this.manageNewClickable(\n tComponentArr[t].children[i].children[j]\n );\n this.incorrectArray.push(\n tComponentArr[t].children[i].children[j]\n );\n this.ciIndex++;\n }\n }\n }\n }\n }\n }\n manageNewClickable(clickable) {\n // adds the \"clickable\" functionality\n $(clickable).addClass(\"clickable\");\n if (this.hasStoredAnswers) {\n // Check if the element we're about to append to the pre was in local storage as clicked via its index\n if (\n this.clickedIndexArray[this.clickIndex].toString() ===\n this.clickableCounter.toString()\n ) {\n $(clickable).addClass(\"clickable-clicked\");\n this.clickIndex++;\n if (this.clickIndex === this.clickedIndexArray.length) {\n // Stop doing this if the index array is used up\n this.hasStoredAnswers = false;\n }\n }\n }\n let self = this;\n clickable.onclick = function () {\n self.isAnswered = true;\n if ($(this).hasClass(\"clickable-clicked\")) {\n $(this).removeClass(\"clickable-clicked\");\n $(this).removeClass(\"clickable-incorrect\");\n } else {\n $(this).addClass(\"clickable-clicked\");\n }\n };\n this.clickableArray.push(clickable);\n this.clickableCounter++;\n }\n /*======================================\n == Evaluation and displaying feedback ==\n ======================================*/\n checkCurrentAnswer() {\n // Evaluation is done by iterating over the correct/incorrect arrays and checking by class\n this.correct = true;\n this.correctNum = 0;\n this.incorrectNum = 0;\n for (let i = 0; i < this.correctArray.length; i++) {\n if (!$(this.correctArray[i]).hasClass(\"clickable-clicked\")) {\n this.correct = false;\n } else {\n this.correctNum++;\n }\n }\n for (let i = 0; i < this.incorrectArray.length; i++) {\n if ($(this.incorrectArray[i]).hasClass(\"clickable-clicked\")) {\n this.correct = false;\n this.incorrectNum++;\n } else {\n $(this.incorrectArray[i]).removeClass(\"clickable-incorrect\");\n }\n }\n this.percent =\n (this.correctNum - this.incorrectNum) / this.correctArray.length;\n this.setLocalStorage({ correct: this.correct ? \"T\" : \"F\" });\n }\n\n async logCurrentAnswer(sid) {\n const answer = this.givenIndexArray.join(\";\");\n let data = {\n event: \"clickableArea\",\n answer: answer,\n act: answer,\n div_id: this.divid,\n correct: this.correct ? \"T\" : \"F\",\n };\n if (typeof sid !== \"undefined\") {\n data.sid = sid;\n }\n await this.logBookEvent(data);\n }\n\n renderFeedback() {\n if (this.correct) {\n $(this.feedBackDiv).html(\"You are Correct!\");\n $(this.feedBackDiv).attr(\"class\", \"alert alert-info\");\n } else {\n for (let i = 0; i < this.incorrectArray.length; i++) {\n if ($(this.incorrectArray[i]).hasClass(\"clickable-clicked\")) {\n $(this.incorrectArray[i]).addClass(\"clickable-incorrect\");\n } else {\n $(this.incorrectArray[i]).removeClass(\n \"clickable-incorrect\"\n );\n }\n }\n $(this.feedBackDiv).html(\n \"Incorrect. You clicked on \" +\n this.correctNum +\n \" of the \" +\n this.correctArray.length.toString() +\n \" correct elements and \" +\n this.incorrectNum +\n \" of the \" +\n this.incorrectArray.length.toString() +\n \" incorrect elements. \" +\n this.feedback\n );\n $(this.feedBackDiv).attr(\"class\", \"alert alert-danger\");\n }\n }\n\n disableInteraction() {\n for (var i = 0; i < this.clickableArray.length; i++) {\n $(this.clickableArray[i]).css(\"cursor\", \"initial\");\n this.clickableArray[i].onclick = function () {\n return;\n };\n }\n }\n}\n\n/*=================================\n== Find the custom HTML tags and ==\n== execute our code on them ==\n=================================*/\n$(document).on(\"runestone:login-complete\", function () {\n $(\"[data-component=clickablearea]\").each(function (index) {\n if ($(this).closest(\"[data-component=timedAssessment]\").length == 0) {\n // If this element exists within a timed component, don't render it here\n try {\n CAList[this.id] = new ClickableArea({\n orig: this,\n useRunestoneServices: eBookConfig.useRunestoneServices,\n });\n } catch (err) {\n console.log(`Error rendering ClickableArea Problem ${this.id}\n Details: ${err}`);\n }\n }\n });\n});\n","import ClickableArea from \"./clickable.js\";\n\n(\"use strict\");\n\nexport default class TimedClickableArea extends ClickableArea {\n constructor(opts) {\n super(opts);\n this.restoreAnswers({});\n this.renderTimedIcon(this.containerDiv);\n this.hideButtons();\n }\n\n hideButtons() {\n $(this.submitButton).hide();\n }\n\n renderTimedIcon(component) {\n // renders the clock icon on timed components. The component parameter\n // is the element that the icon should be appended to.\n var timeIconDiv = document.createElement(\"div\");\n var timeIcon = document.createElement(\"img\");\n $(timeIcon).attr({\n src: \"../_static/clock.png\",\n style: \"width:15px;height:15px\",\n });\n timeIconDiv.className = \"timeTip\";\n timeIconDiv.title = \"\";\n timeIconDiv.appendChild(timeIcon);\n $(component).prepend(timeIconDiv);\n }\n\n checkCorrectTimed() {\n // Returns if the question was correct, incorrect, or skipped (return null in the last case)\n if (this.correctNum === 0 && this.incorrectNum === 0) {\n this.correct = null;\n }\n switch (this.correct) {\n case true:\n return \"T\";\n case false:\n return \"F\";\n default:\n return null;\n }\n }\n\n hideFeedback() {\n $(this.feedBackDiv).hide();\n }\n}\n\nif (typeof window.component_factory === \"undefined\") {\n window.component_factory = {};\n}\nwindow.component_factory.clickablearea = function (opts) {\n if (opts.timed) {\n return new TimedClickableArea(opts);\n }\n return new ClickableArea(opts);\n};\n"],"names":["CAList","ClickableArea","constructor","opts","super","orig","this","origElem","divid","id","useRunestoneServices","clickableArray","correctArray","incorrectArray","isTable","undefined","$","data","is","ccArray","split","ciArray","clickIndex","clickableCounter","getQuestion","getFeedback","renderNewElements","caption","addCaption","checkServer","i","childNodes","length","question","feedback","remove","innerHTML","containerDiv","document","createElement","appendChild","addClass","getAttribute","newDiv","newContent","html","slice","createButtons","createFeedbackDiv","replaceWith","submitButton","textContent","attr","class","name","type","onclick","checkCurrentAnswer","logCurrentAnswer","renderFeedback","bind","feedBackDiv","restoreAnswers","answer","hasStoredAnswers","clickedIndexArray","modifyClickables","ccCounter","ccIndex","ciIndex","modifyTableViaCC","children","modifyViaCC","checkLocalStorage","graderactive","storageObj","localStorage","ex","getItem","localStorageKey","JSON","parse","err","console","log","message","removeItem","givenIndexArray","hasClass","push","logBookEvent","event","act","join","div_id","correct","setLocalStorage","timeStamp","Date","storageObject","timestamp","setItem","stringify","manageNewClickable","removeAttr","Math","floor","tComponentArr","nodeName","tmp","j","t","clickable","toString","self","isAnswered","removeClass","correctNum","incorrectNum","percent","async","sid","disableInteraction","css","on","each","index","closest","eBookConfig","TimedClickableArea","renderTimedIcon","hideButtons","hide","component","timeIconDiv","timeIcon","src","style","className","title","prepend","checkCorrectTimed","hideFeedback","window","component_factory","clickablearea","timed"],"sourceRoot":""}