{"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":""}