{"version":3,"file":"144.4702de71f3988031.bundle.js","mappings":"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","sources":["webpack://WebComponents/./runestone/common/js/renderComponent.js","webpack://WebComponents/./runestone/selectquestion/js/selectone.js"],"sourcesContent":["import { runestone_import } from \"../../../webpack.index.js\";\n\nexport async function renderRunestoneComponent(componentSrc, whereDiv, moreOpts) {\n /**\n * The easy part is adding the componentSrc to the existing div.\n * The tedious part is calling the right functions to turn the\n * source into the actual component.\n */\n if (!componentSrc) {\n jQuery(`#${whereDiv}`).html(`

Sorry, no source is available for preview.

`);\n return;\n }\n let patt = /..\\/_images/g;\n componentSrc = componentSrc.replace(\n patt,\n `${eBookConfig.app}/books/published/${eBookConfig.basecourse}/_images`\n );\n jQuery(`#${whereDiv}`).html(componentSrc);\n\n if (typeof window.edList === \"undefined\") {\n window.edList = {};\n }\n\n let componentKind = $($(`#${whereDiv} [data-component]`)[0]).data(\n \"component\"\n );\n // Import the JavaScript for this component before proceeding.\n await runestone_import(componentKind);\n let opt = {};\n opt.orig = jQuery(`#${whereDiv} [data-component]`)[0];\n if (opt.orig) {\n opt.lang = $(opt.orig).data(\"lang\");\n opt.useRunestoneServices = true;\n opt.graderactive = false;\n opt.python3 = true;\n if (typeof moreOpts !== \"undefined\") {\n for (let key in moreOpts) {\n opt[key] = moreOpts[key];\n }\n }\n }\n\n if (typeof component_factory === \"undefined\") {\n alert(\n \"Error: Missing the component factory!\"\n );\n } else {\n if (\n !window.component_factory[componentKind] &&\n !jQuery(`#${whereDiv}`).html()\n ) {\n jQuery(`#${whereDiv}`).html(\n `

Preview not available for ${componentKind}

`\n );\n } else {\n let res = window.component_factory[componentKind](opt);\n if (componentKind === \"activecode\") {\n if (moreOpts.multiGrader) {\n window.edList[\n `${moreOpts.gradingContainer} ${res.divid}`\n ] = res;\n } else {\n window.edList[res.divid] = res;\n }\n }\n }\n }\n}\n\nexport function createTimedComponent(componentSrc, moreOpts) {\n /* The important distinction is that the component does not really need to be rendered\n into the page, in fact, due to the async nature of getting the source the list of questions\n is made and the original html is replaced by the look of the exam.\n */\n\n let patt = /..\\/_images/g;\n componentSrc = componentSrc.replace(\n patt,\n `${eBookConfig.app}/books/published/${eBookConfig.basecourse}/_images`\n );\n\n let componentKind = $($(componentSrc).find(\"[data-component]\")[0]).data(\n \"component\"\n );\n\n let origId = $(componentSrc).find(\"[data-component]\").first().attr(\"id\");\n\n // Double check -- if the component source is not in the DOM, then briefly add it\n // and call the constructor.\n let hdiv;\n if (!document.getElementById(origId)) {\n hdiv = $(\"
\", {\n css: { display: \"none\" },\n }).appendTo(\"body\");\n hdiv.html(componentSrc);\n }\n // at this point hdiv is a jquery object\n\n let ret;\n let opts = {\n orig: document.getElementById(origId),\n timed: true,\n };\n if (typeof moreOpts !== \"undefined\") {\n for (let key in moreOpts) {\n opts[key] = moreOpts[key];\n }\n }\n\n if (componentKind in window.component_factory) {\n ret = window.component_factory[componentKind](opts);\n }\n\n let rdict = {};\n rdict.question = ret;\n return rdict;\n}\n","/**\n * *******************************\n * |docname| - SelectOne Component\n * *******************************\n */\nimport {\n renderRunestoneComponent,\n createTimedComponent,\n} from \"../../common/js/renderComponent.js\";\nimport RunestoneBase from \"../../common/js/runestonebase.js\";\nimport \"../css/selectquestion.css\";\n\nexport default class SelectOne extends RunestoneBase {\n /**\n * constructor --\n * Making an instance of a selectone is a bit more complicated because it is\n * a kind of meta directive. That is, go to the server and randomly select\n * a question to display in this spot. Or, if a student has already seen this question\n * in the context of an exam retrieve the question they saw in the first place.\n * Making an API call and waiting for the response is handled asynchronously.\n * But lots of code is not written with that assumption. So we do the initialization in\n * two parts.\n * 1. Create the object with the usual constructor\n * 2. call initialize, which returns a promise. When that promise is resolved\n * the \"replacement\" component will replace the original selectone component in the DOM.\n *\n * @param {} opts\n */\n constructor(opts) {\n super(opts);\n this.origOpts = opts;\n this.questions = $(opts.orig).data(\"questionlist\");\n this.proficiency = $(opts.orig).data(\"proficiency\");\n this.minDifficulty = $(opts.orig).data(\"minDifficulty\");\n this.maxDifficulty = $(opts.orig).data(\"maxDifficulty\");\n this.points = $(opts.orig).data(\"points\");\n this.autogradable = $(opts.orig).data(\"autogradable\");\n this.not_seen_ever = $(opts.orig).data(\"not_seen_ever\");\n this.selector_id = $(opts.orig).first().attr(\"id\");\n this.primaryOnly = $(opts.orig).data(\"primary\");\n this.ABExperiment = $(opts.orig).data(\"ab\");\n this.toggleOptions = $(opts.orig).data(\"toggleoptions\");\n this.toggleLabels = $(opts.orig).data(\"togglelabels\");\n this.limitBaseCourse = $(opts.orig).data(\"limit-basecourse\");\n opts.orig.id = this.selector_id;\n }\n /**\n * initialize --\n * initialize is used so that the constructor does not have to be async.\n * Constructors should definitely not return promises that would seriously\n * mess things up.\n * @return {Promise} Will resolve after component from DB is reified\n */\n async initialize() {\n let self = this;\n let data = { selector_id: this.selector_id };\n if (this.questions) {\n data.questions = this.questions;\n } else if (this.proficiency) {\n data.proficiency = this.proficiency;\n }\n if (this.minDifficulty) {\n data.minDifficulty = this.minDifficulty;\n }\n if (this.maxDifficulty) {\n data.maxDifficulty = this.maxDifficulty;\n }\n if (this.points) {\n data.points = this.points;\n }\n if (this.autogradable) {\n data.autogradable = this.autogradable;\n }\n if (this.not_seen_ever) {\n data.not_seen_ever = this.not_seen_ever;\n }\n if (this.primaryOnly) {\n data.primary = this.primaryOnly;\n }\n if (this.ABExperiment) {\n data.AB = this.ABExperiment;\n }\n if (this.timedWrapper) {\n data.timedWrapper = this.timedWrapper;\n }\n if (this.toggleOptions) {\n data.toggleOptions = this.toggleOptions;\n }\n if (this.toggleLabels) {\n data.toggleLabels = this.toggleLabels;\n }\n if (this.limitBaseCourse) {\n data.limitBaseCourse = eBookConfig.basecourse;\n }\n let opts = this.origOpts;\n let selectorId = this.selector_id;\n console.log(\"getting question source\");\n let request = new Request(\n `${eBookConfig.new_server_prefix}/assessment/get_question_source`,\n {\n method: \"POST\",\n headers: this.jsonHeaders,\n body: JSON.stringify(data),\n }\n );\n let response = await fetch(request);\n let htmlsrc = await response.json();\n htmlsrc = htmlsrc.detail;\n if (htmlsrc.indexOf(\"No preview\") >= 0) {\n alert(\n `Error: Not able to find a question for ${selectorId} based on the criteria`\n );\n throw new Error(`Unable to find a question for ${selectorId}`);\n }\n let res;\n if (opts.timed) {\n // timed components are not rendered immediately, only when the student\n // starts the assessment and visits this particular entry.\n res = createTimedComponent(htmlsrc, {\n timed: true,\n selector_id: selectorId,\n assessmentTaken: opts.assessmentTaken,\n });\n // replace the entry in the timed assessment's list of components\n // with the component created by createTimedComponent\n for (let component of opts.rqa) {\n if (component.question == self) {\n component.question = res.question;\n break;\n }\n }\n self.realComponent = res.question;\n self.containerDiv = res.question.containerDiv;\n self.realComponent.selectorId = selectorId;\n } else {\n if (data.toggleOptions) {\n var toggleLabels = data.toggleLabels\n .replace(\"togglelabels:\", \"\")\n .trim();\n if (toggleLabels) {\n toggleLabels = toggleLabels.split(\",\");\n for (var t = 0; t < toggleLabels.length; t++) {\n toggleLabels[t] = toggleLabels[t].trim();\n }\n }\n var toggleQuestions = this.questions.split(\", \");\n var toggleUI = \"\";\n // check so that only the first toggle select question on the assignments page has a preview panel created, then all toggle select previews use this same panel\n if (!document.getElementById(\"component-preview\")) {\n toggleUI +=\n '
' +\n '
' +\n '
' +\n \"
\";\n }\n // dropdown menu containing the question options\n toggleUI +=\n '
';\n var toggleFirstID = htmlsrc.split('id=\"')[1];\n toggleFirstID = toggleFirstID.split('\"')[0];\n htmlsrc = toggleUI + htmlsrc + \"
\";\n }\n // just render this component on the page in its usual place\n await renderRunestoneComponent(htmlsrc, selectorId, {\n selector_id: selectorId,\n is_toggle: this.toggleOptions,\n is_select: true,\n useRunestoneServices: true,\n });\n if (data.toggleOptions) {\n $(\"#component-preview\").hide();\n var toggleQuestionSelect = document.getElementById(\n selectorId + \"-toggleQuestion\"\n );\n for (i = 0; i < toggleQuestionSelect.options.length; i++) {\n if (\n toggleQuestionSelect.options[i].value == toggleFirstID\n ) {\n toggleQuestionSelect.value = toggleFirstID;\n $(\"#\" + selectorId).data(\n \"toggle_current\",\n toggleFirstID\n );\n $(\"#\" + selectorId).data(\n \"toggle_current_type\",\n toggleQuestionTypes[0]\n );\n break;\n }\n }\n toggleQuestionSelect.addEventListener(\n \"change\",\n async function () {\n await this.togglePreview(\n toggleQuestionSelect.parentElement.id,\n data.toggleOptions,\n toggleQuestionTypes\n );\n this.logBookEvent({\n event: \"view_toggle\",\n act: toggleQuestionSelect.value,\n div_id: toggleQuestionSelect.parentElement.id,\n });\n }.bind(this)\n );\n }\n }\n return response;\n }\n\n // retrieve html source of a question, for use in various toggle functionalities\n async getToggleSrc(toggleQuestionID) {\n let request = new Request(\n `${eBookConfig.new_server_prefix}/assessment/htmlsrc?acid=${toggleQuestionID}`,\n {\n method: \"GET\",\n }\n );\n let response = await fetch(request);\n let data = await response.json();\n let htmlsrc = data.detail;\n return htmlsrc;\n }\n\n // on changing the value of toggle select dropdown, render selected question in preview panel, add appropriate buttons, then make preview panel visible\n async togglePreview(parentID, toggleOptions, toggleQuestionTypes) {\n $(\"#toggle-buttons\").html(\"\");\n var parentDiv = document.getElementById(parentID);\n var toggleQuestionSelect = parentDiv.getElementsByTagName(\"select\")[0];\n var selectedQuestion =\n toggleQuestionSelect.options[toggleQuestionSelect.selectedIndex]\n .value;\n var htmlsrc = await this.getToggleSrc(selectedQuestion);\n renderRunestoneComponent(htmlsrc, \"toggle-preview\", {\n selector_id: \"toggle-preview\",\n is_toggle: this.toggleOptions,\n is_select: true,\n useRunestoneServices: true,\n });\n\n // add \"Close Preview\" button to the preview panel\n let closeButton = document.createElement(\"button\");\n $(closeButton).text(\"Close Preview\");\n $(closeButton).addClass(\"btn btn-default\");\n closeButton.addEventListener(\"click\",\n function () {\n $(\"#toggle-preview\").html(\"\");\n toggleQuestionSelect.value = $(\"#\" + parentID).data(\n \"toggle_current\"\n );\n $(\"#component-preview\").hide();\n this.logBookEvent({\n event: \"close_toggle\",\n act: toggleQuestionSelect.value,\n div_id: toggleQuestionSelect.parentElement.id\n });\n }.bind(this)\n );\n $(\"#toggle-buttons\").append(closeButton);\n\n // if \"lock\" is not in toggle options, then allow adding more buttons to the preview panel\n if (!toggleOptions.includes(\"lock\")) {\n let setButton = document.createElement(\"button\");\n $(setButton).text(\"Select this Problem\");\n $(setButton).addClass(\"btn btn-primary\");\n $(setButton).click(\n async function () {\n await this.toggleSet(\n parentID,\n selectedQuestion,\n htmlsrc,\n toggleQuestionTypes\n );\n $(\"#component-preview\").hide();\n this.logBookEvent({\n event: \"select_toggle\",\n act: selectedQuestion,\n div_id: parentID,\n });\n }.bind(this)\n );\n $(\"#toggle-buttons\").append(setButton);\n\n // if \"transfer\" in toggle options, and if current question type is Parsons and selected question type is active code, then add \"Transfer\" button to preview panel\n if (toggleOptions.includes(\"transfer\")) {\n var currentType = $(\"#\" + parentID).data(\"toggle_current_type\");\n var selectedType =\n toggleQuestionTypes[toggleQuestionSelect.selectedIndex];\n if (\n currentType == \"Parsons Mixed-Up Code\" &&\n selectedType == \"Active Write Code\"\n ) {\n let transferButton = document.createElement(\"button\");\n $(transferButton).text(\"Transfer Response\");\n $(transferButton).addClass(\"btn btn-primary\");\n $(transferButton).click(\n async function () {\n await this.toggleTransfer(\n parentID,\n selectedQuestion,\n htmlsrc,\n toggleQuestionTypes\n );\n }.bind(this)\n );\n $(\"#toggle-buttons\").append(transferButton);\n }\n }\n }\n\n $(\"#component-preview\").show();\n }\n\n // on clicking \"Select this Problem\" button, close preview panel, replace current question in assignments page with selected question, and send request to update grading database\n // _ `toggleSet`\n async toggleSet(parentID, selectedQuestion, htmlsrc, toggleQuestionTypes) {\n var selectorId = parentID + \"-toggleSelectedQuestion\";\n var toggleQuestionSelect = document\n .getElementById(parentID)\n .getElementsByTagName(\"select\")[0];\n document.getElementById(selectorId).innerHTML = \"\"; // need to check whether this is even necessary\n await renderRunestoneComponent(htmlsrc, selectorId, {\n selector_id: selectorId,\n is_toggle: this.toggleOptions,\n is_select: true,\n useRunestoneServices: true,\n });\n let request = new Request(\n `${eBookConfig.new_server_prefix}/assessment/set_selected_question?metaid=${parentID}&selected=${selectedQuestion}`,\n {}\n );\n await fetch(request);\n $(\"#toggle-preview\").html(\"\");\n $(\"#\" + parentID).data(\"toggle_current\", selectedQuestion);\n $(\"#\" + parentID).data(\n \"toggle_current_type\",\n toggleQuestionTypes[toggleQuestionSelect.selectedIndex]\n );\n }\n\n // on clicking \"Transfer\" button, extract the current text and indentation of the Parsons blocks in the answer space, then paste that into the selected active code question\n async toggleTransfer(\n parentID,\n selectedQuestion,\n htmlsrc,\n toggleQuestionTypes\n ) {\n // retrieve all Parsons lines within the answer space and loop through this list\n var currentParsons = document\n .getElementById(parentID + \"-toggleSelectedQuestion\")\n .querySelectorAll(\"div[class^='answer']\")[0]\n .getElementsByClassName(\"prettyprint lang-py\");\n var currentParsonsClass;\n var currentBlockIndent;\n var indentCount;\n var indent;\n var parsonsLine;\n var parsonsLines = ``;\n var count;\n for (var p = 0; p < currentParsons.length; p++) {\n indentCount = 0;\n indent = \"\";\n // for Parsons blocks that have built-in indentation in their lines\n currentParsonsClass = currentParsons[p].classList[2];\n if (currentParsonsClass) {\n if (currentParsonsClass.includes(\"indent\")) {\n indentCount =\n parseInt(indentCount) +\n parseInt(\n currentParsonsClass.slice(\n 6,\n currentParsonsClass.length\n )\n );\n }\n }\n // for Parsons answer spaces with vertical lines that allow student to define their own line indentation\n currentBlockIndent =\n currentParsons[p].parentElement.parentElement.style.left;\n if (currentBlockIndent) {\n indentCount =\n parseInt(indentCount) +\n parseInt(\n currentBlockIndent.slice(\n 0,\n currentBlockIndent.indexOf(\"px\")\n ) / 30\n );\n }\n for (var d = 0; d < indentCount; d++) {\n indent += \" \";\n }\n // retrieve each text snippet of each Parsons line and loop through this list\n parsonsLine = currentParsons[p].getElementsByTagName(\"span\");\n count = 0;\n for (var l = 0; l < parsonsLine.length; l++) {\n if (parsonsLine[l].childNodes[0].nodeName == \"#text\") {\n // Parsons blocks have differing amounts of hierarchy levels (spans within spans)\n if (p == 0 && count == 0) {\n // need different check than l == 0 because the l numbering doesn't align with location within line due to inconsistent span heirarchy\n parsonsLines += indent + parsonsLine[l].innerHTML;\n count++;\n } else if (count != 0) {\n parsonsLines += parsonsLine[l].innerHTML;\n count++;\n } else {\n parsonsLines =\n parsonsLines +\n `\n ` +\n indent +\n parsonsLine[l].innerHTML;\n parsonsLines = parsonsLines.replace(\n \" \",\n \"\"\n );\n count++;\n }\n }\n }\n }\n // replace all existing code within selected active code question with extracted Parsons text\n var htmlsrcFormer = htmlsrc.slice(\n 0,\n htmlsrc.indexOf(\"\") +\n 10\n );\n var htmlsrcLatter = htmlsrc.slice(\n htmlsrc.indexOf(\"\"),\n htmlsrc.length\n );\n htmlsrc = htmlsrcFormer + parsonsLines + htmlsrcLatter;\n\n await this.toggleSet(\n parentID,\n selectedQuestion,\n htmlsrc,\n toggleQuestionTypes\n );\n $(\"#component-preview\").hide();\n }\n}\n\nif (typeof window.component_factory === \"undefined\") {\n window.component_factory = {};\n}\n\nwindow.component_factory.selectquestion = function (opts) {\n return new SelectOne(opts);\n};\n\n/*\n * When the page is loaded and the login checks are complete find and render\n * each selectquestion component that is not part of a timedAssessment.\n **/\n$(document).on(\"runestone:login-complete\", async function () {\n let selQuestions = document.querySelectorAll(\n \"[data-component=selectquestion]\"\n );\n for (let cq of selQuestions) {\n try {\n if ($(cq).closest(\"[data-component=timedAssessment]\").length == 0) {\n // If this element exists within a timed component, don't render it here\n let tmp = new SelectOne({ orig: cq });\n await tmp.initialize();\n }\n } catch (err) {\n console.log(`Error rendering New Exercise ${cq.id}\n Details: ${err}`);\n console.log(err.stack);\n }\n }\n});\n"],"names":["async","renderRunestoneComponent","componentSrc","whereDiv","moreOpts","jQuery","html","replace","eBookConfig","app","basecourse","window","edList","componentKind","$","data","opt","orig","lang","useRunestoneServices","graderactive","python3","key","component_factory","alert","res","multiGrader","gradingContainer","divid","SelectOne","constructor","opts","super","this","origOpts","questions","proficiency","minDifficulty","maxDifficulty","points","autogradable","not_seen_ever","selector_id","first","attr","primaryOnly","ABExperiment","toggleOptions","toggleLabels","limitBaseCourse","id","self","primary","AB","timedWrapper","selectorId","console","log","request","Request","new_server_prefix","method","headers","jsonHeaders","body","JSON","stringify","response","fetch","htmlsrc","json","detail","indexOf","Error","timed","hdiv","ret","find","origId","document","getElementById","css","display","appendTo","rdict","question","createTimedComponent","assessmentTaken","component","rqa","realComponent","containerDiv","trim","split","t","length","i","toggleQuestionSubstring","toggleQuestionType","toggleQuestions","toggleUI","toggleQuestionTypes","getToggleSrc","slice","includes","toggleFirstID","is_toggle","is_select","hide","toggleQuestionSelect","options","value","addEventListener","togglePreview","parentElement","logBookEvent","event","act","div_id","bind","toggleQuestionID","parentID","getElementsByTagName","selectedQuestion","selectedIndex","closeButton","createElement","text","addClass","append","setButton","click","toggleSet","currentType","selectedType","transferButton","toggleTransfer","show","innerHTML","currentParsonsClass","currentBlockIndent","indentCount","indent","parsonsLine","count","currentParsons","querySelectorAll","getElementsByClassName","parsonsLines","p","classList","parseInt","style","left","d","l","childNodes","nodeName","htmlsrcFormer","htmlsrcLatter","selectquestion","on","selQuestions","cq","closest","tmp","initialize","err","stack"],"sourceRoot":""}