{"version":3,"file":"866.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 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 if (typeof Prism !== \"undefined\") {\n Prism.highlightAllUnder(this.containerDiv);\n }\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.percent = Math.max(0, this.percent);\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 window.componentMap[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 if (! this.assessmentTaken){\n this.restoreAnswers({}); // This takes the place of reinitializeListeners -- but might be better to implement that method for consistency.\n }\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":["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","Prism","highlightAllUnder","containerDiv","i","childNodes","length","question","feedback","remove","innerHTML","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","max","sid","disableInteraction","css","on","each","index","closest","window","componentMap","eBookConfig","TimedClickableArea","assessmentTaken","renderTimedIcon","hideButtons","hide","component","timeIconDiv","timeIcon","src","style","className","title","prepend","checkCorrectTimed","hideFeedback","component_factory","clickablearea","timed"],"sourceRoot":""}