{"version":3,"file":"759.js","mappings":"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","sources":["webpack://WebComponents/./runestone/dragndrop/js/dragndrop-i18n.en.js","webpack://WebComponents/./runestone/dragndrop/js/dragndrop-i18n.pt-br.js","webpack://WebComponents/./runestone/dragndrop/js/dragndrop.js","webpack://WebComponents/./runestone/dragndrop/js/timeddnd.js"],"sourcesContent":["$.i18n().load({\n en: {\n msg_dragndrop_correct_answer: \"You are correct!\",\n msg_dragndrop_incorrect_answer:\n \"Incorrect. You got $1 correct and $2 incorrect out of $3. You left $4 unmatched.\",\n msg_dragndrop_check_me: \"Check me\",\n msg_dragndrop_reset: \"Reset\",\n },\n});\n","$.i18n().load({\n \"pt-br\": {\n msg_dragndrop_correct_answer: \"Correto!\",\n msg_dragndrop_incorrect_answer:\n \"Incorreto. VocĂȘ teve $1 correto(s) e $2 incorreto(s) de $3. VocĂȘ deixou $4 em branco.\",\n msg_dragndrop_check_me: \"Verificar\",\n msg_dragndrop_reset: \"Resetar\",\n },\n});\n","/*==========================================\n======= Master dragndrop.js ========\n============================================\n=== This file contains the JS for ===\n=== the Runestone Drag n drop component. ===\n============================================\n=== Created by ===\n=== Isaiah Mayerchak ===\n=== 7/6/15 ===\n=== Brad MIller ===\n=== 2/7/19 ===\n=== 12/30/24 ===\n==========================================*/\n\n/*\n * Some terminology:\n * - draggable: the element that is being dragged\n * - dropzone: the element that is being dropped on\n * - premise: the element that is being dragged\n * - response: the element that is being dropped on\n * - category: each premis and response have a category. Several premises can have the same category\n * and be dropped onto the same response. If a premise has no response its category will not be in\n * the list of categories.\n *\n * Key variables:\n * - dragArray: an array of draggable elements\n * - dropArray: an array of dropzone elements\n * - categories: an array of all categories\n */\n\"use strict\";\n\nimport RunestoneBase from \"../../common/js/runestonebase.js\";\nimport \"../css/dragndrop.less\";\nimport \"./dragndrop-i18n.en.js\";\nimport \"./dragndrop-i18n.pt-br.js\";\n//import \"./DragDropTouch.js\";\n\nexport default class DragNDrop extends RunestoneBase {\n constructor(opts) {\n super(opts);\n var orig = opts.orig; // entire <ul> element that will be replaced by new HTML\n this.origElem = orig;\n this.divid = orig.id;\n this.useRunestoneServices = opts.useRunestoneServices;\n this.random = false;\n if (this.origElem.hasAttribute(\"data-random\")) {\n this.random = true;\n }\n this.feedback = \"\";\n this.question = \"\";\n this.populate(); // Populates this.responseArray, this.premiseArray, this.feedback and this.question\n this.createNewElements();\n this.caption = \"Drag-N-Drop\";\n this.addCaption(\"runestone\");\n if (typeof Prism !== \"undefined\") {\n Prism.highlightAllUnder(this.containerDiv);\n }\n }\n\n /*======================\n === Update variables ===\n ======================*/\n populate() {\n this.responseArray = [];\n this.premiseArray = [];\n for (let element of this.origElem.querySelectorAll(\n \"[data-subcomponent='draggable']\"\n )) {\n let replaceSpan = document.createElement(\"span\");\n replaceSpan.innerHTML = element.innerHTML;\n replaceSpan.id = element.id;\n replaceSpan.setAttribute(\"draggable\", \"true\");\n replaceSpan.classList.add(\"draggable-drag\");\n replaceSpan.classList.add(\"premise\");\n replaceSpan.dataset.category = this.getCategory(element);\n replaceSpan.dataset.parent_id = this.divid;\n this.premiseArray.push(replaceSpan);\n this.setDragListeners(replaceSpan);\n }\n this.premiseArray = shuffleArray(this.premiseArray);\n for (let element of this.origElem.querySelectorAll(\n \"[data-subcomponent='dropzone']\"\n )) {\n let replaceSpan = document.createElement(\"span\");\n replaceSpan.innerHTML = element.innerHTML;\n replaceSpan.id = element\n .getAttribute(\"for\")\n .replace(\"drag\", \"drop\");\n replaceSpan.classList.add(\n \"draggable-drop\",\n \"drop-label\",\n \"response\"\n );\n replaceSpan.dataset.category = this.getCategory(element);\n replaceSpan.dataset.parent_id = this.divid;\n this.responseArray.push(replaceSpan);\n this.setDropListeners(replaceSpan);\n }\n\n this.question = this.origElem.querySelector(\n \"[data-subcomponent='question']\"\n ).innerHTML;\n let feedback = this.origElem.querySelector(\n \"[data-subcomponent='feedback']\"\n );\n if (feedback) {\n this.feedback = feedback.innerHTML;\n }\n }\n\n getCategory(elem) {\n if (elem.dataset.category) {\n return elem.dataset.category;\n } else {\n // if no category then use the for attribute or the id\n // this is for backwards compatibility\n if (elem.hasAttribute(\"for\")) {\n return elem.getAttribute(\"for\");\n } else {\n return elem.id;\n }\n }\n }\n /*========================================\n == Create new HTML elements and replace ==\n == original element with them ==\n ========================================*/\n createNewElements() {\n this.containerDiv = document.createElement(\"div\");\n this.containerDiv.id = this.divid;\n this.containerDiv.classList.add(\"draggable-container\");\n this.containerDiv.innerHTML = this.question;\n this.containerDiv.appendChild(document.createElement(\"br\"));\n this.dragDropWrapDiv = document.createElement(\"div\"); // Holds the draggables/dropzones, prevents feedback from bleeding in\n this.dragDropWrapDiv.style.display = \"block\";\n this.containerDiv.appendChild(this.dragDropWrapDiv);\n this.draggableDiv = document.createElement(\"div\");\n this.draggableDiv.classList.add(\"rsdraggable\", \"dragzone\");\n this.addDragDivListeners();\n this.dropZoneDiv = document.createElement(\"div\");\n this.dropZoneDiv.classList.add(\"rsdraggable\");\n this.dragDropWrapDiv.appendChild(this.draggableDiv);\n this.dragDropWrapDiv.appendChild(this.dropZoneDiv);\n this.createButtons();\n this.checkServer(\"dragNdrop\", true);\n if (eBookConfig.practice_mode) {\n this.finishSettingUp();\n }\n self = this;\n this.ivp = this.isValidPremise.bind(this);\n self.queueMathJax(self.containerDiv);\n }\n\n finishSettingUp() {\n this.appendReplacementSpans();\n this.createFeedbackDiv();\n this.origElem.parentNode.replaceChild(this.containerDiv, this.origElem);\n if (!this.hasStoredDropzones) {\n this.minheight = this.draggableDiv.offsetHeight;\n // Ensure MathJax has completed before adjusting the zone widths\n this.queueMathJax(this.containerDiv).then(() => {\n this.adjustDragDropWidths();\n });\n }\n this.draggableDiv.style.minHeight = this.minheight.toString() + \"px\";\n if (this.dropZoneDiv.offsetHeight > this.minheight) {\n this.dragDropWrapDiv.style.minHeight =\n this.dropZoneDiv.offsetHeight.toString() + \"px\";\n } else {\n this.dragDropWrapDiv.style.minHeight =\n this.minheight.toString() + \"px\";\n }\n this.draggableDiv.style.width = `${this.dragwidth}%`;\n this.dropZoneDiv.style.width = `${this.dropwidth}%`;\n }\n addDragDivListeners() {\n let self = this;\n this.draggableDiv.addEventListener(\n \"dragover\",\n function (ev) {\n ev.preventDefault();\n if (this.draggableDiv.classList.contains(\"possibleDrop\")) {\n return;\n }\n this.draggableDiv.classList.add(\"possibleDrop\");\n }.bind(this)\n );\n this.draggableDiv.addEventListener(\n \"drop\",\n function (ev) {\n self.isAnswered = true;\n ev.preventDefault();\n if (this.draggableDiv.classList.contains(\"possibleDrop\")) {\n this.draggableDiv.classList.remove(\"possibleDrop\");\n }\n var data = ev.dataTransfer.getData(\"draggableID\");\n var draggedSpan = document.getElementById(data);\n if (\n !this.draggableDiv.contains(draggedSpan) &&\n !this.strangerDanger(draggedSpan)\n ) {\n // Make sure element isn't already there--prevents erros w/appending child\n this.draggableDiv.appendChild(draggedSpan);\n this.adjustDragDropWidths();\n this.minheight = this.draggableDiv.offsetHeight;\n this.dragDropWrapDiv.style.minHeight =\n this.minheight.toString() + \"px\";\n }\n }.bind(this)\n );\n this.draggableDiv.addEventListener(\n \"dragleave\",\n function (e) {\n if (!this.draggableDiv.classList.contains(\"possibleDrop\")) {\n return;\n }\n this.draggableDiv.classList.remove(\"possibleDrop\");\n }.bind(this)\n );\n }\n createButtons() {\n this.buttonDiv = document.createElement(\"div\");\n this.buttonDiv.classList.add(\"dnd-button-container\");\n this.submitButton = document.createElement(\"button\"); // Check me button\n this.submitButton.textContent = $.i18n(\"msg_dragndrop_check_me\");\n this.submitButton.setAttribute(\"class\", \"btn btn-success drag-button\");\n this.submitButton.setAttribute(\"name\", \"do answer\");\n this.submitButton.setAttribute(\"type\", \"button\");\n this.submitButton.onclick = function () {\n this.checkCurrentAnswer();\n this.renderFeedback();\n this.logCurrentAnswer();\n }.bind(this);\n this.resetButton = document.createElement(\"button\"); // Check me button\n this.resetButton.textContent = $.i18n(\"msg_dragndrop_reset\");\n this.resetButton.setAttribute(\n \"class\",\n \"btn btn-default drag-button drag-reset\"\n );\n this.resetButton.setAttribute(\"name\", \"do answer\");\n this.resetButton.onclick = function () {\n this.resetDraggables();\n }.bind(this);\n this.buttonDiv.appendChild(this.submitButton);\n this.buttonDiv.appendChild(this.resetButton);\n this.containerDiv.appendChild(this.buttonDiv);\n }\n appendReplacementSpans() {\n if (\n this.answerState === undefined ||\n Object.keys(this.answerState).length === 0\n ) {\n this.answerState = {};\n for (let element of this.premiseArray) {\n this.draggableDiv.appendChild(element);\n }\n for (let element of this.responseArray) {\n this.dropZoneDiv.appendChild(element);\n }\n } else {\n let placedPremises = [];\n for (let response of this.responseArray) {\n this.dropZoneDiv.appendChild(response);\n if (this.answerState[response.id]) {\n for (let premise of this.answerState[response.id]) {\n placedPremises.push(premise);\n response.appendChild(this.findPremise(premise));\n }\n }\n }\n for (let premise of this.premiseArray) {\n if (placedPremises.indexOf(premise.id) == -1) {\n this.draggableDiv.appendChild(premise);\n }\n }\n }\n }\n\n findPremise(id) {\n for (let premise of this.premiseArray) {\n if (premise.id == id) {\n return premise;\n }\n }\n }\n\n setDragListeners(dgSpan) {\n let self = this;\n dgSpan.addEventListener(\"dragstart\", function (ev) {\n ev.dataTransfer.setData(\"draggableID\", ev.target.id);\n });\n dgSpan.addEventListener(\"dragover\", function (ev) {\n ev.preventDefault();\n });\n dgSpan.addEventListener(\n \"drop\",\n function (ev) {\n self.isAnswered = true;\n ev.preventDefault();\n var data = ev.dataTransfer.getData(\"draggableID\");\n var draggedSpan = document.getElementById(data);\n if (\n draggedSpan != ev.target &&\n !this.strangerDanger(draggedSpan)\n ) {\n // Make sure element isn't already there--prevents erros w/appending child\n this.draggableDiv.appendChild(draggedSpan);\n }\n }.bind(this)\n );\n }\n\n setDropListeners(dpSpan) {\n dpSpan.addEventListener(\n \"dragover\",\n function (ev) {\n self.isAnswered = true;\n ev.preventDefault();\n if (ev.target.classList.contains(\"possibleDrop\")) {\n return;\n }\n if (ev.target.classList.contains(\"draggable-drop\")) {\n ev.target.classList.add(\"possibleDrop\");\n }\n }.bind(this)\n );\n dpSpan.addEventListener(\"dragleave\", function (ev) {\n self.isAnswered = true;\n ev.preventDefault();\n if (!ev.target.classList.contains(\"possibleDrop\")) {\n return;\n }\n ev.target.classList.remove(\"possibleDrop\");\n });\n dpSpan.addEventListener(\n \"drop\",\n function (ev) {\n self.isAnswered = true;\n ev.preventDefault();\n if (ev.target.classList.contains(\"possibleDrop\")) {\n ev.target.classList.remove(\"possibleDrop\");\n }\n var data = ev.dataTransfer.getData(\"draggableID\");\n var draggedSpan = document.getElementById(data);\n if (\n ev.target.classList.contains(\"draggable-drop\") &&\n !this.strangerDanger(draggedSpan) &&\n !this.premiseArray.includes(ev.target) // don't drop on another premise!\n ) {\n // Make sure element isn't already there--prevents erros w/appending child\n ev.target.appendChild(draggedSpan);\n }\n this.queueMathJax(this.containerDiv).then(() => {\n this.adjustDragDropWidths();\n });\n }.bind(this)\n );\n }\n\n adjustDragDropWidths() {\n // Temporarily minimize the dragzone width to the content\n this.draggableDiv.style.width = \"fit-content\";\n \n const dragzoneWidth = this.draggableDiv.offsetWidth;\n const totalWidth = this.dragDropWrapDiv.offsetWidth;\n\n let dragzonePercent = Math.ceil((dragzoneWidth / totalWidth) * 100);\n dragzonePercent = Math.max(28, Math.min(dragzonePercent, 48));\n const dropzonePercent = 100 - dragzonePercent - 4; // 4 accounts for zone padding\n \n this.dragwidth = dragzonePercent;\n this.dropwidth = dropzonePercent;\n\n this.draggableDiv.style.width = `${dragzonePercent}%`;\n this.dropZoneDiv.style.width = `${dropzonePercent}%`;\n }\n\n createFeedbackDiv() {\n if (!this.feedBackDiv) {\n this.feedBackDiv = document.createElement(\"div\");\n this.feedBackDiv.id = this.divid + \"_feedback\";\n this.feedBackDiv.setAttribute(\"aria-live\", \"polite\");\n this.feedBackDiv.setAttribute(\"role\", \"status\");\n this.containerDiv.appendChild(document.createElement(\"br\"));\n this.containerDiv.appendChild(this.feedBackDiv);\n }\n }\n /*=======================\n == Auxiliary functions ==\n =======================*/\n /* leaving the name as is, because it reminds me of Isaiah! */\n strangerDanger(testSpan) {\n // Returns true if the test span doesn't belong to this instance of DragNDrop\n if (testSpan.dataset.parent_id != this.divid) {\n return true;\n } else {\n return false;\n }\n }\n /*==============================\n == Reset button functionality ==\n ==============================*/\n resetDraggables() {\n this.dropZoneDiv.innerHTML = \"\";\n for (let response of this.responseArray) {\n response.classList.remove(\"drop-incorrect\");\n this.dropZoneDiv.appendChild(response);\n }\n this.draggableDiv.innerHTML = \"\";\n shuffleArray(this.premiseArray);\n for (let premise of this.premiseArray) {\n this.draggableDiv.appendChild(premise);\n }\n this.answerState = {};\n this.feedBackDiv.style.display = \"none\";\n this.adjustDragDropWidths();\n this.minheight = this.draggableDiv.offsetHeight;\n this.dragDropWrapDiv.style.minHeight =\n this.minheight.toString() + \"px\";\n this.feedBackDiv.style.visibility = \"hidden\";\n }\n /*===========================\n == Evaluation and feedback ==\n ===========================*/\n getAllCategories() {\n this.categories = [];\n for (let response of this.dropZoneDiv.childNodes) {\n this.categories.push(response.dataset.category);\n }\n return this.categories;\n }\n\n checkCurrentAnswer() {\n let categories = this.getAllCategories();\n this.correct = true;\n this.unansweredNum = 0;\n this.incorrectNum = 0;\n this.correctNum = 0;\n this.dragNum = this.premiseArray.length;\n\n for (let response of this.dropZoneDiv.childNodes) {\n // ignore drop zone children that aren't premises\n for (let premise of Array.from(response.childNodes).filter(\n this.ivp\n )) {\n if (premise.dataset.category == response.dataset.category) {\n this.correctNum++;\n } else {\n this.incorrectNum++;\n }\n }\n }\n for (let premise of Array.from(this.draggableDiv.childNodes).filter(\n (node) => node.nodeType !== Node.TEXT_NODE\n )) {\n if (categories.indexOf(premise.dataset.category) == -1) {\n this.correctNum++;\n } else {\n this.unansweredNum++;\n }\n }\n this.percent = this.correctNum / this.premiseArray.length;\n console.log(this.percent, this.incorrectNum, this.unansweredNum);\n if (this.percent < 1.0) {\n this.correct = false;\n }\n this.setLocalStorage({ correct: this.correct ? \"T\" : \"F\" });\n }\n\n isCorrectDrop(response) {\n // Returns true if all premises in the response are in the correct category\n // and all premises in the category are in the response\n // used by renderFeedback\n let correct = true;\n let correctPlacements = 0;\n for (let premise of Array.from(response.childNodes).filter(this.ivp)) {\n if (premise.dataset.category != response.dataset.category) {\n correct = false;\n } else {\n correctPlacements++;\n }\n }\n let catCount = 0;\n for (let premis of this.premiseArray) {\n if (premis.dataset.category == response.dataset.category) {\n catCount++;\n }\n }\n return correct && correctPlacements == catCount;\n }\n\n isValidPremise(premise) {\n if (this.premiseArray.includes(premise)) {\n return true;\n } else {\n return false;\n }\n }\n\n async logCurrentAnswer(sid) {\n let answer = JSON.stringify(this.answerState);\n let data = {\n event: \"dragNdrop\",\n act: answer,\n answer: answer,\n min_height: Math.round(this.minheight),\n drag_width: this.dragwidth,\n drop_width: this.dropwidth,\n div_id: this.divid,\n correct: this.correct,\n correctNum: this.correctNum,\n dragNum: this.dragNum,\n };\n if (typeof sid !== \"undefined\") {\n data.sid = sid;\n }\n await this.logBookEvent(data);\n }\n renderFeedback() {\n for (let response of this.dropZoneDiv.childNodes) {\n if (this.isCorrectDrop(response)) {\n response.classList.remove(\"drop-incorrect\");\n } else {\n response.classList.add(\"drop-incorrect\");\n }\n }\n if (!this.feedBackDiv) {\n this.createFeedbackDiv();\n }\n this.feedBackDiv.style.visibility = \"visible\";\n if (this.correct) {\n var msgCorrect = $.i18n(\"msg_dragndrop_correct_answer\");\n setTimeout(() => {\n this.feedBackDiv.innerHTML = msgCorrect;\n }, 10);\n this.feedBackDiv.className = \"alert alert-info draggable-feedback\";\n\n } else {\n var msgIncorrect = $.i18n(\n $.i18n(\"msg_dragndrop_incorrect_answer\"),\n this.correctNum,\n this.incorrectNum,\n this.dragNum,\n this.unansweredNum\n );\n // this.feedback comes from the author (a hint maybe)\n setTimeout(() => {\n this.feedBackDiv.innerHTML = msgIncorrect + \" \" + this.feedback;\n }, 10);\n this.feedBackDiv.className =\n \"alert alert-danger draggable-feedback\";\n }\n }\n /*===================================\n === Checking/restoring from storage ===\n ===================================*/\n restoreAnswers(data) {\n // Restore answers from storage retrieval done in RunestoneBase\n this.hasStoredDropzones = true;\n this.minheight = data.min_height;\n this.dragwidth = data.drag_width;\n this.dropwidth = data.drop_width;\n this.answerState = JSON.parse(data.answer);\n this.finishSettingUp();\n }\n\n checkLocalStorage() {\n if (this.graderactive) {\n return;\n }\n var storedObj;\n this.hasStoredDropzones = false;\n var len = localStorage.length;\n if (len > 0) {\n var ex = localStorage.getItem(this.localStorageKey());\n if (ex !== null) {\n this.hasStoredDropzones = true;\n try {\n storedObj = JSON.parse(ex);\n this.minheight = storedObj.min_height;\n this.dragwidth = storedObj.drag_width;\n this.dropwidth = storedObj.drop_width;\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.hasStoredDropzones = false;\n this.finishSettingUp();\n return;\n }\n this.answerState = storedObj.answer;\n if (this.useRunestoneServices) {\n // store answer in database\n let answer = JSON.stringify(this.answerState);\n this.logBookEvent({\n event: \"dragNdrop\",\n act: answer,\n answer: answer,\n min_height: Math.round(this.minheight),\n drag_width: this.dragwidth,\n drop_width: this.dropwidth,\n div_id: this.divid,\n correct: storedObj.correct,\n });\n }\n }\n }\n this.finishSettingUp();\n }\n\n setLocalStorage(data) {\n if (data.answer === undefined) {\n // If we didn't load from the server, we must generate the data\n this.answerState = {};\n for (let response of this.dropZoneDiv.childNodes) {\n this.answerState[response.id] = [];\n for (let premise of response.childNodes) {\n if (\n premise.nodeType !== Node.TEXT_NODE &&\n this.premiseArray.includes(premise)\n ) {\n this.answerState[response.id].push(premise.id);\n }\n }\n }\n }\n var timeStamp = new Date();\n var correct = data.correct;\n var storageObj = {\n answer: this.answerState,\n min_height: this.minheight,\n timestamp: timeStamp,\n correct: correct,\n drag_width: this.dragwidth,\n drop_width: this.dropwidth,\n };\n localStorage.setItem(\n this.localStorageKey(),\n JSON.stringify(storageObj)\n );\n }\n\n disableInteraction() {\n this.resetButton.style.display = \"none\";\n for (var i = 0; i < this.premiseArray.length; i++) {\n // No more dragging\n this.premiseArray[i].draggable = false;\n this.premiseArray[i].style.cursor = \"initial\";\n }\n }\n}\n\nfunction shuffleArray(array) {\n for (let i = array.length - 1; i > 0; i--) {\n // Generate a random index between 0 and i\n const j = Math.floor(Math.random() * (i + 1));\n // Swap elements at indices i and j\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n}\n\n/*=================================\n== Find the custom HTML tags and ==\n== execute our code on them ==\n=================================*/\ndocument.addEventListener(\"runestone:login-complete\", function () {\n const elements = document.querySelectorAll(\"[data-component=dragndrop]\");\n elements.forEach((element) => {\n const opts = {\n orig: element,\n useRunestoneServices: eBookConfig.useRunestoneServices,\n };\n if (!element.closest(\"[data-component=timedAssessment]\")) {\n // If this element exists within a timed component, don't render it here\n try {\n window.componentMap[element.id] = new DragNDrop(opts);\n } catch (err) {\n console.log(\n `Error rendering DragNDrop Problem ${element.id}: ${err}`\n );\n }\n }\n });\n});\n","\"use strict\";\n\nimport DragNDrop from \"./dragndrop.js\";\n\nexport default class TimedDragNDrop extends DragNDrop {\n constructor(opts) {\n super(opts);\n this.finishSettingUp();\n this.renderTimedIcon(this.containerDiv);\n this.hideButtons();\n }\n hideButtons() {\n $(this.submitButton).hide();\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 checkCorrectTimed() {\n // Returns if the question was correct. Used for timed assessment grading.\n if (this.unansweredNum === this.dragPairArray.length) {\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 hideFeedback() {\n $(this.feedBackDiv).hide();\n }\n}\n\nif (typeof window.component_factory === \"undefined\") {\n window.component_factory = {};\n}\nwindow.component_factory[\"dragndrop\"] = function (opts) {\n if (opts.timed) {\n return new TimedDragNDrop(opts);\n }\n return new DragNDrop(opts);\n};\n"],"names":["$","i18n","load","en","msg_dragndrop_correct_answer","msg_dragndrop_incorrect_answer","msg_dragndrop_check_me","msg_dragndrop_reset","DragNDrop","constructor","opts","super","orig","this","origElem","divid","id","useRunestoneServices","random","hasAttribute","feedback","question","populate","createNewElements","caption","addCaption","Prism","highlightAllUnder","containerDiv","responseArray","premiseArray","element","querySelectorAll","replaceSpan","document","createElement","innerHTML","setAttribute","classList","add","dataset","category","getCategory","parent_id","push","setDragListeners","shuffleArray","getAttribute","replace","setDropListeners","querySelector","elem","appendChild","dragDropWrapDiv","style","display","draggableDiv","addDragDivListeners","dropZoneDiv","createButtons","checkServer","eBookConfig","practice_mode","finishSettingUp","self","ivp","isValidPremise","bind","queueMathJax","appendReplacementSpans","createFeedbackDiv","parentNode","replaceChild","hasStoredDropzones","minheight","offsetHeight","then","adjustDragDropWidths","minHeight","toString","width","dragwidth","dropwidth","addEventListener","ev","preventDefault","contains","isAnswered","remove","data","dataTransfer","getData","draggedSpan","getElementById","strangerDanger","e","buttonDiv","submitButton","textContent","onclick","checkCurrentAnswer","renderFeedback","logCurrentAnswer","resetButton","resetDraggables","undefined","answerState","Object","keys","length","placedPremises","response","premise","findPremise","indexOf","dgSpan","setData","target","dpSpan","includes","dragzoneWidth","offsetWidth","totalWidth","dragzonePercent","Math","ceil","max","min","dropzonePercent","feedBackDiv","testSpan","visibility","getAllCategories","categories","childNodes","correct","unansweredNum","incorrectNum","correctNum","dragNum","Array","from","filter","node","nodeType","Node","TEXT_NODE","percent","console","log","setLocalStorage","isCorrectDrop","correctPlacements","catCount","premis","sid","answer","JSON","stringify","event","act","min_height","round","drag_width","drop_width","div_id","logBookEvent","msgCorrect","setTimeout","className","msgIncorrect","restoreAnswers","parse","checkLocalStorage","graderactive","storedObj","localStorage","ex","getItem","localStorageKey","err","message","removeItem","timeStamp","Date","storageObj","timestamp","setItem","disableInteraction","i","draggable","cursor","array","j","floor","forEach","closest","window","componentMap","TimedDragNDrop","renderTimedIcon","hideButtons","hide","component","timeIconDiv","timeIcon","attr","src","title","prepend","checkCorrectTimed","dragPairArray","hideFeedback","component_factory","timed"],"sourceRoot":""}